diff -Nru mame-0.263+dfsg.1/3rdparty/bx/src/debug.cpp mame-0.264+dfsg.1/3rdparty/bx/src/debug.cpp --- mame-0.263+dfsg.1/3rdparty/bx/src/debug.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/3rdparty/bx/src/debug.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -43,7 +43,13 @@ // NativeClient: NaCl module load failed: Validation failure. File violates Native Client safety rules. __asm__ ("int $3"); #elif BX_PLATFORM_EMSCRIPTEN - emscripten_log(EM_LOG_CONSOLE | EM_LOG_ERROR | EM_LOG_C_STACK | EM_LOG_JS_STACK | EM_LOG_DEMANGLE, "debugBreak!"); + emscripten_log(0 + | EM_LOG_CONSOLE + | EM_LOG_ERROR + | EM_LOG_C_STACK + | EM_LOG_JS_STACK + , "debugBreak!" + ); // Doing emscripten_debugger() disables asm.js validation due to an emscripten bug //emscripten_debugger(); EM_ASM({ debugger; }); diff -Nru mame-0.263+dfsg.1/3rdparty/lua-zlib/lua_zlib.c mame-0.264+dfsg.1/3rdparty/lua-zlib/lua_zlib.c --- mame-0.263+dfsg.1/3rdparty/lua-zlib/lua_zlib.c 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/3rdparty/lua-zlib/lua_zlib.c 2024-03-25 14:00:46.000000000 +0000 @@ -392,7 +392,7 @@ SETLITERAL("_COPYRIGHT", "Copyright (c) 2009-2010 Brian Maher"); SETLITERAL("_DESCRIPTION", "Yet another binding to the zlib library"); - SETLITERAL("_VERSION", "lua-zlib $Id: fd56b12798762ac4778b3b2fa5b69de30a46c987 $ (tag: mame0263)"); + SETLITERAL("_VERSION", "lua-zlib $Id: fd56b12798762ac4778b3b2fa5b69de30a46c987 $ (tag: mame0264)"); /* Expose this to lua so we can do a test: */ SETINT("_TEST_BUFSIZ", LUAL_BUFFERSIZE); diff -Nru mame-0.263+dfsg.1/android-project/app/src/main/AndroidManifest.xml mame-0.264+dfsg.1/android-project/app/src/main/AndroidManifest.xml --- mame-0.263+dfsg.1/android-project/app/src/main/AndroidManifest.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/android-project/app/src/main/AndroidManifest.xml 2024-03-25 14:00:46.000000000 +0000 @@ -4,8 +4,8 @@ --> diff -Nru mame-0.263+dfsg.1/debian/changelog mame-0.264+dfsg.1/debian/changelog --- mame-0.263+dfsg.1/debian/changelog 2024-02-28 10:52:07.000000000 +0000 +++ mame-0.264+dfsg.1/debian/changelog 2024-03-27 09:59:53.000000000 +0000 @@ -1,4 +1,10 @@ -mame (0.263+dfsg.1-0ubuntu1~ppa1~jammy1) jammy; urgency=medium +mame (0.264+dfsg.1-0ubuntu1~ppa1~jammy1) jammy; urgency=medium + + * New upstream release. + + -- Cesare Falco Wed, 27 Mar 2024 10:59:53 +0100 + +mame (0.263+dfsg.1-1) unstable; urgency=medium * New upstream release. diff -Nru mame-0.263+dfsg.1/docs/source/commandline/commandline-all.rst mame-0.264+dfsg.1/docs/source/commandline/commandline-all.rst --- mame-0.263+dfsg.1/docs/source/commandline/commandline-all.rst 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/source/commandline/commandline-all.rst 2024-03-25 14:00:46.000000000 +0000 @@ -3989,7 +3989,7 @@ Specifies the type of UI to use, either ``simple`` or ``cabinet``. - The default is Cabinet (**-ui cabinet**). + The default is cabinet (**-ui cabinet**). Example: .. code-block:: bash @@ -4025,9 +4025,9 @@ **\-[no]ui_mouse** - Displays a mouse cursor when using the built-in UI for MAME. + Displays a mouse cursor when using the built-in MAME user interface. - The default is (**-noui_mouse**). + The default is ON (**-ui_mouse**). .. _mame-commandline-language: diff -Nru mame-0.263+dfsg.1/docs/source/conf.py mame-0.264+dfsg.1/docs/source/conf.py --- mame-0.263+dfsg.1/docs/source/conf.py 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/source/conf.py 2024-03-25 14:00:46.000000000 +0000 @@ -63,9 +63,9 @@ # built documents. # # The short X.Y version. -version = '0.263' +version = '0.264' # The full version, including alpha/beta/rc tags. -release = '0.263' +release = '0.264' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff -Nru mame-0.263+dfsg.1/docs/source/debugger/general.rst mame-0.264+dfsg.1/docs/source/debugger/general.rst --- mame-0.263+dfsg.1/docs/source/debugger/general.rst 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/source/debugger/general.rst 2024-03-25 14:00:46.000000000 +0000 @@ -190,15 +190,22 @@ %c Prints the corresponding argument as an 8-bit character. -%[0][]d +%[-][0][]d Prints the corresponding argument as a decimal number with optional - minimum field width and zero fill. -%[0][]o + left justification, zero fill and minimum field width. +%[-][0][]o Prints the corresponding argument as an octal number with optional - minimum field width and zero fill using lowercase letters. -%[0][]x - Prints the corresponding argument as a hexadecimal number with - optional minimum field width and zero fill using uppercase letters. + left justification, zero fill and minimum field width. +%[-][0][]x + Prints the corresponding argument as a lowercase hexadecimal number + with optional left justification, zero fill and minimum field width. +%[-][0][]X + Prints the corresponding argument as an uppercase hexadecimal number + with optional left justification, zero fill and minimum field width. +%[-][][.[]]s + Prints a null-terminated string of 8-bit characters from the address + and address space given by the corresponding argument, with optional + left justification, minimum and maximum field widths. \%% Prints a literal percent symbol. \\n diff -Nru mame-0.263+dfsg.1/docs/source/initialsetup/compilingmame.rst mame-0.264+dfsg.1/docs/source/initialsetup/compilingmame.rst --- mame-0.263+dfsg.1/docs/source/initialsetup/compilingmame.rst 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/source/initialsetup/compilingmame.rst 2024-03-25 14:00:46.000000000 +0000 @@ -559,6 +559,10 @@ TOOLS Set to **1** to build additional tools along with the emulator, including **unidasm**, **chdman**, **romcmp**, and **srcclean**. +EMULATOR + When set to **0**, the main emulator target will not be created. This is + intended to be used in conjunction with setting **TOOLS** to **1** to build + the additional tools without building the emulator. NO_OPENGL Set to **1** to disable building the OpenGL video output module. NO_USE_PORTAUDIO diff -Nru mame-0.263+dfsg.1/docs/swlist/n64jp.csv mame-0.264+dfsg.1/docs/swlist/n64jp.csv --- mame-0.263+dfsg.1/docs/swlist/n64jp.csv 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/swlist/n64jp.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -ZIP Name,Last MAME version tested,Game Flags,Additional Notes -1080snowu,,1, -64oozum2,,0, -fzeroxj,,1, -hiryuken,,1, -jikkjlea,,1,Screen image looks too dark. Missing fog? -starfoxj,,0, -sm64j,,0, -yoshistoj,,0, -007goldnj,,0, -64dhtama,,0, -64hana,,0, -64oozumo,,0, -64trumpc,,0, -aerogaugjd,,0, -aerogaugj,,0, -aishogi3,,0, -airboardj,,0, -akumajo,,0, -akumajog,,0, -bakubomb,,0, -bakubom2,,0, -bangaioh,,0, -bakushou,,0, -banjokazj,,0, -banjotooj,,0, -bassrush,,0, -beetlearj,,0, -biohaz2,,0, -blastdoz,,0, -bokujom2,,0, -bokujom2a,,0, -bokujom2b,,0, -bombmnae,,0, -bombheroj,,0, -buckbumbj,,0, -chtwistj,,0, -chtwist2j,,0, -choroq,,0, -choroq2,,0, -cknight,,0, -cknight2,,0, -snobokd2j,,0, -citytour,,0, -custrobo,,0, -custrob2,,0, -ddrdisny,,0, -dendeg64,,1, -dstall64p,,0, -dstall64,,0, -dezaemon,,1,Mouse doesn't work? -dkracingj,,0, -dk64j,,0, -doom64j,,3,Black screen after initial disclaimer. -doraemon,,0, -doraemn2,,0, -doraemn3,,0, -doubutsu,,0, -dualheroj,,0, -eikousa,,0, -eltale,,1,(Barely tested) -excitbikj,,0, -extremegj,,0, -extremg2j,,0, -f1wgpj,,0, -famista,,0, -fifa98j,,0, -fightcup,,1, -furaish2,,1, -gaspj,,0, -ggoemddd,,0, -ggoemneo,,0, -olymp2k,,0, -gauntlegj,,0, -gettlove,,0, -goemnsug,,0, -hamstmon,,0, -harukana,,3,Has mirrored gfx. eventually leads to a RSP assert -heiwapw,,0, -hexenj,,3,No 3d graphics including enemies. -kirby64j,,3,Black screen at Level 1 -kirby64j1,,0, -kirby64j2,,0, -kirby64j3,,0, -humangp,,0, -hybridhj,,2,Asserts if throttled. garbled text -naganoj,,0, -ideyosuk,,3,Black screen. access 0x1ff00000 area (debug ROM?) -iggyreckj,,0, -itoishig,,0, -jldyna64,,0, -jleleven,,0, -jllive64,,0, -jltactic,,0, -jltactic1,,0, -jangsim,,0, -jikkg1,,0, -jikkg1a,,0, -jikkjl99,,0, -jikkjl99a,,0, -powyak2k,,0, -powyak2ka,,0, -powyak4,,0, -powyak4a,,0, -powyak5,,0, -powyak5a,,0, -powyak5b,,0, -powyak6,,0, -powyak6a,,0, -powyak6b,,0, -powyk2k1,,0, -powyk2k1a,,0, -jikksc98,,0, -jikksc98a,,0, -jikksc98b,,0, -jikkscr3,,0, -turokj,,0, -jinsei64,,0, -daikatanj,,0, -fcmaniax,,0, -kinghill,,0, -kiratt64,,0, -knifeedgj,,0, -lastleg,,0, -letsmash,,0, -ldrun3dj,,0, -mtetriscj,,0, -mahjong,,0, -mjhoroki,,0, -mjmaster,,0, -marioglfj,,0, -marioglfj1,,0, -mariokrtj,,0, -mariokrtj1,,0, -mariopho,,0, -marioparj,,0, -mariopr2j,,0, -mariopr3j,,0, -mariosto,,0, -mariotenj,,0, -mickspedj,,0, -moritash,,0, -mrcj,,0, -nbazon98j,,0, -nbazone2,,0, -evangeln,,3,Black screen. -nintama,,0, -smashbroj,,0, -nustsu64,,0, -nustsu64a,,0, -nusts64s,,0, -ogrebatlj,,2,Flipped hand icon. -olymph98j,,0, -onegai,,0, -pachinko,,0, -parlrpro,,0, -pdultram,,0, -pdarkj,,0, -pikachu,,0, -pilotwinj,,0, -pokesnapj,,0, -pokestdj,,0, -pokestd2j,,0, -pokestdk,,0, -pleague,,0, -mjkiwame,,1, -mjkiwame1,,0, -mjtsuwa,,0, -puyopuy4,,1,(Not tested all features) -puyopsun,,1, -pbobble,,0, -rakugaj,,0, -rally99,,0, -robotpon,,3,Heavy gfx artifacts. eventually leads to black screen -rockmand,,0, -saikyou,,0, -sdhiryu,,0, -shadgatej,,0, -sprowres,,0, -sprowrs2,,0, -simcit2k,,0, -snobokidj,,0, -snowsped,,0, -sonicwing,,0, -spacedyn,,0, -ssiliconj,,0, -starsoldj,,0, -startwin,,0, -swshutsu,,0, -swteiko,,0, -swracerj,,0, -sbdaman,,0, -sbowlingj,,0, -sm64jse,,0, -srobospi,mame0163-159-gf2891c8,1,Wrong foreground text during battle -srobot64,,1,Minor gfx artifacts with some elements (stripped textures) -ssrace64,,0, -puzldama,,0, -tetris64,,3,White screen -toonpan,,0, -tghj,,0, -tgoverdrj,,0, -tgrallyj,,0, -tgrally2j,,0, -beastwarj,,0, -tsumibat,,0, -utchan,,0, -vrally99j,,0, -vkiller,,0, -vprowrs2,,0, -vprowres,,0, -waveracej,,0, -waveracej1,,0, -waveracej2,,0, -wg3dhj,,0, -wetrixj,,0, -wildchop,,0, -winbackj,,0, -winbackj1,,0, -wprojj2,,0, -wmania2kj,,0, -yakouch2,,0, -yukeyuke,,0, -zeldamajj,,0, -zeldamajj1,,0, -zeldaootj,,0, -zeldaootj1,,0, -zeldaootj2,,0, -zool,,0, -zeldaootmqj,,0, -zeldaootj3,,0, -zeldamajj2,,0, -64gbchk,,2,Doesn't seem to do anything useful. -photovw,,0, -u64demo,,0, -dlpnctrl,,2,Doesn't seem to do anything. diff -Nru mame-0.263+dfsg.1/docs/swlist/readme.txt mame-0.264+dfsg.1/docs/swlist/readme.txt --- mame-0.263+dfsg.1/docs/swlist/readme.txt 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/swlist/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -Compatibility lists for console/computers in MAME, in CSV format. - -File format for a single line is: -;;;\n - - are in integer format, these are: -0 - Not Tested -1 - Working -2 - Partial -3 - Not Working diff -Nru mame-0.263+dfsg.1/docs/swlist/x1_flop.csv mame-0.264+dfsg.1/docs/swlist/x1_flop.csv --- mame-0.263+dfsg.1/docs/swlist/x1_flop.csv 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/swlist/x1_flop.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,375 +0,0 @@ -ZIP Name,Last MAME version tested,Game Flags,Additional Notes -177,,0, -1942,,0, -4thunit,,0, -aressha,,0, -advfant,,0, -advfantd,,0, -alpha,,0, -amtruck,,0, -aokiooka,,0, -arcus,,0, -argo,,0, -arion,,0, -aspicsp,,0, -aztec,,0, -batlcity,,0, -blckonyx,,0, -bokensha,,0, -bosco,,0, -bbreaker,,0, -carmine,,0, -chackn,,0, -cprowsp,,0, -crimson,,0, -crimsona,,0, -blassty,,0, -dside,,0, -daisenr,,0, -daisenra,,0, -daiva,,0, -daivaa,,0, -dezeniwl,,0, -diablo,,0, -megamit,,0, -megamitb,,0, -megamita,,0, -dbuster,,0, -euphory,,0, -exoa2,,0, -fantsian,,0, -murdclub,,0, -fzone,,0, -fzonea,,0, -gaiamons,,0, -gaiflame,,0, -galforce,,0, -gambler,,1, -gambler2,,1, -gamma5,,0, -gandhara,,0, -goonies,,0, -gradius,,0, -gradiusa,,0, -gradiusb,,0, -gradiusk,,0, -gruppe,,0, -hajafuin,,0, -herzog,,0, -hokuto,,0, -hfox,,0, -hfoxa,,0, -hfox2,,0, -hydlide,,0, -hydlidea,,0, -hydlide2,,0, -hydlide2a,,0, -hydlide2b,,0, -hydlide3,,0, -hydlide3a,,0, -hydlide3b,,0, -jesus,,0, -jesusd,,0, -legkage,,0, -karuizaw,,0, -kingkngt,,0, -powermj,,0, -kugyokud,,0, -kugyokuda,,0, -lagrange,,0, -laplace,,0, -lasvegas,,0, -lastarmg,,0, -ldrun,,0, -lostpow,,0, -lunacity,,0, -lupin,,0, -luxsor,,0, -mule,,0, -mulea,,0, -mjkyojs,,0, -maidum,,0, -maiduma,,0, -mikkoku,,0, -mikkokuk,,0, -majavent,,0, -makaifuk,,0, -manilove,,0, -manhatrq,,0, -mappy,,0, -mightmag,,0, -mrproy88,,0, -mugen2,,0, -valis,,0, -nobunaga,,0, -nobuseng,,0, -nobuzenk,,0, -ojibinbm,,0, -ojibinbma,,0, -ojibinbmb,,0, -orbit3,,0, -outroyd,,0, -outroyda,,0, -phantas,,0, -profmj,,0, -psyoblad,,0, -relics,,0, -reviver,,0, -revolty2,,0, -riglas,,0, -robowres,,0, -romancia,,0, -romanciaa,,0, -sangoku2,,0, -sangoku2a,,0, -screamer,,0, -seijoden,,0, -seijodena,,0, -seijopan,,0, -seijopana,,0, -shanghai,,0, -shanghaia,,0, -skugyokd,,0, -shintake,,0, -sofia,,0, -silvergh,,0, -sorcer,,0, -sorcera,,0, -gilgasor,,0, -sorcerexp4,,0, -sorcerexp,,0, -sorcerexp2,,0, -sorcerexp3,,0, -sorcersel1,,0, -sorcersel2,,0, -sorcersel3,,0, -sorcersel4,,0, -sorcersel5,,0, -sorcerutil,,0, -sorcerutila,,0, -sorcermd,,0, -sharrier,,0, -sharriera,,0, -spchange,,0, -spyvsspy,,0, -scruiser,,0, -suikoden,,0, -slaydock,,0, -slaydocka,,0, -slaydocm,,0, -smbsp,,0, -smbspa,,0, -asteka2,,0, -tankent2,,0, -tetris,,0, -thexder,,0, -thndrbal,,0, -timepara,,0, -tokyo,,0, -tokyons,,0, -topzip,,0, -druaga,,0, -toypop,,0, -triton,,0, -trumpkyo,,0, -ultima4,,0, -ultima4a,,0, -uootoy,,0, -victnine,,0, -wibarm,,0, -wibarma,,0, -will,,0, -wingman,,0, -wingman2,,0, -wizardry,,0, -wizardr2,,0, -wizardr4,,0, -woodypoc,,0, -woodypoca,,0, -woodypocb,,0, -worldgl2,,0, -xanadu,,0, -xanadu2,,0, -ys,,0, -ys2,,0, -zeliard,,0, -algarna,,0, -bastard,,0, -mars,,0, -marsa,,0, -marsb,,0, -darkstrm,,0, -dezeni,,0, -dezenia,,0, -dialide,,0, -dialidea,,0, -dione,,0, -dslayer,,0, -fairires,,0, -5sdream,,0, -frontlin,,0, -galaga,,0, -galaxian,,0, -gatlabyr,,0, -hyprol84,,0, -irohanih,,0, -issural,,0, -knither,,0, -labyrint,,0, -lizard,,0, -lovechas,,0, -lovechasa,,0, -marvels,,0, -marvelsa,,0, -marvelsb,,0, -mikichan,,0, -newtype,,0, -newtypea,,0, -punchbal,,0, -poplemon,,0, -portopia,,0, -rwings,,0, -saziri,,0, -saziria,,0, -state,,0, -bshashsc,,0, -tforce,,0, -vip,,0, -vipa,,0, -vipb,,0, -vipc,,0, -vipd,,0, -wizardr3,,0, -xevious,,0, -xeviousa,,0, -ys3,,0, -zeta5,,0, -pstar2,,0, -dokkin,,0, -triviaq,,0, -namcovgm,,0, -kudokika,,0, -sayaka,,0, -moritash,,0, -emono1,,0, -tenshit,,0, -albatros,,0, -albatrosx,,0, -albatrosjc,,0, -albatrosv,,0, -albatrosw,,0, -arctic,,0, -asteka,,0, -balonfgt,,0, -btanuki,,0, -bgorilla,,0, -byaku,,0, -casablan,,0, -csoldier,,0, -dome,,0, -donjuan,,0, -elthlead,,0, -golques,,0, -gyrodine,,0, -afterdrk,,0, -hayato,,0, -hotdog,,0, -ishinara,,0, -jotunn,,0, -kaleidos,,0, -kohakuir,,0, -laptick,,0, -lastwar,,0, -legend,,0, -madelein,,0, -melonsod,,0, -nukenind,,0, -penguinw,,0, -produce,,0, -rebirth,,0, -srambo,,0, -sirius1,,0, -sangoku,,0, -satsujin,,0, -kissmurd,,0, -sf3dopv,,0, -startrap,,0, -uruseiya,,0, -zgundam,,0, -eggyd,,0, -yaksadem,,0, -x1demo,,0, -x1cdemo,,0, -x1demoa,,0, -x1fdemo,,0, -x1gdemo,,0, -x1gdemoa,,0, -x1tdemo,,0, -srdemo,,0, -hubasic1,,0, -hubasic2,,0, -turbobas,,0, -turbobasa,,0, -turbzbas,,0, -tapbas,,0, -dbbasic,,0, -cpm22,,0, -swordos,,0, -swordosa,,0, -jodanos,,0, -jodanosa,,0, -xdos,,0, -extrahyp,,0, -extrahypa,,0, -hyperdsk,,0, -jetterm,,0, -filemast,,0, -tap2dsk,,0, -graphtol,,0, -newfmdrv,,0, -davinci,,0, -expertx1,,0, -dskanlzr,,0, -fmdata,,0, -unk_fl1,,0, -blank,,0, -basic1,,0, -basic2,,0, -game6,,0, -game01,,0, -game02,,0, -game03,,0, -game04,,0, -game05,,0, -game06,,0, -game07,,0, -game08,,0, -game09,,0, -game10,,0, -game11,,0, -game12,,0, -game13,,0, -game14,,0, -game15,,0, -game16,,0, -game17,,0, -game18,,0, -game19,,0, -game20,,0, -x1gmpk1,,0, -x1gmpk2,,0, -x1gmpk3,,0, -casgame1,,0, -casgame2,,0, -gamee,,0, -gameea,,0, -gamepck1,,0, -gamepck2,,0, -gamepck3,,0, -gamepck4,,0, -gamepk1,,0, -gamepk2,,0, -jodanpk1,,0, -mbm,,0, -uedabgm1,,0, -uedabgm2,,0, diff -Nru mame-0.263+dfsg.1/docs/swlist/x68k_flop.csv mame-0.264+dfsg.1/docs/swlist/x68k_flop.csv --- mame-0.263+dfsg.1/docs/swlist/x68k_flop.csv 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/docs/swlist/x68k_flop.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,1784 +0,0 @@ -177;;1; -2069ad;;1; -3takun;;0; -38mankk;;1; -4thunit;;0; -4thunit2;;0; -dualtarg;;0; -zero;;0; -dagain;;0; -aressha2;;0; -aressh2o;;0; -aressha3;;0; -aressha3mc;;0; -aressha3mc1;;0; -aressha3log;;0; -aressha3oms;;0; -aburner2;;0; -acombat2;;0; -airmanag;;0; -ajax;;0; -akiko;;0; -akumajo;;1; -akumajod;;0; -alfaim;;0; -algarna;;0; -alice;;0; -alice2;;0; -aliensyn;;1; -abart1;;0; -abart2;;0; -abart3;;0; -abart4;;0; -alshark;;0; -ambiv;;0; -animjv3;;0; -animjv3d;;0; -animjv3da;;0; -animjv3t;;0; -genchohi;;0; -genghis;;0; -aquales;;0; -arcshu;;0; -arcusod;;0; -arcus;;0; -arcus2;;0; -argos;;0; -arknoid2;;0; -votoms;;0; -votomsd;;0; -artemis;;0; -atomrobo;;0; -asuka120;;0; -chelnov;;0; -ayumimon;;0; -baraduke;;0; -barufuku;;0; -btlchess;;0; -btech;;0; -beast;;0; -beast2;;0; -bellaven;;0; -bellavn2;;0; -peachang;;0; -peachangd;;0; -birdywld;;0; -cgdai1;;0; -cgdai2;;0; -bgfxd1;;0; -bgfxd2;;0; -bgfxd3;;0; -bgfxd4;;0; -bgfxd5;;0; -bgfxd6;;0; -bshashms;;0; -blitzkrg;;0; -blodia;;0; -bombermn;;0; -bnzabros;;0; -bonnoyob;;0; -bonnoyo2;;0; -bonnoyo3;;0; -bosco;;0; -branmrkr;;0; -bretonne;;0; -bretsce1;;0; -bretsce2;;0; -bretsce3;;0; -bretscen;;0; -bublbobl;;0; -butasan;;0; -byakuya;;0; -cal;;0; -cal2;;0; -cameltry;;0; -cancanb;;0; -cancanbs;;0; -cancanbp;;0; -cancanbe;;0; -carat;;0; -caroll;;0; -casablan;;0; -castles;;0; -catsp1;;0; -chaossb;;0; -chasehq;;0; -chinmoku;;0; -choubang;;0; -choujin;;0; -choujind;;0; -chukatai;;0; -cinderel;;0; -cockpit;;0; -codezero;;1;wrong scrolling effect for title screen, player explosion looks bad -collectd;;0; -columns;;0; -cntinent;;0; -cospsyco;;0; -cotton;;0; -cclimber;;0; -crescent;;0; -cuarto;;0; -cuberunr;;0; -cybrbloc;;0; -cybrcore;;0; -dodokid1;;0; -dodokid2;;0; -dodokid3;;0; -dodokid4;;0; -dodokid5;;0; -dreturn;;0; -daikokai;;0; -daimakai;;2;CRT Mode 2 causes offsetted sprites -daisenr2;;0; -daisenr3;;0; -daisenr3d;;0; -daisenr3mc1;;0; -daisenr3mc2;;0; -daikaint;;0; -daikains;;0; -dalk;;0; -darwin;;0; -dashyar;;0; -kyoko;;0; -deja;;0; -deadbrn;;0; -deathbra;;0; -dbringer;;0; -deflektr;;1; -cybwrite;;0; -cybwrites1;;0; -dtwinbee;;0; -dtwinbeed;;0; -diebahn;;0; -digdug;;0; -dinoland;;0; -dios;;0; -dokicard;;0; -dome;;0; -albion;;0; -dor;;0; -dor2;;0; -dor3;;0; -dorse93;;0; -dorsesak;;0; -dbleagle;;0; -dokyusei;;0; -downtown;;0; -drstop;;0; -drachaku;;0; -dragon;;0; -dbuster;;0; -drgcityx;;0; -drageyes;;0; -dknight;;0; -dknight2;;0; -dknight3;;0; -dknight4;;0; -dslayed;;0; -dspirit;;0; -drgnwars;;0; -drgstrik;;0; -drakkhen;;0; -dngmster;;0; -dynduke;;0; -eikan;;0; -elle;;0; -emerald;;0; -emeraldd;;0; -emperor;;0; -entfuhr;;0; -etoile;;0; -eurosens;;0; -evilstn;;0; -evilstnk;;0; -excthour;;0; -exon;;0; -exterlin;;0; -f15se2;;0; -flstory;;0; -fairytk;;0; -fantzone;;0; -farside;;0; -ffight;;0; -fqueen2;;0; -flappy2;;0; -foxy2;;0; -fruitfld;;0; -fss;;0; -fullthrt;;0; -fushikab;;0; -nadia;;0; -nadiamfd;;0; -futwars;;0; -fzsenki;;0; -gr;;0; -gakubomb;;0; -galaga88;;0; -gamejang;;0; -gammapl;;0; -garou;;0; -garou2;;0; -garousp;;0; -gaudi;;0; -gemini;;0; -genjuki;;0; -genocide;;0; -genocid2;;0; -genocid2d;;0; -genpei;;0; -geoseal;;0; -geoseald;;0; -gingaed;;0; -gingaed2;;0; -ginga2dx;;0; -gingpow;;0; -girlpara;;0; -gizexix;;0; -gokichi;;0; -gorakuin;;0; -gradius;;0; -gradius2;;0; -gramcat2;;0; -granada;;0; -granadad;;0; -grandifl;;0; -grndmast;;0; -groupx;;0; -glyeward;;0; -gunship;;0; -ayayo;;0; -ayayo2;;0; -ayayo3;;0; -hanayori;;0; -hanayor2;;0; -hanahour;;0; -hanateng;;0; -haresawa;;0; -heavynov;;0; -himihana;;0; -fshark;;0; -fsharkd;;0; -elthlead;;0; -hoshisun;;0; -hoshisu2;;0; -hotelwar;;0; -hhunt1;;0; -hhunt2;;0; -hhunt3;;0; -hhunt6;;0; -hhunt11;;0; -manyrobo;;0; -hydlide3;;0; -illumina;;0; -illcity;;0; -image;;0; -imagefig;;0; -imitatn;;0; -imperial;;0; -inindo;;0; -irohanih;;0; -ishido;;0; -ishinara;;0; -kissmurd;;0; -murdcldx;;0; -manhatrq;;0; -nicklaus;;0; -nicklausc1;;0; -nicklausc2;;0; -janjaka;;0; -jane;;0; -jangou1;;0; -jangou2;;0; -janshqst;;0; -janshqstd;;0; -jesus2;;0; -billiard;;0; -joker;;0; -joker2;;0; -joshidol;;0; -joshua;;0; -kaerimic;;0; -kareinar;;0; -kawaichi;;0; -keeper;;0; -kensoson;;0; -kerakera;;0; -kibunpas;;0; -sap2;;0; -kikoshid;;0; -kikoshidd;;0; -kimidake;;0; -chicago;;0; -kitahei;;0; -kiwame;;0; -klax;;0; -knghtarm;;0; -knghtarmd;;0; -kohakuir;;0; -powermj2;;0; -koberenm;;0; -noriko;;0; -kouryuuk;;0; -ku2;;0; -ku2fr;;0; -kurukaji;;0; -kudokika;;0; -kudokik2;;0; -ktiger;;0; -lagoon;;0; -lammal;;0; -laplace;;0; -lasvegas;;0; -lastarmg;;0; -lastbat;;0; -lastbatd;;0; -leadingc;;0; -lemmings;;0; -lenam;;0; -libbler;;0; -libido7;;0; -lifendth;;0; -lightbac;;0; -lipsadv;;0; -lipsadv3;;0; -lipsadv2;;0; -lodossfk;;0; -lodoss;;0; -lodoss2;;0; -ldb_x68k;;0; -looperas;;0; -loopz;;0; -lovelyho;;0; -lua;;0; -lucyshot;;0; -madstlkr;;0; -magshot;;0; -mjclinic;;0; -mjfantas;;0; -mjkyojs;;0; -mjmaster;;0; -mjsaikyo;;0; -mjyuench;;0; -mahoudai;;0; -mai;;0; -mikkokuk;;0; -majinkyu;;0; -kumiko;;0; -manilove;;0; -marble;;0; -marchen;;0; -marchenp;;0; -marinebs;;0; -mariridx;;0; -martlage;;0; -mastmon2;;0; -mayumi;;0; -megalo;;0; -mercury;;0; -metaleye;;0; -metalsig;;0; -mclown;;0; -midgarts;;0; -mightmag;;0; -milktime;;0; -mirage;;0; -misty1;;0; -misty2;;0; -misty3;;0; -misty4;;0; -misty5;;0; -misty6;;0; -misty7;;0; -gundamco;;0; -momo;;0; -mooncrst;;0; -moonligt;;0; -mooncrys;;0; -moritas2;;0; -motos;;0; -mrdo;;0; -valis2;;0; -valis2d;;0; -myeyes;;0; -myeyesa;;0; -naious;;0; -namachuk;;0; -namcovgm;;0; -nectaris;;0; -nejishik;;0; -nejishikd;;0; -nekdodge;;0; -neksoccr;;0; -nemesis;;0; -nemesisd;;0; -neurgear;;0; -n3dgaugu;;0; -n3dg8lak;;0; -tnzs;;0; -nicoll;;0; -nikoniko;;0; -noah;;0; -noblemnd;;0; -nobubufu;;0; -nobuhao;;0; -nobuseng;;0; -nobuzenk;;0; -nost1907;;0; -ohpai;;0; -okumanch;;0; -olteus2;;0; -oedohanj;;0; -orangeib;;0; -ougonras;;0; -overtake;;0; -pacland;;0; -pacmania;;0; -pachinko;;0; -parodius;;0; -parodiusd;;0; -purplcat;;0; -purplct3;;0; -purupuru;;0; -phalanx;;0; -phantas3;;0; -phantas4;;0; -pias;;0; -pbpinbal;;0; -pinky1;;0; -pinkypon;;0; -pinkypn2;;0; -pinkypn3;;0; -pipedrem;;0; -pipyan;;0; -pitapat;;0; -ponyon;;0; -populous;;0; -populus2;;0; -populopl;;0; -pleague;;0; -pmonger;;0; -premium;;0; -premium2;;0; -present;;0; -present2;;0; -prettydl;;0; -ppersia;;0; -princess;;0; -prosoccr;;0; -prostudg;;0; -ptennwc;;0; -proyak;;0; -prodmang;;0; -profmjg;;0; -puppetsh;;0; -puyopuyo;;0; -puyopuyod;;0; -puzznic;;0; -quarters;;0; -quarth;;0; -quenduel;;0; -quintia;;0; -quizbanc;;0; -quiztori;;0; -rcrobotc;;0; -rcrobot2;;0; -rcrobot3;;0; -rcrobot4;;0; -rtype;;0; -rance3;;0; -raygun;;0; -reichsr;;0; -reinforc;;0; -relics;;0; -review;;0; -rtishtar;;0; -ringmst;;0; -ringmst2;;0; -tanba;;0; -risinsun;;0; -rogueall;;0; -rouge;;0; -royalbld;;0; -runewort;;0; -ryunaki;;0; -ryukyu;;0; -sabnack;;0; -salamand;;0; -sangoku;;0; -sangoku3;;0; -saori;;0; -saotome;;0; -saotome2;;0; -sap;;0; -schwarzs;;0; -scorpius;;0; -sekakimi;;0; -shanghai;;0; -shanghaiod;;0; -shangh2;;0; -shangh2d;;0; -shangrli;;0; -shangr2;;0; -shangr2s;;0; -shootrng;;0; -shoot68k;;0; -shogisei;;0; -shojoden;;0; -shflpuck;;0; -signchou;;0; -silentmb;;0; -simant;;0; -simcity;;1; -simcitycd2;;0; -simcitycd1;;0; -simcityed;;0; -simcitylog;;0; -simearth;;0; -slimyer;;0; -softhard;;0; -softhrd2;;0; -solfeace;;0; -soniclnk;;0; -sotsugyo;;0; -sotsugym;;0; -sokoperf;;0; -cannonsg;;0; -sharrier;;0; -spcrogue;;0; -spindiz2;;0; -spindiz2d;;0; -squarers;;0; -scruiser;;0; -starfrce;;0; -starlust;;0; -starmobl;;0; -startrad;;0; -starwars;;0; -starship;;0; -strawdsn;;0; -sf2ce;;0; -strider;;0; -suikoden;;0; -superdps;;0; -supdaisn;;0; -supdaisnmc;;0; -supdaisnpk;;0; -shangon;;1;Back layer pen issues. -slasvegs;;0; -slasveg2;;0; -sshangh;;0; -srmp23;;0; -srmp4;;0; -ssf2;;0; -ssf2a;;0; -sweetang;;0; -sweetemo;;0; -syvalion;;0; -tdf;;0; -taiheiyo;;0; -taikoris;;0; -teiketsu;;0; -telenetm;;0; -tenkatou;;0; -tenkatoud;;0; -tenkyuh;;0; -tenkyusp;;0; -tenshinr;;0; -tenshi3r;;0; -tensh3bh;;0; -tenshi4;;0; -tenshi6;;0; -tessera;;0; -tetris;;0; -thanatos;;0; -thrice;;0; -tblade;;0; -tf2;;0; -tf2d;;0; -tokimecb;;0; -tokyojs1;;0; -tokyojs2;;0; -bakkonst;;0; -bakkons2;;0; -toshinto;;0; -toshintoh;;0; -trilogyk;;0; -tricornf;;0; -tsukagag;;0; -tunnelst;;0; -twilight;;0; -twiligh3;;0; -twiligh4;;0; -twinbee;;0; -usvball;;0; -ujincol;;0; -funnybee;;0; -ukbusin;;0; -ultima4;;0; -ultima5;;0; -ultima6;;0; -urotsuki;;0; -vampireh;;0; -versnag;;0; -viewpoin;;0; -viperv6t;;0; -viperv8t;;0; -willdeng;;0; -warning;;0; -wings;;0; -winpost;;0; -wordwort;;0; -worldgl3;;0; -savagemp;;0; -wrestan3;;0; -wrestans;;0; -xak;;0; -xenon2;;0; -xevious;;0; -xeviousd;;0; -xna;;0; -yajiuma;;0; -yajiuma90;;0; -yamikets;;0; -yamiket2;;0; -yaritai1;;0; -yaritai2;;0; -yesterd;;0; -yorutens;;0; -yojuclub;;0; -yojuclb2;;0; -yoju2048;;0; -ys;;0; -ys3;;0; -zan;;0; -zansc1;;0; -zansc2;;0; -zark;;0; -zavas;;0; -zenkaidn;;0; -abunaten;;0; -cresmoon;;0; -dps;;0; -dpssg;;0; -dpssg2;;0; -dpssg3;;0; -rance;;0; -rance2;;0; -pacman;;0; -human68k;;0; -human68ka;;0; -human68kb;;0; -human68k_301;;0; -human68k_301a;;0; -human68k_301b;;0; -human68k_202;;0; -human68k_201;;0; -human68k_20x;;0; -sxwin31;;0; -sxwin31a;;0; -sxwin30;;0; -sxwin20;;0; -sxwin10;;0; -sxwkkit;;0; -os9;;0; -os9cpro;;0; -kowindow;;0; -kowinap1;;0; -kowinap2;;0; -kowinap3;;0; -kowinap4;;0; -backpama;;0; -backppro;;0; -backupp1;;0; -business;;0; -ccompilr;;0; -ccompilr210;;0; -ccompilr200;;0; -ctrace;;0; -canvas;;0; -canvasgl1;;0; -canvasgl2;;0; -cardpro;;0; -cdrom;;0; -communic;;0; -physicn;;0; -copyaid;;0; -cybrnote;;0; -cyclone;;0; -cyclonea;;0; -des;;0; -easydraw;;0; -easypnt;;0; -ewword;;0; -expansfdo;;0; -expansfd;;0; -fcalc;;0; -fcardgt;;0; -filem1g;;0; -filem2g;;0; -filem3g;;0; -filem4g;;0; -filem5g;;0; -filem6g;;0; -filem7g;;0; -filemst100;;0; -filemst100a;;0; -filemst110;;0; -filemst110a;;0; -filemst;;0; -fileprof;;0; -final;;0; -fixer100;;0; -fixer;;0; -formul68;;0; -easygfxt;;0; -gyopicha;;0; -honyakuh;;0; -hostpro;;0; -hotfile1;;0; -hotfile5;;0; -hotfile6;;0; -hotfile7;;0; -hyperudv;;0; -hyperwor;;0; -itekomas;;0; -kamikaze;;0; -kiss;;0; -konetjk1;;0; -konetjk2;;0; -lzd;;0; -lzh;;0; -magicpal;;0; -matier10;;0; -matier20;;0; -matier;;0; -messiah;;0; -mu1;;0; -multiwrd;;0; -musicpro;;0; -musicmid;;0; -musicstd;;0; -necodemo;;0; -newprint;;0; -newprintgl1;;0; -newprintgl2;;0; -newprintgc;;0; -newprnt2;;0; -nihonwp;;0; -pattern;;0; -personal;;0; -polyphon;;0; -prism68k;;0; -sampling;;0; -scsiutil;;0; -soundpro;;0; -spritedt;;0; -statnary;;0; -ssurgeon;;0; -teleport;;0; -terazzos;;0; -termin;;0; -termin2;;0; -toystool;;0; -twincp1;;0; -twincp10;;0; -wetpaint;;0; -wetpain2;;0; -wetpain3;;0; -windex;;0; -x68kcoll;;0; -x68kcolla;;0; -x68kace;;0; -x68kacea;;0; -x68kdev;;0; -x68kfree;;0; -x68klibc;;0; -x68lscan;;0; -x68mlang;;0; -x68ktex;;0; -xbas2c;;0; -zpro68kv1;;0; -zpro68kv2;;0; -zpro68k;;0; -zxvi68k;;0; -triphodc;;0; -sion;;0; -sion2;;0; -sion4;;0; -brain31;;0; -brain32;;0; -brain33;;0; -brain34;;0; -brain35;;0; -carrot8;;0; -carrot9;;0; -carrot11;;0; -carrot13;;0; -carrot14;;0; -carrot15;;0; -carrot16;;0; -carrot18;;0; -elfgraf;;0; -dennocbi;;0; -dennocc1;;0; -dennocc2;;0; -dennocc3;;0; -dennocji;;0; -dennocjn;;0; -dennoc01;;0; -dennoc02;;0; -dennoc03;;0; -dennoc04;;0; -dennoc05;;0; -dennoc06;;0; -dennoc07;;0; -dennoc08;;0; -dennoc09;;0; -dennoc10;;0; -dennoc11;;0; -dennoc12;;0; -dennoc13;;0; -dennoc14;;0; -dennoc15;;0; -dennoc16;;0; -dennoc17;;0; -dennoc18;;0; -dennoc19;;0; -dennoc20;;0; -dennoc21;;0; -dennoc22;;0; -dennoc23;;0; -dennoc24;;0; -dennoc25;;0; -dennoc26;;0; -dennoc27;;0; -dennoc28;;0; -dennoc29;;0; -dennoc30;;0; -dennoc31;;0; -dennoc32;;0; -dennoc33;;0; -dennoc34;;0; -dennoc35;;0; -dennoc36;;0; -dennoc37;;0; -dennoc38;;0; -dennoc39;;0; -dennoc40;;0; -dennoc41;;0; -dennoc42;;0; -dennoc43;;0; -dennoc44;;0; -dennoc45;;0; -dennoc46;;0; -dennoc47;;0; -dennoc48;;0; -dennoc49;;0; -dennoc50;;0; -dennoc51;;0; -dennoc52;;0; -dennoc53;;0; -dennoc54;;0; -dennoc55;;0; -dennoc56;;0; -dennoc57;;0; -dennoc58;;0; -dennoc59;;0; -dennoc60;;0; -dennoc61;;0; -dennoc62;;0; -dennoc63;;0; -dennoc64;;0; -dennoc65;;0; -dennoc66;;0; -dennoc67;;0; -dennoc68;;0; -dennoc69;;0; -dennoc70;;0; -dennoc71;;0; -dennoc72;;0; -dennoc73;;0; -dennoc74;;0; -dennoc75;;0; -dennoc76;;0; -dennoc77;;0; -dennoc78;;0; -dennoc79;;0; -dennoc80;;0; -dennoc81;;0; -dennoc82;;0; -dennoc83;;0; -dennoc84;;0; -dennoc85;;0; -dennoc86;;0; -dennoc87;;0; -dennoc88;;0; -dennoc89;;0; -dennoc90;;0; -dennoc91;;0; -dennoc92;;0; -dennoc93;;0; -dennoc95;;0; -elrinda1;;0; -finalm21;;0; -finalm27;;0; -hayabusa;;0; -ohxzmus1;;0; -ohxzmus1a;;0; -ohxzmus2;;0; -ohxzmus2a;;0; -ohxs10;;0; -ohx9006;;0; -ohx9006a;;0; -ohx9105;;0; -ohx9105a;;0; -ohx91xx;;0; -ohx9206;;0; -ohx9206a;;0; -ohx9207;;0; -ohx9310;;0; -ohx9403;;0; -ohx9405;;0; -ohx9407;;0; -ohx9410;;0; -ohx9410a;;0; -ohx9412;;0; -ohx9412a;;0; -ohx9505;;0; -ohx9508;;0; -ohx9512;;0; -sennots1;;0; -sennotmt;;0; -tokkan3;;0; -unform91;;0; -unformtj;;0; -unformat;;0; -unformsj;;0; -yippee1;;0; -yippee2;;0; -3danhen;;0; -cybrmiss;;0; -deltaarm;;0; -fly;;0; -galseed;;0; -japan213;;0; -ohootsuk;;0; -scarlet1;;0; -3meka;;0; -37degc;;0; -ajine;;0; -aahime;;0; -abuten;;0; -accheat;;0; -actshoot;;0; -advland;;0; -advland2;;0; -advland2a;;0; -aikoku;;0; -airhork;;0; -akazucha;;0; -akazucc;;0; -akazukin;;0; -alfarne;;0; -amamori;;0; -amegame;;0; -amheroes;;0; -amheroesa;;0; -andromed;;0; -angeldiv;;0; -anmira;;0; -anzufly;;0; -arianshu;;0; -rumikqz;;0; -rumikqz2;;0; -ams2;;0; -ruhappy;;0; -arsia;;0; -artemisd;;0; -arururu;;0; -astqueen;;0; -asteroid;;0; -asteroi2;;0; -atennis;;0; -ayachan;;0; -bpoint;;0; -babafgt2;;0; -babel;;0; -babeltou;;0; -badroad;;0; -bakamed;;0; -bakaniki;;0; -bakukeid;;0; -bakudanm;;0; -bakuyugi;;0; -balonfgt;;0; -bf92ce;;0; -bf92bang;;0; -bf92;;0; -baribar3;;0; -bbknuckl;;0; -batlcity;;0; -btlgame;;0; -btlmania;;0; -btlunit;;0; -btlunit2;;0; -bslfght000;;0; -bslfght;;0; -bsmnfght210;;0; -bsmnfght;;0; -slrmnkdk;;0; -slrmntia;;0; -bssmnfgt;;0; -bssmnfgx;;0; -sailrv3p;;0; -sailrv5p;;0; -sailrvf3;;0; -sailrv2;;0; -skirt1;;0; -skirt2;;0; -skirt3;;0; -biyoyonc;;0; -blanka;;0; -bleedout;;0; -blindspt;;0; -bljack2;;0; -blockout;;0; -blocksto;;0; -bluwaver;;0; -bluwing2;;0; -bm68;;0; -bodhidh2;;0; -bodhidha030;;0; -bodhidha;;0; -bombmand;;0; -bonnou2;;0; -bonnou2d;;0; -bonnoumu;;0; -bottoro2;;0; -boynboyn;;0; -boyoyon;;0; -breakdwn;;0; -breed;;0; -butarian;;0; -butasanq;;0; -conz;;0; -captcolr;;0; -caterpi;;0; -cavecrwd;;0; -celcion;;0; -celia;;0; -celiad;;0; -chachafv;;0; -chachafv100;;0; -chami;;0; -chaosang;;0; -chijou;;0; -chikyugi;;0; -chottohn;;0; -chotmswp;;0; -choubaku;;0; -chorensa;;0; -chorensa045;;0; -chorensa035;;0; -chorensa010;;0; -circusx2;;0; -citycon;;0; -clayshot;;0; -clearlap;;0; -sailorq;;0; -columnsg;;0; -columnsm;;0; -cmdxray;;0; -cosmopzl;;0; -cosmopzlm;;0; -crarrow;;0; -xfireex;;0; -cryoku;;0; -cryokud;;0; -crystwr;;0; -cubegrd3;;0; -cylips;;0; -cybrfld;;0; -cybrrpg;;0; -cynthia;;0; -daifugou;;0; -daikon;;0; -daisn2ue;;0; -dmgfgh2p;;0; -dancexp;;0; -dangarea;;0; -dariball;;0; -darius;;0; -dariusdt;;0; -dariuse;;0; -darkcstl;;0; -dastard;;0; -datsugok;;0; -dccard;;0; -deathf2;;0; -deepscak;;0; -deepscan;;0; -deep;;0; -degon;;0; -demslay;;0; -demslay2;;0; -demslay3;;0; -dennogak;;0; -desperad011;;0; -desperad;;0; -devilinv;;0; -devilch;;0; -devilch2;;0; -diamexp;;0; -diamexp2;;0; -digdugd;;0; -limnoama;;0; -dion;;0; -directx;;0; -discoscr;;0; -disk7fmv;;0; -disk8fmv;;0; -disk9fmv;;0; -diveon2d;;0; -diveon;;0; -diveond;;0; -diver;;0; -dofmoria;;0; -dogfight;;0; -dokiaman;;0; -doordoor;;0; -doridor;;0; -dorix;;0; -dbltargt;;0; -drasan;;0; -drorima;;0; -dslayer;;0; -dragonx;;0; -drgnprov;;0; -dquest100;;0; -dquest;;0; -drnksmok;;0; -drnksmod;;0; -duelfgh2;;0; -duelfght;;0; -dungseek;;0; -dynamics;;0; -eeledit;;0; -eff;;0; -elfcg;;0; -elrinda2;;0; -erionqst;;0; -excitbik;;0; -ezoris;;0; -fastlap;;0; -famass;;0; -fancyqix;;0; -fantsht;;0; -farewell;;0; -fevrie;;0; -fifteen1;;0; -fifteen2;;0; -fifteen3;;0; -fifteen4;;0; -fifteen5;;0; -fifteen6;;0; -fifteen7;;0; -fire;;0; -firia;;0; -1stblow;;0; -fcrisis;;0; -fmaindsh;;0; -fmission;;0; -fmissio2;;0; -flmwing;;0; -flmdart;;0; -fleur;;0; -flipflop;;0; -flipull;;0; -flyshoot;;0; -formulax;;0; -formxt;;0; -formxy;;0; -fortatk;;0; -fortyone;;0; -fourfall;;0; -fourfallu;;0; -frapull;;0; -frayd;;0; -friskytm;;0; -frog;;0; -frogger;;0; -froggero;;0; -fushigid;;0; -gaiafght;;0; -gaiarm;;0; -gakutosh;;0; -galagad;;0; -galaxian;;0; -galaxia2;;0; -galax68k;;0; -galwars;;0; -galmind2;;0; -gamex;;0; -ganpaich;;0; -gardislg;;0; -gardisli202;;0; -gardisli202a;;0; -gawar;;0; -gedou;;0; -gedouret;;0; -gekkan5;;0; -gemdrop;;0; -getready;;0; -getsumen;;0; -gigafght;;0; -glacierd;;0; -glacier;;0; -godblazn;;0; -gokiburi;;0; -grobda;;0; -grobdam;;0; -guardian;;0; -guardans;;0; -gyaos;;0; -htdash;;0; -hakobune;;0; -halfmind;;0; -halfmnd2;;0; -hanakoi;;0; -hanaiko;;0; -hatenkou;;0; -hazard;;0; -hrtsaph;;0; -hnkyo68k;;0; -heiankyo;;0; -hellhoun;;0; -helmet;;0; -herohero;;0; -heroher4;;0; -heroher6;;0; -heroher8;;0; -hetzer;;0; -hextris;;0; -heysay;;0; -heysay010;;0; -higesori;;0; -highlow;;0; -highpos;;0; -himegas;;0; -hiroshi;;0; -hiroshi2;;0; -hyuusha;;0; -hitomiza;;0; -hitomizaa;;0; -hitton;;0; -hoippuru;;0; -horiume;;0; -horror;;0; -hotjump;;0; -hotjumpo;;0; -htjewel;;0; -hvrcraft;;0; -hydlide;;0; -hydlide2;;0; -ikablade;;0; -ikkakutc;;0; -ilmlaser;;0; -imazoman;;0; -iinoyama;;0; -integral;;0; -intropro;;0; -jaleckex;;0; -jammes;;0; -jankencb;;0; -jastis;;0; -jeena;;0; -jotei1;;0; -jotei2;;0; -jotei3;;0; -jotei4;;0; -jumpsimn;;0; -junkerpr;;0; -kachofug;;0; -kaisengd;;0; -kaizoku;;0; -kankyoss;;0; -karouden;;0; -karoudensd;;0; -karoudensds;;0; -karoudenhd;;0; -karoudsp;;0; -kateikyo;;0; -kateiky2;;0; -kawaisou;;0; -kax;;0; -kikoyosa202;;0; -kikoyosa;;0; -kingou2;;0; -kisehazu;;0; -kishikai;;0; -klaxpm;;0; -knightar;;0; -knightmk;;0; -koma;;0; -korakora;;0; -korette;;0; -kosogens;;0; -kukeisf;;0; -kurukuru;;0; -kyarukan;;0; -kyunkyun;;0; -kyunkyu2;;0; -ksgikadv;;0; -lamp;;0; -lastpic2;;0; -lasttemp;;0; -laydock;;0; -leshies;;0; -levelpnta;;0; -levelpnt;;0; -lexus2;;0; -libblerd;;0; -libblerd1;;0; -libblerd2;;0; -liberty;;0; -limeligt;;0; -lilchin;;0; -lilchind;;0; -lilchinf;;0; -lockon;;0; -lockon2;;0; -lockon3;;0; -ldrun;;0; -ldrun1;;0; -longnigt;;0; -lot3;;0; -lumchan;;0; -lumchank;;0; -lunafant;;0; -luster;;0; -lyricalp;;0; -macross;;0; -madgear;;0; -magery;;0; -magery2;;0; -magery3;;0; -mageryot;;0; -magcrash;;0; -magritte;;0; -mjtengok;;0; -mahokuni;;0; -mahousen;;0; -majohall;;0; -mappy1;;0; -mappy2;;0; -marblmag;;0; -marblpan;;0; -marblrevt;;0; -marblrv2;;0; -marblrev;;0; -mario;;0; -marmalad;;0; -marss;;0; -peepshot;;0; -mcha;;0; -menosakk;;0; -jangken;;0; -megamipn;;0; -memobrkn;;0; -metlunit;;0; -metluni2;;0; -meteowrs;;0; -mikkunl;;0; -millisht;;0; -minami;;0; -miragerw;;0; -missile3;;0; -missile2;;0; -missile1;;0; -missile1a;;0; -missadlt;;0; -mogu1990;;0; -mogura;;0; -mokonasp;;0; -mokonas;;0; -moloq;;0; -momotaro;;0; -momogaid;;0; -momotar2;;0; -monmonss;;0; -monmons2;;0; -monmons3;;0; -monmonsx;;0; -moneyh;;0; -monstpan;;0; -moria;;0; -moritan;;0; -mouichid;;0; -mysteryh;;0; -nageyari;;0; -naniwa2;;0; -naniwa;;0; -naniwa3;;0; -nmfire;;0; -nasakemf;;0; -nazors;;0; -nemes93;;0; -nemes94;;0; -nervbj;;0; -newbokow;;0; -nicejan;;0; -nininbtl;;0; -nininbtla;;0; -nisedqv;;0; -nishitet;;0; -norikotb;;0; -noutendn;;0; -nova;;0; -nyankosw;;0; -ohhajiki;;0; -oraorabl;;0; -oraorabl1;;0; -orashoot;;0; -origames;;0; -ossandot;;0; -otokodam;;0; -ougonbut;;0; -overdriv;;0; -pacmanit;;0; -pacmand;;0; -pacmen;;0; -pachisur51;;0; -pachisur;;0; -paikouka;;0; -paroran212;;0; -paroran;;0; -parsec305;;0; -parsec;;0; -prtaxiom;;0; -paruru;;0; -patariro;;0; -penjang;;0; -pensancd;;0; -pentaris;;0; -peshipzl;;0; -peshipz2;;0; -phoenixq;;0; -pinball1;;0; -pizzabst;;0; -plantinv;;0; -plesea;;0; -putiplin;;0; -putiplina;;0; -putiplinb;;0; -pokersis;;0; -pole2win;;0; -popcard;;0; -popjack;;0; -porolith;;0; -porttowr;;0; -potton;;0; -powerrac;;0; -poyopoyo;;0; -princenp;;0; -prinbing;;0; -princros;;0; -profit;;0; -projdhn1;;0; -projdhn2;;0; -projdhn3;;0; -projmoon;;0; -prostit;;0; -proth68k;;0; -fassbust;;0; -psycharr;;0; -puchipuc;;0; -puninces;;0; -pushbon;;0; -pushbona;;0; -puzzle;;0; -puzzle15;;0; -questqst;;0; -questlnd;;0; -quieazm2;;0; -quieazum;;0; -quieazmd;;0; -quizbocc;;0; -quizcult;;0; -quizpon;;0; -quizfght;;0; -quizjan;;0; -quizjigo;;0; -quizjock;;0; -quizmang;;0; -quizsnip;;0; -rplusr;;0; -rplusrd;;0; -r3golf;;0; -raguna;;0; -rallyx;;0; -ramunecl;;0; -raydefoxo2;;0; -raydefoxo1;;0; -raydefox;;0; -raydefx2;;0; -rayersht;;0; -rayvs;;0; -real;;0; -redarms;;0; -redarmsm;;0; -refresh;;0; -reserve;;0; -riiyaden;;0; -ripobita;;0; -robotbt2;;0; -rolldwn2;;0; -rotateo;;0; -rotate;;0; -rotation;;0; -sabaodam;;0; -sades;;0; -sailrmbk;;0; -sailrms;;0; -sailorv2;;0; -sailorv3;;0; -sailrmcq;;0; -sakeruda;;0; -samegame;;0; -sarumune;;0; -satelit2;;0; -satbatle;;0; -satelit;;0; -satorisp;;0; -satoris2;;0; -isonofam;;0; -scramble;;0; -scrap;;0; -sdfightr;;0; -sdsadist;;0; -sdtoki;;0; -sebasuch;;0; -seethru2;;0; -seesaw;;0; -seiruna;;0; -seifukuk;;0; -seiyudai;;0; -sekaiss;;0; -sekizudx;;0; -sekizuhao;;0; -sekizuha;;0; -senegal;;0; -senningm;;0; -senshasn;;0; -senshasna;;0; -senshas3;;0; -shikato;;0; -shikendm;;0; -shikenmi;;0; -shikendu;;0; -shimaimj100;;0; -shimaimj110;;0; -shimaimj130;;0; -shimaimj;;0; -sbbknuck;;0; -shinkeis;;0; -shouten;;0; -silkrod2;;0; -silkroad;;0; -silsteel;;0; -silsteelo;;0; -silverbl;;0; -silvrcry;;0; -slimemst;;0; -smsxmoon;;0; -smsxsamp;;0; -snell;;0; -snowkibn;;0; -solitair;;0; -solitea;;0; -sorcer;;0; -sorcerys;;0; -sorceryso;;0; -sorcsugo;;0; -souhoubp;;0; -souhoutv;;0; -sokoban;;0; -sinv;;0; -spacelnd;;0; -spacesld;;0; -spannerx;;0; -spannera;;0; -tenanmon;;0; -spiralbl;;0; -starblad;;0; -starblap;;0; -starchrg;;0; -starcrs2;;0; -starfght;;0; -starlusd;;0; -starpuls;;0; -startrek;;0; -starwar;;0; -starfrcd;;0; -steelgun;;0; -stox;;0; -haita2b;;0; -haita2a;;0; -haita2;;0; -streetuc;;0; -stripfgt;;0; -stripfg2;;0; -strokex;;0; -suchabtl100;;0; -suchabtl;;0; -sukaparo;;0; -sukatan;;0; -superart;;0; -supercgq;;0; -superdai;;0; -superfm;;0; -superfis;;0; -supergft;;0; -superjck;;0; -smb;;0; -smponjan;;0; -supermf;;0; -spakris;;0; -spakrisa;;0; -sshinpi;;0; -sss;;0; -sssd;;0; -sss2;;0; -streetbm;;0; -stphalnx;;0; -superxdx;;0; -superx95;;0; -swordmst;;0; -swordms2;;0; -sxaoumio;;0; -sxaoumi;;0; -t94x;;0; -tdquesto;;0; -tdquest;;0; -tdquestup;;0; -tdquest2b;;0; -tdquest2a;;0; -tdquest2;;0; -tacolis;;0; -tailchas;;0; -karatedo;;0; -takeout;;0; -takogame;;0; -tankbatt;;0; -tankbatl;;0; -tank6;;0; -target;;0; -targetv2;;0; -targetv2h;;0; -tataka8k;;0; -kcomik46;;0; -kcomik47;;0; -kcomikex;;0; -tekkense;;0; -tenchimu;;0; -tenchipz;;0; -terishu;;0; -terradrv;;0; -terumina;;0; -tetrisse;;0; -tetriscfb;;0; -tetriscfa;;0; -tetriscf;;0; -tetrislca;;0; -tetrislc;;0; -texceed;;0; -tf4go;;0; -tf4g;;0; -theater1;;0; -theater2;;0; -walldown;;0; -timcc94;;0; -timpaper;;0; -timelag;;0; -timeplt;;0; -tinna7c;;0; -tinyclmn;;0; -tinyhopp;;0; -tokimls;;0; -tokimls2;;0; -tokitais;;0; -tokkoukf;;0; -tokukeij;;0; -tonkotsu;;0; -toridesg;;0; -tojodens;;0; -druaga;;0; -toypop;;0; -triangle;;0; -tripleya;;0; -twinsoul;;0; -twtwins2;;0; -twins;;0; -ueshitah;;0; -uhauha2;;0; -ultimagc;;0; -uno;;0; -uramikk;;0; -uruseiya;;0; -usagijmp;;0; -vagrantf;;0; -valentin;;0; -vaystarn;;0; -virgangl;;0; -vision;;0; -vsklith;;0; -vulquar;;0; -wbullet;;0; -wtank;;0; -wakaog;;0; -wanders;;0; -waterblu;;0; -wfantas;;0; -wildcard;;0; -windblst;;0; -wips2;;0; -wrecking;;0; -xtype;;0; -xadlak;;0; -xadlak221;;0; -xadlako;;0; -xanadu;;0; -xevioud;;0; -y2;;0; -y2d;;0; -yacolumn;;0; -yonkaku;;0; -ys1d;;0; -ysmilk;;0; -ys2miss;;0; -ys2milk;;0; -yctrump;;0; -yugachas;;0; -yugaiga2;;0; -yugaigak;;0; -yugaipzl;;0; -yugaiwar;;0; -yuzurugi;;0; -zeromasto;;0; -zeromast;;0; -zerorei;;0; -zolgus;;0; -zounds;;0; -zoutage;;0; -zugya;;0; -cryokua;;0; -cynthi2;;0; -formulaxa;;0; -grdiusac;;0; -todayjob;;0; -larjis;;0; -t94xa;;0; -lcmyprin;;0; -zeromastx;;0; -smba;;0; diff -Nru mame-0.263+dfsg.1/hash/a2600.xml mame-0.264+dfsg.1/hash/a2600.xml --- mame-0.263+dfsg.1/hash/a2600.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/a2600.xml 2024-03-25 14:00:46.000000000 +0000 @@ -7607,6 +7607,17 @@ + + Hobo (prototype) + 1983 + UA Limited + + + + + + + Hole Hunter 19?? @@ -12453,6 +12464,17 @@ + + R2D Tank (prototype) + 1983 + UA Limited + + + + + + + Rabbit Transit (prototype 19830829) 1983 @@ -15109,6 +15131,17 @@ + + + Spiders (prototype) + 1983 + UA Limited + + + + + + Spider Fighter diff -Nru mame-0.263+dfsg.1/hash/apple2_flop_misc.xml mame-0.264+dfsg.1/hash/apple2_flop_misc.xml --- mame-0.263+dfsg.1/hash/apple2_flop_misc.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/apple2_flop_misc.xml 2024-03-25 14:00:46.000000000 +0000 @@ -789,7 +789,8 @@ 2019 4AM - + + @@ -938,7 +944,8 @@ Anti-M (version 1.6) 2019 4AM - + + @@ -967,11 +975,12 @@ - + Anti-M (version 1.8) 2020 4AM - + + + + + + + + + + + + Anti-M (version 2.0) + 2023 + 4AM + + + + + + + + + + + + + Anti-M (version 2.1) + 2024 + 4AM + + + + + + + + + + + + + Anti-M (version 2.2) + 2024 + 4AM + + + + + + + + + + Ankh diff -Nru mame-0.263+dfsg.1/hash/bkrankp_cart.xml mame-0.264+dfsg.1/hash/bkrankp_cart.xml --- mame-0.263+dfsg.1/hash/bkrankp_cart.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/bkrankp_cart.xml 2024-03-25 14:00:46.000000000 +0000 @@ -16,9 +16,9 @@ | NO |2316095|J-Pop - Green | | NO |2316096|J-Pop - Pink | | NO |2316097|J-Pop - Lemmon Yellow | -| NO |2323098|Yo-Kai Watch Selection | -| NO |2333250|J-Pop - Purple | -| NO |2333251|J-Pop - White | +| YES |2323098|Yo-Kai Watch Selection | +| YES |2333250|J-Pop - Purple | +| YES |2333251|J-Pop - White | | YES |2333252|J-Pop - Rose | | NO |2333253|J-Pop - Red | | YES |2333254|Vocaloid | @@ -28,14 +28,54 @@ | NO |2350534|J-Pop - Mint | | NO |2350535|Best Hit Song | +======+=======+=========================+ +(some of these are J-Pop Kids, check which) --> - + + Yo-Kai Watch + 2015 + Bandai + + + + + + + + + + + J-Pop Purple + 2015 + Bandai + + + + + + + + + + + J-Pop White + 2015 + Bandai + + + + + + + + + + J-Pop Rose - 20?? + 2015 Bandai @@ -47,7 +87,7 @@ Vocaloid - 20?? + 2015 Bandai diff -Nru mame-0.263+dfsg.1/hash/cdi.xml mame-0.264+dfsg.1/hash/cdi.xml --- mame-0.263+dfsg.1/hash/cdi.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/cdi.xml 2024-03-25 14:00:46.000000000 +0000 @@ -1277,6 +1277,22 @@ + + + Hotel Mario (prototype v0.09, 19931123) + 1994 + Philips + + + + + + + - Jikkyou Powerful Pro Yakyuu - Dreamcast Edition (Japan) + Jikkyou Pawafuru Puro Yakyū - Dreamcast Edition (Japan) 2000 Konami + diff -Nru mame-0.263+dfsg.1/hash/ekara_japan.xml mame-0.264+dfsg.1/hash/ekara_japan.xml --- mame-0.263+dfsg.1/hash/ekara_japan.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/ekara_japan.xml 2024-03-25 14:00:46.000000000 +0000 @@ -75,7 +75,7 @@ The EC number is printed on the left side of the cart label, as well as in the serial code Carts EC0001-0010 don't have a number printed on the box, only the title - the number was added starting with EC0011 - Only known undumped carts in main series are 58, 64, 81, 83, 84, 85 (assuming highest number is 85) + No known undumped carts in main series (assuming highest number is 85) .. *EC0001-JPM J-Pop Mix Volume 1 .. *EC0002-JPM J-Pop Mix Volume 2 @@ -165,11 +165,11 @@ 79 *EC0079-ETZ Enka Taizen Volume 2 (custom presentation etc.) 80 *EC0080-JPM J-Pop Mix Volume 41 - 81 EC0081-JPM J-Pop Mix Volume 42 + 81 *EC0081-JPM J-Pop Mix Volume 42 82 *EC0082-MBH Matthew's Best Hit Selection - 83 EC0083-JPM J-Pop Mix Volume 43 + 83 *EC0083-JPM J-Pop Mix Volume 43 84 *EC0084-KSB Kids' Song Best 40 - 85 EC0085-ETZ Enka Taizen Volume 3 (custom presentation etc.) + 85 *EC0085-ETZ Enka Taizen Volume 3 (custom presentation etc.) (more? what's the highest regular number?) @@ -1125,7 +1125,16 @@ - + + J-Pop Mix Vol.42 (Japan) (EC0081-JPM) + 2002 + Takara + + + + + + Matthew's Best Hit Selection (Japan) (EC0082-MBH) @@ -1138,7 +1147,16 @@ - + + J-Pop Mix Vol.43 (Japan) (EC0083-JPM) + 2003 + Takara + + + + + + Kids' Song Best 40 (Japan) (EC0084-KSB) @@ -1152,6 +1170,17 @@ - + + + Enka Taizen Dai San-hen (Japan) (EC0085-ETZ) + 2003 + Takara + + + + + + + diff -Nru mame-0.263+dfsg.1/hash/ekara_japan_g.xml mame-0.264+dfsg.1/hash/ekara_japan_g.xml --- mame-0.263+dfsg.1/hash/ekara_japan_g.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/ekara_japan_g.xml 2024-03-25 14:00:46.000000000 +0000 @@ -26,8 +26,8 @@ G-9 *GC0009-TPJ TV Pop Junior Volume 3 (Volume 2 is 'P-2' in 'P' series) G-10 *GC0010-BAT Best Artist Volume 4 G-11 *GC0011-TPJ TV Pop Junior Volume 4 - G-12 GC0012-BHT Best Hit Volume 5 (Volume 4 is 'P-1' in 'P' series) - G-13 GC0013-BHT Best Hit Volume 6 + G-12 *GC0012-BHT Best Hit Volume 5 (Volume 4 is 'P-1' in 'P' series) + G-13 *GC0013-BHT Best Hit Volume 6 G-14 *GC0014-MIN mini-moni Volume 2 G-15 *GC0015-BAT Best Artist Volume 5 G-16 *GC0016-TPJ TV Pop Junior Volume 5 @@ -196,7 +196,31 @@ + + Best Hit Volume 5 (Japan) (GC0012-BHT) + 2002 + Takara + + + + + + + + + + Best Hit Volume 6 (Japan) (GC0013-BHT) + 2002 + Takara + + + + + + + + mini-moni Volume 2 (GC0014-MIN) diff -Nru mame-0.263+dfsg.1/hash/ekara_japan_kd.xml mame-0.264+dfsg.1/hash/ekara_japan_kd.xml --- mame-0.263+dfsg.1/hash/ekara_japan_kd.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/ekara_japan_kd.xml 2024-03-25 14:00:46.000000000 +0000 @@ -7,11 +7,11 @@ - The 4th Unit 5 - D-Again (Demo) + The 4th Unit 5 - D-Again (demo) 1990 データウエスト (Data West) @@ -1566,7 +1566,7 @@ - + - + - Taito Chase H.Q. (Demo) + Taito Chase H.Q. (demo) 1991 ビング (Ving) @@ -7448,7 +7448,7 @@ --> - Emit Vol. 1 - Toki no Maigo (Demo) + Emit Vol. 1 - Toki no Maigo (demo) 1994 光栄 (Koei) @@ -13244,7 +13244,7 @@ - + - Indiana Jones and the Last Crusade (Pre-Release Version) + Indiana Jones and the Last Crusade (pre-release version) 1990 富士通 (Fujitsu) @@ -17409,7 +17409,7 @@ - + - Megamorph (Demo) + Megamorph (demo) 1994 富士通 (Fujitsu) @@ -22807,7 +22807,7 @@ - + - Psychic Detective Series Vol. 2 - Memories (Demo) + Psychic Detective Series Vol. 2 - Memories (demo) 1989 データウエスト (Data West) @@ -22909,7 +22909,7 @@ - + - + - Psychic Detective Series Vol. 4 - Orgel (Demo) + Psychic Detective Series Vol. 4 - Orgel (demo) 1991 データウエスト (Data West) @@ -23055,7 +23055,7 @@ - + - + - Psychic Detective Series Final - Solitude Gekan (Demo) + Psychic Detective Series Final - Solitude Gekan (demo) 1993 データウエスト (Data West) @@ -25035,13 +25035,13 @@ - + - Sherlock Holmes - Consulting Detective (Demo) + Sherlock Holmes - Consulting Detective (demo) 1990 富士通 (Fujitsu) @@ -25506,7 +25506,7 @@ - + - Super Street Fighter II - The New Challengers (Sample Disc) + Super Street Fighter II - The New Challengers (sample disc) 1994 カプコン (Capcom) diff -Nru mame-0.263+dfsg.1/hash/gcslottv.xml mame-0.264+dfsg.1/hash/gcslottv.xml --- mame-0.263+dfsg.1/hash/gcslottv.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/gcslottv.xml 2024-03-25 14:00:46.000000000 +0000 @@ -21,7 +21,7 @@ - + Ginginmaru TV 2002 Sammy @@ -44,6 +44,19 @@ + + + + Jū-ō Junior + 2002 + Sammy + + + + + + + Mōjū-ō TV diff -Nru mame-0.263+dfsg.1/hash/gp32.xml mame-0.264+dfsg.1/hash/gp32.xml --- mame-0.263+dfsg.1/hash/gp32.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/gp32.xml 2024-03-25 14:00:46.000000000 +0000 @@ -23,9 +23,8 @@ --> - - Astonishia Story R (Kor) + Astonishia Story R (Korea) 2002 Gamepark @@ -36,11 +35,14 @@ - - Blue Angelo - Angels from the Shrine (Euro) + Blue Angelo - Angels from the Shrine (Europe) 2005 Shibuya Interactive + + @@ -48,9 +50,8 @@ - - Dooly Soccer 2002 (Kor) + Dooly Soccer 2002 (Korea) 2002 Gamepark @@ -61,11 +62,13 @@ - - Dungeon & Guarder (Kor) + Dungeon & Guarder (Korea) 2001 Gamepark + @@ -74,11 +77,13 @@ - - Dungeon & Guarder (Euro) + Dungeon & Guarder (Europe) 2001 Gamepark + @@ -87,11 +92,13 @@ - - Dyhard - Infinity (Kor, V1083) + Dyhard - Infinity (Korea, V1083) 2001 Gamepark + @@ -100,11 +107,13 @@ - - Dyhard - Infinity (Euro, V1107) + Dyhard - Infinity (Europe, V1107) 2001 Gamepark + @@ -112,9 +121,8 @@ - - GP Daenantu ~ GP!!! Dairantou (Kor) + GP Daenantu ~ GP!!! Dairantou (Korea) 2003 Gamepark @@ -125,11 +133,13 @@ - - Hany Party Game (Kor) + Hany Party Game (Korea) 2002 Gamepark + @@ -137,9 +147,8 @@ - - Geunyeoui Gisadan Ganghaengdolpa (Kor) + Geunyeoui Gisadan Ganghaengdolpa (Korea) 2002 Gamepark @@ -150,9 +159,8 @@ - - Her Knights - All for the Princess (Euro) + Her Knights - All for the Princess (Europe) 2002 Gamepark @@ -162,9 +170,8 @@ - - Kimchiman GP32 (Kor) + Kimchiman GP32 (Korea) 2002 Gamepark @@ -175,9 +182,8 @@ - - Eunhaengnamu Sonyeo Mil (Kor) + Eunhaengnamu Sonyeo Mil (Korea) 2003 Gamepark @@ -188,12 +194,14 @@ - - - Little Wizard (Kor) + Little Wizard (Korea) 2001 Gamepark + @@ -202,12 +210,14 @@ - - - Little Wizard (Euro) + Little Wizard (Europe) 2001 Gamepark + @@ -215,11 +225,13 @@ - - One-Shot VOCA (Kor) + One-Shot VOCA (Korea) 2002 Gamepark + @@ -228,9 +240,8 @@ - - Princess Maker 2 (Kor) + Princess Maker 2 (Korea) 2002 Gamepark @@ -241,11 +252,13 @@ - - Rally Pop (Kor) + Rally Pop (Korea) 2001 Gamepark + @@ -254,9 +267,8 @@ - - Raphael (Kor) + Raphael (Korea) 2002 Gamepark @@ -266,11 +278,13 @@ - - Tanggle's Magic Square (Kor) + Tanggle's Magic Square (Korea) 2001 Gamepark + @@ -278,9 +292,8 @@ - - Therapy (Kor) + Therapy (Korea) 2002 Gamepark @@ -291,9 +304,8 @@ - - Tomak - Save the Earth, Again (Kor, v2.0?) + Tomak - Save the Earth, Again (Korea, v2.0?) 2002 Gamepark @@ -304,9 +316,8 @@ - - Tomak - Save the Earth, Again (Euro, v1.0) + Tomak - Save the Earth, Again (Europe, v1.0) 2002 Gamepark @@ -316,9 +327,8 @@ - - Tomak - Save the Earth, Again (Euro, v2.0) + Tomak - Save the Earth, Again (Europe, v2.0) 2002 Gamepark @@ -328,9 +338,8 @@ - - Treasure Island (Kor) + Treasure Island (Korea) 2002 Gamepark @@ -341,9 +350,8 @@ - - Treasure Island (Euro) + Treasure Island (Europe) 2002 Gamepark @@ -354,11 +362,13 @@ - - W.B.W. - Mabeobsaga Doego Sip-eo! (Kor) + W.B.W. - Mabeobsaga Doego Sip-eo! (Korea) 2004 Gamepark + @@ -367,9 +377,8 @@ - - Wizard Slayer (Kor) + Wizard Slayer (Korea) 2002 Gamepark @@ -379,9 +388,8 @@ - - Funny Soccer 2002 (Kor) + Funny Soccer 2002 (Korea) 2002 Gamepark @@ -391,11 +399,13 @@ - - GlooP Deluxe (Euro) + GlooP Deluxe (Europe) 2003 Aeon Flame + @@ -404,11 +414,13 @@ - - Holeman Battle Race 2002 (Kor) + Holeman Battle Race 2002 (Korea) 2002 MoongKle + @@ -417,11 +429,13 @@ - - Pinball Dreams (Euro) + Pinball Dreams (Europe) 2002 Gamepark + @@ -430,9 +444,8 @@ - - Story of Bug eyed Monster (Kor) + Story of Bug eyed Monster (Korea) 2003 Gamepark @@ -442,9 +455,8 @@ - - Winter Is (Kor) + Winter Is (Korea) 2003 Gamepark @@ -454,9 +466,8 @@ - - Super Plusha (Euro) + Super Plusha (Europe) 2002 Gamepark @@ -466,11 +477,13 @@ - - Tales of Windy Land (Kor) + Tales of Windy Land (Korea) 2003 AIM Technology + @@ -479,9 +492,8 @@ - - Topy Topy Gogo (Euro) + Topy Topy Gogo (Europe) 2003 Gamepark @@ -492,9 +504,8 @@ - - Tears - Another Story (Kor) + Tears - Another Story (Korea) 2003 Team D.T.R. diff -Nru mame-0.263+dfsg.1/hash/hikara.xml mame-0.264+dfsg.1/hash/hikara.xml --- mame-0.263+dfsg.1/hash/hikara.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/hikara.xml 2024-03-25 14:00:46.000000000 +0000 @@ -58,16 +58,16 @@ Pocket Monsters Special unknown Yellow 1 User Cartridge (5 Capacity) n/a Translucent Grey/White - User Cartridge (10 Capacity) n/a Translucent Pink - User Cartridge (20 Capacity) n/a Translucent Blue + 1 User Cartridge (10 Capacity) n/a Translucent Pink + 1 User Cartridge (20 Capacity) n/a Translucent Blue --> + キューティーハニー 倖田來未 Cutie Honey Kōda Kumi + KissHug aiko KissHug aiko + さくらんぼ 大塚愛 Sakuranbo Ōtsuka Ai + Dream Fighter Perfume Dream Fighter Perfume + ポリリズム Perfume Polyrhythm Perfume --> Hi-kara 5-song capacity user cartridge (used, with 5 songs) (Japan) 2008 @@ -81,6 +81,66 @@ + + + + Hi-kara 10-song capacity user cartridge (used, with 10 songs) (Japan) + 2008 + Takara Tomy + + + + + + + + + + + + + Hi-kara 20-song capacity user cartridge (used, with 20 songs) (Japan) + 2008 + Takara Tomy + + + + + + + + + Best Hit Collection Volume 1: J-Pop 1 (Japan) diff -Nru mame-0.263+dfsg.1/hash/ibm5170_cdrom.xml mame-0.264+dfsg.1/hash/ibm5170_cdrom.xml --- mame-0.263+dfsg.1/hash/ibm5170_cdrom.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/ibm5170_cdrom.xml 2024-03-25 14:00:46.000000000 +0000 @@ -7092,7 +7092,7 @@ S3 + + + + + + + + + Classic Rock I (USA) + 1990 + Worlds of Wonder + + + + + + + + + + + + Classic Rock II (USA) + 1990 + Worlds of Wonder + + + + + + + + + + + + Hard Rock I (USA) + 1990 + Worlds of Wonder + + + + + + + + + + + + Hard Rock II (USA) + 1990 + Worlds of Wonder + + + + + + + + + + + + Lead Rock Guitarists (USA) + 1990 + Worlds of Wonder + + + + + + + + + + + + Modern Rock (USA) + 1990 + Worlds of Wonder + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/hash/mac_cdrom.xml mame-0.264+dfsg.1/hash/mac_cdrom.xml --- mame-0.263+dfsg.1/hash/mac_cdrom.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/mac_cdrom.xml 2024-03-25 14:00:46.000000000 +0000 @@ -6,6 +6,7 @@ Compatibility tags: MC68000 - 68000 CPU MC68020 - 68020 CPU +MC68020_32 - 68020 CPU with 32-bit clean ROMs (orignal LC) MC68030 - 68030 CPU MC68030_32 - 68030 CPU with 32-bit clean ROMs (IIci and later) MC68040 - 68040 CPU @@ -20,8 +21,8 @@ Apple Legacy Recovery 1998 Apple - - + + @@ -87,8 +88,8 @@ Mac OS 7.6 (US English) 1997 Apple - - + + @@ -99,8 +100,8 @@ Mac OS 7.6 (German) 1997 Apple - - + + @@ -111,8 +112,8 @@ Mac OS 7.6.1 (US English) 1997 Apple - - + + diff -Nru mame-0.263+dfsg.1/hash/megadriv.xml mame-0.264+dfsg.1/hash/megadriv.xml --- mame-0.263+dfsg.1/hash/megadriv.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/megadriv.xml 2024-03-25 14:00:46.000000000 +0000 @@ -27,10 +27,11 @@ ROAD RASH USA needs proper dump SIDE POCKET JAPAN/USA conflict in current info SMURFS PAL we have Rev A, Rev 0 needed (does it exist?) + SUPER FUTEBOL BRAZIL TecToy rerelease of wcup90 SUMISEI HOME TANMATSU JAPAN VALIS III JAPAN we have v1.1 (Rev A?), v1.0 (Rev 0?) needed WONDER MIDI JAPAN - WORLD CUP SOCCER JAPAN/USA we have v1.0 (Rev ?), v1.2 (Rev ?) and v1.3 (Rev B), v1.1 (Rev ?) needed + WORLD CUP ITALIA 90 WORLD investigate if Japan ever got this, verify wcsa (v1.2), verify what the known PT/SE/CZ/AU versions are based off. WORLD OF ILLUSION JAPAN we have v1.0 (Rev 0?), v1.1 (Rev A?) needed (confirmed by Xacrow) @@ -6322,6 +6323,19 @@ --> + + PGA Tour Golf II for use with the Personal Trainer + 1995 + HeartBeat Corp + + + + + + + + + @@ -9410,11 +9424,15 @@ - - + World Championship Soccer (USA, rev. B) ~ World Cup Soccer (Japan, rev. B) 1989 Sega + @@ -9428,11 +9446,14 @@ - - - World Championship Soccer (USA) ~ World Cup Soccer (Japan) + + World Cup Soccer (Japan, REV00) 1989 Sega + @@ -9475,11 +9496,16 @@ - - + World Cup Italia '90 (Europe) 1990 - Sega + Sega / Olivetti / Virgin Mastertronic + @@ -10091,7 +10117,7 @@ - 16 Ton (Japan, SegaNet) + 16t (Japan, Sega Game Toshokan) 1991 Sega @@ -10102,7 +10128,7 @@ - 16 Ton (Japan, Game no Kandume MegaCD rip) + 16t (Japan, Game no Kandume MegaCD rip) 1991 Sega @@ -11545,7 +11571,7 @@ - Aworg (Japan, SegaNet) + Aworg (Japan, Sega Game Toshokan) 1991 Sega @@ -15562,7 +15588,7 @@ - Ikazuse! Koi no Doki Doki Penguin Land MD (Japan, SegaNet) + Ikazuse! Koi no Doki Doki Penguin Land MD (Japan, Sega Game Toshokan) 1991 Sega @@ -17015,7 +17041,7 @@ - Shi no Meikyuu - Labyrinth of Death (Japan, SegaNet) + Shi no Meikyuu - Labyrinth of Death (Japan, Sega Game Toshokan) 1991 Sega @@ -18520,7 +18546,7 @@ - Hyper Marbles (Japan, SegaNet) + Hyper Marbles (Japan, Sega Game Toshokan) 1991 Sega @@ -19570,7 +19596,7 @@ - Kiss Shot (Japan, SegaNet) + Kiss Shot (Japan, Sega Game Toshokan) 1991 Sega @@ -20693,7 +20719,7 @@ - Medal City (Japan, SegaNet) + Medal City (Japan, Sega Game Toshokan) 1991 Sega @@ -20848,7 +20874,7 @@ - MegaMind (Japan, SegaNet) + MegaMind (Japan, Sega Game Toshokan) 1991 Sega @@ -23744,7 +23770,7 @@ - Paddle Fighter (Japan, SegaNet) + Paddle Fighter (Japan, Sega Game Toshokan) 1991 Sega @@ -24087,7 +24113,7 @@ - Phantasy Star II - Amia's Adventure (Japan, SegaNet) + Phantasy Star II - Amia's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24098,7 +24124,7 @@ - Phantasy Star II - Anne's Adventure (Japan, SegaNet) + Phantasy Star II - Anne's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24109,7 +24135,7 @@ - Phantasy Star II - Huey's Adventure (Japan, SegaNet) + Phantasy Star II - Huey's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24120,7 +24146,7 @@ - Phantasy Star II - Kinds's Adventure (Japan, SegaNet) + Phantasy Star II - Kinds's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24131,7 +24157,7 @@ - Phantasy Star II - Nei's Adventure (Japan, SegaNet) + Phantasy Star II - Nei's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24142,7 +24168,7 @@ - Phantasy Star II - Rudger's Adventure (Japan, SegaNet) + Phantasy Star II - Rudger's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24153,7 +24179,7 @@ - Phantasy Star II - Shilka's Adventure (Japan, SegaNet) + Phantasy Star II - Shilka's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -24164,7 +24190,7 @@ - Phantasy Star II - Yushis's Adventure (Japan, SegaNet) + Phantasy Star II - Yushis's Adventure (Japan, Sega Game Toshokan) 1991 Sega @@ -25038,7 +25064,7 @@ - Putter Golf (Japan, SegaNet) + Putter Golf (Japan, Sega Game Toshokan) 1991 Sega @@ -25144,7 +25170,7 @@ - Pyramid Magic (Japan, SegaNet) + Pyramid Magic (Japan, Sega Game Toshokan) 1991 Sega @@ -25166,7 +25192,7 @@ - Pyramid Magic II (Japan, SegaNet) + Pyramid Magic II (Japan, Sega Game Toshokan) 1991 Sega @@ -25177,7 +25203,7 @@ - Pyramid Magic III (Japan, SegaNet) + Pyramid Magic III (Japan, Sega Game Toshokan) 1991 Sega @@ -25188,7 +25214,7 @@ - Pyramid Magic Special (Japan, SegaNet) + Pyramid Magic Special (Japan, Sega Game Toshokan) 1991 Sega @@ -25762,7 +25788,7 @@ - Riddle Wired (Japan, SegaNet) + Riddle Wired (Japan, Sega Game Toshokan) 1991 Sega @@ -26058,7 +26084,7 @@ - Robot Battler (Japan, SegaNet) + Robot Battler (Japan, Sega Game Toshokan) 1991 Sega @@ -27583,7 +27609,7 @@ - Sonic Eraser (Japan, SegaNet) + Sonic Eraser (Japan, Sega Game Toshokan) 1991 Sega @@ -30302,7 +30328,7 @@ - Teddy Boy Blues (Japan, SegaNet) + Teddy Boy Blues (Japan, Sega Game Toshokan) 1991 Sega - + World Championship Soccer (USA, v1.2) ~ World Cup Soccer (Japan, v1.2) 1989 Sega + - + diff -Nru mame-0.263+dfsg.1/hash/msx1_cass.xml mame-0.264+dfsg.1/hash/msx1_cass.xml --- mame-0.263+dfsg.1/hash/msx1_cass.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/msx1_cass.xml 2024-03-25 14:00:46.000000000 +0000 @@ -444,34 +444,40 @@ - - Aackobase II (Europe) + Aackobase II (Netherlands) 1985 Aackosoft - - + + + + + + - - Aackobase II (Europe, alt) + Aackobase II (Netherlands, alt) 1985 Aackosoft - - + + + + + + @@ -6450,6 +6456,222 @@ + + The Games Collection (Europe) + 1988 + Eurosoft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Games Designer (Spain) @@ -6465,6 +6687,18 @@ + + Games Tutor (I) (Spain) + 1986 + MSX Club + + + + + + + + The Games - Winter Edition (Europe) 1988 @@ -7312,6 +7546,18 @@ + + Hard-Copy (Spain) + 1986 + MSX Club + + + + + + + + Harvey Smith's Showjumper (Europe, hacked protection) 1985 @@ -15990,6 +16236,20 @@ + + + + T-GRAPH (Europe) + 1984 + Toshiba + For Toshiba Plotter Printer HX-P570, Dot Printer HX-P550. + + + + + + + diff -Nru mame-0.263+dfsg.1/hash/msx1_flop_525.xml mame-0.264+dfsg.1/hash/msx1_flop_525.xml --- mame-0.263+dfsg.1/hash/msx1_flop_525.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/msx1_flop_525.xml 2024-03-25 14:00:46.000000000 +0000 @@ -33,7 +33,7 @@ O Conde de Monte Cristo (Brazil) 1988 - Nemesis Informatica + Nemesis Informática @@ -44,7 +44,7 @@ Disk Mechanic v2.0 (Brazil) 1990 - Discovery Informatica + Discovery Informática @@ -52,10 +52,35 @@ + + Gradius System (Brazil) + 1990 + Nemesis Informática + Some menu options ask for other disks named G-COPY or G-CALC; part of this package or other products from Nemesis Informática? + + + + + + + + + + + + + + + + + + + Graphic View (Brazil) 1989 - Paulisoft Informatica + Paulisoft Informática + @@ -77,7 +102,7 @@ MSX-DOS Tools (Brazil, v4.3) 1991 - Nemesis Informatica + Nemesis Informática @@ -96,10 +121,23 @@ + + Poster Maker (Brazil) + 1989 + Discovery Informática + + + + + + + + Professional Cards (Brazil) 1990 - Discovery Informatica + Discovery Informática + @@ -107,11 +145,22 @@ + + Professional Paint (Brazil) + 19?? + Hitek + + + + + + + Professional Publisher (Brazil) 1990 - Discovery Informatica - + Discovery Informática + @@ -119,6 +168,30 @@ + + Professional Stripes (Brazil) + 1990 + Discovery Informática + + + + + + + + + + Retrato Falado (Brazil) + 19?? + MSX Shop + + + + + + + + Serra Pelada (Brazil) 1987 @@ -130,5 +203,16 @@ + + + SuperCalc 2 (Brazil) + 1985 + Compucenter Informática + + + + + + diff -Nru mame-0.263+dfsg.1/hash/msx2p_cart.xml mame-0.264+dfsg.1/hash/msx2p_cart.xml --- mame-0.263+dfsg.1/hash/msx2p_cart.xml 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/hash/msx2p_cart.xml 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,56 @@ + + + + + + + Knit Designer (Japan) + 19?? + Silver Reed + Cartridge hardware is not emulated. + + + + + + + + + + + + + + + + + + + + Ghostly Manor + 2022 + 9958 Crew + + + + + + + + + + Nothing Thing + 2013 + #msxdev Compo + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/hash/n64.xml mame-0.264+dfsg.1/hash/n64.xml --- mame-0.263+dfsg.1/hash/n64.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/n64.xml 2024-03-25 14:00:46.000000000 +0000 @@ -5867,12 +5867,13 @@ - Jikkyou Powerful Pro Yakyuu 2000 (Japan, rev 1) + Jikkyou Pawafuru Puro Yakyū 2000 (Japan, rev 1) 2000 Konami + @@ -5881,12 +5882,13 @@ - Jikkyou Powerful Pro Yakyuu 2000 (Japan) + Jikkyou Pawafuru Puro Yakyū 2000 (Japan) 2000 Konami + @@ -5903,12 +5905,13 @@ - Jikkyou Powerful Pro Yakyuu 4 (Japan, rev 1) + Jikkyou Pawafuru Puro Yakyū 4 (Japan, rev 1) 1997 Konami + @@ -5921,12 +5924,13 @@ - Jikkyou Powerful Pro Yakyuu 4 (Japan) + Jikkyou Pawafuru Puro Yakyū 4 (Japan) 1997 Konami + @@ -5935,7 +5939,7 @@ - Jikkyou Powerful Pro Yakyuu 5 (Japan, rev 2) + Jikkyou Pawafuru Puro Yakyū 5 (Japan, rev 2) 1998 Konami + @@ -5952,7 +5957,7 @@ - Jikkyou Powerful Pro Yakyuu 5 (Japan, rev 1) + Jikkyou Pawafuru Puro Yakyū 5 (Japan, rev 1) 1998 Konami + @@ -5977,7 +5983,7 @@ - Jikkyou Powerful Pro Yakyuu 5 (Japan) + Jikkyou Pawafuru Puro Yakyū 5 (Japan) 1998 Konami + @@ -6000,12 +6007,13 @@ - Jikkyou Powerful Pro Yakyuu 6 (Japan, rev 2) + Jikkyou Pawafuru Puro Yakyū 6 (Japan, rev 2) 1999 Konami + @@ -6014,12 +6022,13 @@ - Jikkyou Powerful Pro Yakyuu 6 (Japan, rev 1) + Jikkyou Pawafuru Puro Yakyū 6 (Japan, rev 1) 1999 Konami + @@ -6028,12 +6037,13 @@ - Jikkyou Powerful Pro Yakyuu 6 (Japan) + Jikkyou Pawafuru Puro Yakyū 6 (Japan) 1999 Konami + @@ -6050,12 +6060,13 @@ - Jikkyou Powerful Pro Yakyuu Basic Ban 2001 (Japan, rev 1) + Jikkyou Pawafuru Puro Yakyū Basic-ban 2001 (Japan, rev 1) 2001 Konami + @@ -6064,12 +6075,13 @@ - Jikkyou Powerful Pro Yakyuu Basic Ban 2001 (Japan) + Jikkyou Pawafuru Puro Yakyū Basic-ban 2001 (Japan) 2001 Konami + diff -Nru mame-0.263+dfsg.1/hash/pc1512_hdd.xml mame-0.264+dfsg.1/hash/pc1512_hdd.xml --- mame-0.263+dfsg.1/hash/pc1512_hdd.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/pc1512_hdd.xml 2024-03-25 14:00:46.000000000 +0000 @@ -10,7 +10,7 @@ 1986 Amstrad - + diff -Nru mame-0.263+dfsg.1/hash/saturn.xml mame-0.264+dfsg.1/hash/saturn.xml --- mame-0.263+dfsg.1/hash/saturn.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/saturn.xml 2024-03-25 14:00:46.000000000 +0000 @@ -547,8 +547,8 @@ Jantei: Battle Cos-Player (Japan) [T-34601G] | (jantbcp) Japan Super Bass Classic '96 (Japan) [T-18707G] | (jsbc96) Jikkyou Oshaberi Parodius: Forever with Me (Japan) [T-9513G] | (jikkparo) - Jikkyou Powerful Pro Yakyuu '95 Kaimakuban (Japan) [T-9502G] | (powyak95) - Jikkyou Powerful Pro Yakyuu S (Japan) [T-9523G] | (powyaks) + Jikkyou Pawafuru Puro Yakyū '95 Kaimaku-ban (Japan) [T-9502G] | (powyak95) + Jikkyou Pawafuru Puro Yakyū S (Japan) [T-9523G] | (powyaks) Jikuu Tantei DD: Dracula Detective: Maboroshi no Lorelei (Japan) [T-2103G] | (jikudrac) Jinzou Ningen Hakaider: Last Judgement (Japan) [GS-9088] | (lastjudg) Jissen Mahjong (Japan) [T-15002G] | (jissenmj) @@ -18401,12 +18401,13 @@ - Jikkyou Powerful Pro Yakyuu '95 - Kaimaku-ban (Japan) + Jikkyou Pawafuru Puro Yakyū '95 Kaimaku-ban (Japan) 1995 Konami + @@ -27111,12 +27112,13 @@ - Jikkyou Powerful Pro Yakyuu S (Japan) + Jikkyou Pawafuru Puro Yakyū S (Japan) 1997 Konami + diff -Nru mame-0.263+dfsg.1/hash/scv.xml mame-0.264+dfsg.1/hash/scv.xml --- mame-0.263+dfsg.1/hash/scv.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/scv.xml 2024-03-25 14:00:46.000000000 +0000 @@ -89,10 +89,12 @@ 1985 Epoch - + + + diff -Nru mame-0.263+dfsg.1/hash/sms.xml mame-0.264+dfsg.1/hash/sms.xml --- mame-0.263+dfsg.1/hash/sms.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/sms.xml 2024-03-25 14:00:46.000000000 +0000 @@ -541,6 +541,18 @@ + + Arcade Volleyball + 2021 + raphnet + + + + + + + + Argos no Juujiken (Japan) 1988 @@ -878,10 +890,11 @@ - Bara Buru + Bara Burū 2016 2Minds + @@ -1170,6 +1183,18 @@ + + Blast Arena + 2023 + BadComputer + + + + + + + + Block Hole (Korea) 1990 @@ -1279,7 +1304,7 @@ Bruce Lee 2015 - <homebrew> + Kagesan @@ -1486,6 +1511,7 @@ Castelo Rá-Tim-Bum (Brazil) 1997 Tec Toy + @@ -2392,6 +2418,58 @@ + + Extreme Volleyball Infernal League (v2.0.21, demo) + 2023 + raphnet + + + + + + + + + + + Extreme Volleyball Infernal League (v1.0.2) + 2023 + raphnet + + + + + + + + + + + Extreme Volleyball Infernal League (v1.0.5) + 2023 + raphnet + + + + + + + + + + + Extreme Volleyball Infernal League (v1.0.6) + 2023 + raphnet + + + + + + + + + F1 (Europe, Brazil) 1993 @@ -2603,7 +2681,7 @@ - Fantasy Zone - The Maze (Europe, USA) + Fantasy Zone: The Maze (Europe, USA) 1987 Sega @@ -2614,6 +2692,17 @@ + + Fantasy Zone: The Maze (prototype) + 1987 + Sega + + + + + + + Final Bubble Bobble (Japan) 1988 @@ -2632,6 +2721,7 @@ Férias Frustradas do Pica-Pau (Brazil) 1996 Tec Toy + @@ -2707,8 +2797,9 @@ Flight of Pigarus (v1.11) 2018 2Minds - + + @@ -2723,9 +2814,10 @@ Flight of Pigarus (v1.10) 2018 - <homebrew> - + Kagesan + + @@ -2739,9 +2831,10 @@ Flight of Pigarus (v1.00) 2018 - <homebrew> - + Kagesan + + @@ -3548,6 +3641,7 @@ Heroes Against Demons 2020 2Minds + @@ -3848,6 +3942,18 @@ + + Jewel Stone (demo) + 2019 + ichigobankai & Vingazole + + + + + + + + Joe Montana Football (Europe, USA, Brazil) 1990 @@ -4217,6 +4323,30 @@ + + Lucky Penguin (v1.1) + 2020 + Denine + + + + + + + + + + Lucky Penguin (v1.0) + 2020 + Denine + + + + + + + + Mahjong Sengoku Jidai (Japan, Hong Kong) 1987 @@ -4471,6 +4601,7 @@ Show do Milhão (Brazil, prototype) 2003 Tec Toy + @@ -4584,6 +4715,7 @@ Mônica no Castelo do Dragao (Brazil) 1991 Tec Toy + @@ -5139,6 +5271,30 @@ + + Pitman (v1.03) + 2021 + Under4Mhz + + + + + + + + + + Pitman (v1.02) + 2021 + Under4Mhz + + + + + + + + Pooyan (Korea) 19?? @@ -5318,6 +5474,7 @@ Phantasy Star (Brazil) 1987 Tec Toy + @@ -5832,11 +5989,11 @@ - S.O.S Lagoa Poluida (Brazil) + S.O.S. Lagoa Poluida (Brazil) 1995 Tec Toy - + @@ -5848,6 +6005,7 @@ Sapo Xulé vs. Os Invasores do Brejo (Brazil) 1995 Tec Toy + @@ -6017,6 +6175,71 @@ + + SKBN (v1.4) + 2021 + raphnet + + + + + + + + + + + SKBN (v1.3) + 2021 + raphnet + + + + + + + + + + + SKBN (v1.2) + 2021 + raphnet + + + + + + + + + + + SKBN (v1.1) + 2021 + raphnet + + + + + + + + + + + SKBN (v1.0) + 2021 + raphnet + + + + + + + + + Sky Fighter (Korea) @@ -6219,6 +6442,7 @@ Sítio do Picapau Amarelo (Brazil) 1997 Tec Toy + @@ -7026,6 +7250,7 @@ Super Futebol II (Brazil) 1990 Sega + @@ -7461,6 +7686,7 @@ Turma da Mônica em O Resgate (Brazil) 1993 Tec Toy + @@ -7476,6 +7702,7 @@ As Aventuras da TV Colosso (Brazil) 1996 Tec Toy + @@ -7839,10 +8066,37 @@ + + Wing Warriors (fix) + 2024 + EGS + + + + + + + + + + + Wing Warriors + 2019 + Kitmaker Entertainment + + + + + + + + + Winter Olympics - Lillehammer '94 (Europe) 1993 U.S. Gold + @@ -7855,6 +8109,7 @@ Winter Olympics - Lillehammer '94 (Brazil) 1993 U.S. Gold + @@ -7991,6 +8246,7 @@ Where in the World is Carmen Sandiego? (Brazil) 1989 Tec Toy + diff -Nru mame-0.263+dfsg.1/hash/snes.xml mame-0.264+dfsg.1/hash/snes.xml --- mame-0.263+dfsg.1/hash/snes.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/snes.xml 2024-03-25 14:00:46.000000000 +0000 @@ -398,7 +398,7 @@ - + @@ -851,7 +851,7 @@ Castlevania - Dracula X (USA, final prototype) 1995 Konami - + @@ -1520,7 +1520,7 @@ Foreman For Real (USA, final prototype) 1995 Acclaim Entertainment - + @@ -1706,7 +1706,7 @@ International Superstar Soccer Deluxe (Europe, prototype) 1995 Konami - + @@ -1867,7 +1867,7 @@ Joe & Mac 2 - Lost in the Tropics (USA, prototype, alt) 1994 Data East - + @@ -1892,7 +1892,7 @@ Jurassic Park (USA, prototype) 1993 Ocean - + @@ -2600,7 +2600,7 @@ The Pirates of Dark Water (USA, prototype) 1994 Sunsoft - + @@ -2880,7 +2880,7 @@ Samurai Shodown (USA, prototype) 1994 Takara - + @@ -3250,7 +3250,7 @@ 1994 Nintendo - + @@ -3421,7 +3421,7 @@ Human Entertainment - + @@ -3482,7 +3482,7 @@ 1993 Nintendo - + @@ -3587,7 +3587,7 @@ 1995 Nintendo - + @@ -3762,7 +3762,7 @@ 1993 Tomy - + @@ -4078,7 +4078,7 @@ WeaponLord (USA, prototype) 1995 Namco - + @@ -4449,7 +4449,7 @@ Konami - + @@ -4947,7 +4947,7 @@ 1994 ASCII Entertainment - + @@ -6053,7 +6053,7 @@ 1995 Jaleco - + @@ -6271,7 +6271,7 @@ Data East - + @@ -6556,7 +6556,7 @@ Konami - + @@ -6577,7 +6577,7 @@ DTMC - + @@ -6621,7 +6621,7 @@ Ocean - + @@ -7273,7 +7273,7 @@ Konami - + @@ -7434,7 +7434,7 @@ Titus - + @@ -7544,7 +7544,7 @@ Takara - + @@ -7932,7 +7932,7 @@ Hot-B - + @@ -7997,7 +7997,7 @@ Konami - + @@ -8629,7 +8629,7 @@ Konami - + @@ -8719,7 +8719,7 @@ Activision - + @@ -9725,7 +9725,7 @@ Capcom - + @@ -9797,7 +9797,7 @@ Capcom - + @@ -9893,7 +9893,7 @@ - + @@ -9978,7 +9978,7 @@ Konami - + @@ -10284,7 +10284,7 @@ - + @@ -10486,7 +10486,7 @@ Interplay - + @@ -10507,7 +10507,7 @@ Interplay - + @@ -10531,7 +10531,7 @@ Interplay - + @@ -10555,7 +10555,7 @@ Interplay - + @@ -10816,7 +10816,7 @@ - + @@ -10841,7 +10841,7 @@ - + @@ -10863,7 +10863,7 @@ - + @@ -11054,7 +11054,7 @@ - + @@ -11084,7 +11084,7 @@ - + @@ -11456,7 +11456,7 @@ Ocean - + @@ -11742,7 +11742,7 @@ 1995 Elite Systems - + @@ -11896,7 +11896,7 @@ 1994 Nintendo - + @@ -11924,7 +11924,7 @@ Nintendo - + @@ -11951,7 +11951,7 @@ Nintendo - + @@ -11990,7 +11990,7 @@ 1995 Nintendo - + @@ -12016,7 +12016,7 @@ 1995 Nintendo - + @@ -12044,7 +12044,7 @@ 1995 Nintendo - + @@ -12073,7 +12073,7 @@ Nintendo - + @@ -12098,7 +12098,7 @@ 1996 Nintendo - + @@ -12124,7 +12124,7 @@ Nintendo - + @@ -12306,7 +12306,7 @@ Acclaim Entertainment - + @@ -12373,7 +12373,7 @@ - + @@ -12395,7 +12395,7 @@ - + @@ -12420,7 +12420,7 @@ - + @@ -12442,7 +12442,7 @@ - + @@ -13035,7 +13035,7 @@ GameTek - + @@ -13463,7 +13463,7 @@ 1995 Takara - + @@ -13484,7 +13484,7 @@ Takara - + @@ -13578,7 +13578,7 @@ Data East - + @@ -14110,7 +14110,7 @@ - + @@ -14236,7 +14236,7 @@ Ocean - + @@ -14354,7 +14354,7 @@ - + @@ -14381,7 +14381,7 @@ - + @@ -14689,7 +14689,7 @@ - + @@ -14785,7 +14785,7 @@ - + @@ -14993,7 +14993,7 @@ - + @@ -15146,7 +15146,7 @@ - + @@ -15461,7 +15461,7 @@ - + @@ -15645,7 +15645,7 @@ - + @@ -15796,7 +15796,7 @@ Nintendo - + @@ -15832,7 +15832,7 @@ Nintendo - + @@ -15858,7 +15858,7 @@ Nintendo - + @@ -15884,7 +15884,7 @@ Nintendo - + @@ -16075,7 +16075,7 @@ 1995 Konami - + @@ -16095,7 +16095,7 @@ 1995 Konami - + @@ -16214,7 +16214,7 @@ - + @@ -16253,7 +16253,7 @@ - + @@ -16282,7 +16282,7 @@ - + @@ -16304,7 +16304,7 @@ - + @@ -16327,7 +16327,7 @@ - + @@ -16352,7 +16352,7 @@ - + @@ -16501,7 +16501,7 @@ - + @@ -16522,13 +16522,14 @@ - Jikkyou Powerful Pro Yakyuu - Basic Ban '98 (Japan) + Jikkyou Pawafuru Puro Yakyū - Basic-ban '98 (Japan) 1998 Konami - + + @@ -16549,13 +16550,14 @@ - Jikkyou Powerful Pro Yakyuu 2 (Japan) + Jikkyou Pawafuru Puro Yakyū 2 (Japan) 1995 Konami - + + @@ -16578,13 +16580,14 @@ - Jikkyou Powerful Pro Yakyuu 3 (Japan) + Jikkyou Pawafuru Puro Yakyū 3 (Japan) 1996 Konami - + + @@ -16605,13 +16608,14 @@ - Jikkyou Powerful Pro Yakyuu 3 (Japan, alt) + Jikkyou Pawafuru Puro Yakyū 3 (Japan, alt) 1996 Konami - + + @@ -16634,13 +16638,14 @@ - Jikkyou Powerful Pro Yakyuu 3 - '97 Haru (Japan) + Jikkyou Pawafuru Puro Yakyū 3 - '97 Haru (Japan) 1997 Konami - + + @@ -16661,13 +16666,14 @@ - Jikkyou Powerful Pro Yakyuu '94 (Japan) + Jikkyou Pawafuru Puro Yakyū '94 (Japan) 1994 Konami - + + @@ -16683,13 +16689,14 @@ - Jikkyou Powerful Pro Yakyuu '96 - Kaimaku Ban (Japan) + Jikkyou Pawafuru Puro Yakyū '96 Kaimaku-ban (Japan) 1996 Konami - + + @@ -16710,13 +16717,14 @@ - Jikkyou Powerful Pro Yakyuu '96 - Kaimaku Ban (Japan, rev. A) + Jikkyou Pawafuru Puro Yakyū '96 Kaimaku-ban (Japan, rev. A) 1996 Konami - + + @@ -16744,7 +16752,7 @@ - + @@ -16771,7 +16779,7 @@ - + @@ -16799,7 +16807,7 @@ - + @@ -16847,7 +16855,7 @@ - + @@ -16874,7 +16882,7 @@ - + @@ -16997,7 +17005,7 @@ - + @@ -17037,7 +17045,7 @@ Ocean - + @@ -17058,7 +17066,7 @@ Ocean - + @@ -17135,7 +17143,7 @@ - + @@ -17289,7 +17297,7 @@ Nintendo - + @@ -17316,7 +17324,7 @@ Nintendo - + @@ -17344,7 +17352,7 @@ - + @@ -17595,7 +17603,7 @@ - + @@ -17648,7 +17656,7 @@ Nintendo - + @@ -17668,7 +17676,7 @@ 1995 Nintendo - + @@ -18191,7 +18199,7 @@ 1994 Konami - + @@ -18213,7 +18221,7 @@ - + @@ -18326,7 +18334,7 @@ - + @@ -18732,7 +18740,7 @@ - + @@ -18800,7 +18808,7 @@ - + @@ -18988,7 +18996,7 @@ - + @@ -19153,7 +19161,7 @@ 1993 Namco - + @@ -19177,7 +19185,7 @@ Namco - + @@ -19201,7 +19209,7 @@ Konami - + @@ -19374,7 +19382,7 @@ - + @@ -19736,7 +19744,7 @@ - + @@ -20551,7 +20559,7 @@ Gremlin Interactive - + @@ -20572,7 +20580,7 @@ GameTek - + @@ -21591,7 +21599,7 @@ 1996 Disney Interactive - + @@ -21612,7 +21620,7 @@ Sunsoft - + @@ -21651,7 +21659,7 @@ 1993 Nintendo - + @@ -21671,7 +21679,7 @@ 1993 Nintendo - + @@ -22148,7 +22156,7 @@ 1994 Jaleco - + @@ -22169,7 +22177,7 @@ Jaleco - + @@ -22450,7 +22458,7 @@ 1993 Interplay - + @@ -22471,7 +22479,7 @@ Virgin Interactive - + @@ -22539,7 +22547,7 @@ - + @@ -22879,7 +22887,7 @@ - + @@ -22906,7 +22914,7 @@ - + @@ -22935,7 +22943,7 @@ - + @@ -22962,7 +22970,7 @@ - + @@ -23112,7 +23120,7 @@ - + @@ -23185,7 +23193,7 @@ Takara - + @@ -23210,7 +23218,7 @@ - + @@ -23645,7 +23653,7 @@ 1993 Nintendo - + @@ -23671,7 +23679,7 @@ Square - + @@ -23697,7 +23705,7 @@ Square - + @@ -23726,7 +23734,7 @@ - + @@ -23753,7 +23761,7 @@ - + @@ -23782,7 +23790,7 @@ - + @@ -23809,7 +23817,7 @@ - + @@ -23922,7 +23930,7 @@ - + @@ -24722,7 +24730,7 @@ Enix - + @@ -24820,7 +24828,7 @@ - + @@ -24842,7 +24850,7 @@ - + @@ -24989,7 +24997,7 @@ - + @@ -25263,7 +25271,7 @@ Jaleco - + @@ -25304,7 +25312,7 @@ Capcom - + @@ -25572,7 +25580,7 @@ - + @@ -25655,7 +25663,7 @@ 1994 Nintendo - + @@ -25685,7 +25693,7 @@ - + @@ -26254,7 +26262,7 @@ - + @@ -26281,7 +26289,7 @@ - + @@ -26309,7 +26317,7 @@ - + @@ -26336,7 +26344,7 @@ - + @@ -26365,7 +26373,7 @@ - + @@ -26393,7 +26401,7 @@ - + @@ -26423,7 +26431,7 @@ - + @@ -26450,7 +26458,7 @@ - + @@ -26606,7 +26614,7 @@ - + @@ -26675,7 +26683,7 @@ - + @@ -26702,7 +26710,7 @@ - + @@ -26729,7 +26737,7 @@ - + @@ -26785,7 +26793,7 @@ - + @@ -26854,7 +26862,7 @@ - + @@ -26911,7 +26919,7 @@ - + @@ -26985,7 +26993,7 @@ - + @@ -27012,7 +27020,7 @@ - + @@ -27039,7 +27047,7 @@ - + @@ -27179,7 +27187,7 @@ - + @@ -27222,7 +27230,7 @@ Jaleco - + @@ -27293,7 +27301,7 @@ - + @@ -27341,7 +27349,7 @@ 1994 Nintendo - + @@ -27493,7 +27501,7 @@ - + @@ -27548,7 +27556,7 @@ - + @@ -27750,7 +27758,7 @@ 1993 Nintendo - + @@ -27789,7 +27797,7 @@ 1993 Nintendo - + @@ -27817,7 +27825,7 @@ Nintendo - + @@ -27858,7 +27866,7 @@ Nintendo - + @@ -27912,7 +27920,7 @@ - + @@ -28273,7 +28281,7 @@ 1995 Nintendo - + @@ -28302,7 +28310,7 @@ Nintendo - + @@ -28332,7 +28340,7 @@ - + @@ -28589,7 +28597,7 @@ - + @@ -28876,7 +28884,7 @@ Nintendo - + @@ -29231,7 +29239,7 @@ - + @@ -29843,7 +29851,7 @@ - + @@ -29954,7 +29962,7 @@ - + @@ -30062,7 +30070,7 @@ - + @@ -30118,7 +30126,7 @@ - + @@ -30284,7 +30292,7 @@ - + @@ -30311,7 +30319,7 @@ - + @@ -30405,7 +30413,7 @@ Tecmo - + @@ -30434,7 +30442,7 @@ - + @@ -30841,7 +30849,7 @@ 1996 Nintendo - + @@ -30866,7 +30874,7 @@ 1996 Nintendo - + @@ -30891,7 +30899,7 @@ 1994 Nintendo - + @@ -30912,7 +30920,7 @@ Nintendo - + @@ -30933,7 +30941,7 @@ Nintendo - + @@ -31083,7 +31091,7 @@ 1995 Infogrames - + @@ -31194,7 +31202,7 @@ 1994 Konami - + @@ -31216,7 +31224,7 @@ - + @@ -31569,7 +31577,7 @@ - + @@ -32302,7 +32310,7 @@ - + @@ -32472,7 +32480,7 @@ 1996 Nintendo - + @@ -32502,7 +32510,7 @@ - + @@ -32583,7 +32591,7 @@ - + @@ -32603,7 +32611,7 @@ 1994 GameTek - + @@ -32630,7 +32638,7 @@ - + @@ -32758,7 +32766,7 @@ - + @@ -32913,7 +32921,7 @@ Activision - + @@ -33039,7 +33047,7 @@ - + @@ -33185,7 +33193,7 @@ - + @@ -33207,7 +33215,7 @@ - + @@ -33473,7 +33481,7 @@ 1994 Nintendo - + @@ -33753,7 +33761,7 @@ - + @@ -33777,13 +33785,14 @@ - Jikkyou Powerful Pro Yakyuu 2 (Japan, rev. A) + Jikkyou Pawafuru Puro Yakyū 2 (Japan, rev. A) 1995 Konami - + + @@ -33915,7 +33924,7 @@ Nintendo - + @@ -33944,7 +33953,7 @@ - + @@ -34211,7 +34220,7 @@ 1993 Nintendo - + @@ -34561,7 +34570,7 @@ - + @@ -34787,7 +34796,7 @@ - + @@ -34909,7 +34918,7 @@ 90 Minutes - European Prime Goal (Europe, prototype) 1995 Ocean - + @@ -34924,7 +34933,7 @@ 90 Minutes - European Prime Goal (Europe) 1995 Ocean - + @@ -34954,7 +34963,7 @@ - + @@ -35061,7 +35070,7 @@ ActRaiser 2 (Europe) 1993 Enix - + @@ -35137,7 +35146,7 @@ The Adventures of Batman & Robin (Europe) 1995 Konami - + @@ -35150,7 +35159,7 @@ The Adventures of Dr. Franken (Europe) 1995 DTMC - + @@ -35179,7 +35188,7 @@ 1997 Infogrames - + @@ -35262,7 +35271,7 @@ - + @@ -35280,7 +35289,7 @@ - + @@ -35315,7 +35324,7 @@ - + @@ -35403,7 +35412,7 @@ - + @@ -35528,7 +35537,7 @@ - + @@ -35622,7 +35631,7 @@ Animaniacs (Europe) 1994 Konami - + @@ -35638,7 +35647,7 @@ - + @@ -35651,7 +35660,7 @@ Animaniacs (prototype 19940611) 1994 Konami - + @@ -35825,7 +35834,7 @@ - + @@ -35895,7 +35904,7 @@ Art of Fighting (Europe) 1994 Takara - + @@ -36073,7 +36082,7 @@ - + @@ -36449,7 +36458,7 @@ - + @@ -36674,7 +36683,7 @@ Biker Mice from Mars (Europe) 1994 Konami - + @@ -36700,7 +36709,7 @@ BioMetal (Europe) 1993 Activision - + @@ -37285,7 +37294,7 @@ Buck Rogers - The Arcade Game (Europe, prototype) 1993 Electro Brain - + @@ -37355,7 +37364,7 @@ - + @@ -37397,7 +37406,7 @@ California Games II (Europe) 1992 DTMC - + @@ -37583,7 +37592,7 @@ Castlevania - Vampire's Kiss (Europe) 1995 Konami - + @@ -37693,7 +37702,7 @@ - + @@ -37709,7 +37718,7 @@ - + @@ -37966,7 +37975,7 @@ Clay Fighter (Europe, prototype) 1993 Interplay - + @@ -37979,7 +37988,7 @@ Clay Fighter (Europe) 1993 Interplay - + @@ -38004,7 +38013,7 @@ Claymates (Europe, prototype) 1993 Interplay - + @@ -38018,7 +38027,7 @@ Claymates (Europe, prototype, alt) 1993 Interplay - + @@ -38031,7 +38040,7 @@ Claymates (Europe) 1993 Interplay - + @@ -38071,7 +38080,7 @@ - + @@ -38283,7 +38292,7 @@ - + @@ -38411,7 +38420,7 @@ - + @@ -38456,7 +38465,7 @@ - + @@ -38474,7 +38483,7 @@ - + @@ -38492,7 +38501,7 @@ - + @@ -38623,7 +38632,7 @@ - + @@ -38695,7 +38704,7 @@ - + @@ -38741,7 +38750,7 @@ - + @@ -39012,7 +39021,7 @@ - + @@ -39205,7 +39214,7 @@ - + @@ -39218,7 +39227,7 @@ Donald in Maui Mallard (Europe) 1996 Nintendo - + @@ -39232,7 +39241,7 @@ 1994 Nintendo - + @@ -39247,7 +39256,7 @@ Donkey Kong Country 2 - Diddy's Kong Quest (Germany) 1995 Nintendo - + @@ -39263,7 +39272,7 @@ 1995 Nintendo - + @@ -39497,7 +39506,7 @@ - + @@ -39512,7 +39521,7 @@ Dragon - The Bruce Lee Story (Europe) 1995 Acclaim Entertainment - + @@ -39525,7 +39534,7 @@ Dragon Ball Z - Chomutujeon (Korea) 1994? Bandai? - + @@ -39610,7 +39619,7 @@ - + @@ -39626,7 +39635,7 @@ - + @@ -39899,7 +39908,7 @@ - + @@ -40090,7 +40099,7 @@ 1995 Nintendo - + @@ -40352,7 +40361,7 @@ Eric Cantona Football Challenge (France) 1993 Elite Systems - + @@ -40828,7 +40837,7 @@ Fatal Fury Special (Europe, prototype) 1995 Takara - + @@ -40884,7 +40893,7 @@ Fever Pitch Soccer (Europe) 1995 U.S. Gold - + @@ -40971,7 +40980,7 @@ - + @@ -40984,7 +40993,7 @@ Fighter's History (USA, prototype) 1994 Data East - + @@ -41000,7 +41009,7 @@ - + @@ -41110,7 +41119,7 @@ 1994 Capcom - + @@ -41440,7 +41449,7 @@ The Flintstones (Europe) 1995 Ocean - + @@ -41508,7 +41517,7 @@ Foreman For Real (Europe) 1995 Acclaim Entertainment - + @@ -41524,7 +41533,7 @@ - + @@ -41538,7 +41547,7 @@ 1995 Acclaim Entertainment - + @@ -41871,7 +41880,7 @@ - + @@ -41983,7 +41992,7 @@ - + @@ -42001,7 +42010,7 @@ - + @@ -42028,7 +42037,7 @@ - + @@ -42046,7 +42055,7 @@ - + @@ -42064,7 +42073,7 @@ - + @@ -42311,7 +42320,7 @@ Get in the Hole (Japan) 1995 Good House - + @@ -42437,7 +42446,7 @@ - + @@ -42453,7 +42462,7 @@ - + @@ -42469,7 +42478,7 @@ - + @@ -42554,7 +42563,7 @@ Gokujou Parodius (Japan, prototype) 1994 Konami - + @@ -42567,7 +42576,7 @@ Gokujou Parodius (Japan, sample) 1994 Konami - + @@ -42689,7 +42698,7 @@ GP-1 (Europe) 1993 Atlus - + @@ -42703,7 +42712,7 @@ 1993 Atlus - + @@ -42717,7 +42726,7 @@ 1994 Atlus - + @@ -42794,7 +42803,7 @@ - + @@ -42807,7 +42816,7 @@ The Great Battle IV (Japan, sample) 1994 Banpresto - + @@ -42946,7 +42955,7 @@ - + @@ -43069,7 +43078,7 @@ 1994 Jaleco - + @@ -43112,7 +43121,7 @@ Hanguk Pro Yagu (Korea) 1994? Hyundai - + @@ -43290,7 +43299,7 @@ 1995 U.S. Gold - + @@ -43333,7 +43342,7 @@ Hebereke's Popoitto (Europe) 1995 Sunsoft - + @@ -43346,7 +43355,7 @@ Hebereke's Popoon (Europe) 1993 Sunsoft - + @@ -43626,7 +43635,7 @@ - + @@ -43644,7 +43653,7 @@ - + @@ -43947,7 +43956,7 @@ - + @@ -43963,7 +43972,7 @@ - + @@ -43979,7 +43988,7 @@ - + @@ -44121,7 +44130,7 @@ - + @@ -44322,7 +44331,7 @@ The Ignition Factor (prototype) 1994 Jaleco - + @@ -44336,7 +44345,7 @@ 1995 Jaleco - + @@ -44412,7 +44421,7 @@ Illusion of Time (Europe) 1994 Nintendo - + @@ -44427,7 +44436,7 @@ Illusion of Time (Spain) 1994 Nintendo - + @@ -44584,7 +44593,7 @@ 1995 Konami - + @@ -44598,7 +44607,7 @@ 1995 Konami - + @@ -44627,7 +44636,7 @@ - + @@ -44641,7 +44650,7 @@ 1993 Taito - + @@ -44796,7 +44805,7 @@ - + @@ -44814,7 +44823,7 @@ - + @@ -44854,7 +44863,7 @@ J.League Excite Stage '95 (Japan, prototype) 1995 Epoch - + @@ -44872,7 +44881,7 @@ - + @@ -44890,7 +44899,7 @@ - + @@ -45196,7 +45205,7 @@ - + @@ -45209,13 +45218,14 @@ - Jikkyou Powerful Pro Yakyuu 2 (Japan, rev. B) + Jikkyou Pawafuru Puro Yakyū 2 (Japan, rev. B) 1995 Konami - + + @@ -45227,13 +45237,14 @@ - Jikkyou Powerful Pro Yakyuu 3 - '97 Haru (Japan, rev. A) + Jikkyou Pawafuru Puro Yakyū 3 - '97 Haru (Japan, rev. A) 1997 Konami - + + @@ -45251,7 +45262,7 @@ - + @@ -45266,7 +45277,7 @@ Jikkyou World Soccer 2 - Fighting Eleven (Japan, prototype) 1995 Konami - + @@ -45305,7 +45316,7 @@ 1993 Electro Brain - + @@ -45318,7 +45329,7 @@ Jim Power - The Lost Dimension in 3D (enhanced version) 2015 Piko Interactive - + @@ -45481,7 +45492,7 @@ - + @@ -45533,7 +45544,7 @@ - + @@ -45600,7 +45611,7 @@ Joe & Mac 2 - Lost in the Tropics (USA, prototype) 1994 Data East - + @@ -45614,7 +45625,7 @@ 1994 Data East - + @@ -45639,7 +45650,7 @@ Joe & Mac 3 - Lost in the Tropics (Europe) 1994 Data East - + @@ -45941,7 +45952,7 @@ - + @@ -46046,7 +46057,7 @@ - + @@ -46059,7 +46070,7 @@ K.H. Rummenigge's Player Manager (Germany) 1993 Imagineer - + @@ -46074,7 +46085,7 @@ K.H. Rummenigge's Player Manager (Germany, Demo 20 Week Manager) 1993 Imagineer - + @@ -46089,7 +46100,7 @@ K.H. Rummenigge's Player Manager (Germany, Demo 10 Week Manager) 1993 Imagineer - + @@ -46249,7 +46260,7 @@ - + @@ -46397,7 +46408,7 @@ - + @@ -46428,7 +46439,7 @@ 1993 Asmik - + @@ -46444,7 +46455,7 @@ 1993 Asmik - + @@ -46459,7 +46470,7 @@ Kevin Keegan's Player Manager (Europe) 1993 Imagineer - + @@ -46502,7 +46513,7 @@ Kick Off 3 - European Challenge (Europe) 1994 Vic Tokai - + @@ -46515,7 +46526,7 @@ Kid Klown in Crazy Chase (Europe) 1994 Kemco - + @@ -46901,7 +46912,7 @@ - + @@ -46917,7 +46928,7 @@ 1995 Nintendo - + @@ -46948,7 +46959,7 @@ Kirby's Ghost Trap (Europe) 1995 Nintendo - + @@ -46964,7 +46975,7 @@ - + @@ -47024,7 +47035,7 @@ - + @@ -47067,7 +47078,7 @@ 1994 Capcom - + @@ -47199,7 +47210,7 @@ - + @@ -47217,7 +47228,7 @@ - + @@ -47380,7 +47391,7 @@ - + @@ -47539,7 +47550,7 @@ - + @@ -47832,7 +47843,7 @@ 1994 DTMC - + @@ -47846,7 +47857,7 @@ 1994 Konami - + @@ -47874,7 +47885,7 @@ - + @@ -48072,7 +48083,7 @@ - + @@ -48226,7 +48237,7 @@ Lothar Matthäus Super Soccer (Germany) 1995 Ocean - + @@ -48256,7 +48267,7 @@ Lucky Luke (Europe) 1997 Infogrames - + @@ -48570,7 +48581,7 @@ - + @@ -48780,7 +48791,7 @@ - + @@ -48798,7 +48809,7 @@ - + @@ -48816,7 +48827,7 @@ - + @@ -48905,7 +48916,7 @@ Manchester United Championship Soccer (Europe) 1995 Ocean - + @@ -49033,7 +49044,7 @@ Marko's Magic Football (Europe) 1995 Acclaim Entertainment - + @@ -49270,7 +49281,7 @@ 1996 Nintendo - + @@ -49467,7 +49478,7 @@ Mega Lo Mania (Europe, prototype) 1991 Virgin Interactive - + @@ -49481,7 +49492,7 @@ 1991 Virgin Interactive - + @@ -49520,7 +49531,7 @@ 1994 Capcom - + @@ -49687,7 +49698,7 @@ - + @@ -49988,7 +49999,7 @@ Mighty Max (Europe) 1995 Ocean - + @@ -50001,7 +50012,7 @@ Mighty Max (USA, prototype) 1995 Ocean - + @@ -50247,7 +50258,7 @@ - + @@ -50392,7 +50403,7 @@ - + @@ -50808,7 +50819,7 @@ NBA Give 'n Go (Europe) 1995 Konami - + @@ -50822,7 +50833,7 @@ 1995 Konami - + @@ -50835,7 +50846,7 @@ NBA Hang Time (Europe) 1996 Midway - + @@ -50851,7 +50862,7 @@ 1996 Midway - + @@ -50966,7 +50977,7 @@ - + @@ -51693,7 +51704,7 @@ - + @@ -51708,7 +51719,7 @@ Nintendo - + @@ -51723,7 +51734,7 @@ Nintendo - + @@ -51764,7 +51775,7 @@ - + @@ -52309,7 +52320,7 @@ 1994 Taito - + @@ -52322,7 +52333,7 @@ Operation Thunderbolt (prototype) 1994 Taito - + @@ -52500,7 +52511,7 @@ - + @@ -52543,7 +52554,7 @@ Pac-Attack (Europe) 1993 Namco - + @@ -52581,7 +52592,7 @@ Pac-in-Time (Europe) 1995 Namco - + @@ -52597,7 +52608,7 @@ - + @@ -52611,7 +52622,7 @@ 1995 Namco - + @@ -52624,7 +52635,7 @@ Pac-Man 2 - The New Adventures (Europe) 1994 Nintendo - + @@ -52637,7 +52648,7 @@ Pac-Man 2 - The New Adventures (France) 1994 Nintendo - + @@ -52650,7 +52661,7 @@ Pac-Man 2 - The New Adventures (Germany) 1994 Nintendo - + @@ -52743,7 +52754,7 @@ - + @@ -53054,7 +53065,7 @@ The Peace Keepers (prototype) 1994 Jaleco - + @@ -53068,7 +53079,7 @@ 1994 Jaleco - + @@ -53633,7 +53644,7 @@ - + @@ -53647,7 +53658,7 @@ 1996 Disney Interactive - + @@ -53675,7 +53686,7 @@ The Pirates of Dark Water (Europe) 1994 Sunsoft - + @@ -53772,7 +53783,7 @@ Plok! (Europe) 1993 Nintendo - + @@ -53788,7 +53799,7 @@ - + @@ -53802,7 +53813,7 @@ 1993 Tradewest - + @@ -53891,7 +53902,7 @@ Pop'n TwinBee (Europe) 1993 Palcom - + @@ -53904,7 +53915,7 @@ Pop'n TwinBee - Rainbow Bell Adventures (Europe) 1995 Konami - + @@ -53917,7 +53928,7 @@ Pop'n TwinBee - Rainbow Bell Adventures (Germany) 1995 Konami - + @@ -53950,7 +53961,7 @@ - + @@ -53968,7 +53979,7 @@ - + @@ -54006,7 +54017,7 @@ Populous II - Trials of the Olympian Gods (Europe) 1993 Imagineer - + @@ -54019,7 +54030,7 @@ Populous II - Trials of the Olympian Gods (Germany) 1993 Imagineer - + @@ -54202,7 +54213,7 @@ Prehistorik Man (Europe) 1996 Titus - + @@ -54228,7 +54239,7 @@ 1996 Titus - + @@ -54463,7 +54474,7 @@ 1994 Jaleco - + @@ -54547,7 +54558,7 @@ - + @@ -54656,7 +54667,7 @@ R-Type III - The Third Lightning (Europe, prototype) 1994 Jaleco - + @@ -54672,7 +54683,7 @@ - + @@ -54849,7 +54860,7 @@ 1992 Ocean - + @@ -55170,7 +55181,7 @@ Revolution X (Europe) 1995 Acclaim Entertainment - + @@ -55183,7 +55194,7 @@ Revolution X (Germany) 1995 Acclaim Entertainment - + @@ -55199,7 +55210,7 @@ - + @@ -55213,7 +55224,7 @@ 1995 Acclaim Entertainment - + @@ -55468,7 +55479,7 @@ 1993 Interplay - + @@ -55591,7 +55602,7 @@ Square - + @@ -55666,7 +55677,7 @@ - + @@ -55699,7 +55710,7 @@ - + @@ -55715,7 +55726,7 @@ - + @@ -55793,7 +55804,7 @@ - + @@ -55808,7 +55819,7 @@ Samurai Shodown (Europe) 1994 Takara - + @@ -55821,7 +55832,7 @@ Samurai Spirits (Japan, prototype) 1994 Takara - + @@ -56068,7 +56079,7 @@ Secret of Mana (Europe, rev. A) 1993 Nintendo - + @@ -56083,7 +56094,7 @@ Secret of Mana (Europe) 1993 Nintendo - + @@ -56098,7 +56109,7 @@ Secret of Mana (France) 1993 Nintendo - + @@ -56131,7 +56142,7 @@ - + @@ -56165,7 +56176,7 @@ - + @@ -56469,7 +56480,7 @@ 1994 Vic Tokai - + @@ -56722,7 +56733,7 @@ - + @@ -57280,7 +57291,7 @@ - + @@ -57373,7 +57384,7 @@ Smash Tennis (Europe) 1993 Virgin Interactive - + @@ -57426,7 +57437,7 @@ Soccer Kid (Europe) 1994 Ocean - + @@ -57466,7 +57477,7 @@ Soccer Shootout (Europe) 1994 Capcom - + @@ -57616,7 +57627,7 @@ - + @@ -57677,7 +57688,7 @@ - + @@ -57693,7 +57704,7 @@ - + @@ -57709,7 +57720,7 @@ - + @@ -57759,7 +57770,7 @@ 1994 Enix - + @@ -57815,7 +57826,7 @@ Space Ace (USA, prototype) 1994 Absolute Entertainment - + @@ -57856,7 +57867,7 @@ Space Invaders - The Original Game (Europe) 1996 Nintendo - + @@ -57870,7 +57881,7 @@ 1997 Nintendo - + @@ -57923,7 +57934,7 @@ Sparkster (Europe) 1994 Konami - + @@ -57939,7 +57950,7 @@ - + @@ -57953,7 +57964,7 @@ 1994 Konami - + @@ -58056,7 +58067,7 @@ Speedy Gonzales in Los Gatos Bandidos (USA, Acclaim prototype) 1995 Acclaim Entertainment - + @@ -58070,7 +58081,7 @@ 1995 Acclaim Entertainment - + @@ -58084,7 +58095,7 @@ 1995 Acclaim Entertainment - + @@ -58186,7 +58197,7 @@ Spirou (Europe) 1995 Infogrames - + @@ -58406,7 +58417,7 @@ Star Trek - The Next Generation - Future's Past (Europe) 1994 Spectrum Holobyte - + @@ -58420,7 +58431,7 @@ 1994 Spectrum Holobyte - + @@ -58681,7 +58692,7 @@ Striker (Europe, prototype) 1992 Elite - + @@ -58694,7 +58705,7 @@ Striker (Europe) 1992 Elite - + @@ -58708,7 +58719,7 @@ 1994 Nintendo - + @@ -58727,7 +58738,7 @@ - + @@ -58772,7 +58783,7 @@ Sunset Riders (Europe) 1993 Konami - + @@ -58786,7 +58797,7 @@ 1993 Konami - + @@ -59047,7 +59058,7 @@ 1995 Jaleco - + @@ -59063,7 +59074,7 @@ 1994 Jaleco - + @@ -59277,7 +59288,7 @@ - + @@ -59295,7 +59306,7 @@ - + @@ -59313,7 +59324,7 @@ - + @@ -59435,7 +59446,7 @@ 1994 Hudson - + @@ -59653,7 +59664,7 @@ Super Conflict - The Mideast (Europe) 1993 Vic Tokai - + @@ -59669,7 +59680,7 @@ 1993 Vic Tokai - + @@ -59767,7 +59778,7 @@ - + @@ -59783,7 +59794,7 @@ - + @@ -59891,7 +59902,7 @@ - + @@ -59947,7 +59958,7 @@ - + @@ -59981,7 +59992,7 @@ - + @@ -59997,7 +60008,7 @@ - + @@ -60013,7 +60024,7 @@ - + @@ -60032,7 +60043,7 @@ - + @@ -60082,7 +60093,7 @@ - + @@ -60100,7 +60111,7 @@ - + @@ -60169,7 +60180,7 @@ - + @@ -60267,7 +60278,7 @@ - + @@ -60283,7 +60294,7 @@ - + @@ -60491,7 +60502,7 @@ Super International Cricket (Europe, prototype) 1994 Nintendo - + @@ -60581,7 +60592,7 @@ - + @@ -60648,7 +60659,7 @@ - + @@ -60726,7 +60737,7 @@ - + @@ -60795,7 +60806,7 @@ - + @@ -60814,7 +60825,7 @@ - + @@ -60849,7 +60860,7 @@ - + @@ -60864,7 +60875,7 @@ Super Mario World 2 - Yoshi's Island (Europe, rev. A) 1995 Nintendo - + @@ -60881,7 +60892,7 @@ 1995 Nintendo - + @@ -60900,7 +60911,7 @@ - + @@ -61019,7 +61030,7 @@ - + @@ -61160,7 +61171,7 @@ Super Pinball - Behind the Mask (Europe) 1994 Nintendo - + @@ -61201,7 +61212,7 @@ - + @@ -61307,7 +61318,7 @@ Super Putty (Europe) 1993 U.S. Gold - + @@ -61321,7 +61332,7 @@ 1993 U.S. Gold - + @@ -61395,7 +61406,7 @@ - + @@ -62019,7 +62030,7 @@ - + @@ -62297,7 +62308,7 @@ 1994 Namco - + @@ -62538,7 +62549,7 @@ - + @@ -62556,7 +62567,7 @@ - + @@ -62854,7 +62865,7 @@ - + @@ -62884,7 +62895,7 @@ - + @@ -62900,7 +62911,7 @@ 1995 Tecmo - + @@ -62916,7 +62927,7 @@ 1995 Tecmo - + @@ -63103,7 +63114,7 @@ - + @@ -63183,7 +63194,7 @@ Terranigma (Europe) 1996 Nintendo - + @@ -63198,7 +63209,7 @@ Terranigma (Germany, rev. A) 1996 Nintendo - + @@ -63213,7 +63224,7 @@ Terranigma (Spain) 1996 Nintendo - + @@ -63228,7 +63239,7 @@ Tetris 2 (Europe) 1994 Nintendo - + @@ -63242,7 +63253,7 @@ 1994 Nintendo - + @@ -63271,7 +63282,7 @@ - + @@ -63285,7 +63296,7 @@ 1993 Bullet-Proof Software - + @@ -63301,7 +63312,7 @@ - + @@ -63317,7 +63328,7 @@ - + @@ -63615,7 +63626,7 @@ - + @@ -63629,7 +63640,7 @@ 1994 Konami - + @@ -63654,7 +63665,7 @@ Tiny Toon Adventures - Wild & Wacky Sports (Europe, rev. A) 1994 Konami - + @@ -63710,7 +63721,7 @@ - + @@ -63829,7 +63840,7 @@ Top Gear 2 (Europe) 1993 Kemco - + @@ -63843,7 +63854,7 @@ 1993 Kemco - + @@ -63891,7 +63902,7 @@ - + @@ -64100,7 +64111,7 @@ - + @@ -64365,7 +64376,7 @@ - + @@ -64406,7 +64417,7 @@ - + @@ -64424,7 +64435,7 @@ - + @@ -64915,7 +64926,7 @@ - + @@ -64930,7 +64941,7 @@ Umizuri Meijin - Suzuki Hen (Japan, prototype) 1994 Electronic Arts Victor - + @@ -65637,7 +65648,7 @@ WeaponLord (Europe) 1995 Ocean - + @@ -65652,7 +65663,7 @@ 1995 Namco - + @@ -65769,7 +65780,7 @@ Wild Guns (USA) 1995 Natsume - + @@ -66020,7 +66031,7 @@ Wolfenstein 3D (Europe) 1994 Imagineer - + @@ -66034,7 +66045,7 @@ 1994 Imagineer - + @@ -66390,7 +66401,7 @@ 1993 Atlus - + @@ -66531,7 +66542,7 @@ X-Kaliber 2097 (Europe) 1994 Sony Interactive - + @@ -66821,7 +66832,7 @@ Yoshi's Safari (Europe) 1993 Nintendo - + @@ -66835,7 +66846,7 @@ 1993 Nintendo - + @@ -66908,7 +66919,7 @@ - + @@ -66926,7 +66937,7 @@ - + @@ -66961,7 +66972,7 @@ - + @@ -67122,7 +67133,7 @@ - + @@ -67222,7 +67233,7 @@ Zombies (Europe) 1993 Konami - + @@ -67236,7 +67247,7 @@ 1993 Konami - + diff -Nru mame-0.263+dfsg.1/hash/snes_bspack.xml mame-0.264+dfsg.1/hash/snes_bspack.xml --- mame-0.263+dfsg.1/hash/snes_bspack.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/snes_bspack.xml 2024-03-25 14:00:46.000000000 +0000 @@ -46,7 +46,7 @@ - Same Game - Chara Data Shuu (BSROM, Not for sale) + Same Game - Chara Data Shuu (BSROM, not for sale) 1996 Hudson @@ -94,7 +94,7 @@ - BS Dragon Quest I (Bad Header?) + BS Dragon Quest I (bad header?) 199? <unknown> @@ -107,7 +107,7 @@ - BS Dragon Quest I (Hacked) + BS Dragon Quest I (hacked) 199? <unknown> @@ -147,7 +147,7 @@ - Dandan Belt Conveyor - Ukulele no Maki (Bad Header?) + Dandan Belt Conveyor - Ukulele no Maki (bad header?) 199? <unknown> @@ -186,7 +186,7 @@ - 3-ji no Wide Shou - 6 Gatsugou (Bad Header?) + 3-ji no Wide Shou - 6 Gatsugou (bad header?) 199? <unknown> @@ -212,7 +212,7 @@ - Albert Odyssey (Bad Header?) + Albert Odyssey (bad header?) 199? <unknown> @@ -238,7 +238,7 @@ - Arkanoid - Doh It Again (Bad Header?) + Arkanoid - Doh It Again (bad header?) 199? <unknown> @@ -264,7 +264,7 @@ - B Dash - 2 Gatsugou (Bad Header?) + B Dash - 2 Gatsugou (bad header?) 199? <unknown> @@ -290,7 +290,7 @@ - B Dash - 3 Gatsugou (Bad Header?) + B Dash - 3 Gatsugou (bad header?) 199? <unknown> @@ -318,7 +318,7 @@ - BS F-Zero Grand Prix - Knight League - Dai-1-shuu (Bad Header?) + BS F-Zero Grand Prix - Knight League - Dai-1-shuu (bad header?) 199? <unknown> @@ -346,7 +346,7 @@ - BS F-Zero Grand Prix - Queen League - Dai-2-shuu (Bad Header?) + BS F-Zero Grand Prix - Queen League - Dai-2-shuu (bad header?) 199? <unknown> @@ -374,7 +374,7 @@ - BS F-Zero Grand Prix - King League - Dai-3-shuu (Bad Header?) + BS F-Zero Grand Prix - King League - Dai-3-shuu (bad header?) 199? <unknown> @@ -402,7 +402,7 @@ - BS F-Zero Grand Prix - Ace League - Dai-4-shuu (Bad Header?) + BS F-Zero Grand Prix - Ace League - Dai-4-shuu (bad header?) 199? <unknown> @@ -415,7 +415,7 @@ - BS F-Zero Grand Prix 2 - Practice (Maybe Bad?) + BS F-Zero Grand Prix 2 - Practice (maybe bad?) 199? <unknown> @@ -457,7 +457,7 @@ - BS Fire Emblem - Akaneia Senki Hen - Dai-1-wa - Palace Kanraku (0404, Alt Download Date) + BS Fire Emblem - Akaneia Senki Hen - Dai-1-wa - Palace Kanraku (0404, alt download date) 199? <unknown> @@ -485,7 +485,7 @@ - BS Fire Emblem - Akaneia Senki Hen - Dai-2-wa - Akai Ryuu Kishi (Bad Header?) + BS Fire Emblem - Akaneia Senki Hen - Dai-2-wa - Akai Ryuu Kishi (bad header?) 199? <unknown> @@ -513,7 +513,7 @@ - BS Fire Emblem - Akaneia Senki Hen - Dai-3-wa - Seigi no Touzokudan (Bad Header?) + BS Fire Emblem - Akaneia Senki Hen - Dai-3-wa - Seigi no Touzokudan (bad header?) 199? <unknown> @@ -541,7 +541,7 @@ - BS Fire Emblem - Akaneia Senki Hen - Dai-4-wa - Hajimari no Toki (Bad Header?) + BS Fire Emblem - Akaneia Senki Hen - Dai-4-wa - Hajimari no Toki (bad header?) 199? <unknown> @@ -694,7 +694,7 @@ - BS Nichibutsu Mahjong - Mahjong Taikai (Bad Header?) + BS Nichibutsu Mahjong - Mahjong Taikai (bad header?) 199? <unknown> @@ -722,7 +722,7 @@ - BS Nichibutsu Mahjong - Renshuu Mahjong - Ichimantou (Bad Header?) + BS Nichibutsu Mahjong - Renshuu Mahjong - Ichimantou (bad header?) 199? <unknown> @@ -750,7 +750,7 @@ - BS Nichibutsu Mahjong - Renshuu Mahjong - Nimantou (Bad Header?) + BS Nichibutsu Mahjong - Renshuu Mahjong - Nimantou (bad header?) 199? <unknown> @@ -776,7 +776,7 @@ - BS Nintendo HP - 5/17 Gou (Bad Header?) + BS Nintendo HP - 5/17 Gou (bad header?) 199? <unknown> @@ -802,7 +802,7 @@ - BS Nintendo HP - 5/31 Gou (Bad Header?) + BS Nintendo HP - 5/31 Gou (bad header?) 199? <unknown> @@ -830,7 +830,7 @@ - BS Parlor! Parlor! - Dai-2-shuu (Bad Header?) + BS Parlor! Parlor! - Dai-2-shuu (bad header?) 199? <unknown> @@ -858,7 +858,7 @@ - BS Shin Onigashima - Dai-1-wa - Kataribe no Koya (Bad Header?) + BS Shin Onigashima - Dai-1-wa - Kataribe no Koya (bad header?) 199? <unknown> @@ -886,7 +886,7 @@ - BS Shin Onigashima - Dai-2-wa - Kataribe no Koya (Bad Header?) + BS Shin Onigashima - Dai-2-wa - Kataribe no Koya (bad header?) 199? <unknown> @@ -914,7 +914,7 @@ - BS Shin Onigashima - Dai-3-wa - Kataribe no Koya (Bad Header?) + BS Shin Onigashima - Dai-3-wa - Kataribe no Koya (bad header?) 199? <unknown> @@ -942,7 +942,7 @@ - BS Shin Onigashima - Dai-4-wa - Kataribe no Koya (Bad Header?) + BS Shin Onigashima - Dai-4-wa - Kataribe no Koya (bad header?) 199? <unknown> @@ -968,7 +968,7 @@ - BS St. Giga PG - 10 Gatsugou (Bad Header?) + BS St. Giga PG - 10 Gatsugou (bad header?) 199? <unknown> @@ -996,7 +996,7 @@ - BS Super Mario Collection - Dai-3-shuu (Bad Header?) + BS Super Mario Collection - Dai-3-shuu (bad header?) 199? <unknown> @@ -1024,7 +1024,7 @@ - BS Super Mario USA - Power Challenge - Dai-1-kai (Bad Header?) + BS Super Mario USA - Power Challenge - Dai-1-kai (bad header?) 199? <unknown> @@ -1052,7 +1052,7 @@ - BS Super Mario USA - Power Challenge - Dai-2-kai (Bad Header?) + BS Super Mario USA - Power Challenge - Dai-2-kai (bad header?) 199? <unknown> @@ -1080,7 +1080,7 @@ - BS Super Mario USA - Power Challenge - Dai-3-kai (Bad Header?) + BS Super Mario USA - Power Challenge - Dai-3-kai (bad header?) 199? <unknown> @@ -1108,7 +1108,7 @@ - BS Super Mario USA - Power Challenge - Dai-4-kai (Bad Header?) + BS Super Mario USA - Power Challenge - Dai-4-kai (bad header?) 199? <unknown> @@ -1167,7 +1167,7 @@ - BS Tantei Club - Yuki ni Kieta Kako - Kouhen (Bad Header?) + BS Tantei Club - Yuki ni Kieta Kako - Kouhen (bad header?) 199? <unknown> @@ -1195,7 +1195,7 @@ - BS Tantei Club - Yuki ni Kieta Kako - Zenpen (Bad Header?) + BS Tantei Club - Yuki ni Kieta Kako - Zenpen (bad header?) 199? <unknown> @@ -1223,7 +1223,7 @@ - BS Zelda no Densetsu - Dai-3-wa (Bad Header?) + BS Zelda no Densetsu - Dai-3-wa (bad header?) 199? <unknown> @@ -1309,7 +1309,7 @@ - Cheap de Gorgeous Vol. 1 (Bad Header?) + Cheap de Gorgeous Vol. 1 (bad header?) 199? <unknown> @@ -1335,7 +1335,7 @@ - Chrono Trigger - Character Zukan (Bad Header?) + Chrono Trigger - Character Zukan (bad header?) 199? <unknown> @@ -1361,7 +1361,7 @@ - Chrono Trigger - Jet Bike Special (Bad Header?) + Chrono Trigger - Jet Bike Special (bad header?) 199? <unknown> @@ -1387,7 +1387,7 @@ - Chrono Trigger - Music Library (Bad Header?) + Chrono Trigger - Music Library (bad header?) 199? <unknown> @@ -1413,7 +1413,7 @@ - Columbus no Tamagoyaki - Dai-1-kai (Bad Header?) + Columbus no Tamagoyaki - Dai-1-kai (bad header?) 199? <unknown> @@ -1439,7 +1439,7 @@ - Columbus no Tamagoyaki - Dai-2-kai (Bad Header?) + Columbus no Tamagoyaki - Dai-2-kai (bad header?) 199? <unknown> @@ -1465,7 +1465,7 @@ - Columbus no Tamagoyaki - Dai-3-kai (Bad Header?) + Columbus no Tamagoyaki - Dai-3-kai (bad header?) 199? <unknown> @@ -1491,7 +1491,7 @@ - Cu-On-Pa SFC (0531, Bad Header?) + Cu-On-Pa SFC (0531, bad header?) 199? <unknown> @@ -1517,7 +1517,7 @@ - Daibakushou Jinsei Gekijou (Bad Header?) + Daibakushou Jinsei Gekijou (bad header?) 199? <unknown> @@ -1543,7 +1543,7 @@ - Dandan Belt Conveyor - Gyuunyuu no Maki (Bad Header?) + Dandan Belt Conveyor - Gyuunyuu no Maki (bad header?) 199? <unknown> @@ -1569,7 +1569,7 @@ - Digital Magazine Busters BS - 4/12 Gou (Bad Header?) + Digital Magazine Busters BS - 4/12 Gou (bad header?) 199? <unknown> @@ -1595,7 +1595,7 @@ - Digital Magazine Busters BS - 5/10 Gou (Bad Header?) + Digital Magazine Busters BS - 5/10 Gou (bad header?) 199? <unknown> @@ -1621,7 +1621,7 @@ - Digital Magazine Busters BS - 5/24 Gou (Bad Header?) + Digital Magazine Busters BS - 5/24 Gou (bad header?) 199? <unknown> @@ -1647,7 +1647,7 @@ - Digital Magazine Busters BS - 8/23 Gou (Bad Header?) + Digital Magazine Busters BS - 8/23 Gou (bad header?) 199? <unknown> @@ -1673,7 +1673,7 @@ - Do-Re-Mi de Faa 2~! - 5/10 Gou (Bad Header?) + Do-Re-Mi de Faa 2~! - 5/10 Gou (bad header?) 199? <unknown> @@ -1699,7 +1699,7 @@ - Do-Re-Mi de Faa 2~! - 5/25 Gou (Bad Header?) + Do-Re-Mi de Faa 2~! - 5/25 Gou (bad header?) 199? <unknown> @@ -1725,7 +1725,7 @@ - Dokapon Gaiden - Honoo no Audition (Bad Header?) + Dokapon Gaiden - Honoo no Audition (bad header?) 199? <unknown> @@ -1764,7 +1764,7 @@ - Dragon Slayer - Eiyuu Densetsu (Bad Header?) + Dragon Slayer - Eiyuu Densetsu (bad header?) 199? <unknown> @@ -1790,7 +1790,7 @@ - Dynami Tracer (Bad Header?) + Dynami Tracer (bad header?) 199? <unknown> @@ -1817,7 +1817,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 1 (Bad Header?) + Excitebike - Bunbun Mario Battle - Stadium 1 (bad header?) 199? <unknown> @@ -1845,7 +1845,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 2 (Bad Header?) + Excitebike - Bunbun Mario Battle - Stadium 2 (bad header?) 199? <unknown> @@ -1887,7 +1887,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 3 (19980111 - 19980117, Bad Header?) + Excitebike - Bunbun Mario Battle - Stadium 3 (19980111 - 19980117, bad header?) 199? <unknown> @@ -1901,7 +1901,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 3 (0208, Bad Header?) + Excitebike - Bunbun Mario Battle - Stadium 3 (0208, bad header?) 199? <unknown> @@ -1929,7 +1929,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 4 (Bad Header?) + Excitebike - Bunbun Mario Battle - Stadium 4 (bad header?) 199? <unknown> @@ -1955,7 +1955,7 @@ - F-Zero (Bad Header?) + F-Zero (bad header?) 199? <unknown> @@ -1981,7 +1981,7 @@ - Fenek - 6 Gatsugou (Bad Header?) + Fenek - 6 Gatsugou (bad header?) 199? <unknown> @@ -2020,7 +2020,7 @@ - Freud no Chousenjou - Dai-1-gou (Bad Header?) + Freud no Chousenjou - Dai-1-gou (bad header?) 199? <unknown> @@ -2046,7 +2046,7 @@ - Freud no Chousenjou - Dai-2-gou (Bad Header?) + Freud no Chousenjou - Dai-2-gou (bad header?) 199? <unknown> @@ -2072,7 +2072,7 @@ - Freud no Chousenjou - Dai-3-gou (Bad Header?) + Freud no Chousenjou - Dai-3-gou (bad header?) 199? <unknown> @@ -2098,7 +2098,7 @@ - Freud no Chousenjou - Dai-4-gou (Bad Header?) + Freud no Chousenjou - Dai-4-gou (bad header?) 199? <unknown> @@ -2124,7 +2124,7 @@ - Freud no Chousenjou - Dai-5-gou (Bad Header?) + Freud no Chousenjou - Dai-5-gou (bad header?) 199? <unknown> @@ -2150,7 +2150,7 @@ - Freud no Chousenjou - Dai-6-gou (Bad Header?) + Freud no Chousenjou - Dai-6-gou (bad header?) 199? <unknown> @@ -2176,7 +2176,7 @@ - Game Tora no Taikoban - 5/17 Gou (Bad Header?) + Game Tora no Taikoban - 5/17 Gou (bad header?) 199? <unknown> @@ -2202,7 +2202,7 @@ - Game Tora no Taikoban - 5/31 Gou (Bad Header?) + Game Tora no Taikoban - 5/31 Gou (bad header?) 199? <unknown> @@ -2228,7 +2228,7 @@ - Gekkan Coin Toss - Deck 1 (Bad Header?) + Gekkan Coin Toss - Deck 1 (bad header?) 199? <unknown> @@ -2254,7 +2254,7 @@ - Golf Daisuki! O.B. Club (Bad Header?) + Golf Daisuki! O.B. Club (bad header?) 199? <unknown> @@ -2280,7 +2280,7 @@ - GoodsPress - 3 Gatsugou (Bad Header?) + GoodsPress - 3 Gatsugou (bad header?) 199? <unknown> @@ -2306,7 +2306,7 @@ - GoodsPress - 6 Gatsugou (Bad Header?) + GoodsPress - 6 Gatsugou (bad header?) 199? <unknown> @@ -2332,7 +2332,7 @@ - GoodsPress - 7 Gatsugou (Bad Header?) + GoodsPress - 7 Gatsugou (bad header?) 199? <unknown> @@ -2358,7 +2358,7 @@ - Heisei Gunjin Shougi (Bad Header?) + Heisei Gunjin Shougi (bad header?) 199? <unknown> @@ -2384,7 +2384,7 @@ - Ikari no Yousai (Bad Header?) + Ikari no Yousai (bad header?) 199? <unknown> @@ -2410,7 +2410,7 @@ - Kaizou Choujin Shubibinman Zero (Bad Header?) + Kaizou Choujin Shubibinman Zero (bad header?) 199? <unknown> @@ -2436,7 +2436,7 @@ - Kirby no Omochabako - Baseball (Bad Header?) + Kirby no Omochabako - Baseball (bad header?) 199? <unknown> @@ -2462,7 +2462,7 @@ - Kirby no Omochabako - Guruguru Ball (Bad Header?) + Kirby no Omochabako - Guruguru Ball (bad header?) 199? <unknown> @@ -2544,7 +2544,7 @@ - Kodomo Chousadan Mighty Pockets - ChoUSA 3 - Kyakusen Queen Patra no Nazo (Bad Header?) + Kodomo Chousadan Mighty Pockets - ChoUSA 3 - Kyakusen Queen Patra no Nazo (bad header?) 199? <unknown> @@ -2570,7 +2570,7 @@ - Koi wa Balance - Tatoeba K-kun no Tabou na Ichinichi Hen (Bad Header?) + Koi wa Balance - Tatoeba K-kun no Tabou na Ichinichi Hen (bad header?) 199? <unknown> @@ -2609,7 +2609,7 @@ - Let's Pachinko Nante Gindama 1 (Bad Header?) + Let's Pachinko Nante Gindama 1 (bad header?) 199? <unknown> @@ -2635,7 +2635,7 @@ - Let's Pachinko Nante Gindama 2 (Bad Header?) + Let's Pachinko Nante Gindama 2 (bad header?) 199? <unknown> @@ -2661,7 +2661,7 @@ - Let's Pachinko Nante Gindama 3 (Bad Header?) + Let's Pachinko Nante Gindama 3 (bad header?) 199? <unknown> @@ -2700,7 +2700,7 @@ - Lord Monarch (Bad Header?) + Lord Monarch (bad header?) 199? <unknown> @@ -2726,7 +2726,7 @@ - Mario Paint - BS Ban (Bad Header?) + Mario Paint - BS Ban (bad header?) 199? <unknown> @@ -2752,7 +2752,7 @@ - Mario Paint - Yuushou Naizou Ban (Bad Header?) + Mario Paint - Yuushou Naizou Ban (bad header?) 199? <unknown> @@ -2778,7 +2778,7 @@ - Nintama Rantarou 2 (Bad Header?) + Nintama Rantarou 2 (bad header?) 199? <unknown> @@ -2804,7 +2804,7 @@ - Nintendo Power Magazine 107 (Bad Header?) + Nintendo Power Magazine 107 (bad header?) 199? <unknown> @@ -2843,7 +2843,7 @@ - Pokekame Magazine (Bad Header?) + Pokekame Magazine (bad header?) 199? <unknown> @@ -2869,7 +2869,7 @@ - Radical Dreamers - Nusume Nai Houseki (Bad Header?) + Radical Dreamers - Nusume Nai Houseki (bad header?) 199? <unknown> @@ -2898,7 +2898,7 @@ - Satella Walker 2 - Sate Bou o Sukuidase! (Bad Header?) + Satella Walker 2 - Sate Bou o Sukuidase! (bad header?) 199? <unknown> @@ -2925,7 +2925,7 @@ - Shanghai - Banri no Choujou (Bad Header?) + Shanghai - Banri no Choujou (bad header?) 199? <unknown> @@ -2952,7 +2952,7 @@ - Sousa Sentai Wappers - Mission 01 (Bad Header?) + Sousa Sentai Wappers - Mission 01 (bad header?) 199? <unknown> @@ -2978,7 +2978,7 @@ - Sousa Sentai Wappers - Mission 02 (Bad Header?) + Sousa Sentai Wappers - Mission 02 (bad header?) 199? <unknown> @@ -3004,7 +3004,7 @@ - Sousa Sentai Wappers - Soushuuhen (Bad Header?) + Sousa Sentai Wappers - Soushuuhen (bad header?) 199? <unknown> @@ -3030,7 +3030,7 @@ - Special Tee Shot (Bad Header?) + Special Tee Shot (bad header?) 199? <unknown> @@ -3058,7 +3058,7 @@ - Spriggan Powered BS - Prelude (Bad Header?) + Spriggan Powered BS - Prelude (bad header?) 199? <unknown> @@ -3084,7 +3084,7 @@ - Super E.D.F. (Bad Header?) + Super E.D.F. (bad header?) 199? <unknown> @@ -3110,7 +3110,7 @@ - Super Famicom Wars - BS Ban - Tsukinowajima (Bad Header?) + Super Famicom Wars - BS Ban - Tsukinowajima (bad header?) 199? <unknown> @@ -3136,7 +3136,7 @@ - Super Mahjong Taikai (Bad Header?) + Super Mahjong Taikai (bad header?) 199? <unknown> @@ -3176,7 +3176,7 @@ - Super Ninja-kun (Bad Header?) + Super Ninja-kun (bad header?) 199? <unknown> @@ -3202,7 +3202,7 @@ - Super Tsumeshougi 1000 (Bad Header?) + Super Tsumeshougi 1000 (bad header?) 199? <unknown> @@ -3228,7 +3228,7 @@ - Super Volley II (Bad Header?) + Super Volley II (bad header?) 199? <unknown> @@ -3255,7 +3255,7 @@ - Sutte Hakkun - 98 Event Version (Bad Header?) + Sutte Hakkun - 98 Event Version (bad header?) 199? <unknown> @@ -3294,7 +3294,7 @@ - Sutte Hakkun - BS Version 2 (0603, Bad Header?) + Sutte Hakkun - BS Version 2 (0603, bad header?) 199? <unknown> @@ -3307,7 +3307,7 @@ - Sutte Hakkun - BS Version 2 (1008, Bad Header?) + Sutte Hakkun - BS Version 2 (1008, bad header?) 199? <unknown> @@ -3333,7 +3333,7 @@ - Sutte Hakkun - Event Version (Bad Header?) + Sutte Hakkun - Event Version (bad header?) 199? <unknown> @@ -3359,7 +3359,7 @@ - Treasure Conflix (Bad Header?) + Treasure Conflix (bad header?) 199? <unknown> @@ -3385,7 +3385,7 @@ - Waiwai Check - 3/7 Gou (Bad Header?) + Waiwai Check - 3/7 Gou (bad header?) 199? <unknown> @@ -3411,7 +3411,7 @@ - Wario no Mori - Futatabi (Bad Header?) + Wario no Mori - Futatabi (bad header?) 199? <unknown> @@ -3450,7 +3450,7 @@ - Wizardry V - Saika no Chuushin (Bad Header?) + Wizardry V - Saika no Chuushin (bad header?) 199? <unknown> @@ -3463,7 +3463,7 @@ - Yoshi no Panepon - BS Ban (Bad Header?) + Yoshi no Panepon - BS Ban (bad header?) 199? <unknown> @@ -3489,7 +3489,7 @@ - Yung Hakase no Shinsatsushitsu - Dai-1-gou (Bad Header?) + Yung Hakase no Shinsatsushitsu - Dai-1-gou (bad header?) 199? <unknown> @@ -3515,7 +3515,7 @@ - Yung Hakase no Shinsatsushitsu - Dai-2-gou (Bad Header?) + Yung Hakase no Shinsatsushitsu - Dai-2-gou (bad header?) 199? <unknown> @@ -3541,7 +3541,7 @@ - Zelda no Densetsu - Kamigami no Triforce (0528, Bad Header?) + Zelda no Densetsu - Kamigami no Triforce (0528, bad header?) 199? <unknown> @@ -3567,7 +3567,7 @@ - Zootto Mahjong! - Event Version (Bad Header?) + Zootto Mahjong! - Event Version (bad header?) 199? <unknown> @@ -3593,7 +3593,7 @@ - Zootto Mahjong! - Preview Ban (Bad Header?) + Zootto Mahjong! - Preview Ban (bad header?) 199? <unknown> @@ -3686,7 +3686,7 @@ - Super Nazo Puyo - Rulue no Roux (Bad Header?) + Super Nazo Puyo - Rulue no Roux (bad header?) 199? <unknown> @@ -3759,7 +3759,7 @@ - Kouryaku Casino Bar Nichiyoubi (Hacked) + Kouryaku Casino Bar Nichiyoubi (hacked) 199? <unknown> @@ -3772,7 +3772,7 @@ - 2/24 Game Tora no Ooana Special (0224, Hacked) + 2/24 Game Tora no Ooana Special (0224, hacked) 199? <unknown> @@ -3801,7 +3801,7 @@ - Tamori no Picross (0626, Bad Header?) + Tamori no Picross (0626, bad header?) 199? <unknown> @@ -3869,7 +3869,7 @@ - Zelda no Densetsu - Kamigami no Triforce (1130, Locked) + Zelda no Densetsu - Kamigami no Triforce (1130, locked) 199? <unknown> @@ -3895,7 +3895,7 @@ - BS F-Zero Grand Prix 2 - Practice (Bad?) + BS F-Zero Grand Prix 2 - Practice (bad?) 199? <unknown> @@ -4027,7 +4027,7 @@ - ActRaiser (Bad Header?) + ActRaiser (bad header?) 199? <unknown> @@ -4067,7 +4067,7 @@ - Kid Klown no Crazy Chase (Bad Header?) + Kid Klown no Crazy Chase (bad header?) 199? <unknown> @@ -4094,7 +4094,7 @@ - Konae-chan no Dokidoki Penguin Kazoku (Alt) + Konae-chan no Dokidoki Penguin Kazoku (alt) 199? <unknown> @@ -4312,7 +4312,7 @@ - Machi Magazine (Hacked) + Machi Magazine (hacked) 1995? <unknown> @@ -4432,7 +4432,7 @@ - Sonic Blast Man (Bad Header?) + Sonic Blast Man (bad header?) 199? <unknown> @@ -4459,7 +4459,7 @@ - Table Game Daishuugou!! (Bad Header?) + Table Game Daishuugou!! (bad header?) 199? <unknown> @@ -4473,7 +4473,7 @@ - Shanghai - Banri no Choujou (Alt) + Shanghai - Banri no Choujou (alt) 199? <unknown> @@ -4529,7 +4529,7 @@ - Kaizou Choujin Shubibinman Zero (Locked) + Kaizou Choujin Shubibinman Zero (locked) 199? <unknown> @@ -4555,7 +4555,7 @@ - Super Bomberman (Locked, Bad Header?) + Super Bomberman (locked, bad header?) 199? <unknown> @@ -4568,7 +4568,7 @@ - Bass Tournament 4 (Incomplete Data) + Bass Tournament 4 (incomplete data) 199? <unknown> @@ -4663,7 +4663,7 @@ - Star Soldier - 2 Minute (Hacked) + Star Soldier - 2 Minute (hacked) 199? <unknown> @@ -4776,7 +4776,7 @@ - Ijuin Hikaru no Houkago no Ousama (Hacked?) + Ijuin Hikaru no Houkago no Ousama (hacked?) 199? <unknown> @@ -4832,7 +4832,7 @@ - Super Volley II (Alt?) + Super Volley II (alt?) 199? <unknown> @@ -4875,7 +4875,7 @@ - Darius Force (0315, Bad Header?) + Darius Force (0315, bad header?) 199? <unknown> @@ -4903,7 +4903,7 @@ - BS F-Zero Grand Prix 2 - Practice (Bad Header?) + BS F-Zero Grand Prix 2 - Practice (bad header?) 199? <unknown> @@ -4917,7 +4917,7 @@ - BS Fire Emblem - Akaneia Senki Hen - Dai-4-wa - Hajimari no Toki (Alt Download Date) + BS Fire Emblem - Akaneia Senki Hen - Dai-4-wa - Hajimari no Toki (alt download date) 199? <unknown> @@ -4943,7 +4943,7 @@ - Dr. Mario (Alt) + Dr. Mario (alt) 199? <unknown> @@ -4956,7 +4956,7 @@ - Dr. Mario (Alt 2) + Dr. Mario (alt 2) 199? <unknown> @@ -4983,7 +4983,7 @@ - 04/07 Game Tora no Chou Ooana 2 (0407, Hacked) + 04/07 Game Tora no Chou Ooana 2 (0407, hacked) 199? <unknown> @@ -5115,7 +5115,7 @@ 'broken' file first, hacked one afterwards. --> - Excitebike - Bunbun Mario Battle - Stadium 1 (Alt Data?) + Excitebike - Bunbun Mario Battle - Stadium 1 (alt data?) 199? <unknown> @@ -5128,7 +5128,7 @@ - Excitebike - Bunbun Mario Battle - Stadium 1 (Alt Data?, Hacked) + Excitebike - Bunbun Mario Battle - Stadium 1 (alt data?, hacked) 199? <unknown> @@ -5408,7 +5408,7 @@ - BS Unknown Memory Pack 21 (ASCII MUSIC DATA, Bad?) + BS Unknown Memory Pack 21 (ASCII MUSIC DATA, bad?) 199? <unknown> @@ -5422,7 +5422,7 @@ - BS Unknown Memory Pack 22 (RPG Tsukuru Data Bad?) + BS Unknown Memory Pack 22 (RPG Tsukuru Data, bad?) 199? <unknown> diff -Nru mame-0.263+dfsg.1/hash/spectrum_cass.xml mame-0.264+dfsg.1/hash/spectrum_cass.xml --- mame-0.263+dfsg.1/hash/spectrum_cass.xml 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/hash/spectrum_cass.xml 2024-03-25 14:00:46.000000000 +0000 @@ -120,7 +120,7 @@ 1943 (Kixx) 1988 - Go! / Kixx + Kixx @@ -5691,7 +5691,7 @@ Conquest 1984 - Cheetahsoft Ltd + Cheetahsoft @@ -6163,7 +6163,7 @@ Contact Sam Cruise (set 2, Summit) 1986 - Microsphere / Summit + Summit @@ -6174,7 +6174,7 @@ Contact Sam Cruise (set 3, Summit) 1986 - Microsphere / Summit + Summit @@ -6287,7 +6287,7 @@ Commando (EDOS) 1985 - Elite Systems / EDOS + EDOS @@ -6298,7 +6298,7 @@ Commando (Encore) 1988 - Elite Systems / Encore + Encore @@ -7429,7 +7429,6 @@ - Chunk Zone 2016 @@ -7511,6 +7510,19 @@ + + Diversidade e Classificação de Seres Vivos + 1986 + Astor Software + + + + + + + + + Dizzy - The Ultimate Cartoon Adventure (set 1) @@ -7620,7 +7632,6 @@ - Dizzy II - Treasure Island Dizzy (set 2) @@ -10110,6 +10121,18 @@ + + Férias em Portugal + 1984 + Astor Software + + + + + + + + Fuller Box & Orator Demonstration 1983 @@ -13466,7 +13489,7 @@ - H.E.R.O + H.E.R.O. 1984 Activision @@ -13476,6 +13499,17 @@ + + H.E.R.O. (Proein Soft) + 1984 + Proein Soft Line + + + + + + + High Frontier 1987 @@ -16478,6 +16512,17 @@ + + The Last Escape + 2021 + Ariel Endaraues + + + + + + + Little Puff 1989 @@ -17483,6 +17528,30 @@ + + Mira Técnica + 1985 + Astor Software + + + + + + + + + + Mira Técnica (patched) + 1985 + Astor Software + + + + + + + + Mission Jupiter 19?? @@ -18160,7 +18229,6 @@ - Mikie (set 1) 1985 @@ -18186,7 +18254,7 @@ Mikie (The Hit Squad) 1985 - Imagine Software Ltd / The Hit Squad + The Hit Squad @@ -18205,7 +18273,6 @@ - Milk Race 1987 @@ -19995,6 +20062,19 @@ Titles beginning with 'O' ############################################################################################################################## --> + + O Esqueleto Humano + 1985 + Astor Software + + + + + + + + + Star Runner @@ -27121,7 +27242,7 @@ - Swords And Sorcery (set 1) + Swords & Sorcery (set 1) 1985 PSS @@ -27132,9 +27253,9 @@ - Swords And Sorcery (set 2, Summit) - 19?? - <unknown> + Swords & Sorcery (set 2, Summit) + 1985 + Summit Software @@ -27143,9 +27264,9 @@ - Swords And Sorcery (set 3) - 19?? - <unknown> + Swords & Sorcery (set 3) + 1985 + PSS @@ -27153,6 +27274,72 @@ + + Swords & Sorcery (set 4) + 1985 + PSS + + + + + + + + + Super Bomberman 2 Remix (demo v1.1) + 2023 + ZX Evolution + + + + + + + + + Super Bomberman 2 Remix (demo v0.1) + 2023 + ZX Evolution + + + + + + + + + Super Bowl + 1986 + Ocean + + + + + + + + + Super Bowl (The Hit Squad) + 1986 + The Hit Squad + + + + + + + + + Super Bowl (alt) + 1986 + Ocean + + + + + + + Super Soccer 1986 @@ -27201,35 +27388,14 @@ - - Super Bowl - 1986 - Ocean - - - - - - - - - Super Bowl (The Hit Squad) - 1986 - The Hit Squad - - - - - - - - - Super Bowl (alt) - 1986 - Ocean + + Super Soho + 198? + M.R. Charman + - - + + @@ -31636,9 +31802,14 @@ - The James Bond Collection (Live and Let Die, Licence to Kill, The Spy Who Loved Me) + The James Bond 007 Collection 1991 Domark + @@ -40277,9 +40448,9 @@ - +80 Finance Manager - Disciple Version - 19?? - <unknown> + +80 Finance Manager (Disciple Version) + 1983 + Oxford Computer Publishing @@ -40294,8 +40465,8 @@ +80 Finance Manager - 19?? - <unknown> + 1983 + Oxford Computer Publishing @@ -40638,7 +40809,7 @@ - + 128 Music & Carols (set 2) 1986 R.D. Foord @@ -40654,10 +40825,10 @@ - + 128 Music & Carols - 19?? - <unknown> + 1986 + R.D. Foord @@ -40670,10 +40841,10 @@ - + 128 Music - 19?? - <unknown> + 1986 + R.D. Foord @@ -40821,8 +40992,8 @@ 1942 Mission - 19?? - <unknown> + 1985 + Tartan Software @@ -41321,19 +41492,19 @@ 3D Game Maker (Dro Soft) - 19?? - <unknown> - + 1987 + Dro Soft + - + - + @@ -41522,23 +41693,23 @@ - 3D Snooker (EDOS) - 19?? - <unknown> + 3D Snooker + 1990 + Players Premier - - + + - 3D Snooker - 19?? - <unknown> + 3D Snooker (EDOS) + 1990 + EDOS - - + + @@ -41577,20 +41748,20 @@ - 3D Starstrike (299) - 1986 - 2.99 Classics + 3D Starstrike + 1984 + Realtime Games Software - - + + 3D Starstrike (set 2) - 19?? - <unknown> + 1984 + Realtime Games Software @@ -41604,12 +41775,12 @@ - 3D Starstrike - 19?? - <unknown> + 3D Starstrike (2.99 Classics) + 1986 + 2.99 Classics - - + + @@ -53786,12 +53957,17 @@ - Buggy Boy (Encore) - 1990 - Encore - - - + Buggy Boy + 1988 + Elite Systems + + + + + + + + @@ -53809,8 +53985,8 @@ Buggy Boy (MCM) (set 2) - 19?? - <unknown> + 1988 + MCM Software @@ -53824,17 +54000,12 @@ - Buggy Boy - 19?? - <unknown> - - - - - - - - + Buggy Boy (Encore) + 1990 + Encore + + + @@ -53958,8 +54129,20 @@ + + Bulbo and the Blue Dragon + 2019 + Pension Productions + + + + + + + + - Bulbo And The Lizard-King (set 3) + Bulbo and the Lizard-King (set 3) 1987 Zenobi Software @@ -53970,9 +54153,9 @@ - Bulbo And The Lizard-King (set 2) - 19?? - <unknown> + Bulbo and the Lizard-King (set 2) + 1987 + Zenobi Software @@ -53981,9 +54164,9 @@ - Bulbo And The Lizard-King - Release 1 - 19?? - <unknown> + Bulbo and the Lizard-King (release 1) + 1987 + Zenobi Software @@ -53996,6 +54179,37 @@ + + Bulbo's Intrepid Adventure + 2019 + Pension Productions + + + + + + + + + + + + + + + + + + + + + + + + + + + Bull Run 1984 @@ -57896,21 +58110,52 @@ - Chip's Challenge - 19?? - <unknown> + Chip's Challenge (two files) + 1990 + U.S. Gold + + + + Chip's Challenge (one file) + 1990 + U.S. Gold + + + + + + + + + Chip's Challenge (Erbe) + 1991 + Erbe Software + + + + + + + + + + + + + + Chiron 1988 @@ -57924,8 +58169,8 @@ Cholo - 19?? - <unknown> + 1987 + Firebird Software @@ -57960,7 +58205,6 @@ - Chopper Rescue 1983 @@ -59581,8 +59825,8 @@ Complete Machine Code Package (set 2) - 19?? - <unknown> + 1987 + Roybot @@ -59606,10 +59850,10 @@ - - Composer - 19?? - <unknown> + + Composer (William Stuart) + 1982 + William Stuart Systems @@ -59618,23 +59862,23 @@ - Compress Copy (Plomba Software) + Compress Copy 1988 - Plomba + Dinosoft - - + + - Compress Copy - 19?? - <unknown> + Compress Copy (Plomba Software) + 1988 + Plomba Software - - + + @@ -59682,17 +59926,6 @@ - - Computer Scrabble (Leisure Genius) - 19?? - <unknown> - - - - - - - Computer Studies - 13 Years+ 19?? @@ -59811,10 +60044,13 @@ - - Conflict - Release 1 - 19?? - <unknown> + + Conflict (release 1) + 1982 + Martech Games + @@ -59828,9 +60064,9 @@ - Conflict - Release 2 - 19?? - <unknown> + Conflict (release 2) + 1982 + Martech Games @@ -60263,8 +60499,8 @@ Cop-Out - 19?? - <unknown> + 1986 + Mikro-Gen @@ -60520,8 +60756,8 @@ Corporal Stone - 19?? - <unknown> + 1992 + Zenobi Software @@ -65425,8 +65661,8 @@ Deathscape - 19?? - <unknown> + 1987 + Starlight Software @@ -65516,23 +65752,23 @@ - Deek's Deeds (Zenobi) + Deek's Deeds 1990 - Zenobi Software + Jason McHale - - + + - Deek's Deeds - 19?? - <unknown> + Deek's Deeds (Zenobi) + 1990 + Zenobi Software - - + + @@ -66181,6 +66417,18 @@ + + Corrida de Cavalos + 198? + Microbyte Software + + + + + + + + Derrynmoor - The Book 1985 @@ -67449,8 +67697,19 @@ - - Distron (set 2) + + Distron + 1983 + DK'Tronics + + + + + + + + + Distron (two sided tape) 1983 DK'Tronics @@ -67465,13 +67724,21 @@ - - Distron (set 1) - 1983 - DK'Tronics - - - + + Ditador + Treinador de Futebol + 198? + Vector 5 + + + + + + + + + + + @@ -70390,17 +70657,6 @@ - - The Dungeon of Torgar (Adventure Workshop) - 19?? - <unknown> - - - - - - - The Dungeon of Torgar (set 2) 1993 @@ -70423,6 +70679,28 @@ + + The Dungeon of Torgar (Adventure Workshop) + 199? + The Adventure Workshop + + + + + + + + + The Dungeon of Torgar (Adventure Workshop, alt) + 199? + The Adventure Workshop + + + + + + + The Dungeon 19?? @@ -70446,23 +70724,23 @@ - The Dunshalt Donut (Adventure Probe) + The Dunshalt Donut 1984 - Adventure Probe Software + Anubis Software - - + + - The Dunshalt Donut - 19?? - <unknown> + The Dunshalt Donut (Adventure Probe) + 1984 + Adventure Probe Software - - + + @@ -71169,39 +71447,6 @@ - - - El Tragamanzanas (Monser) - 19?? - <unknown> - - - - - - - - - - - - - - El Tragamanzanas - 19?? - <unknown> - - - - - - - - - - - - Elecciones Generales 1986 @@ -73872,8 +74117,8 @@ The Enchanted Cottage (Zenobi) - 19?? - <unknown> + 1988 + Zenobi Software @@ -76230,6 +76475,7 @@ Football Manager (set 2, French) 1982 Addictive Games + @@ -76252,6 +76498,7 @@ Futbol Manager (set 1, Microbyte) 1982 Microbyte + @@ -76263,6 +76510,7 @@ Futbol Manager (set 2) 1982 Addictive Games + @@ -76270,6 +76518,18 @@ + + Treinador de Futebol + 1983 + Microbyte Software + + + + + + + + Football Manager - World Cup Edition (set 1) 1990 @@ -90034,6 +90294,234 @@ + + Italia 1944 (English) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia 1944 (German) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia 1944 (Italian) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia 1944 (Portuguese) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia 1944 (Russian) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia 1944 (Spanish) + 2021 + Zankle Soft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Italia '90 - World Cup Soccer 1989 @@ -93052,7 +93540,7 @@ - The Jade Stone (set 1, release 3) + The Jade Stone (release 3) 1987 Marlin Games @@ -93068,7 +93556,7 @@ - The Jade Stone (set 2, release 2) + The Jade Stone (release 2) 1987 Marlin Games @@ -93084,7 +93572,7 @@ - The Jade Stone (set 3, release 1) + The Jade Stone (release 1) 1987 Marlin Games @@ -93100,7 +93588,7 @@ - The Jade Stone (set 4, Zenobi) + The Jade Stone (Zenobi) 1987 Marlin Games / Zenobi Software @@ -103553,6 +104041,39 @@ + + Metamorphosis + 2021 + ITNL-team + + + + + + + + + Metamorphosis (128K, Valentine's Day demo) + 2021 + ITNL-team + + + + + + + + + Metamorphosis (48K, Valentine's Day demo) + 2021 + ITNL-team + + + + + + + Metaplex 1988 @@ -122492,8 +123013,8 @@ Ring-O - 19?? - <unknown> + 1983 + Elephant Software @@ -122501,10 +123022,21 @@ + + Ring-O (alt) + 1983 + Elephant Software + + + + + + + Ringmaster 19?? - <unknown> + Sara Coward @@ -126350,8 +126882,9 @@ Scrabble - Francais - 19?? - <unknown> + 1983 + Sinclair Research + @@ -126360,20 +126893,20 @@ - Scrabble De-Luxe - 19?? - <unknown> + Computer Scrabble (Leisure Genius) + 1983 + Leisure Genius - - + + - Scrabble - 19?? - <unknown> + Scrabble (Sinclair, alt) + 1983 + Sinclair Research @@ -126381,6 +126914,36 @@ + + Scrabble DeLuxe + 1987 + Leisure Genius + + + + + + + + + Scrabble + Campo de Minas + 198? + Microbaite Software + + + + + + + + + + + + + + + Scramble (Krypton Force) 1984 @@ -142375,8 +142938,8 @@ Theme Park UK (set 2) - 19?? - <unknown> + 1993 + Zenobi Software @@ -142408,8 +142971,8 @@ Theme Park USA (set 2) - 19?? - <unknown> + 1993 + Zenobi Software @@ -142433,34 +142996,34 @@ - - Theory of Music Questions and Exercises (48K) - 19?? - <unknown> + + Theory of Music Questions and Exercises (128K) + 1986 + Ted Kirk - - + + - - + + - - Theory of Music Questions and Exercises (128K) - 19?? - <unknown> + + Theory of Music Questions and Exercises (48K) + 1986 + Ted Kirk - - + + - - + + @@ -152888,45 +153451,47 @@ - Wreckage (Unique) - 19?? - <unknown> + Wreckage + 1983 + Ventamatic + - - + + - Wreckage - 19?? - <unknown> + Wreckage (Unique) + 1983 + Unique Computer Services + - - + + - Wriggler (set 2) - 19?? - <unknown> + Wriggler + 1985 + Romantic Robot - - + + - Wriggler - 19?? - <unknown> + Wriggler (alt) + 1985 + Romantic Robot - - + + @@ -152942,6 +153507,45 @@ + + Wudang (standard loader) + 2020 + World XXI Soft + + + + + + + + + + + Wudang (turbo loader) + 2020 + World XXI Soft + + + + + + + + + + + Wudang (Pure Basic Contest version) + 2020 + World XXI Soft + + + + + + + + + Wulfpack 1989 @@ -153917,20 +154521,9 @@ - Yes Prime Minister (Mastertronic Plus) + Yes, Prime Minister 1987 - Mastertronic Plus - - - - - - - - - Yes Prime Minister - 19?? - <unknown> + Mosaic Publishing @@ -153943,6 +154536,17 @@ + + Yes, Prime Minister (Mastertronic Plus) + 1987 + Mastertronic Plus + + + + + + + Yeti 1988 @@ -157433,7 +158037,7 @@ 3D Combat Zone & Spectrum Chess II 19?? - <unknown> + Dixons @@ -157637,11 +158241,42 @@ + + 48K №1 - El Tragamanzanas + 1985 + Monser + + + + + + + + + + + - - 48K (Issue 02) - Panzer 3D - 19?? - <unknown> + + 48K №1 - El Tragamanzanas (alt) + 1985 + Monser + + + + + + + + + + + + + + 48K №2 - Panzer 3D + 1985 + Monser @@ -157649,10 +158284,21 @@ - - 48K (Issue 04) - Challenger - 19?? - <unknown> + + 48K №3 - Maziacs + 1985 + Monser + + + + + + + + + 48K №4 - Challenger + 1985 + Monser @@ -157660,10 +158306,32 @@ - - 48K (Issue 07) - Especial Comecocos - 19?? - <unknown> + + 48K №5 - Regata + 1985 + Monser + + + + + + + + + 48K №6 - Especial Marcianitos + 1985 + Monser + + + + + + + + + 48K №7 - Especial Comecocos + 1985 + Monser @@ -157671,10 +158339,10 @@ - - 48K (Issue 08) - Pistolero - 19?? - <unknown> + + 48K №8 - Pistolero + 1985 + Monser @@ -157682,6 +158350,39 @@ + + 48K №9 - Frank N' Stein + 1985 + Monser + + + + + + + + + 48K №10 - American Billiards + 1985 + Monser + + + + + + + + + 48K №11 - Camara Secreta + 1985 + Monser + + + + + + + 48k Value Pack 1984 @@ -158663,17 +159364,6 @@ - - American Billards (Monser) - 19?? - <unknown> - - - - - - - Amunt La Informatica (Issue 02) 19?? @@ -160404,9 +161094,9 @@ - Computer Gamer (Issue 09) - 19?? - <unknown> + Computer Gamer (Transmission No. 9 - Stardate December 1985) + 1985 + Argus Specialist Publications @@ -160833,7 +161523,7 @@ Dix Jeux Fantastiques 19?? - <unknown> + Gremlin Graphics Software diff -Nru mame-0.263+dfsg.1/makefile mame-0.264+dfsg.1/makefile --- mame-0.263+dfsg.1/makefile 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/makefile 2024-03-25 14:00:46.000000000 +0000 @@ -1578,7 +1578,7 @@ ifeq (posix,$(SHELLTYPE)) $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS) - @echo '#define BARE_BUILD_VERSION "0.263"' > $@ + @echo '#define BARE_BUILD_VERSION "0.264"' > $@ @echo '#define BARE_VCS_REVISION "$(NEW_GIT_VERSION)"' >> $@ @echo 'extern const char bare_build_version[];' >> $@ @echo 'extern const char bare_vcs_revision[];' >> $@ @@ -1588,7 +1588,7 @@ @echo 'const char build_version[] = BARE_BUILD_VERSION " (" BARE_VCS_REVISION ")";' >> $@ else $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS) - @echo #define BARE_BUILD_VERSION "0.263" > $@ + @echo #define BARE_BUILD_VERSION "0.264" > $@ @echo #define BARE_VCS_REVISION "$(NEW_GIT_VERSION)" >> $@ @echo extern const char bare_build_version[]; >> $@ @echo extern const char bare_vcs_revision[]; >> $@ diff -Nru mame-0.263+dfsg.1/plugins/hiscore/hiscore.dat mame-0.264+dfsg.1/plugins/hiscore/hiscore.dat --- mame-0.263+dfsg.1/plugins/hiscore/hiscore.dat 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/plugins/hiscore/hiscore.dat 2024-03-25 14:00:46.000000000 +0000 @@ -62,7 +62,7 @@ ;** let game display hiscore table a few times in attract mode before ** ;** starting a game ** leprechn: -leprecha: +leprechna: potogold: @:maincpu,program,02ca,50,55,00 @@ -735,6 +735,129 @@ @:maincpu,program,ffac22,ca,00,a4 +;@s:atlus/cave.cpp + +;(donpachi) +donpachi: +donpachihk: +donpachij: +donpachijs: +donpachikr: +@:maincpu,program,101782,4,00,00 +@:maincpu,program,101846,5a,00,01 + + +;(pretty soldier sailer moon) +sailormn: +sailormnh: +sailormnj: +sailormnk: +sailormnnj: +sailormnnk: +sailormnnt: +sailormnnu: +sailormno: +sailormnoh: +sailormnoj: +sailormnok: +sailormnot: +sailormnou: +sailormnt: +sailormnu: +@:maincpu,program,10944f,47,02,05 + + +;(air gallet (taiwan)) +agallet: +agalleta: +agalletah: +agalletaj: +agalletak: +agalletat: +agalletau: +agalleth: +agalletj: +agalletk: +agallett: +agalletu: +@:maincpu,program,100292,5a,00,00 +@:maincpu,program,100200,2,02,1a + + +;(mazinger z) +mazinger: +mazingerj: +@:maincpu,program,100022,43,00,4e + + +ddonpach: +ddonpachj: +@:maincpu,program,1016ea,64,00,05 +@:maincpu,program,101626,4,00,06 + + +;*******gaia crusaders +gaia: +@:maincpu,program,100030,9a,00,04 + + +;pwrinst2j:******gouketsuji ichizoku 2 (japan) +pwrinst2: +pwrinst2j: +@:maincpu,program,40e800,32,00,01 + + +;(hotdog storm) +hotdogst: +@:maincpu,program,301100,54,00,14 + + +uopoko: +uopokoj: +@:maincpu,program,100038,6e,00,20 + + +;(esp.ra.de) (International Ver 1998 4/22 and clones) +esprade: +espradej: +espradejo: +@:maincpu,program,1023b0,50,00,8c +@:maincpu,program,1022ec,4,00,00 + + +;plegends:******Power Instinct Legends (USA) +;plegendsj:******Gouketsuji Ichizoku Saikyou Densetsu (Japan) +plegends: +plegendsj: +@:maincpu,program,40e800,3b,00,0c + + +;(guwange (japan)) +guwange: +@:maincpu,program,2024f0,140,00,10 +@:maincpu,program,2024ac,4,00,00 + + +nmaster: +@:maincpu,program,f08100,e0,30,01 + + +guwanges: +@:maincpu,program,2024fa,140,0,10 +@:maincpu,program,2024b6,4,00,00 + + +;(metamoqester) (by GeoMan) +metmqstr: +@:maincpu,program,f080e0,100,0a,01 + + +;(dangun feveron (japan)) +dfeveron: +feversos: +@:maincpu,program,103eb4,16d,02,07 + + ;@s:atlus/ohmygod.cpp naname: @@ -2160,6 +2283,62 @@ @:maincpu,program,ee47,03,00,00 +;@s:cave/cv1k.cpp + +espgal2: +espgal2a: +@:maincpu,program,c43e064,ed,00,4d + + +dfkbl: +@:maincpu,program,ca02028,2fcb,08,56 + + +deathsml: +@:maincpu,program,c53abd8,63f,00,4d + + +futari10: +@:maincpu,program,c51c0b0,18d,00,48 + + +mushisam: +@:maincpu,program,c244d8c,ed,00,4d + + +mushisamb: +@:maincpu,program,c244dec,9d,00,4e + + +futari15: +@:maincpu,program,c51f7a4,1dd,00,41 + + +mushisama: +@:maincpu,program,c244d1c,ed,00,4d + + +futari15a: +@:maincpu,program,c51f794,1dd,00,41 + + +dsmbl: +@:maincpu,program,c89aee9,95e,00,4d + + +futaribl: +futariblj: +@:maincpu,program,c5193ac,275,00,44 + + +ddpdfk: +@:maincpu,program,c889b1c,2cff,06,4e + + +ddpdfk10: +@:maincpu,program,c88877c,2cff,06,4e + + ;@s:cinematronics/cchasm.cpp cchasm: @@ -8392,129 +8571,6 @@ @:maincpu,program,0507,50,55,00 -;@s:misc/cave.cpp - -;(donpachi) -donpachi: -donpachihk: -donpachij: -donpachijs: -donpachikr: -@:maincpu,program,101782,4,00,00 -@:maincpu,program,101846,5a,00,01 - - -;(pretty soldier sailer moon) -sailormn: -sailormnh: -sailormnj: -sailormnk: -sailormnnj: -sailormnnk: -sailormnnt: -sailormnnu: -sailormno: -sailormnoh: -sailormnoj: -sailormnok: -sailormnot: -sailormnou: -sailormnt: -sailormnu: -@:maincpu,program,10944f,47,02,05 - - -;(air gallet (taiwan)) -agallet: -agalleta: -agalletah: -agalletaj: -agalletak: -agalletat: -agalletau: -agalleth: -agalletj: -agalletk: -agallett: -agalletu: -@:maincpu,program,100292,5a,00,00 -@:maincpu,program,100200,2,02,1a - - -;(mazinger z) -mazinger: -mazingerj: -@:maincpu,program,100022,43,00,4e - - -ddonpach: -ddonpachj: -@:maincpu,program,1016ea,64,00,05 -@:maincpu,program,101626,4,00,06 - - -;*******gaia crusaders -gaia: -@:maincpu,program,100030,9a,00,04 - - -;pwrinst2j:******gouketsuji ichizoku 2 (japan) -pwrinst2: -pwrinst2j: -@:maincpu,program,40e800,32,00,01 - - -;(hotdog storm) -hotdogst: -@:maincpu,program,301100,54,00,14 - - -uopoko: -uopokoj: -@:maincpu,program,100038,6e,00,20 - - -;(esp.ra.de) (International Ver 1998 4/22 and clones) -esprade: -espradej: -espradejo: -@:maincpu,program,1023b0,50,00,8c -@:maincpu,program,1022ec,4,00,00 - - -;plegends:******Power Instinct Legends (USA) -;plegendsj:******Gouketsuji Ichizoku Saikyou Densetsu (Japan) -plegends: -plegendsj: -@:maincpu,program,40e800,3b,00,0c - - -;(guwange (japan)) -guwange: -@:maincpu,program,2024f0,140,00,10 -@:maincpu,program,2024ac,4,00,00 - - -nmaster: -@:maincpu,program,f08100,e0,30,01 - - -guwanges: -@:maincpu,program,2024fa,140,0,10 -@:maincpu,program,2024b6,4,00,00 - - -;(metamoqester) (by GeoMan) -metmqstr: -@:maincpu,program,f080e0,100,0a,01 - - -;(dangun feveron (japan)) -dfeveron: -feversos: -@:maincpu,program,103eb4,16d,02,07 - - ;@s:misc/cocoloco.cpp cocoloco: @@ -8524,62 +8580,6 @@ @:maincpu,program,2170,25,3e,3e -;@s:misc/cv1k.cpp - -espgal2: -espgal2a: -@:maincpu,program,c43e064,ed,00,4d - - -dfkbl: -@:maincpu,program,ca02028,2fcb,08,56 - - -deathsml: -@:maincpu,program,c53abd8,63f,00,4d - - -futari10: -@:maincpu,program,c51c0b0,18d,00,48 - - -mushisam: -@:maincpu,program,c244d8c,ed,00,4d - - -mushisamb: -@:maincpu,program,c244dec,9d,00,4e - - -futari15: -@:maincpu,program,c51f7a4,1dd,00,41 - - -mushisama: -@:maincpu,program,c244d1c,ed,00,4d - - -futari15a: -@:maincpu,program,c51f794,1dd,00,41 - - -dsmbl: -@:maincpu,program,c89aee9,95e,00,4d - - -futaribl: -futariblj: -@:maincpu,program,c5193ac,275,00,44 - - -ddpdfk: -@:maincpu,program,c889b1c,2cff,06,4e - - -ddpdfk10: -@:maincpu,program,c88877c,2cff,06,4e - - ;@s:misc/dfruit.cpp gemcrush: @@ -14193,7 +14193,7 @@ ;rezont:******Rezon (Taito) rezon: -rezont: +rezono: @:maincpu,program,201c66,63,03,20 @:maincpu,program,2018ba,2,03,e8 @@ -16191,7 +16191,7 @@ footchmp: -hthero: +htheroj: @:maincpu,program,10a920,50,0a,00 diff -Nru mame-0.263+dfsg.1/scripts/build/verinfo.py mame-0.264+dfsg.1/scripts/build/verinfo.py --- mame-0.263+dfsg.1/scripts/build/verinfo.py 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/build/verinfo.py 2024-03-25 14:00:46.000000000 +0000 @@ -23,7 +23,7 @@ def extract_version(verinfo): - pattern = re.compile('\s+BARE_BUILD_VERSION\s+"(([^."]+)\.([^."]+))"') + pattern = re.compile(r'\s+BARE_BUILD_VERSION\s+"(([^."]+)\.([^."]+))"') for line in verinfo: match = pattern.search(line) if match: diff -Nru mame-0.263+dfsg.1/scripts/genie.lua mame-0.264+dfsg.1/scripts/genie.lua --- mame-0.263+dfsg.1/scripts/genie.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/genie.lua 2024-03-25 14:00:46.000000000 +0000 @@ -1173,6 +1173,9 @@ "-std=c++17", "-s EXCEPTION_CATCHING_ALLOWED=\"['_ZN15running_machine17start_all_devicesEv','_ZN12cli_frontend7executeEiPPc','_ZN8chd_file11open_commonEb','_ZN8chd_file13read_metadataEjjRNSt3__212basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE','_ZN8chd_file13read_metadataEjjRNSt3__26vectorIhNS0_9allocatorIhEEEE','_ZNK19netlist_mame_device19base_validity_checkER16validity_checker']\"", } + defines { + "ASIO_HAS_PTHREADS", + } linkoptions { "-Wl,--start-group", "-O" .. _OPTIONS["OPTIMIZE"], diff -Nru mame-0.263+dfsg.1/scripts/src/bus.lua mame-0.264+dfsg.1/scripts/src/bus.lua --- mame-0.263+dfsg.1/scripts/src/bus.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/bus.lua 2024-03-25 14:00:46.000000000 +0000 @@ -2075,6 +2075,8 @@ MAME_DIR .. "src/devices/bus/mc10/mc10_cart.h", MAME_DIR .. "src/devices/bus/mc10/mcx128.cpp", MAME_DIR .. "src/devices/bus/mc10/mcx128.h", + MAME_DIR .. "src/devices/bus/mc10/multiports_ext.cpp", + MAME_DIR .. "src/devices/bus/mc10/multiports_ext.h", MAME_DIR .. "src/devices/bus/mc10/pak.cpp", MAME_DIR .. "src/devices/bus/mc10/pak.h", MAME_DIR .. "src/devices/bus/mc10/ram.cpp", @@ -2572,6 +2574,8 @@ files { MAME_DIR .. "src/devices/bus/vcs_ctrl/ctrl.cpp", MAME_DIR .. "src/devices/bus/vcs_ctrl/ctrl.h", + MAME_DIR .. "src/devices/bus/vcs_ctrl/cx85.cpp", + MAME_DIR .. "src/devices/bus/vcs_ctrl/cx85.h", MAME_DIR .. "src/devices/bus/vcs_ctrl/joystick.cpp", MAME_DIR .. "src/devices/bus/vcs_ctrl/joystick.h", MAME_DIR .. "src/devices/bus/vcs_ctrl/joybooster.cpp", @@ -2988,6 +2992,8 @@ MAME_DIR .. "src/devices/bus/a2bus/romcard.h", MAME_DIR .. "src/devices/bus/a2bus/sider.cpp", MAME_DIR .. "src/devices/bus/a2bus/sider.h", + MAME_DIR .. "src/devices/bus/a2bus/snesmax.cpp", + MAME_DIR .. "src/devices/bus/a2bus/snesmax.h", MAME_DIR .. "src/devices/bus/a2bus/softcard3.cpp", MAME_DIR .. "src/devices/bus/a2bus/softcard3.h", MAME_DIR .. "src/devices/bus/a2bus/ssbapple.cpp", @@ -5490,6 +5496,10 @@ MAME_DIR .. "src/devices/bus/pci/aha2940au.h", MAME_DIR .. "src/devices/bus/pci/audiowerk2.cpp", MAME_DIR .. "src/devices/bus/pci/audiowerk2.h", + MAME_DIR .. "src/devices/bus/pci/clgd5446.cpp", + MAME_DIR .. "src/devices/bus/pci/clgd5446.h", + MAME_DIR .. "src/devices/bus/pci/clgd546x_laguna.cpp", + MAME_DIR .. "src/devices/bus/pci/clgd546x_laguna.h", MAME_DIR .. "src/devices/bus/pci/ds2416.cpp", MAME_DIR .. "src/devices/bus/pci/ds2416.h", MAME_DIR .. "src/devices/bus/pci/ess_maestro.cpp", @@ -5502,6 +5512,8 @@ MAME_DIR .. "src/devices/bus/pci/oti_spitfire.h", MAME_DIR .. "src/devices/bus/pci/opti82c861.cpp", MAME_DIR .. "src/devices/bus/pci/opti82c861.h", + MAME_DIR .. "src/devices/bus/pci/pdc20262.cpp", + MAME_DIR .. "src/devices/bus/pci/pdc20262.h", MAME_DIR .. "src/devices/bus/pci/promotion.cpp", MAME_DIR .. "src/devices/bus/pci/promotion.h", MAME_DIR .. "src/devices/bus/pci/riva128.cpp", @@ -5512,12 +5524,16 @@ MAME_DIR .. "src/devices/bus/pci/rtl8029as_pci.h", MAME_DIR .. "src/devices/bus/pci/rtl8139_pci.cpp", MAME_DIR .. "src/devices/bus/pci/rtl8139_pci.h", + MAME_DIR .. "src/devices/bus/pci/sis6326.cpp", + MAME_DIR .. "src/devices/bus/pci/sis6326.h", MAME_DIR .. "src/devices/bus/pci/sonicvibes.cpp", MAME_DIR .. "src/devices/bus/pci/sonicvibes.h", MAME_DIR .. "src/devices/bus/pci/sw1000xg.cpp", MAME_DIR .. "src/devices/bus/pci/sw1000xg.h", MAME_DIR .. "src/devices/bus/pci/virge_pci.cpp", MAME_DIR .. "src/devices/bus/pci/virge_pci.h", + MAME_DIR .. "src/devices/bus/pci/vision.cpp", + MAME_DIR .. "src/devices/bus/pci/vision.h", MAME_DIR .. "src/devices/bus/pci/vt6306.cpp", MAME_DIR .. "src/devices/bus/pci/vt6306.h", MAME_DIR .. "src/devices/bus/pci/wd9710_pci.cpp", @@ -5532,14 +5548,16 @@ --------------------------------------------------- -- ---@src/devices/bus/plg100/plg100.h,BUSES["PLG100"] = true +--@src/devices/bus/plg1x0/plg1x0.h,BUSES["PLG1X0"] = true --------------------------------------------------- -if (BUSES["PLG100"]~=null) then +if (BUSES["PLG1X0"]~=null) then files { - MAME_DIR .. "src/devices/bus/plg100/plg100.cpp", - MAME_DIR .. "src/devices/bus/plg100/plg100.h", - MAME_DIR .. "src/devices/bus/plg100/vl.cpp", - MAME_DIR .. "src/devices/bus/plg100/vl.h", + MAME_DIR .. "src/devices/bus/plg1x0/plg1x0.cpp", + MAME_DIR .. "src/devices/bus/plg1x0/plg1x0.h", + MAME_DIR .. "src/devices/bus/plg1x0/plg100-vl.cpp", + MAME_DIR .. "src/devices/bus/plg1x0/plg100-vl.h", + MAME_DIR .. "src/devices/bus/plg1x0/plg150-ap.cpp", + MAME_DIR .. "src/devices/bus/plg1x0/plg150-ap.h", } end diff -Nru mame-0.263+dfsg.1/scripts/src/cpu.lua mame-0.264+dfsg.1/scripts/src/cpu.lua --- mame-0.263+dfsg.1/scripts/src/cpu.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/cpu.lua 2024-03-25 14:00:46.000000000 +0000 @@ -651,14 +651,14 @@ files { MAME_DIR .. "src/devices/cpu/g65816/g65816.cpp", MAME_DIR .. "src/devices/cpu/g65816/g65816.h", + MAME_DIR .. "src/devices/cpu/g65816/g65816cm.h", + MAME_DIR .. "src/devices/cpu/g65816/g65816ds.h", MAME_DIR .. "src/devices/cpu/g65816/g65816o0.cpp", MAME_DIR .. "src/devices/cpu/g65816/g65816o1.cpp", MAME_DIR .. "src/devices/cpu/g65816/g65816o2.cpp", MAME_DIR .. "src/devices/cpu/g65816/g65816o3.cpp", MAME_DIR .. "src/devices/cpu/g65816/g65816o4.cpp", - MAME_DIR .. "src/devices/cpu/g65816/g65816cm.h", - MAME_DIR .. "src/devices/cpu/g65816/g65816ds.h", - MAME_DIR .. "src/devices/cpu/g65816/g65816op.h", + MAME_DIR .. "src/devices/cpu/g65816/g65816op.ipp", } end @@ -701,8 +701,6 @@ MAME_DIR .. "src/devices/cpu/h8/h8s2600.h", MAME_DIR .. "src/devices/cpu/h8/h8325.cpp", MAME_DIR .. "src/devices/cpu/h8/h8325.h", - MAME_DIR .. "src/devices/cpu/h8/h83337.cpp", - MAME_DIR .. "src/devices/cpu/h8/h83337.h", MAME_DIR .. "src/devices/cpu/h8/h83002.cpp", MAME_DIR .. "src/devices/cpu/h8/h83002.h", MAME_DIR .. "src/devices/cpu/h8/h83003.cpp", @@ -717,10 +715,16 @@ MAME_DIR .. "src/devices/cpu/h8/h83042.h", MAME_DIR .. "src/devices/cpu/h8/h83048.cpp", MAME_DIR .. "src/devices/cpu/h8/h83048.h", + MAME_DIR .. "src/devices/cpu/h8/h83217.cpp", + MAME_DIR .. "src/devices/cpu/h8/h83217.h", + MAME_DIR .. "src/devices/cpu/h8/h83337.cpp", + MAME_DIR .. "src/devices/cpu/h8/h83337.h", MAME_DIR .. "src/devices/cpu/h8/h8s2245.cpp", MAME_DIR .. "src/devices/cpu/h8/h8s2245.h", - MAME_DIR .. "src/devices/cpu/h8/h8s2320.cpp", - MAME_DIR .. "src/devices/cpu/h8/h8s2320.h", + MAME_DIR .. "src/devices/cpu/h8/h8s2319.cpp", + MAME_DIR .. "src/devices/cpu/h8/h8s2319.h", + MAME_DIR .. "src/devices/cpu/h8/h8s2329.cpp", + MAME_DIR .. "src/devices/cpu/h8/h8s2329.h", MAME_DIR .. "src/devices/cpu/h8/h8s2357.cpp", MAME_DIR .. "src/devices/cpu/h8/h8s2357.h", MAME_DIR .. "src/devices/cpu/h8/h8s2655.cpp", @@ -897,6 +901,14 @@ MAME_DIR .. "src/devices/cpu/sh/sh7032.h", MAME_DIR .. "src/devices/cpu/sh/sh7042.cpp", MAME_DIR .. "src/devices/cpu/sh/sh7042.h", + MAME_DIR .. "src/devices/cpu/sh/sh_adc.cpp", + MAME_DIR .. "src/devices/cpu/sh/sh_adc.h", + MAME_DIR .. "src/devices/cpu/sh/sh_cmt.cpp", + MAME_DIR .. "src/devices/cpu/sh/sh_cmt.h", + MAME_DIR .. "src/devices/cpu/sh/sh_intc.cpp", + MAME_DIR .. "src/devices/cpu/sh/sh_intc.h", + MAME_DIR .. "src/devices/cpu/sh/sh_port.cpp", + MAME_DIR .. "src/devices/cpu/sh/sh_port.h", MAME_DIR .. "src/devices/cpu/sh/sh7604_bus.cpp", MAME_DIR .. "src/devices/cpu/sh/sh7604_bus.h", MAME_DIR .. "src/devices/cpu/sh/sh7604_sci.cpp", @@ -1630,6 +1642,7 @@ --@src/devices/cpu/m6502/gew7.h,CPUS["M6502"] = true --@src/devices/cpu/m6502/gew12.h,CPUS["M6502"] = true --@src/devices/cpu/m6502/m3745x.h,CPUS["M6502"] = true +--@src/devices/cpu/m6502/m37640.h,CPUS["M6502"] = true --@src/devices/cpu/m6502/m4510.h,CPUS["M6502"] = true --@src/devices/cpu/m6502/m50734.h,CPUS["M6502"] = true --@src/devices/cpu/m6502/m5074x.h,CPUS["M6502"] = true @@ -1669,6 +1682,8 @@ MAME_DIR .. "src/devices/cpu/m6502/gew12.h", MAME_DIR .. "src/devices/cpu/m6502/m3745x.cpp", MAME_DIR .. "src/devices/cpu/m6502/m3745x.h", + MAME_DIR .. "src/devices/cpu/m6502/m37640.cpp", + MAME_DIR .. "src/devices/cpu/m6502/m37640.h", MAME_DIR .. "src/devices/cpu/m6502/m4510.cpp", MAME_DIR .. "src/devices/cpu/m6502/m4510.h", MAME_DIR .. "src/devices/cpu/m6502/m50734.cpp", @@ -2941,6 +2956,8 @@ local want_disasm_kc80 = opt_tool(CPUS, "KC80") if want_disasm_z80 or want_disasm_kc80 then + table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/z80/r800dasm.cpp") + table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/z80/r800dasm.h") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/z80/z80dasm.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/z80/z80dasm.h") end diff -Nru mame-0.263+dfsg.1/scripts/src/machine.lua mame-0.264+dfsg.1/scripts/src/machine.lua --- mame-0.263+dfsg.1/scripts/src/machine.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/machine.lua 2024-03-25 14:00:46.000000000 +0000 @@ -1940,6 +1940,18 @@ --------------------------------------------------- -- +--@src/devices/machine/1801vp128.h,MACHINES["K1801VP128"] = true +--------------------------------------------------- + +if (MACHINES["K1801VP128"]~=null) then + files { + MAME_DIR .. "src/devices/machine/1801vp128.cpp", + MAME_DIR .. "src/devices/machine/1801vp128.h", + } +end + +--------------------------------------------------- +-- --@src/devices/machine/kb3600.h,MACHINES["KB3600"] = true --------------------------------------------------- @@ -2905,6 +2917,8 @@ MAME_DIR .. "src/devices/machine/mediagx_cs5530_bridge.h", MAME_DIR .. "src/devices/machine/mediagx_cs5530_ide.cpp", MAME_DIR .. "src/devices/machine/mediagx_cs5530_ide.h", + MAME_DIR .. "src/devices/machine/mediagx_cs5530_video.cpp", + MAME_DIR .. "src/devices/machine/mediagx_cs5530_video.h", MAME_DIR .. "src/devices/machine/mediagx_host.cpp", MAME_DIR .. "src/devices/machine/mediagx_host.h", MAME_DIR .. "src/devices/machine/zfmicro_usb.cpp", @@ -4465,6 +4479,18 @@ --------------------------------------------------- -- +--@src/devices/machine/it8705f.h,MACHINES["IT8705F"] = true +--------------------------------------------------- + +if (MACHINES["IT8705F"]~=null) then + files { + MAME_DIR .. "src/devices/machine/it8705f.cpp", + MAME_DIR .. "src/devices/machine/it8705f.h", + } +end + +--------------------------------------------------- +-- --@src/devices/machine/pc87306.h,MACHINES["PC87306"] = true --------------------------------------------------- @@ -4477,6 +4503,18 @@ --------------------------------------------------- -- +--@src/devices/machine/w83787f.h,MACHINES["W83787F"] = true +--------------------------------------------------- + +if (MACHINES["W83787F"]~=null) then + files { + MAME_DIR .. "src/devices/machine/w83787f.cpp", + MAME_DIR .. "src/devices/machine/w83787f.h", + } +end + +--------------------------------------------------- +-- --@src/devices/machine/w83977tf.h,MACHINES["W83977TF"] = true --------------------------------------------------- @@ -5329,3 +5367,14 @@ MAME_DIR .. "src/devices/machine/tc9223.h", } end + +--------------------------------------------------- +--@src/devices/machine/upd7261.h,MACHINES["UPD7261"] = true +--------------------------------------------------- + +if (MACHINES["UPD7261"]~=null) then + files { + MAME_DIR .. "src/devices/machine/upd7261.cpp", + MAME_DIR .. "src/devices/machine/upd7261.h", + } +end diff -Nru mame-0.263+dfsg.1/scripts/src/osd/modules.lua mame-0.264+dfsg.1/scripts/src/osd/modules.lua --- mame-0.263+dfsg.1/scripts/src/osd/modules.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/osd/modules.lua 2024-03-25 14:00:46.000000000 +0000 @@ -60,6 +60,9 @@ MAME_DIR .. "src/osd/interface/inputman.h", MAME_DIR .. "src/osd/interface/inputseq.cpp", MAME_DIR .. "src/osd/interface/inputseq.h", + MAME_DIR .. "src/osd/interface/midiport.h", + MAME_DIR .. "src/osd/interface/nethandler.cpp", + MAME_DIR .. "src/osd/interface/nethandler.h", MAME_DIR .. "src/osd/modules/debugger/debug_module.h", MAME_DIR .. "src/osd/modules/debugger/debuggdbstub.cpp", MAME_DIR .. "src/osd/modules/debugger/debugimgui.cpp", diff -Nru mame-0.263+dfsg.1/scripts/src/sound.lua mame-0.264+dfsg.1/scripts/src/sound.lua --- mame-0.263+dfsg.1/scripts/src/sound.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/sound.lua 2024-03-25 14:00:46.000000000 +0000 @@ -692,11 +692,12 @@ --@src/devices/sound/msm5232.h,SOUNDS["MSM5232"] = true --@src/devices/sound/okim6376.h,SOUNDS["OKIM6376"] = true --@src/devices/sound/okim6295.h,SOUNDS["OKIM6295"] = true +--@src/devices/sound/okim6588.h,SOUNDS["OKIM6588"] = true --@src/devices/sound/okim9810.h,SOUNDS["OKIM9810"] = true --@src/devices/sound/okiadpcm.h,SOUNDS["OKIADPCM"] = true --------------------------------------------------- -if (SOUNDS["OKIM6258"]~=null or SOUNDS["OKIM6295"]~=null or SOUNDS["OKIM9810"]~=null or SOUNDS["I5000_SND"]~=null or SOUNDS["OKIADPCM"]~=null) then +if (SOUNDS["OKIM6258"]~=null or SOUNDS["OKIM6295"]~=null or SOUNDS["OKIM6588"]~=null or SOUNDS["OKIM9810"]~=null or SOUNDS["I5000_SND"]~=null or SOUNDS["OKIADPCM"]~=null) then files { MAME_DIR .. "src/devices/sound/okiadpcm.cpp", MAME_DIR .. "src/devices/sound/okiadpcm.h", @@ -738,6 +739,13 @@ } end +if (SOUNDS["OKIM6588"]~=null) then + files { + MAME_DIR .. "src/devices/sound/okim6588.cpp", + MAME_DIR .. "src/devices/sound/okim6588.h", + } +end + if (SOUNDS["OKIM9810"]~=null) then files { MAME_DIR .. "src/devices/sound/okim9810.cpp", @@ -1553,6 +1561,18 @@ --------------------------------------------------- -- +--@src/devices/sound/swx00.h,SOUNDS["SWX00"] = true +--------------------------------------------------- + +if (SOUNDS["SWX00"]~=null) then + files { + MAME_DIR .. "src/devices/sound/swx00.cpp", + MAME_DIR .. "src/devices/sound/swx00.h", + } +end + +--------------------------------------------------- +-- --@src/devices/sound/meg.h,SOUNDS["MEG"] = true --------------------------------------------------- @@ -1694,3 +1714,15 @@ MAME_DIR .. "src/devices/sound/ap2010pcm.h", } end + +--------------------------------------------------- +-- Texas Instruments CF61909 +--@src/devices/sound/cf61909.h,SOUNDS["CF61909"] = true +--------------------------------------------------- + +if (SOUNDS["CF61909"]~=null) then + files { + MAME_DIR .. "src/devices/sound/cf61909.cpp", + MAME_DIR .. "src/devices/sound/cf61909.h", + } +end diff -Nru mame-0.263+dfsg.1/scripts/src/tools.lua mame-0.264+dfsg.1/scripts/src/tools.lua --- mame-0.263+dfsg.1/scripts/src/tools.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/tools.lua 2024-03-25 14:00:46.000000000 +0000 @@ -469,7 +469,7 @@ } defines { - "NL_DISABLE_DYNAMIC_LOAD=1", + "NL_DISABLE_DYNAMIC_LOAD=1", } files { @@ -747,7 +747,7 @@ } dependency { - { "aueffectutil", MAME_DIR .. "src/tools/aueffectutil-Info.plist", true }, + { "aueffectutil", MAME_DIR .. "src/tools/aueffectutil-Info.plist", true }, } links { diff -Nru mame-0.263+dfsg.1/scripts/src/video.lua mame-0.264+dfsg.1/scripts/src/video.lua --- mame-0.263+dfsg.1/scripts/src/video.lua 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/scripts/src/video.lua 2024-03-25 14:00:46.000000000 +0000 @@ -248,28 +248,6 @@ end -------------------------------------------------- ---@src/devices/video/epic12.h,VIDEOS["EPIC12"] = true --------------------------------------------------- - -if (VIDEOS["EPIC12"]~=null) then - files { - MAME_DIR .. "src/devices/video/epic12.cpp", - MAME_DIR .. "src/devices/video/epic12.h", - MAME_DIR .. "src/devices/video/epic12_blit0.cpp", - MAME_DIR .. "src/devices/video/epic12_blit1.cpp", - MAME_DIR .. "src/devices/video/epic12_blit2.cpp", - MAME_DIR .. "src/devices/video/epic12_blit3.cpp", - MAME_DIR .. "src/devices/video/epic12_blit4.cpp", - MAME_DIR .. "src/devices/video/epic12_blit5.cpp", - MAME_DIR .. "src/devices/video/epic12_blit6.cpp", - MAME_DIR .. "src/devices/video/epic12_blit7.cpp", - MAME_DIR .. "src/devices/video/epic12_blit8.cpp", - MAME_DIR .. "src/devices/video/epic12in.hxx", - MAME_DIR .. "src/devices/video/epic12pixel.hxx", - } -end - --------------------------------------------------- -- --@src/devices/video/fixfreq.h,VIDEOS["FIXFREQ"] = true -------------------------------------------------- @@ -919,6 +897,18 @@ -------------------------------------------------- -- +--@src/devices/video/pc_vga_mediagx.h,VIDEOS["PC_VGA_MEDIAGX"] = true +-------------------------------------------------- + +if (VIDEOS["PC_VGA_MEDIAGX"]~=null) then + files { + MAME_DIR .. "src/devices/video/pc_vga_mediagx.cpp", + MAME_DIR .. "src/devices/video/pc_vga_mediagx.h", + } +end + +-------------------------------------------------- +-- --@src/devices/video/pc_vga_nvidia.h,VIDEOS["PC_VGA_NVIDIA"] = true -------------------------------------------------- @@ -1037,19 +1027,6 @@ } end - --------------------------------------------------- --- ---@src/devices/video/clgd546x_laguna.h,VIDEOS["CLGD546X_LAGUNA"] = true --------------------------------------------------- - -if (VIDEOS["CLGD546X_LAGUNA"]~=null) then - files { - MAME_DIR .. "src/devices/video/clgd546x_laguna.cpp", - MAME_DIR .. "src/devices/video/clgd546x_laguna.h", - } -end - -------------------------------------------------- -- diff -Nru mame-0.263+dfsg.1/src/devices/bus/a2bus/a2cffa.cpp mame-0.264+dfsg.1/src/devices/bus/a2bus/a2cffa.cpp --- mame-0.263+dfsg.1/src/devices/bus/a2bus/a2cffa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a2bus/a2cffa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -297,14 +297,14 @@ bool a2bus_cffa2_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_eeprom, 0x1000, actual) && actual == 0x1000; + auto const [err, actual] = read(file, m_eeprom, 0x1000); + return !err && (actual == 0x1000); } bool a2bus_cffa2_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_eeprom, 0x1000, actual) && actual == 0x1000; + auto const [err, actual] = write(file, m_eeprom, 0x1000); + return !err; } void a2bus_cffa2_6502_device::nvram_default() @@ -314,14 +314,14 @@ bool a2bus_cffa2_6502_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_eeprom, 0x1000, actual) && actual == 0x1000; + auto const [err, actual] = read(file, m_eeprom, 0x1000); + return !err && (actual == 0x1000); } bool a2bus_cffa2_6502_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_eeprom, 0x1000, actual) && actual == 0x1000; + auto const [err, actual] = write(file, m_eeprom, 0x1000); + return !err; } } // anonymous namespace diff -Nru mame-0.263+dfsg.1/src/devices/bus/a2bus/cards.cpp mame-0.264+dfsg.1/src/devices/bus/a2bus/cards.cpp --- mame-0.263+dfsg.1/src/devices/bus/a2bus/cards.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a2bus/cards.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -62,6 +62,7 @@ #include "ramcard16k.h" #include "romcard.h" #include "sider.h" +#include "snesmax.h" #include "softcard3.h" #include "ssbapple.h" #include "ssprite.h" @@ -136,6 +137,7 @@ device.option_add("ssprite", A2BUS_SSPRITE); // Synetix SuperSprite Board device.option_add("ssbapple", A2BUS_SSBAPPLE); // SSB Apple speech board device.option_add("4play", A2BUS_4PLAY); // 4Play Joystick Card (Rev. B) + device.option_add("snesmax", A2BUS_SNES_MAX); // SNES MAX controller adapter device.option_add("ceyes2", A2BUS_COMPUTEREYES2); // ComputerEyes/2 Video Digitizer device.option_add("twarp", A2BUS_TRANSWARP); // AE TransWarp accelerator device.option_add("applesurance", A2BUS_APPLESURANCE); // Applesurance Diagnostic Controller @@ -212,6 +214,7 @@ device.option_add("twarp", A2BUS_TRANSWARP); // AE TransWarp accelerator device.option_add("vulcan", A2BUS_VULCANIIE); // Applied Engineering Vulcan IDE drive device.option_add("4play", A2BUS_4PLAY); // 4Play Joystick Card (Rev. B) + device.option_add("snesmax", A2BUS_SNES_MAX); // SNES MAX controller adapter device.option_add("ceyes2", A2BUS_COMPUTEREYES2); // ComputerEyes/2 Video Digitizer device.option_add("applesurance", A2BUS_APPLESURANCE); // Applesurance Diagnostic Controller device.option_add("byte8251", A2BUS_BYTE8251); // BYTE Magazine 8251 serial card @@ -286,6 +289,7 @@ device.option_add("vulcan", A2BUS_VULCAN); // Applied Engineering Vulcan IDE drive device.option_add("vulcangold", A2BUS_VULCANGOLD); // Applied Engineering Vulcan Gold IDE drive device.option_add("4play", A2BUS_4PLAY); // 4Play Joystick Card (Rev. B) + device.option_add("snesmax", A2BUS_SNES_MAX); // SNES MAX controller adapter // device.option_add("magicmusician", A2BUS_MAGICMUSICIAN); // Magic Musician Card // device.option_add("pcxport", A2BUS_PCXPORTER); // Applied Engineering PC Transporter device.option_add("byte8251", A2BUS_BYTE8251); // BYTE Magazine 8251 serial card diff -Nru mame-0.263+dfsg.1/src/devices/bus/a2bus/snesmax.cpp mame-0.264+dfsg.1/src/devices/bus/a2bus/snesmax.cpp --- mame-0.263+dfsg.1/src/devices/bus/a2bus/snesmax.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a2bus/snesmax.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,97 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#include "emu.h" +#include "snesmax.h" + +#include "bus/snes_ctrl/ctrl.h" + +namespace { + +class a2bus_snes_max_device : public device_t, public device_a2bus_card_interface +{ +public: + a2bus_snes_max_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + u32 clock) : + device_t(mconfig, A2BUS_SNES_MAX, tag, owner, clock), + device_a2bus_card_interface(mconfig, *this), + m_controllers(*this, "%u", 1U), + m_latch_timer(nullptr), + m_data(0xff) + { + } + + virtual u8 read_c0nx(u8 offset) override + { + return m_data; + } + + virtual void write_c0nx(u8 offset, u8 data) override + { + if (BIT(offset, 0)) + { + m_data = + (m_controllers[0]->read_pin4() ? 0x00 : 0x80) | + (m_controllers[1]->read_pin4() ? 0x00 : 0x40) | + 0x3f; + } + else + { + machine().scheduler().synchronize(timer_expired_delegate(FUNC(a2bus_snes_max_device::set_latch), this), 0); + } + } + + virtual bool take_c800() override + { + return false; + } + +protected: + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD + { + SNES_CONTROL_PORT(config, m_controllers[0], snes_control_port_devices, "joypad"); + SNES_CONTROL_PORT(config, m_controllers[1], snes_control_port_devices, "joypad"); + } + + virtual void device_start() override ATTR_COLD + { + m_latch_timer = timer_alloc(FUNC(a2bus_snes_max_device::reset_latch), this); + + m_data = 0xff; + + save_item(NAME(m_data)); + + m_controllers[0]->write_strobe(0); + m_controllers[1]->write_strobe(0); + } + +private: + TIMER_CALLBACK_MEMBER(set_latch) + { + m_controllers[0]->write_strobe(1); + m_controllers[1]->write_strobe(1); + m_latch_timer->adjust(attotime::from_ticks(7, clock())); + } + + TIMER_CALLBACK_MEMBER(reset_latch) + { + m_controllers[0]->write_strobe(0); + m_controllers[1]->write_strobe(0); + + m_data = + (m_controllers[0]->read_pin4() ? 0x00 : 0x80) | + (m_controllers[1]->read_pin4() ? 0x00 : 0x40) | + 0x3f; + } + + required_device_array m_controllers; + emu_timer *m_latch_timer; + u8 m_data; +}; + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(A2BUS_SNES_MAX, device_a2bus_card_interface, a2bus_snes_max_device, "a2snesmax", "SNES MAX Game Controller Interface") diff -Nru mame-0.263+dfsg.1/src/devices/bus/a2bus/snesmax.h mame-0.264+dfsg.1/src/devices/bus/a2bus/snesmax.h --- mame-0.263+dfsg.1/src/devices/bus/a2bus/snesmax.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a2bus/snesmax.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,20 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*********************************************************************** + + Homebrew dual SNES controller interface by Lukazi + + https://lukazi.blogspot.com/2021/06/game-controller-snes-max-snes.html + +***********************************************************************/ +#ifndef MAME_BUS_A2BUS_SNESMAX_H +#define MAME_BUS_A2BUS_SNESMAX_H + +#pragma once + +#include "a2bus.h" + + +DECLARE_DEVICE_TYPE(A2BUS_SNES_MAX, device_a2bus_card_interface) + +#endif // MAME_BUS_A2BUS_SNESMAX_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/a7800/a78_slot.cpp mame-0.264+dfsg.1/src/devices/bus/a7800/a78_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/a7800/a78_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a7800/a78_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -512,8 +512,7 @@ // Load and check the header uint8_t head[128]; - std::size_t actual; - hook.image_file()->read(&head[0], 128, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &head[0], 128); // FIXME: check error return or read returning short // let's try to auto-fix some common errors in the header int const mapper = validate_header(get_u16be(&head[53]), false); diff -Nru mame-0.263+dfsg.1/src/devices/bus/a800/a800_slot.cpp mame-0.264+dfsg.1/src/devices/bus/a800/a800_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/a800/a800_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/a800/a800_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -655,9 +655,8 @@ // check whether there is an header, to identify the cart type if ((len % 0x1000) == 0x10) { - size_t actual; uint8_t head[0x10]; - hook.image_file()->read(&head[0], 0x10, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &head[0], 0x10); // FIXME: check error return or read returning short type = identify_cart_type(&head[0]); } else // otherwise try to guess based on size @@ -701,9 +700,8 @@ int type = A5200_8K; if ((len % 0x1000) == 0x10) { - size_t actual; uint8_t head[0x10]; - hook.image_file()->read(&head[0], 0x10, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &head[0], 0x10); // FIXME: check error return or read returning short type = identify_cart_type(&head[0]); } else diff -Nru mame-0.263+dfsg.1/src/devices/bus/abcbus/ssa.cpp mame-0.264+dfsg.1/src/devices/bus/abcbus/ssa.cpp --- mame-0.263+dfsg.1/src/devices/bus/abcbus/ssa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/abcbus/ssa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -161,6 +161,23 @@ } +void abc_super_smartaid_device::nvram_default() +{ +} + +bool abc_super_smartaid_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram, m_nvram.bytes()); + return !err && (actual == m_nvram.bytes()); +} + +bool abc_super_smartaid_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram, m_nvram.bytes()); + return !err; +} + + //************************************************************************** // ABC BUS INTERFACE diff -Nru mame-0.263+dfsg.1/src/devices/bus/abcbus/ssa.h mame-0.264+dfsg.1/src/devices/bus/abcbus/ssa.h --- mame-0.263+dfsg.1/src/devices/bus/abcbus/ssa.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/abcbus/ssa.h 2024-03-25 14:00:46.000000000 +0000 @@ -39,9 +39,9 @@ virtual void device_reset() override; // device_nvram_interface implementation - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram, m_nvram.bytes(), actual) && actual == m_nvram.bytes(); } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram, m_nvram.bytes(), actual) && actual == m_nvram.bytes(); } + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; // device_abcbus_interface implementation virtual void abcbus_cs(uint8_t data) override { m_bus->write_cs(data); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/adam/exp.cpp mame-0.264+dfsg.1/src/devices/bus/adam/exp.cpp --- mame-0.263+dfsg.1/src/devices/bus/adam/exp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/adam/exp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,8 @@ #include "emu.h" #include "exp.h" +#include + //************************************************************************** @@ -76,13 +78,18 @@ std::pair adam_expansion_slot_device::call_load() { + std::error_condition err; + if (m_card) { if (!loaded_through_softlist()) { size_t const size = length(); - fread(m_card->m_rom, size); + std::size_t actual; + std::tie(err, m_card->m_rom, actual) = read(image_core_file(), size); + if (!err && (actual != size)) + err = std::errc::io_error; } else { @@ -90,7 +97,7 @@ } } - return std::make_pair(std::error_condition(), std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/aquarius/slot.cpp mame-0.264+dfsg.1/src/devices/bus/aquarius/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/aquarius/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/aquarius/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -118,9 +118,8 @@ { uint8_t header[16]; - size_t actual; hook.image_file()->seek(len - 0x2000, SEEK_SET); // FIXME: check error return - hook.image_file()->read(&header[0], 16, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &header[0], 16); // FIXME: check error return or read returning short // detect SuperCart header if (!memcmp(&header[0], SC08_HEADER, 16) || !memcmp(&header[0], SC16_HEADER, 16)) diff -Nru mame-0.263+dfsg.1/src/devices/bus/ata/cr589.cpp mame-0.264+dfsg.1/src/devices/bus/ata/cr589.cpp --- mame-0.263+dfsg.1/src/devices/bus/ata/cr589.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ata/cr589.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -29,8 +29,8 @@ bool matsushita_cr589_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(buffer, sizeof(buffer), actual) && actual == sizeof(buffer); + auto const [err, actual] = read(file, buffer, sizeof(buffer)); + return !err && (actual == sizeof(buffer)); } @@ -42,8 +42,8 @@ bool matsushita_cr589_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(buffer, sizeof(buffer), actual) && actual == sizeof(buffer); + auto const [err, actual] = write(file, buffer, sizeof(buffer)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/ata/xm3301.cpp mame-0.264+dfsg.1/src/devices/bus/ata/xm3301.cpp --- mame-0.263+dfsg.1/src/devices/bus/ata/xm3301.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ata/xm3301.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,8 +1,8 @@ // license:BSD-3-Clause -// copyright-holders: Angelo Salese +// copyright-holders: Angelo Salese, Grull Osgo /************************************************************************************************** -Toshiba TAISATAP.SYS support +Toshiba TAISATAP.SYS support / CD_BALLY.SYS (gammagic) TODO: - XM-3301 on its own is a SCSI-2 drive, the ATAPI variants must be higher number(s)? @@ -25,9 +25,17 @@ memset(m_identify_buffer, 0, sizeof(m_identify_buffer)); - // "E:XM" and "1.0" is where Master Model and Revision are printed - t10mmc::set_model("TOSHIBA CD-ROM DRVE:XM 1.0"); + // From a XM-5401 SCSI dump string $7f08 + // [5401] will be printed as Master Model + // [3605] as Rev number + // Both TAISATAP.SYS and CD_BALLY.SYS tests against one of these strings: + // "TOSHIBA CD-ROM" + // "TOSHIBA CD-ROM XM-3301" + // "TOSHIBA CD-ROM DRIVE:XM" + // "TOSHIBA DVD" (CD_BALLY.SYS only) + t10mmc::set_model("TOSHIBA CD-ROM XM-5401TA3605"); + // xx20 is the only confirmed part (wants IRQ for command $a0) m_identify_buffer[0] = 0x8520; // TODO: everything below here is unconfirmed diff -Nru mame-0.263+dfsg.1/src/devices/bus/ata/xm3301.h mame-0.264+dfsg.1/src/devices/bus/ata/xm3301.h --- mame-0.263+dfsg.1/src/devices/bus/ata/xm3301.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ata/xm3301.h 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Angelo Salese +// copyright-holders:Angelo Salese, Grull Osgo #ifndef MAME_BUS_ATA_XM3301_H #define MAME_BUS_ATA_XM3301_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/dqbb.cpp mame-0.264+dfsg.1/src/devices/bus/c64/dqbb.cpp --- mame-0.263+dfsg.1/src/devices/bus/c64/dqbb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/dqbb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -75,6 +75,25 @@ } +void c64_dqbb_cartridge_device::nvram_default() +{ +} + + +bool c64_dqbb_cartridge_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram.get(), 0x4000); + return !err && (actual == 0x4000); +} + + +bool c64_dqbb_cartridge_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram.get(), 0x4000); + return !err; +} + + //------------------------------------------------- // c64_cd_r - cartridge data read //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/dqbb.h mame-0.264+dfsg.1/src/devices/bus/c64/dqbb.h --- mame-0.263+dfsg.1/src/devices/bus/c64/dqbb.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/dqbb.h 2024-03-25 14:00:46.000000000 +0000 @@ -36,9 +36,9 @@ virtual void device_reset() override; // device_nvram_interface implementation - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram.get(), 0x4000, actual) && actual == 0x4000; } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram.get(), 0x4000, actual) && actual == 0x4000; } + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; // device_c64_expansion_card_interface implementation virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/exp.cpp mame-0.264+dfsg.1/src/devices/bus/c64/exp.cpp --- mame-0.263+dfsg.1/src/devices/bus/c64/exp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/exp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,8 @@ #include "formats/cbm_crt.h" +#include + //************************************************************************** @@ -110,11 +112,16 @@ if (!loaded_through_softlist()) { + util::core_file &file = image_core_file(); size = length(); if (is_filetype("80")) { - fread(m_card->m_roml, size); + std::size_t actual; + std::tie(err, m_card->m_roml, actual) = read(file, size); + if (!err && (actual != size)) + err = std::errc::io_error; + m_card->m_roml_size = size; m_card->m_exrom = 0; @@ -125,7 +132,11 @@ } else if (is_filetype("a0")) { - fread(m_card->m_romh, 0x2000); + std::size_t actual; + std::tie(err, m_card->m_roml, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + m_card->m_romh_size = 0x2000; m_card->m_exrom = 0; @@ -133,14 +144,18 @@ } else if (is_filetype("e0")) { - fread(m_card->m_romh, 0x2000); + std::size_t actual; + std::tie(err, m_card->m_roml, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + m_card->m_romh_size = 0x2000; m_card->m_game = 0; } else if (is_filetype("crt")) { - if (cbm_crt_read_header(image_core_file(), &m_card->m_roml_size, &m_card->m_romh_size, &m_card->m_exrom, &m_card->m_game)) + if (cbm_crt_read_header(file, &m_card->m_roml_size, &m_card->m_romh_size, &m_card->m_exrom, &m_card->m_game)) { uint8_t *roml = nullptr; uint8_t *romh = nullptr; @@ -151,7 +166,7 @@ if (m_card->m_roml_size) roml = m_card->m_roml.get(); if (m_card->m_romh_size) romh = m_card->m_romh.get(); - cbm_crt_read_data(image_core_file(), roml, romh); + cbm_crt_read_data(file, roml, romh); } } else diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/fcc.cpp mame-0.264+dfsg.1/src/devices/bus/c64/fcc.cpp --- mame-0.263+dfsg.1/src/devices/bus/c64/fcc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/fcc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -123,6 +123,25 @@ } +void c64_final_chesscard_device::nvram_default() +{ +} + + +bool c64_final_chesscard_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram.get(), 0x2000); + return !err && (actual == 0x2000); +} + + +bool c64_final_chesscard_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram.get(), 0x2000); + return !err; +} + + //------------------------------------------------- // c64_cd_r - cartridge data read //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/fcc.h mame-0.264+dfsg.1/src/devices/bus/c64/fcc.h --- mame-0.263+dfsg.1/src/devices/bus/c64/fcc.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/fcc.h 2024-03-25 14:00:46.000000000 +0000 @@ -39,9 +39,9 @@ virtual void device_reset() override; // device_nvram_interface implementation - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram.get(), 0x2000, actual) && actual == 0x2000; } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram.get(), 0x2000, actual) && actual == 0x2000; } + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; // device_c64_expansion_card_interface implementation virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/neoram.cpp mame-0.264+dfsg.1/src/devices/bus/c64/neoram.cpp --- mame-0.263+dfsg.1/src/devices/bus/c64/neoram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/neoram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -76,6 +76,25 @@ } +void c64_neoram_cartridge_device::nvram_default() +{ +} + + +bool c64_neoram_cartridge_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram.get(), 0x200000); + return !err && (actual == 0x200000); +} + + +bool c64_neoram_cartridge_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram.get(), 0x200000); + return !err; +} + + //------------------------------------------------- // c64_cd_w - cartridge data write //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/c64/neoram.h mame-0.264+dfsg.1/src/devices/bus/c64/neoram.h --- mame-0.263+dfsg.1/src/devices/bus/c64/neoram.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/c64/neoram.h 2024-03-25 14:00:46.000000000 +0000 @@ -36,9 +36,9 @@ virtual void device_reset() override; // device_nvram_interface implementation - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram.get(), 0x200000, actual) && actual == 0x200000; } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram.get(), 0x200000, actual) && actual == 0x200000; } + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; // device_c64_expansion_card_interface implementation virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/cbm2/exp.cpp mame-0.264+dfsg.1/src/devices/bus/cbm2/exp.cpp --- mame-0.263+dfsg.1/src/devices/bus/cbm2/exp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/cbm2/exp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,8 @@ #include "emu.h" #include "exp.h" +#include + //************************************************************************** @@ -91,22 +93,29 @@ { if (!loaded_through_softlist()) { + util::core_file &file = image_core_file(); size_t const size = length(); if (is_filetype("20")) { - m_card->m_bank1 = std::make_unique(size); - fread(m_card->m_bank1, size); + size_t actual; + std::tie(err, m_card->m_bank1, actual) = util::read(file, size); + if (!err && (actual != size)) + err = std::errc::io_error; } else if (is_filetype("40")) { - m_card->m_bank2 = std::make_unique(size); - fread(m_card->m_bank2, size); + size_t actual; + std::tie(err, m_card->m_bank2, actual) = util::read(file, size); + if (!err && (actual != size)) + err = std::errc::io_error; } else if (is_filetype("60")) { - m_card->m_bank3 = std::make_unique(size); - fread(m_card->m_bank3, size); + size_t actual; + std::tie(err, m_card->m_bank3, actual) = util::read(file, size); + if (!err && (actual != size)) + err = std::errc::io_error; } else { diff -Nru mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_rom.cpp mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_rom.cpp --- mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_rom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_rom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,9 @@ #include "emu.h" #include "cpc_rom.h" +#include + + DEFINE_DEVICE_TYPE(CPC_ROM, cpc_rom_device, "cpc_rom", "CPC ROM Box") void cpc_exp_cards(device_slot_interface &device); @@ -103,20 +106,16 @@ -------------------------------------------------*/ std::pair cpc_rom_image_device::call_load() { - uint64_t const size = length(); + uint64_t const total = length(); + size_t const size = std::min(total, 16384); - m_base = std::make_unique(16384); - if(size <= 16384) - { - fread(m_base, size); - } - else - { - fseek(size - 16384, SEEK_SET); - fread(m_base, 16384); - } + std::error_condition err; + size_t actual; + std::tie(err, m_base, actual) = read_at(image_core_file(), total - size, size); + if (!err && (actual != size)) + err = std::errc::io_error; - return std::make_pair(std::error_condition(), std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_ssa1.cpp mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_ssa1.cpp --- mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_ssa1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_ssa1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -30,10 +30,10 @@ { uint8_t ret = 0xff; - if(get_sby() == 0) + if(!m_sp0256_device->sby_r()) ret &= ~0x80; - if(get_lrq() != 0) + if(m_sp0256_device->lrq_r()) ret &= ~0x40; return ret; @@ -50,7 +50,7 @@ // SBY is not connected - if(get_lrq() != 0) + if(m_sp0256_device->lrq_r()) ret &= ~0x80; return ret; @@ -61,26 +61,6 @@ m_sp0256_device->ald_w(data & 0x3f); } -void cpc_ssa1_device::lrq_cb(int state) -{ - set_lrq(state); -} - -void cpc_ssa1_device::sby_cb(int state) -{ - set_sby(state); -} - -void cpc_dkspeech_device::lrq_cb(int state) -{ - set_lrq(state); -} - -void cpc_dkspeech_device::sby_cb(int state) -{ - set_sby(state); -} - //------------------------------------------------- // Device ROM definition //------------------------------------------------- @@ -119,8 +99,6 @@ { SPEAKER(config, "mono").front_center(); SP0256(config, m_sp0256_device, XTAL(3'120'000)); - m_sp0256_device->data_request_callback().set(FUNC(cpc_ssa1_device::lrq_cb)); - m_sp0256_device->standby_callback().set(FUNC(cpc_ssa1_device::sby_cb)); m_sp0256_device->add_route(ALL_OUTPUTS, "mono", 1.00); // pass-through @@ -134,8 +112,6 @@ { SPEAKER(config, "mono").front_center(); SP0256(config, m_sp0256_device, DERIVED_CLOCK(1, 1)); // uses the CPC's clock from pin 50 of the expansion port - m_sp0256_device->data_request_callback().set(FUNC(cpc_dkspeech_device::lrq_cb)); - m_sp0256_device->standby_callback().set(FUNC(cpc_dkspeech_device::sby_cb)); m_sp0256_device->add_route(ALL_OUTPUTS, "mono", 1.00); // pass-through @@ -153,7 +129,6 @@ cpc_ssa1_device::cpc_ssa1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CPC_SSA1, tag, owner, clock), device_cpc_expansion_card_interface(mconfig, *this), m_slot(nullptr), m_rom(nullptr), - m_lrq(1), m_sby(0), m_sp0256_device(*this,"sp0256") { } @@ -161,7 +136,6 @@ cpc_dkspeech_device::cpc_dkspeech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CPC_DKSPEECH, tag, owner, clock), device_cpc_expansion_card_interface(mconfig, *this), m_slot(nullptr), m_rom(nullptr), - m_lrq(1), m_sby(0), m_sp0256_device(*this,"sp0256") { } diff -Nru mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_ssa1.h mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_ssa1.h --- mame-0.263+dfsg.1/src/devices/bus/cpc/cpc_ssa1.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/cpc/cpc_ssa1.h 2024-03-25 14:00:46.000000000 +0000 @@ -56,11 +56,6 @@ // construction/destruction cpc_ssa1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void set_lrq(uint8_t state) { m_lrq = state; } - uint8_t get_lrq() { return m_lrq; } - void set_sby(uint8_t state) { m_sby = state; } - uint8_t get_sby() { return m_sby; } - uint8_t ssa1_r(); void ssa1_w(uint8_t data); @@ -74,15 +69,8 @@ virtual void device_add_mconfig(machine_config &config) override; private: - void lrq_cb(int state); - void sby_cb(int state); - cpc_expansion_slot_device *m_slot; - uint8_t *m_rom; - uint8_t m_lrq; - uint8_t m_sby; - required_device m_sp0256_device; }; @@ -93,11 +81,6 @@ // construction/destruction cpc_dkspeech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void set_lrq(uint8_t state) { m_lrq = state; } - uint8_t get_lrq() { return m_lrq; } - void set_sby(uint8_t state) { m_sby = state; } - uint8_t get_sby() { return m_sby; } - uint8_t dkspeech_r(); void dkspeech_w(uint8_t data); @@ -111,15 +94,8 @@ virtual void device_add_mconfig(machine_config &config) override; private: - void lrq_cb(int state); - void sby_cb(int state); - cpc_expansion_slot_device *m_slot; - uint8_t *m_rom; - uint8_t m_lrq; - uint8_t m_sby; - required_device m_sp0256_device; }; diff -Nru mame-0.263+dfsg.1/src/devices/bus/ekara/slot.cpp mame-0.264+dfsg.1/src/devices/bus/ekara/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/ekara/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ekara/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -185,8 +185,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = ekara_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/epson_sio/pf10.cpp mame-0.264+dfsg.1/src/devices/bus/epson_sio/pf10.cpp --- mame-0.263+dfsg.1/src/devices/bus/epson_sio/pf10.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/epson_sio/pf10.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -126,7 +126,7 @@ TIMER_CALLBACK_MEMBER( epson_pf10_device::serial_clk_tick ) { - m_cpu->m6801_clock_serial(); + m_cpu->clock_serial(); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/gamate/slot.cpp mame-0.264+dfsg.1/src/devices/bus/gamate/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/gamate/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gamate/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -201,8 +201,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = gamate_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/gameboy/gbslot.cpp mame-0.264+dfsg.1/src/devices/bus/gameboy/gbslot.cpp --- mame-0.263+dfsg.1/src/devices/bus/gameboy/gbslot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gameboy/gbslot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -551,10 +552,8 @@ // look for a valid header in the second page u8 header2[0x50]; - size_t actual; - if (file.read_at(offset + 0x8000 + 0x0100, header2, sizeof(header2), actual) || (sizeof(header2) != actual)) - return false; - if (!cartheader::verify_header_checksum(header2)) + auto const [err, actual] = read_at(file, offset + 0x8000 + 0x0100, header2, sizeof(header2)); + if (err || (sizeof(header2) != actual) || !cartheader::verify_header_checksum(header2)) return false; // make sure it fits with the cartridge RAM size declaration @@ -614,10 +613,8 @@ if (sizeof(trailer) >= length) return false; - size_t actual; - if (file.read_at(length - sizeof(trailer), &trailer, sizeof(trailer), actual)) - return false; - if (sizeof(trailer) != actual) + auto const [err, actual] = read_at(file, length - sizeof(trailer), &trailer, sizeof(trailer)); + if (err || (sizeof(trailer) != actual)) return false; trailer.swap(); @@ -635,9 +632,11 @@ return std::nullopt; // need to read the footer leader - gbxfile::leader_1_0 leader; + std::error_condition err; size_t actual; - if (file.read_at(length - trailer.size, &leader, sizeof(leader), actual) || (sizeof(leader) != actual)) + gbxfile::leader_1_0 leader; + std::tie(err, actual) = read_at(file, length - trailer.size, &leader, sizeof(leader)); + if (err || (sizeof(leader) != actual)) { osd_printf_warning( "[%s] Error reading GBX trailer leader - assuming file is not GBX format\n", @@ -709,7 +708,8 @@ // need to probe for EEPROM size // TODO: does the GBX footer declare the EEPROM size as cartridge RAM size? u8 header[0x50]; - if (!file.read_at(offset + 0x100, header, sizeof(header), actual) && (sizeof(header) == actual)) + std::tie(err, actual) = read_at(file, offset + 0x100, header, sizeof(header)); + if (!err && (sizeof(header) == actual)) { result = guess_mbc7_type(tag, file, length, offset, header); } @@ -816,8 +816,8 @@ // now check for a valid cartridge header u32 const lastpage(get_mmm01_initial_low_page(length)); u8 backheader[0x50]; - size_t actual; - if (file.read_at(lastpage + 0x100, backheader, sizeof(backheader), actual) || (sizeof(backheader) != actual)) + auto const [err, actual] = read_at(file, lastpage + 0x100, backheader, sizeof(backheader)); + if (err || (sizeof(backheader) != actual)) { osd_printf_warning( "[%s] Error reading last page of program ROM - assuming cartridge does not use MMM01 controller\n", @@ -1005,8 +1005,8 @@ return guess; u8 header[0x50]; - size_t actual; - if (hook.image_file()->read_at(offset + 0x0100, header, sizeof(header), actual) || (sizeof(header) != actual)) + auto const [err, actual] = read_at(*hook.image_file(), offset + 0x0100, header, sizeof(header)); + if (err || (sizeof(header) != actual)) { // reading header failed - guess based on size if (0x8000 >= len) @@ -1128,7 +1128,6 @@ bool proberam = true; auto len = length(); u64 offset; - size_t actual; // probe for GBX format memory_region *gbxregion = nullptr; @@ -1139,7 +1138,7 @@ std::unique_ptr const footer(new (std::nothrow) u8 [gbxtrailer.size]); if (!footer) return std::make_pair(std::errc::not_enough_memory, "Error allocating memory to read GBX file footer"); - std::error_condition const err = file.read_at(len - gbxtrailer.size, footer.get(), gbxtrailer.size, actual); + auto const [err, actual] = read_at(file, len - gbxtrailer.size, footer.get(), gbxtrailer.size); if (err || (gbxtrailer.size != actual)) return std::make_pair(err ? err : std::errc::io_error, "Error reading GBX file footer"); if (1 != gbxtrailer.ver_maj) @@ -1241,7 +1240,7 @@ { LOG("Allocating %u byte cartridge ROM region\n", len); memory_region *const romregion = machine().memory().region_alloc(subtag("rom"), len, 1, ENDIANNESS_LITTLE); - std::error_condition const err = file.read_at(offset, romregion->base(), len, actual); + auto const [err, actual] = read_at(file, offset, romregion->base(), len); if (err || (len != actual)) return std::make_pair(err ? err : std::errc::io_error, "Error reading ROM data from cartridge file"); diff -Nru mame-0.263+dfsg.1/src/devices/bus/gameboy/huc3.cpp mame-0.264+dfsg.1/src/devices/bus/gameboy/huc3.cpp --- mame-0.263+dfsg.1/src/devices/bus/gameboy/huc3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gameboy/huc3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -115,6 +115,7 @@ #include #include #include +#include #include //#define VERBOSE 1 @@ -483,16 +484,22 @@ { if (m_has_battery) { - // read previous machine time (seconds since epoch), seconds counter, and register contents - u64 machinesecs; + std::error_condition err; std::size_t actual; - if (file.read(&machinesecs, sizeof(machinesecs), actual) || (sizeof(machinesecs) != actual)) + + // read previous machine time (seconds since epoch) + u64 machinesecs; + std::tie(err, actual) = read(file, &machinesecs, sizeof(machinesecs)); + if (err || (sizeof(machinesecs) != actual)) return false; m_machine_seconds = big_endianize_int64(machinesecs); - if (file.read(&m_seconds, sizeof(m_seconds), actual) || (sizeof(m_seconds) != actual)) + // read seconds counter and register contents + std::tie(err, actual) = read(file, &m_seconds, sizeof(m_seconds)); + if (err || (sizeof(m_seconds) != actual)) return false; - if (file.read(&m_registers[0], sizeof(m_registers), actual) || (sizeof(m_registers) != actual)) + std::tie(err, actual) = read(file, &m_registers[0], sizeof(m_registers)); + if (err || (sizeof(m_registers) != actual)) return false; } else @@ -509,12 +516,16 @@ system_time current; machine().current_datetime(current); u64 const machinesecs(big_endianize_int64(s64(std::make_signed_t(current.time)))); + std::error_condition err; std::size_t written; - if (file.write(&machinesecs, sizeof(machinesecs), written) || (sizeof(machinesecs) != written)) + std::tie(err, written) = write(file, &machinesecs, sizeof(machinesecs)); + if (err) return false; - if (file.write(&m_seconds, sizeof(m_seconds), written) || (sizeof(m_seconds) != written)) + std::tie(err, written) = write(file, &m_seconds, sizeof(m_seconds)); + if (err) return false; - if (file.write(&m_registers[0], sizeof(m_registers), written) || (sizeof(m_registers) != written)) + std::tie(err, written) = write(file, &m_registers[0], sizeof(m_registers)); + if (err) return false; return true; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/gameboy/mbc3.cpp mame-0.264+dfsg.1/src/devices/bus/gameboy/mbc3.cpp --- mame-0.263+dfsg.1/src/devices/bus/gameboy/mbc3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gameboy/mbc3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,6 +82,7 @@ #include "corestr.h" #include +#include //#define VERBOSE 1 //#define LOG_OUTPUT_FUNC osd_printf_info @@ -512,13 +513,17 @@ if (m_has_battery) { // read previous machine time (seconds since epoch) and RTC registers - u64 seconds; + std::error_condition err; std::size_t actual; - if (file.read(&seconds, sizeof(seconds), actual) || (sizeof(seconds) != actual)) + + u64 seconds; + std::tie(err, actual) = read(file, &seconds, sizeof(seconds)); + if (err || (sizeof(seconds) != actual)) return false; m_machine_seconds = big_endianize_int64(seconds); - if (file.read(&m_rtc_regs[0][0], sizeof(m_rtc_regs[0]), actual) || (sizeof(m_rtc_regs[0]) != actual)) + std::tie(err, actual) = read(file, &m_rtc_regs[0][0], sizeof(m_rtc_regs[0])); + if (err || (sizeof(m_rtc_regs[0]) != actual)) return false; } else @@ -535,10 +540,13 @@ system_time current; machine().current_datetime(current); u64 const seconds(big_endianize_int64(s64(std::make_signed_t(current.time)))); + std::error_condition err; std::size_t written; - if (file.write(&seconds, sizeof(seconds), written) || (sizeof(seconds) != written)) + std::tie(err, written) = write(file, &seconds, sizeof(seconds)); + if (err) return false; - if (file.write(&m_rtc_regs[0][0], sizeof(m_rtc_regs[0]), written) || (sizeof(m_rtc_regs[0]) != written)) + std::tie(err, written) = write(file, &m_rtc_regs[0][0], sizeof(m_rtc_regs[0])); + if (err) return false; return true; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/gameboy/mdslot.cpp mame-0.264+dfsg.1/src/devices/bus/gameboy/mdslot.cpp --- mame-0.263+dfsg.1/src/devices/bus/gameboy/mdslot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gameboy/mdslot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,13 +119,12 @@ std::pair megaduck_cart_slot_device::load_image_file(util::random_read &file) { auto const len = length(); - size_t actual; if (len) { LOG("Allocating %u byte cartridge ROM region\n", len); memory_region *const romregion = machine().memory().region_alloc(subtag("rom"), len, 1, ENDIANNESS_LITTLE); - std::error_condition const err = file.read_at(0, romregion->base(), len, actual); + auto const [err, actual] = read_at(file, 0, romregion->base(), len); if (err || (len != actual)) std::make_pair(err ? err : std::errc::io_error, "Error reading cartridge file"); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/gba/gba_slot.cpp mame-0.264+dfsg.1/src/devices/bus/gba/gba_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/gba/gba_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/gba/gba_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -881,8 +881,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = gba_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/intv/slot.cpp mame-0.264+dfsg.1/src/devices/bus/intv/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/intv/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/intv/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -444,8 +444,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int type = INTV_STD; if (rom[0] == 0xa8 && (rom[1] == (rom[2] ^ 0xff))) diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/3c503.cpp mame-0.264+dfsg.1/src/devices/bus/isa/3c503.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/3c503.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/3c503.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,7 +53,7 @@ } void el2_3c503_device::device_reset() { - memcpy(m_prom, m_dp8390->get_mac(), 6); + memcpy(m_prom, &m_dp8390->get_mac()[0], 6); memset(&m_regs, 0, sizeof(m_regs)); m_regs.bcfr = 0x80; // port 0x300 m_regs.pcfr = 0x20; // address 0xcc000 diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/isa_cards.cpp mame-0.264+dfsg.1/src/devices/bus/isa/isa_cards.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/isa_cards.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/isa_cards.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -211,9 +211,6 @@ device.option_add("gus",ISA16_GUS); device.option_add("sblaster_16", ISA16_SOUND_BLASTER_16); device.option_add("svga_s3", ISA16_SVGA_S3); - device.option_add("s3virge", ISA16_S3VIRGE); - device.option_add("s3virgedx", ISA16_S3VIRGEDX); - device.option_add("dms3d2kp", ISA16_DMS3D2KPRO); device.option_add("svga_dm",ISA16_SVGA_CIRRUS); device.option_add("clgd542x",ISA16_SVGA_CIRRUS_GD542X); device.option_add("gfxultra", ISA16_VGA_GFXULTRA); diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/ne1000.cpp mame-0.264+dfsg.1/src/devices/bus/isa/ne1000.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/ne1000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/ne1000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,8 +16,8 @@ m_dp8390->mem_write_callback().set(FUNC(ne1000_device::ne1000_mem_write)); } -ne1000_device::ne1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NE1000, tag, owner, clock), +ne1000_device::ne1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, NE1000, tag, owner, clock), device_isa8_card_interface(mconfig, *this), m_dp8390(*this, "dp8390d"), m_irq(0) @@ -38,7 +38,7 @@ } void ne1000_device::device_reset() { - memcpy(m_prom, m_dp8390->get_mac(), 6); + memcpy(m_prom, &m_dp8390->get_mac()[0], 6); m_irq = ioport("CONFIG")->read() & 3; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/ne2000.cpp mame-0.264+dfsg.1/src/devices/bus/isa/ne2000.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/ne2000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/ne2000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,8 +16,8 @@ m_dp8390->mem_write_callback().set(FUNC(ne2000_device::ne2000_mem_write)); } -ne2000_device::ne2000_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) - : device_t(mconfig, NE2000, tag, owner, clock), +ne2000_device::ne2000_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) : + device_t(mconfig, NE2000, tag, owner, clock), device_isa16_card_interface(mconfig, *this), m_dp8390(*this, "dp8390d"), m_irq(0) @@ -38,7 +38,7 @@ } void ne2000_device::device_reset() { - memcpy(m_prom, m_dp8390->get_mac(), 6); + memcpy(m_prom, &m_dp8390->get_mac()[0], 6); m_irq = ioport("CONFIG")->read() & 3; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/sblaster.cpp mame-0.264+dfsg.1/src/devices/bus/isa/sblaster.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/sblaster.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/sblaster.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1821,3 +1821,21 @@ m_tx_waiting++; } } + +void isa16_sblaster16_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_IO) + { + ymf262_device &ymf262 = *subdevice("ymf262"); + m_isa->install_device(0x0200, 0x0207, read8smo_delegate(*subdevice("pc_joy"), FUNC(pc_joy_device::joy_port_r)), write8smo_delegate(*subdevice("pc_joy"), FUNC(pc_joy_device::joy_port_w))); + m_isa->install_device(0x0226, 0x0227, read8sm_delegate(*this, FUNC(sb_device::dsp_reset_r)), write8sm_delegate(*this, FUNC(sb_device::dsp_reset_w))); + m_isa->install_device(0x022a, 0x022b, read8sm_delegate(*this, FUNC(sb_device::dsp_data_r)), write8sm_delegate(*this, FUNC(sb_device::dsp_data_w))); + m_isa->install_device(0x022c, 0x022d, read8sm_delegate(*this, FUNC(sb_device::dsp_wbuf_status_r)), write8sm_delegate(*this, FUNC(sb_device::dsp_cmd_w))); + m_isa->install_device(0x022e, 0x022f, read8sm_delegate(*this, FUNC(sb_device::dsp_rbuf_status_r)), write8sm_delegate(*this, FUNC(sb_device::dsp_rbuf_status_w))); + m_isa->install_device(0x0224, 0x0225, read8sm_delegate(*this, FUNC(sb16_device::mixer_r)), write8sm_delegate(*this, FUNC(sb16_device::mixer_w))); + m_isa->install_device(0x0330, 0x0331, read8sm_delegate(*this, FUNC(sb16_device::mpu401_r)), write8sm_delegate(*this, FUNC(sb16_device::mpu401_w))); + m_isa->install_device(0x0388, 0x038b, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write))); + m_isa->install_device(0x0220, 0x0223, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write))); + m_isa->install_device(0x0228, 0x0229, read8sm_delegate(ymf262, FUNC(ymf262_device::read)), write8sm_delegate(ymf262, FUNC(ymf262_device::write))); + } +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/sblaster.h mame-0.264+dfsg.1/src/devices/bus/isa/sblaster.h --- mame-0.263+dfsg.1/src/devices/bus/isa/sblaster.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/sblaster.h 2024-03-25 14:00:46.000000000 +0000 @@ -244,6 +244,7 @@ // optional information overrides virtual void device_add_mconfig(machine_config &config) override; + virtual void remap(int space_id, offs_t start, offs_t end) override; }; // device type definition diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_cirrus.cpp mame-0.264+dfsg.1/src/devices/bus/isa/svga_cirrus.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_cirrus.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_cirrus.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,9 +77,9 @@ { screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update("vga", FUNC(cirrus_gd5430_device::screen_update)); + screen.set_screen_update("vga", FUNC(cirrus_gd5430_vga_device::screen_update)); - CIRRUS_GD5430(config, m_vga, 0); + CIRRUS_GD5430_VGA(config, m_vga, 0); m_vga->set_screen("screen"); m_vga->set_vram_size(0x200000); } @@ -110,7 +110,7 @@ void isa16_svga_cirrus_device::io_isa_map(address_map &map) { - map(0x00, 0x2f).m(m_vga, FUNC(cirrus_gd5430_device::io_map)); + map(0x00, 0x2f).m(m_vga, FUNC(cirrus_gd5430_vga_device::io_map)); } //------------------------------------------------- @@ -124,7 +124,7 @@ m_isa->install_rom(this, 0xc0000, 0xc7fff, "dm_clgd5430"); - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(cirrus_gd5430_device::mem_r)), write8sm_delegate(*m_vga, FUNC(cirrus_gd5430_device::mem_w))); + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(cirrus_gd5430_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(cirrus_gd5430_vga_device::mem_w))); m_isa->install_device(0x03b0, 0x03df, *this, &isa16_svga_cirrus_device::io_isa_map); } @@ -304,9 +304,9 @@ { screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update)); + screen.set_screen_update("vga", FUNC(cirrus_gd5428_vga_device::screen_update)); - CIRRUS_GD5428(config, m_vga, 0); + CIRRUS_GD5428_VGA(config, m_vga, 0); m_vga->set_screen("screen"); m_vga->set_vram_size(0x200000); } @@ -337,7 +337,7 @@ void isa16_svga_cirrus_gd542x_device::io_isa_map(address_map &map) { - map(0x00, 0x2f).m(m_vga, FUNC(cirrus_gd5428_device::io_map)); + map(0x00, 0x2f).m(m_vga, FUNC(cirrus_gd5428_vga_device::io_map)); } //------------------------------------------------- @@ -351,9 +351,19 @@ m_isa->install_rom(this, 0xc0000, 0xc7fff, "clgd542x"); - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(cirrus_gd5428_device::mem_r)), write8sm_delegate(*m_vga, FUNC(cirrus_gd5428_device::mem_w))); + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(cirrus_gd5428_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(cirrus_gd5428_vga_device::mem_w))); m_isa->install_device(0x03b0, 0x03df, *this, &isa16_svga_cirrus_gd542x_device::io_isa_map); +} +void isa16_svga_cirrus_gd542x_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_PROGRAM) + { + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(cirrus_gd5428_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(cirrus_gd5428_vga_device::mem_w))); + m_isa->install_rom(this, 0xc0000, 0xc7fff, "clgd542x"); + } + else if (space_id == AS_IO) + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_svga_cirrus_gd542x_device::io_isa_map); } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_cirrus.h mame-0.264+dfsg.1/src/devices/bus/isa/svga_cirrus.h --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_cirrus.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_cirrus.h 2024-03-25 14:00:46.000000000 +0000 @@ -34,7 +34,7 @@ void io_isa_map(address_map &map); private: - required_device m_vga; + required_device m_vga; }; class isa16_svga_cirrus_gd542x_device : @@ -47,6 +47,7 @@ uint8_t input_port_0_r(); + virtual void remap(int space_id, offs_t start, offs_t end) override; protected: // device-level overrides virtual void device_start() override; @@ -59,7 +60,7 @@ void io_isa_map(address_map &map); private: - required_device m_vga; + required_device m_vga; }; diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_paradise.cpp mame-0.264+dfsg.1/src/devices/bus/isa/svga_paradise.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_paradise.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_paradise.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,6 +106,17 @@ m_isa->install_device(0x03b0, 0x03df, *this, &isa16_pvga1a_device::io_isa_map); } +void isa16_pvga1a_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_PROGRAM) + { + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w))); + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + } + else if (space_id == AS_IO) + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_pvga1a_device::io_isa_map); +} + /****************** * * PVGA1A-JK @@ -460,6 +471,20 @@ m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map); } +void isa16_wd90c31_lr_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_PROGRAM) + { + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w))); + } + else if (space_id == AS_IO) + { + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31_lr_device::io_isa_map); + m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map); + } +} /****************** * diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_paradise.h mame-0.264+dfsg.1/src/devices/bus/isa/svga_paradise.h --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_paradise.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_paradise.h 2024-03-25 14:00:46.000000000 +0000 @@ -21,6 +21,8 @@ // construction/destruction isa16_pvga1a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual void remap(int space_id, offs_t start, offs_t end) override; + protected: // device-level overrides virtual void device_start() override; @@ -153,6 +155,8 @@ // construction/destruction isa16_wd90c31_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual void remap(int space_id, offs_t start, offs_t end) override; + protected: // device-level overrides virtual void device_start() override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_s3.cpp mame-0.264+dfsg.1/src/devices/bus/isa/svga_s3.cpp --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_s3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_s3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,8 +4,25 @@ ISA SVGA S3 wrapper + ISA16 + - P86C911 + - P86C911A + - P86C924 + - P86C801 + - 86C801-R + ISA16 / VL-Bus + - P86C928 + - P86C805 / 86C805-P / 86C805-Q + - 86C805i + VL-Bus / PCI + - Vision864 + - Vision868 + - Vision964 + - Vision968 + - Trio64 (Spea V7-MIRAGE P64, probably last card before full transition to PCI) + TODO: - - All these cards are really PCI and needs to be moved to video/virge_pci.cpp. + - all s3_764 roms are really PCI and needs to be moved to video/virge_pci.cpp. **************************************************************************************************/ @@ -58,9 +75,9 @@ { screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update(m_vga, FUNC(s3_vga_device::screen_update)); + screen.set_screen_update(m_vga, FUNC(s3trio64_vga_device::screen_update)); - S3_VGA(config, m_vga, 0); + S3_TRIO64_VGA(config, m_vga, 0); m_vga->set_screen("screen"); m_vga->set_vram_size(0x100000); } @@ -91,7 +108,7 @@ void isa16_svga_s3_device::io_isa_map(address_map &map) { - map(0x00, 0x2f).m(m_vga, FUNC(s3_vga_device::io_map)); + map(0x00, 0x2f).m(m_vga, FUNC(s3trio64_vga_device::io_map)); } //------------------------------------------------- @@ -124,7 +141,7 @@ m_isa->install16_device(0xbee8, 0xbeeb, read16smo_delegate(*m_8514, FUNC(ibm8514a_device::ibm8514_multifunc_r)), write16smo_delegate(*m_8514, FUNC(ibm8514a_device::ibm8514_multifunc_w))); m_isa->install16_device(0xe2e8, 0xe2eb, read16sm_delegate(*m_8514, FUNC(ibm8514a_device::ibm8514_pixel_xfer_r)), write16sm_delegate(*m_8514, FUNC(ibm8514a_device::ibm8514_pixel_xfer_w))); - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(s3_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(s3_vga_device::mem_w))); + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(s3trio64_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(s3trio64_vga_device::mem_w))); } //------------------------------------------------- @@ -134,321 +151,3 @@ void isa16_svga_s3_device::device_reset() { } - - -/* - * S3 Virge 2D/3D accelerator - */ - -ROM_START( s3virge ) - ROM_REGION(0x8000,"s3virge", 0) - ROM_DEFAULT_BIOS("virge") - - ROM_SYSTEM_BIOS( 0, "virge", "PCI S3 ViRGE v1.00-10" ) - ROMX_LOAD("pci_m-v_virge-4s3.bin", 0x00000, 0x8000, CRC(d0a0f1de) SHA1(b7b41081974762a199610219bdeab149b7c7143d), ROM_BIOS(0) ) - - ROM_SYSTEM_BIOS( 1, "virgeo", "PCI S3 ViRGE v1.00-05" ) - ROMX_LOAD("s3virge.bin", 0x00000, 0x8000, CRC(a7983a85) SHA1(e885371816d3237f7badd57ccd602cd863c9c9f8), ROM_BIOS(1) ) - ROM_IGNORE( 0x8000 ) -ROM_END - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -DEFINE_DEVICE_TYPE(ISA16_S3VIRGE, isa16_s3virge_device, "s3virge", "S3 ViRGE Graphics Card") - - -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -void isa16_s3virge_device::device_add_mconfig(machine_config &config) -{ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update(m_vga, FUNC(s3virge_vga_device::screen_update)); - - S3VIRGE(config, m_vga, 0); - m_vga->set_screen("screen"); - m_vga->set_vram_size(0x400000); - m_vga->linear_config_changed().set(FUNC(isa16_s3virge_device::linear_config_changed_w)); -} - -//------------------------------------------------- -// linear_config_changed_w - callback to indicate -// enabling, disabling, or changig of the linear -// framebuffer configuration. -//------------------------------------------------- - -void isa16_s3virge_device::linear_config_changed_w(int state) -{ -} - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const tiny_rom_entry *isa16_s3virge_device::device_rom_region() const -{ - return ROM_NAME( s3virge ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// isa16_vga_device - constructor -//------------------------------------------------- - -isa16_s3virge_device::isa16_s3virge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ISA16_S3VIRGE, tag, owner, clock), - device_isa16_card_interface(mconfig, *this), - m_vga(*this, "vga") -{ -} - -void isa16_s3virge_device::io_isa_map(address_map &map) -{ - map(0x00, 0x2f).m(m_vga, FUNC(s3virge_vga_device::io_map)); -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- -uint8_t isa16_s3virge_device::input_port_0_r() { return 0xff; } //return machine().root_device().ioport("IN0")->read(); } - -void isa16_s3virge_device::device_start() -{ - set_isa_device(); - - m_isa->install_rom(this, 0xc0000, 0xc7fff, "s3virge"); - - m_isa->install_device(0x03b0, 0x03df, *this, &isa16_s3virge_device::io_isa_map); - - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(s3virge_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(s3virge_vga_device::mem_w))); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void isa16_s3virge_device::device_reset() -{ -} - -/* - * S3 ViRGE/DX - */ - -ROM_START( s3virgedx ) - ROM_REGION(0x8000,"s3virgedx", 0) - ROM_LOAD("s3virgedx.bin", 0x00000, 0x8000, CRC(0da83bd3) SHA1(228a2d644e1732cb5a2eb1291608c7050cf39229) ) -ROM_END - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -DEFINE_DEVICE_TYPE(ISA16_S3VIRGEDX, isa16_s3virgedx_device, "s3virgedx", "S3 ViRGE/DX Graphics Card") - - -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -void isa16_s3virgedx_device::device_add_mconfig(machine_config &config) -{ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update(m_vga, FUNC(s3virgedx_vga_device::screen_update)); - - S3VIRGEDX(config, m_vga, 0); - m_vga->set_screen("screen"); - m_vga->set_vram_size(0x400000); - m_vga->linear_config_changed().set(FUNC(isa16_s3virgedx_device::linear_config_changed_w)); -} - -//------------------------------------------------- -// linear_config_changed_w - callback to indicate -// enabling, disabling, or changig of the linear -// framebuffer configuration. -//------------------------------------------------- - -void isa16_s3virgedx_device::linear_config_changed_w(int state) -{ - const bool old = m_lfb_enable; - m_lfb_enable = state; - if (state) - { - if (old) - { - m_isa->unmap_readwrite(m_lfb_start, m_lfb_end); - } - m_lfb_start = m_vga->get_linear_address(); - m_lfb_end = m_lfb_start + m_vga->get_linear_address_size_full() - 1; - m_isa->install_memory(m_lfb_start, m_lfb_end, read8sm_delegate(*m_vga, FUNC(s3virge_vga_device::fb_r)), write8sm_delegate(*m_vga, FUNC(s3virge_vga_device::fb_w))); - } - else - { - m_isa->unmap_readwrite(m_lfb_start, m_lfb_end); - } -} - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const tiny_rom_entry *isa16_s3virgedx_device::device_rom_region() const -{ - return ROM_NAME( s3virgedx ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// isa16_vga_device - constructor -//------------------------------------------------- - -isa16_s3virgedx_device::isa16_s3virgedx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ISA16_S3VIRGEDX, tag, owner, clock), - device_isa16_card_interface(mconfig, *this), - m_vga(*this, "vga") -{ -} - -void isa16_s3virgedx_device::io_isa_map(address_map &map) -{ - map(0x00, 0x2f).m(m_vga, FUNC(s3virgedx_vga_device::io_map)); -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- -uint8_t isa16_s3virgedx_device::input_port_0_r() { return 0xff; } //return machine().root_device().ioport("IN0")->read(); } - -void isa16_s3virgedx_device::device_start() -{ - set_isa_device(); - - m_isa->install_rom(this, 0xc0000, 0xc7fff, "s3virgedx"); - - m_isa->install_device(0x03b0, 0x03df, *this, &isa16_s3virgedx_device::io_isa_map); - - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(s3virgedx_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(s3virgedx_vga_device::mem_w))); - - save_item(NAME(m_lfb_enable)); - save_item(NAME(m_lfb_start)); - save_item(NAME(m_lfb_end)); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void isa16_s3virgedx_device::device_reset() -{ - m_lfb_enable = m_vga->is_linear_address_active(); - m_lfb_start = m_vga->get_linear_address(); - m_lfb_end = m_lfb_start + m_vga->get_linear_address_size_full() - 1; -} - - -/* - * Diamond Stealth 3D 2000 Pro - */ - -ROM_START( stealth3d2kpro ) - ROM_REGION(0x8000,"stealth3d", 0) - ROM_LOAD("virgedxdiamond.bin", 0x00000, 0x8000, CRC(58b0dcda) SHA1(b13ae6b04db6fc05a76d924ddf2efe150b823029) ) -ROM_END - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -DEFINE_DEVICE_TYPE(ISA16_DMS3D2KPRO, isa16_stealth3d2kpro_device, "dms3d2kp", "Diamond Stealth 3D 2000 Pro") - - -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -void isa16_stealth3d2kpro_device::device_add_mconfig(machine_config &config) -{ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480); - screen.set_screen_update(m_vga, FUNC(s3virgedx_rev1_vga_device::screen_update)); - - S3VIRGEDX1(config, m_vga, 0); - m_vga->set_screen("screen"); - m_vga->set_vram_size(0x400000); - m_vga->linear_config_changed().set(FUNC(isa16_stealth3d2kpro_device::linear_config_changed_w)); -} - -//------------------------------------------------- -// linear_config_changed_w - callback to indicate -// enabling, disabling, or changig of the linear -// framebuffer configuration. -//------------------------------------------------- - -void isa16_stealth3d2kpro_device::linear_config_changed_w(int state) -{ -} - -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const tiny_rom_entry *isa16_stealth3d2kpro_device::device_rom_region() const -{ - return ROM_NAME( stealth3d2kpro ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// isa16_vga_device - constructor -//------------------------------------------------- - -isa16_stealth3d2kpro_device::isa16_stealth3d2kpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ISA16_DMS3D2KPRO, tag, owner, clock), - device_isa16_card_interface(mconfig, *this), - m_vga(*this, "vga") -{ -} - -void isa16_stealth3d2kpro_device::io_isa_map(address_map &map) -{ - map(0x00, 0x2f).m(m_vga, FUNC(s3virgedx_vga_device::io_map)); -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- -uint8_t isa16_stealth3d2kpro_device::input_port_0_r() { return 0xff; } //return machine().root_device().ioport("IN0")->read(); } - -void isa16_stealth3d2kpro_device::device_start() -{ - set_isa_device(); - - m_isa->install_rom(this, 0xc0000, 0xc7fff, "stealth3d"); - - m_isa->install_device(0x03b0, 0x03df, *this, &isa16_stealth3d2kpro_device::io_isa_map); - - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(s3virgedx_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(s3virgedx_vga_device::mem_w))); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void isa16_stealth3d2kpro_device::device_reset() -{ -} diff -Nru mame-0.263+dfsg.1/src/devices/bus/isa/svga_s3.h mame-0.264+dfsg.1/src/devices/bus/isa/svga_s3.h --- mame-0.263+dfsg.1/src/devices/bus/isa/svga_s3.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/isa/svga_s3.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,7 +7,6 @@ #include "isa.h" #include "video/pc_vga_s3.h" -#include "video/s3virge.h" //************************************************************************** @@ -38,99 +37,11 @@ void io_isa_map(address_map &map); private: - required_device m_vga; + required_device m_vga; required_device m_8514; }; -class isa16_s3virge_device : - public device_t, - public device_isa16_card_interface -{ -public: - // construction/destruction - isa16_s3virge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - uint8_t input_port_0_r(); - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override; - virtual const tiny_rom_entry *device_rom_region() const override; - - void linear_config_changed_w(int state); - - void io_isa_map(address_map &map); - -private: - required_device m_vga; -}; - -class isa16_s3virgedx_device : - public device_t, - public device_isa16_card_interface -{ -public: - // construction/destruction - isa16_s3virgedx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - uint8_t input_port_0_r(); - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override; - virtual const tiny_rom_entry *device_rom_region() const override; - - void linear_config_changed_w(int state); - - void io_isa_map(address_map &map); - -private: - required_device m_vga; - bool m_lfb_enable; - uint32_t m_lfb_start; - uint32_t m_lfb_end; -}; - -class isa16_stealth3d2kpro_device : - public device_t, - public device_isa16_card_interface -{ -public: - // construction/destruction - isa16_stealth3d2kpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - uint8_t input_port_0_r(); - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override; - virtual const tiny_rom_entry *device_rom_region() const override; - - void linear_config_changed_w(int state); - - void io_isa_map(address_map &map); - -private: - required_device m_vga; -}; - - // device type definition DECLARE_DEVICE_TYPE(ISA16_SVGA_S3, isa16_svga_s3_device) -DECLARE_DEVICE_TYPE(ISA16_S3VIRGE, isa16_s3virge_device) -DECLARE_DEVICE_TYPE(ISA16_S3VIRGEDX, isa16_s3virgedx_device) -DECLARE_DEVICE_TYPE(ISA16_DMS3D2KPRO, isa16_stealth3d2kpro_device) #endif // MAME_BUS_ISA_SVGA_S3_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/jakks_gamekey/slot.cpp mame-0.264+dfsg.1/src/devices/bus/jakks_gamekey/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/jakks_gamekey/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/jakks_gamekey/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -183,8 +183,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = jakks_gamekey_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/mc10/mc10_cart.cpp mame-0.264+dfsg.1/src/devices/bus/mc10/mc10_cart.cpp --- mame-0.263+dfsg.1/src/devices/bus/mc10/mc10_cart.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/mc10/mc10_cart.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -27,6 +27,10 @@ 16 A3 33 GND 17 A5 34 GND + Alice 32 and Alice 90 have 2 more pins: + 35 IRQ (optional) + 36 SOUND + SEL is an input to the MC-10 that allows the cartridge to remove the internal chips from the bus. @@ -36,6 +40,7 @@ #include "mc10_cart.h" #include "mcx128.h" +#include "multiports_ext.h" #include "pak.h" #include "ram.h" @@ -198,6 +203,7 @@ device.option_add("mcx128", MC10_PAK_MCX128); device.option_add("pak", MC10_PAK); device.option_add("ram", MC10_PAK_RAM); + device.option_add("multi", ALICE_MULTIPORTS_EXT); } //------------------------------------------------- @@ -210,6 +216,7 @@ device.option_add("alice128", ALICE_PAK_MCX128); device.option_add("pak", MC10_PAK); device.option_add("ram", MC10_PAK_RAM); + device.option_add("multi", ALICE_MULTIPORTS_EXT); } //------------------------------------------------- @@ -221,4 +228,5 @@ // basic devices device.option_add("pak", MC10_PAK); device.option_add("ram", MC10_PAK_RAM); + device.option_add("multi", ALICE_MULTIPORTS_EXT); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/mc10/multiports_ext.cpp mame-0.264+dfsg.1/src/devices/bus/mc10/multiports_ext.cpp --- mame-0.263+dfsg.1/src/devices/bus/mc10/multiports_ext.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/mc10/multiports_ext.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,122 @@ +/*************************************************************************** + + multiports_ext.cpp + + Emulation of the Alice Multiports Extension + + Features: + The extension provides an extension doubler and two joystick ports. + + The extension also provides (for the whole Alice family and MC-10): + - 16K of RAM expansion ($5000-$8FFF) + - 64K of ROM expansion in two possible configurations: + - 8K of ROM between $1000 and $2FFF, as 8 banks (Cartridge mode). + - 16K of ROM between $C000 and $FFFF, as 4 banks (ROM mode). + + Only the RAM/ROM expansion is emulated here. + + Banks are selected by writing to: + - $1000 to $1FFF in Cartridge mode (number of bank between 0 and 7) + - $C000 to $CFFF in ROM mode (number of bank between 0 and 3) + +***************************************************************************/ + +#include "emu.h" +#include "multiports_ext.h" + + +namespace { + +//************************************************************************** +// TYPE DECLARATIONS +//************************************************************************** + +class mc10_multiports_ext_device : public device_t, public device_mc10cart_interface +{ +public: + mc10_multiports_ext_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual int max_rom_length() const override; + virtual std::pair load() override; + +protected: + mc10_multiports_ext_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + // device_t implementation + virtual void device_start() override; + virtual void device_reset() override; + + void control_register_write(offs_t offset, u8 data); + + void multiports_mem(address_map &map); + void update_bank(); + +private: + memory_bank_creator m_bank; + uint8_t rom_bank_index; + memory_share_creator m_extention_ram; +}; + +//------------------------------------------------- +// IMPLEMENTATION +//------------------------------------------------- + +mc10_multiports_ext_device::mc10_multiports_ext_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : mc10_multiports_ext_device(mconfig, ALICE_MULTIPORTS_EXT, tag, owner, clock) +{ +} + +mc10_multiports_ext_device::mc10_multiports_ext_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , device_mc10cart_interface(mconfig, *this) + , m_bank(*this, "cart_bank") + , rom_bank_index(0) + , m_extention_ram(*this, "ext_ram", 1024 * 16, ENDIANNESS_BIG) +{ +} + +int mc10_multiports_ext_device::max_rom_length() const +{ + return 1024 * 64; +} + +void mc10_multiports_ext_device::multiports_mem(address_map &map) +{ + map(0x0000, 0x1fff).bankr("cart_bank").w(FUNC(mc10_multiports_ext_device::control_register_write)); +} + +//------------------------------------------------- + +void mc10_multiports_ext_device::device_start() +{ + owning_slot().memspace().install_device(0x1000, 0x2fff, *this, &mc10_multiports_ext_device::multiports_mem); + owning_slot().memspace().install_ram(0x5000, 0x8fff, &m_extention_ram[0]); +} + +//------------------------------------------------- + +void mc10_multiports_ext_device::device_reset() +{ + m_bank->set_entry(0); +} + +void mc10_multiports_ext_device::control_register_write(offs_t offset, u8 data) +{ + if (offset < 0x1000) + m_bank->set_entry(data & 0x07); +} + +std::pair mc10_multiports_ext_device::load() +{ + memory_region *const romregion(memregion("^rom")); + if (romregion->bytes() < (0x2000 * 8)) + return std::make_pair(image_error::INVALIDLENGTH, "Cartridge ROM must be at least 64KB"); + + m_bank->configure_entries(0, 8, romregion->base(), 0x2000); + + return std::make_pair(std::error_condition(), std::string()); +} + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(ALICE_MULTIPORTS_EXT, device_mc10cart_interface, mc10_multiports_ext_device, "mc10_multiports_ext", "Fred_72 and 6502man's Multiports Extension") diff -Nru mame-0.263+dfsg.1/src/devices/bus/mc10/multiports_ext.h mame-0.264+dfsg.1/src/devices/bus/mc10/multiports_ext.h --- mame-0.263+dfsg.1/src/devices/bus/mc10/multiports_ext.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/mc10/multiports_ext.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,12 @@ +#ifndef MAME_BUS_MC10_MULTIPORTS_EXT_H +#define MAME_BUS_MC10_MULTIPORTS_EXT_H + +#pragma once + +#include "mc10_cart.h" + +// device type definition +DECLARE_DEVICE_TYPE(ALICE_MULTIPORTS_EXT, device_mc10cart_interface) + +#endif // MAME_BUS_MC10_MC10_MULTIPORTS_EXT_H + diff -Nru mame-0.263+dfsg.1/src/devices/bus/megadrive/md_slot.cpp mame-0.264+dfsg.1/src/devices/bus/megadrive/md_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/megadrive/md_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/megadrive/md_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -909,8 +909,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + util::read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short uint32_t const offset = genesis_is_SMD(&rom[0x200], len - 0x200) ? 0x200 : 0; @@ -920,7 +919,9 @@ return std::string(slot_string); } else + { return software_get_default_slot("rom"); + } } diff -Nru mame-0.263+dfsg.1/src/devices/bus/msx/cart/cartridge.cpp mame-0.264+dfsg.1/src/devices/bus/msx/cart/cartridge.cpp --- mame-0.263+dfsg.1/src/devices/bus/msx/cart/cartridge.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/msx/cart/cartridge.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -166,9 +166,8 @@ return std::string(slotoptions::NOMAPPER); } length = std::min(length, 4 * 1024 * 1024); - std::vector rom(length); - size_t actual; - if (hook.image_file()->read(&rom[0], length, actual)) + auto const [err, rom, actual] = read(*hook.image_file(), length); + if (err || (actual != length)) { osd_printf_warning("[%s] Error reading from file\n", tag()); return std::string(slotoptions::NOMAPPER); diff -Nru mame-0.263+dfsg.1/src/devices/bus/msx/slot/disk.cpp mame-0.264+dfsg.1/src/devices/bus/msx/slot/disk.cpp --- mame-0.263+dfsg.1/src/devices/bus/msx/slot/disk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/msx/slot/disk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -586,6 +586,7 @@ msx_slot_disk4_tc8566_device::msx_slot_disk4_tc8566_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : msx_slot_tc8566_disk_device(mconfig, MSX_SLOT_DISK4_TC8566, tag, owner, clock, DRIVES_1) + , m_rombank(*this, "rombank") { } @@ -593,7 +594,11 @@ { msx_slot_tc8566_disk_device::device_start(); - page(1)->install_rom(0x4000, 0x7fff, rom_base()); + m_rombank->configure_entries(0, 4, rom_base(), 0x4000); + m_rombank->set_entry(0); + + page(1)->install_read_bank(0x4000, 0x7fff, m_rombank); + page(1)->install_write_handler(0x7ff0, 0x7ff0, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::bank_w))); // 0x7ff1 media change register page(1)->install_write_handler(0x7ff2, 0x7ff2, emu::rw_delegate(*this, FUNC(msx_slot_disk4_tc8566_device::dor_w))); page(1)->install_write_handler(0x7ff3, 0x7ff3, emu::rw_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w))); @@ -607,6 +612,11 @@ add_mconfig(config); } +void msx_slot_disk4_tc8566_device::bank_w(u8 data) +{ + m_rombank->set_entry(data & 0x03); +} + diff -Nru mame-0.263+dfsg.1/src/devices/bus/msx/slot/disk.h mame-0.264+dfsg.1/src/devices/bus/msx/slot/disk.h --- mame-0.263+dfsg.1/src/devices/bus/msx/slot/disk.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/msx/slot/disk.h 2024-03-25 14:00:46.000000000 +0000 @@ -313,6 +313,11 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; + +private: + void bank_w(u8 control); + + memory_bank_creator m_rombank; }; diff -Nru mame-0.263+dfsg.1/src/devices/bus/nabupc/adapter.cpp mame-0.264+dfsg.1/src/devices/bus/nabupc/adapter.cpp --- mame-0.263+dfsg.1/src/devices/bus/nabupc/adapter.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/nabupc/adapter.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,6 +12,8 @@ #include "emuopts.h" #include "unzip.h" +#include + #define VERBOSE 0 #include "logmacro.h" @@ -93,7 +95,7 @@ current.tier[3] = 0xff; current.mbytes[0] = 0x7f; current.mbytes[1] = 0x80; - err = fd->read_at(offset, current.data, 991, actual); + std::tie(err, actual) = read_at(*fd, offset, current.data, 991); do { crc = 0xffff; if (err) { @@ -119,7 +121,7 @@ pak_list.push_back(current); offset = (++npak * 991); memset(current.data, 0, 991); - err = fd->read_at(offset, current.data, 991, actual); + std::tie(err, actual) = read_at(*fd, offset, current.data, 991); } } while(actual > 0); diff -Nru mame-0.263+dfsg.1/src/devices/bus/nes/aladdin.cpp mame-0.264+dfsg.1/src/devices/bus/nes/aladdin.cpp --- mame-0.263+dfsg.1/src/devices/bus/nes/aladdin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/nes/aladdin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,8 +145,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + util::read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short uint8_t const mapper = ((rom[6] & 0xf0) >> 4) | (rom[7] & 0xf0); diff -Nru mame-0.263+dfsg.1/src/devices/bus/nes/nes_slot.cpp mame-0.264+dfsg.1/src/devices/bus/nes/nes_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/nes/nes_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/nes/nes_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -799,8 +799,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short const char *slot_string = "nrom"; if ((rom[0] == 'N') && (rom[1] == 'E') && (rom[2] == 'S')) diff -Nru mame-0.263+dfsg.1/src/devices/bus/nubus/nubus_asntmc3b.cpp mame-0.264+dfsg.1/src/devices/bus/nubus/nubus_asntmc3b.cpp --- mame-0.263+dfsg.1/src/devices/bus/nubus/nubus_asntmc3b.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/nubus/nubus_asntmc3b.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -215,7 +215,7 @@ void nubus_mac8390_device::device_reset() { m_dp83902->dp8390_reset(0); - memcpy(m_prom, m_dp83902->get_mac(), 6); + memcpy(m_prom, &m_dp83902->get_mac()[0], 6); } void nubus_mac8390_device::asntm3b_ram_w(offs_t offset, u8 data) diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/chess.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/chess.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/chess.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/chess.h 2024-03-25 14:00:46.000000000 +0000 @@ -34,7 +34,7 @@ virtual void cart_init() override; virtual u8 read_rom04(offs_t offset) override { return m_rom[offset]; } - virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset]; } + virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset + 0x400]; } virtual void write_p1(u8 data) override; virtual void io_write(offs_t offset, u8 data) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/homecomp.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/homecomp.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/homecomp.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/homecomp.h 2024-03-25 14:00:46.000000000 +0000 @@ -37,7 +37,7 @@ virtual void cart_init() override; virtual u8 read_rom04(offs_t offset) override { return m_rom[offset]; } - virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset]; } + virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset + 0x400]; } virtual void write_p1(u8 data) override; virtual void io_write(offs_t offset, u8 data) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/rally.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/rally.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/rally.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/rally.h 2024-03-25 14:00:46.000000000 +0000 @@ -30,7 +30,7 @@ virtual void cart_init() override; virtual u8 read_rom04(offs_t offset) override; - virtual u8 read_rom0c(offs_t offset) override { return read_rom04(offset); } + virtual u8 read_rom0c(offs_t offset) override { return read_rom04(offset + 0x400); } virtual void write_p1(u8 data) override { m_control = data; } virtual void io_write(offs_t offset, u8 data) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/rom.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/rom.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/rom.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/rom.h 2024-03-25 14:00:46.000000000 +0000 @@ -30,7 +30,7 @@ virtual void cart_init() override; virtual u8 read_rom04(offs_t offset) override; - virtual u8 read_rom0c(offs_t offset) override { return read_rom04(offset); } + virtual u8 read_rom0c(offs_t offset) override { return read_rom04(offset + 0x400); } virtual void write_p1(u8 data) override { m_bank = data & 3; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/slot.cpp mame-0.264+dfsg.1/src/devices/bus/odyssey2/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,6 +10,9 @@ #include "emu.h" #include "slot.h" +#include + + //************************************************************************** // GLOBAL VARIABLES //************************************************************************** @@ -132,6 +135,8 @@ std::pair o2_cart_slot_device::call_load() { + std::error_condition err; + if (m_cart) { if (loaded_through_softlist()) @@ -153,24 +158,33 @@ else { u32 const size = length(); - fread(m_cart->m_rom, size); - - m_cart->m_rom_size = size; - m_cart->m_exrom_size = 0; - m_cart->m_voice_size = 0; - m_b = 0; + size_t actual; + std::tie(err, m_cart->m_rom, actual) = read(image_core_file(), size); + if (!err && (actual != size)) + err = std::errc::io_error; + + if (!err) + { + m_cart->m_rom_size = size; + m_cart->m_exrom_size = 0; + m_cart->m_voice_size = 0; + m_b = 0; - m_type = (size == 0x4000) ? O2_RALLY : O2_STD; + m_type = (size == 0x4000) ? O2_RALLY : O2_STD; + } } if (m_cart->get_rom_size() > 0) - { m_cart->cart_init(); - return std::make_pair(std::error_condition(), std::string()); - } + else if (!err) + err = image_error::UNSPECIFIED; + } + else + { + err = image_error::UNSPECIFIED; } - return std::make_pair(image_error::UNSPECIFIED, std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/test.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/test.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/test.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/test.h 2024-03-25 14:00:46.000000000 +0000 @@ -30,7 +30,7 @@ virtual void cart_init() override; virtual u8 read_rom04(offs_t offset) override { return m_rom[offset]; } - virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset]; } + virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset + 0x400]; } virtual void bus_write(u8 data) override { m_bus_data = data; } virtual void write_p1(u8 data) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/voice.cpp mame-0.264+dfsg.1/src/devices/bus/odyssey2/voice.cpp --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/voice.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/voice.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,6 +14,7 @@ TODO: - bees sound at level complete "MORE MORE MORE CHK CHK CHK" should be more rapid +- turtlesu usually doesn't detect the voice cartridge ******************************************************************************/ @@ -37,6 +38,7 @@ void o2_voice_device::device_start() { save_item(NAME(m_control)); + save_item(NAME(m_reset)); } void o2_voice_device::cart_init() @@ -99,11 +101,16 @@ { if (offset & 0x80 && ~m_control & 0x10) { - // A0-A6: SP0256B A1-A7 (A8 to GND) // D5: 7474 to SP0256B reset - if (data & 0x20) - m_speech->ald_w(offset & 0x7f); - else + bool reset = !(data & 0x20); + if (reset) m_speech->reset(); + else if (!m_reset) + { + // A0-A6: SP0256B A1-A7 (A8 to GND) + m_speech->ald_w(offset & 0x7f); + } + + m_reset = reset; } } diff -Nru mame-0.263+dfsg.1/src/devices/bus/odyssey2/voice.h mame-0.264+dfsg.1/src/devices/bus/odyssey2/voice.h --- mame-0.263+dfsg.1/src/devices/bus/odyssey2/voice.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/odyssey2/voice.h 2024-03-25 14:00:46.000000000 +0000 @@ -51,6 +51,7 @@ required_device m_subslot; u8 m_control = 0; + bool m_reset = false; }; diff -Nru mame-0.263+dfsg.1/src/devices/bus/pasopia/rampac2.cpp mame-0.264+dfsg.1/src/devices/bus/pasopia/rampac2.cpp --- mame-0.263+dfsg.1/src/devices/bus/pasopia/rampac2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pasopia/rampac2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -88,8 +88,8 @@ bool pasopia_rampac2_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = read(file, &m_ram[0], m_ram_size); + return !err && (actual == m_ram_size); } @@ -99,8 +99,8 @@ bool pasopia_rampac2_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = write(file, &m_ram[0], m_ram_size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/pce/pce_rom.cpp mame-0.264+dfsg.1/src/devices/bus/pce/pce_rom.cpp --- mame-0.263+dfsg.1/src/devices/bus/pce/pce_rom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pce/pce_rom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -104,14 +104,14 @@ bool pce_tennokoe_device::nvram_read(util::read_stream &file) { - size_t actual_size; - return !file.read(m_bram, m_bram_size, actual_size) && actual_size == m_bram_size; + auto const [err, actual] = read(file, m_bram, m_bram_size); + return !err && (actual == m_bram_size); } bool pce_tennokoe_device::nvram_write(util::write_stream &file) { - size_t actual_size; - return !file.write(m_bram, m_bram_size, actual_size) && actual_size == m_bram_size; + auto const [err, actual] = write(file, m_bram, m_bram_size); + return !err; } /*------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/pce/pce_slot.cpp mame-0.264+dfsg.1/src/devices/bus/pce/pce_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/pce/pce_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pce/pce_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -324,8 +324,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = pce_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/clgd5446.cpp mame-0.264+dfsg.1/src/devices/bus/pci/clgd5446.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/clgd5446.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/clgd5446.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,146 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/************************************************************************************************** + +Cirrus Logic CL-GD5446 + +Assume Rev. B + +**************************************************************************************************/ + +#include "emu.h" +#include "clgd5446.h" + +#include "screen.h" + +#define LOG_WARN (1U << 1) +#define LOG_TODO (1U << 2) // log unimplemented registers + +#define VERBOSE (LOG_GENERAL | LOG_WARN | LOG_TODO) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) +#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) + +DEFINE_DEVICE_TYPE(GD5446_PCI, cirrus_gd5446_pci_device, "clgd5446_pci", "Cirrus Logic GD5446 card") + +cirrus_gd5446_pci_device::cirrus_gd5446_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pci_card_device(mconfig, GD5446_PCI, tag, owner, clock) + , m_vga(*this, "svga") + , m_vga_rom(*this, "vga_rom") +{ + // subvendor ID: Returns values from ROM 0x7ffc-0x7ffe + set_ids(0x101300b8, 0x00, 0x030000, 0x10130000); +} + +ROM_START( gd5446 ) + // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31, AT27C256R + // from photoply + ROM_REGION32_LE( 0x8000, "vga_rom", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS( 0, "quadtel", "Quadtel CL-GD5446 1.31" ) + ROMX_LOAD( "cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c), ROM_BIOS(0) ) + // Chip:CL-GD5446-HC-A - ROM: CL-GD5436/46 PCI VGA BIOS Version 1.25 - RAM: 1MB, 2MB, 4MB - + // OSC: 14.31818MHz - Connector: DB15 - VESA feature connector + ROM_SYSTEM_BIOS( 1, "quadtelo", "Quadtel CL-GD5446 1.25" ) + ROMX_LOAD("cl-gd5446_pci_vga_bios_version_1.25.u2", 0x0000, 0x8000, CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a), ROM_BIOS(1) ) +// ROMX_LOAD("5446bv.vbi", 0x00000, 0x10000, CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a) ) +ROM_END + +const tiny_rom_entry *cirrus_gd5446_pci_device::device_rom_region() const +{ + return ROM_NAME(gd5446); +} + +void cirrus_gd5446_pci_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update(m_vga, FUNC(cirrus_gd5446_vga_device::screen_update)); + + CIRRUS_GD5446_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // 1MB or 2MB, max 4MB + m_vga->set_vram_size(4*1024*1024); +} + +void cirrus_gd5446_pci_device::device_start() +{ + pci_device::device_start(); + + add_map( 32*1024*1024, M_MEM, FUNC(cirrus_gd5446_pci_device::vram_aperture_map)); + // TODO: special in Rev A, can be either M_MEM or M_IO thru CF8 / CF4 / CF3 + //add_map( 4096, M_MEM, FUNC(cirrus_gd5446_pci_device::mmio_map)); + add_map( 512, M_MEM, FUNC(cirrus_gd5446_pci_device::mmio_map)); + // TODO: Rev B do the same, except it just maps GPIO here thru CF8 / CF4 + add_map( 512, M_MEM, FUNC(cirrus_gd5446_pci_device::gpio_map)); + + add_rom((u8 *)m_vga_rom->base(), 0x8000); + expansion_rom_base = 0xc0000; + + // INTA# + intr_pin = 1; +} + +void cirrus_gd5446_pci_device::device_reset() +{ + pci_device::device_reset(); + + command = 0x0000; + command_mask = 0x0023; + // medium DEVSEL# + status = 0x0200; + + remap_cb(); +} + +void cirrus_gd5446_pci_device::config_map(address_map &map) +{ + pci_device::config_map(map); +} + +void cirrus_gd5446_pci_device::vram_aperture_map(address_map &map) +{ + map(0x000000, 0x3fffff).rw(m_vga, FUNC(cirrus_gd5446_vga_device::mem_linear_r), FUNC(cirrus_gd5446_vga_device::mem_linear_w)); +} + +void cirrus_gd5446_pci_device::mmio_map(address_map &map) +{ + +} + +void cirrus_gd5446_pci_device::gpio_map(address_map &map) +{ + +} + +// TODO: this should really be a subclass of VGA +void cirrus_gd5446_pci_device::legacy_memory_map(address_map &map) +{ + map(0xa0000, 0xbffff).rw(FUNC(cirrus_gd5446_pci_device::vram_r), FUNC(cirrus_gd5446_pci_device::vram_w)); +} + +void cirrus_gd5446_pci_device::legacy_io_map(address_map &map) +{ + map(0, 0x02f).m(m_vga, FUNC(cirrus_gd5446_vga_device::io_map)); +} + +uint8_t cirrus_gd5446_pci_device::vram_r(offs_t offset) +{ + return downcast(m_vga.target())->mem_r(offset); +} + +void cirrus_gd5446_pci_device::vram_w(offs_t offset, uint8_t data) +{ + downcast(m_vga.target())->mem_w(offset, data); +} + +void cirrus_gd5446_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + { + memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(cirrus_gd5446_pci_device::vram_r)), write8sm_delegate(*this, FUNC(cirrus_gd5446_pci_device::vram_w))); + + io_space->install_device(0x03b0, 0x03df, *this, &cirrus_gd5446_pci_device::legacy_io_map); + } +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/clgd5446.h mame-0.264+dfsg.1/src/devices/bus/pci/clgd5446.h --- mame-0.263+dfsg.1/src/devices/bus/pci/clgd5446.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/clgd5446.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +#ifndef MAME_BUS_PCI_CLGD5446_H +#define MAME_BUS_PCI_CLGD5446_H + +#pragma once + +#include "pci_slot.h" +#include "video/pc_vga_cirrus.h" + +class cirrus_gd5446_pci_device : public pci_card_device +{ +public: + cirrus_gd5446_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void legacy_memory_map(address_map &map); + void legacy_io_map(address_map &map); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + virtual void config_map(address_map &map) override; + + virtual void mmio_map(address_map &map); + virtual void vram_aperture_map(address_map &map); + virtual void gpio_map(address_map &map); +private: + required_device m_vga; + required_memory_region m_vga_rom; + + u8 vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); + +// u32 unmap_log_r(offs_t offset, u32 mem_mask = ~0); +// void unmap_log_w(offs_t offset, u32 data, u32 mem_mask = ~0); +}; + +DECLARE_DEVICE_TYPE(GD5446_PCI, cirrus_gd5446_pci_device) + +#endif // MAME_BUS_PCI_CLGD546X_LAGUNA_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/clgd546x_laguna.cpp mame-0.264+dfsg.1/src/devices/bus/pci/clgd546x_laguna.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/clgd546x_laguna.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/clgd546x_laguna.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,205 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese + +#include "emu.h" +#include "clgd546x_laguna.h" + +#include "screen.h" + +#define LOG_WARN (1U << 1) +#define LOG_TODO (1U << 2) // log unimplemented registers + +#define VERBOSE (LOG_GENERAL | LOG_WARN | LOG_TODO) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) +#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) + +DEFINE_DEVICE_TYPE(GD5465_LAGUNA3D, cirrus_gd5465_laguna3d_device, "clgd5465_laguna", "Cirrus Logic GD-5465 \"Laguna 3D\"") + +cirrus_gd5465_laguna3d_device::cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pci_card_device(mconfig, GD5465_LAGUNA3D, tag, owner, clock) + , m_vga(*this, "vga") + , m_vga_rom(*this, "vga_rom") +{ + // device ID 0x1013 Cirrus Logic + // 0x00dx for Laguna revs + // subvendor ID: Returns values from ROM 0x7ff8-0x7ffb + set_ids_agp(0x101300d6, 0x00, 0x10130000); + // TODO: class can be 0x80 (other display controller) with P18 pin. +} + +/* + Cirrus Logic CL-GD5464 Laguna3D +// DSystems Wizar3D PCI graphics card - Chip: CL-GD5464-HC-A - ROM: DSystems Wizar3D 144a.10H - RAM: 2MB, 4MB, 8MB - Connector: DB15 - VESA feature connector +ROM_START( clgd5464 ) + ROM_REGION32_LE( 0x08000, "vga_rom", ROMREGION_ERASEFF ) + ROM_LOAD("dsystems_wizard3d.vbi", 0x00000, 0x08000, CRC(df9f1570), SHA1(4e611f4039b851fd4237d450e38c9d764920a747) ) +ROM_END + +*/ + +ROM_START( gd5465 ) + // Chaintech GA-5465AS AGP graphics card - Chip: CL-GD5465 - ROM: CL-GD546x Laguna PCI VGA BIOS Version 1.62c - RAM: 4MB, 8MB - OSC: 14.3C7Y - Connector: DB15 - VESA feature connector + ROM_REGION32_LE( 0x8000, "vga_rom", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS( 0, "chaintech", "Chaintech GA-5465AS 1.62c" ) + ROMX_LOAD( "chaintech.vbi", 0x0000, 0x8000, CRC(8afa1afb) SHA1(251a953d442dc34738f80371cfbd0fd9f1097635), ROM_BIOS(0) ) +ROM_END + +const tiny_rom_entry *cirrus_gd5465_laguna3d_device::device_rom_region() const +{ + return ROM_NAME(gd5465); +} + +void cirrus_gd5465_laguna3d_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update(m_vga, FUNC(cirrus_gd5446_vga_device::screen_update)); + + // TODO: bump to GD5465 + CIRRUS_GD5446_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // FIXME: shared RAM + // in 4 and 8 MB versions + m_vga->set_vram_size(8*1024*1024); +} + +void cirrus_gd5465_laguna3d_device::device_start() +{ + pci_device::device_start(); + + add_map( 32*1024, M_MEM, FUNC(cirrus_gd5465_laguna3d_device::mmio_map)); + add_map( 32*1024*1024, M_MEM, FUNC(cirrus_gd5465_laguna3d_device::vram_aperture_map)); + + add_rom((u8 *)m_vga_rom->base(), 0x8000); + expansion_rom_base = 0xc0000; + + // INTA# + intr_pin = 1; + save_item(NAME(m_vga_legacy_enable)); + + // TODO: fast back-to-back +} + +void cirrus_gd5465_laguna3d_device::device_reset() +{ + pci_device::device_reset(); + + // TODO: to be checked + command = 0x0000; + status = 0x0000; + + m_vga_legacy_enable = true; + remap_cb(); +} + +void cirrus_gd5465_laguna3d_device::config_map(address_map &map) +{ + pci_device::config_map(map); + // TODO: AGP CAPPTR +// map(0xf8, 0xf8) PCI VGA Shadow Register +// map(0xfc, 0xfc) PCI Vendor Specific Control Register +} + +void cirrus_gd5465_laguna3d_device::mmio_map(address_map &map) +{ + +} + +void cirrus_gd5465_laguna3d_device::vram_aperture_map(address_map &map) +{ + +} + +// TODO: this should really be a subclass of VGA +void cirrus_gd5465_laguna3d_device::legacy_memory_map(address_map &map) +{ + map(0xa0000, 0xbffff).rw(FUNC(cirrus_gd5465_laguna3d_device::vram_r), FUNC(cirrus_gd5465_laguna3d_device::vram_w)); +} + +void cirrus_gd5465_laguna3d_device::legacy_io_map(address_map &map) +{ + map(0, 0x02f).m(m_vga, FUNC(cirrus_gd5446_vga_device::io_map)); +} + +uint8_t cirrus_gd5465_laguna3d_device::vram_r(offs_t offset) +{ + return downcast(m_vga.target())->mem_r(offset); +} + +void cirrus_gd5465_laguna3d_device::vram_w(offs_t offset, uint8_t data) +{ + downcast(m_vga.target())->mem_w(offset, data); +} + +void cirrus_gd5465_laguna3d_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + if (m_vga_legacy_enable) + { + memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(cirrus_gd5465_laguna3d_device::vram_r)), write8sm_delegate(*this, FUNC(cirrus_gd5465_laguna3d_device::vram_w))); + + io_space->install_device(0x03b0, 0x03df, *this, &cirrus_gd5465_laguna3d_device::legacy_io_map); + } +} + +/* + Cirrus Logic CL-GD54M30 - PCI +ROM_START( clgd54m30 ) + ROM_REGION(0x10000, "clgd54m30", 0) + // Chip: CL-GD54M30-I-QC-A, ROM: 32KB, RAM: 1MB, 2MB, Connector: DB15, VESA veature connector + ROM_SYSTEM_BIOS(0, "version_1.00d", "VGA BIOS Version 1.00d") + ROMX_LOAD("korea.bin", 0x00000, 0x10000, CRC(0870507b) SHA1(b3873cb8834767250fcb7043918a35b1b895b0b1), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "stlab_ver_1.00d", "STlab Version 1.00d") + ROMX_LOAD("gd54m30stlab.bin", 0x08000, 0x8000, CRC(72116f4e) SHA1(4618640aa0f07586ebab02260fc58aa3035114fb), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "clgd54m30_ver1.00d", "CL-GD54M30 Ver.1.00d") + ROMX("gd54m30.bin", 0x08000, 0x000, CRC(45a1d9d0) SHA1(0e8a88ff354699bfb75a1de807f2187ff9910c67), ROM_BIOS(2) ) +ROM_END + +*/ + +/* + Cirrus Logic CL-GD543x - PCI cards + +// PCI card CL543XPCI Ver 4.0 - ROM: CL-GD543x PCI VGA BIOS Version 1.10B - RAM: 1MB, 2MB or 4MB - Chip: CL-GD5430-0C-C - OSC: 14.318 MHz - Connector: DB15 +// VESA feature connector - Jumpers: IRQ9 enable/disable, Green control +ROM_START( clgd543x_pci ) + ROM_REGION(0x08000, "clgd543x_pci", 0) + ROM_SYSTEM_BIOS(0, "pci_version_1.10b", "PCI VGA BIOS Version 1.10B") + ROMX_LOAD("cl543x_pci_rev4.bin", 0x00000, 0x8000, CRC(553171a3) SHA1(b72edc318710c46c9cb280e9b1b3c9f8a34844f2), ROM_BIOS(0) ) + ROM_IGNORE( 0x8000 ) + ROM_SYSTEM_BIOS(1, "pci_version_1.00e", "PCI VGA BIOS Version 1.00e") + ROMX_LOAD("cirrus5434.bin", 0x00000, 0x8000, CRC(bc271648) SHA1(08afd4468c4c1a1630a200de1007b1671f109b3c), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "pci_version_1.22", "PCI VGA BIOS Version 1.22") + ROMX_LOAD("gd5434pci.bin", 0x00000, 0x8000, CRC(fa76dabf) SHA1(0310ef02df941e7d35e1d832400e2e4dd07d6309), ROM_BIOS(2) ) + ROM_SYSTEM_BIOS(3, "pci_ver_1.10b_jap", "PCI VGA BIOS Version 1.10B Japan chip") + ROMX_LOAD("japan.bin", 0x00000, 0x8000, CRC(46fe9efa) SHA1(58712b00faf102509c4129c0babeb98df2b6e042), ROM_BIOS(3) ) + ROM_SYSTEM_BIOS(4, "gd5434pciv124", "CL-GD543x PCI VGA BIOS Version 1.24") + ROMX_LOAD("1.24.bin", 0x00000,0x8000, CRC(174fa427) SHA1(3e490f3cc3af33dbfac6ff3ddac5e90bdc895646), ROM_BIOS(4) ) +ROM_END + +*/ + +/* + Cirrus Logic VL-GD5436 - PCI cards + +//Chip: CL-GD5436-I-QC-A - ROM: CL-GD5436 VL/PCI VGA BIOS Version 1.00b - RAM: 1MB, up to 4MB - Connector: DB15 - VESA connector - OSC: 14.31818MHz +// Jumpers: JG1 Green Control, IRQ9 enable/disable +ROM_START( clgd5436 ) + ROM_REGION(0x08000, "clgd5436", 0) + ROM_LOAD("5436.vbi", 0x00000, 0x08000, CRC(7737d03e) SHA1(e4d0b4e7262887dc5a6473ea8909fdc13a6a02c1) ) +ROM_END + +*/ + +/* + Cirrus Logic CL-GD5440 - PCI cards + +// Chip: Cirrus Logic CL-GD5440-J-QC-B - ROM: CL-GD5440 VGA BIOS Version 1.07 - RAM: 1MB, max. 2MB - OSC:14.31818MHz - Connector: DB15 - VESA connector +ROM_START( clgd5440 ) + ROM_REGION(0x10000, "clgd5440", 0) + ROM_LOAD("bios.bin", 0x00000, 0x10000, CRC(f0d3d0b4) SHA1(620b0727a20b127f5f32576ec54fbc6f9f437ad3) ) +ROM_END +*/ diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/clgd546x_laguna.h mame-0.264+dfsg.1/src/devices/bus/pci/clgd546x_laguna.h --- mame-0.263+dfsg.1/src/devices/bus/pci/clgd546x_laguna.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/clgd546x_laguna.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,48 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +#ifndef MAME_BUS_PCI_CLGD546X_LAGUNA_H +#define MAME_BUS_PCI_CLGD546X_LAGUNA_H + +#pragma once + +#include "pci_slot.h" +#include "video/pc_vga_cirrus.h" + +class cirrus_gd5465_laguna3d_device : public pci_card_device +{ +public: + cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void legacy_memory_map(address_map &map); + void legacy_io_map(address_map &map); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + virtual void config_map(address_map &map) override; + + virtual void mmio_map(address_map &map); + virtual void vram_aperture_map(address_map &map); +private: + required_device m_vga; + required_memory_region m_vga_rom; + + u8 vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); + +// u32 unmap_log_r(offs_t offset, u32 mem_mask = ~0); +// void unmap_log_w(offs_t offset, u32 data, u32 mem_mask = ~0); + + bool m_vga_legacy_enable = false; +}; + +DECLARE_DEVICE_TYPE(GD5465_LAGUNA3D, cirrus_gd5465_laguna3d_device) + +#endif // MAME_BUS_PCI_CLGD546X_LAGUNA_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/pci_slot.cpp mame-0.264+dfsg.1/src/devices/bus/pci/pci_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/pci_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/pci_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,20 +8,25 @@ #include "aha2940au.h" #include "audiowerk2.h" +#include "clgd5446.h" +#include "clgd546x_laguna.h" #include "ds2416.h" #include "ess_maestro.h" #include "geforce.h" #include "mga2064w.h" #include "opti82c861.h" #include "oti_spitfire.h" +#include "pdc20262.h" #include "promotion.h" #include "riva128.h" #include "rivatnt.h" #include "rtl8029as_pci.h" #include "rtl8139_pci.h" +#include "sis6326.h" #include "sonicvibes.h" #include "sw1000xg.h" #include "virge_pci.h" +#include "vision.h" #include "vt6306.h" #include "wd9710_pci.h" #include "zr36057.h" @@ -103,28 +108,26 @@ void pci_cards(device_slot_interface &device) { + // 0x00 - backward compatible pre-class code +// device.option_add("voodoo1", VOODOO_1_PCI); + device.option_add("vision864", VISION864_PCI); + device.option_add("vision964", VISION964_PCI); + // 0x01 - mass storage controllers device.option_add("aha2940au", AHA2940AU); + device.option_add("pdc20262", PDC20262); // 0x02 - network controllers device.option_add("rtl8029as", RTL8029AS_PCI); device.option_add("rtl8139", RTL8139_PCI); // 0x03 - display controllers + device.option_add("vision968", VISION968_PCI); device.option_add("virge", VIRGE_PCI); device.option_add("virgedx", VIRGEDX_PCI); - device.option_add("riva128", RIVA128); - device.option_add("riva128zx", RIVA128ZX); - device.option_add("rivatnt", RIVATNT); - device.option_add("rivatnt2", RIVATNT2); - device.option_add("rivatnt2_ultra", RIVATNT2_ULTRA); - device.option_add("vanta", VANTA); - device.option_add("rivatnt2_m64", RIVATNT2_M64); - device.option_add("geforce256", GEFORCE256); - device.option_add("geforce256_ddr", GEFORCE256_DDR); - device.option_add("quadro", QUADRO); device.option_add("mga2064w", MGA2064W); device.option_add("promotion3210", PROMOTION3210); + device.option_add("gd5446", GD5446_PCI); device.option_add("oti64111", OTI64111_PCI); device.option_add("wd9710", WD9710_PCI); @@ -155,3 +158,20 @@ // 0x12 - Processing accelerators // 0x13 - Debug } + +// assume all natively with class code 03 +void agp_cards(device_slot_interface &device) +{ + device.option_add("riva128", RIVA128); + device.option_add("riva128zx", RIVA128ZX); + device.option_add("rivatnt", RIVATNT); + device.option_add("rivatnt2", RIVATNT2); + device.option_add("rivatnt2_ultra", RIVATNT2_ULTRA); + device.option_add("vanta", VANTA); + device.option_add("rivatnt2_m64", RIVATNT2_M64); + device.option_add("geforce256", GEFORCE256); + device.option_add("geforce256_ddr", GEFORCE256_DDR); + device.option_add("quadro", QUADRO); + device.option_add("laguna3d", GD5465_LAGUNA3D); + device.option_add("sis6326_agp", SIS6326_AGP); +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/pci_slot.h mame-0.264+dfsg.1/src/devices/bus/pci/pci_slot.h --- mame-0.263+dfsg.1/src/devices/bus/pci/pci_slot.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/pci_slot.h 2024-03-25 14:00:46.000000000 +0000 @@ -87,5 +87,6 @@ DECLARE_DEVICE_TYPE(PCI_SLOT, pci_slot_device) void pci_cards(device_slot_interface &device); +void agp_cards(device_slot_interface &device); #endif diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/pdc20262.cpp mame-0.264+dfsg.1/src/devices/bus/pci/pdc20262.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/pdc20262.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/pdc20262.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,263 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +Promise PDC20262 FastTrak66/UDMA66 IDE controller + +No documentation, ATA4 complaint + +TODO: +- how it sets compatible/native modes? Subvendor ID list suggests it can switch at will; +- Install win9x driver causes huge loading hiccups, eventually freezes by accessing drive with + explorer.exe (enable UDMA?). For common use is **suggested** to not install them. +- Reportedly has issues with very big HDDs, pinpoint limit and assuming there isn't an issue here. +\- Tested with Seagate Barracuda ST380021A -chs=158816,16,63 (expected: 80GB, actual: 13655MB) +- Marketed as RAID card, verify; +\- Gets classified as SCSI controller in win9x device manager; +- ID and hookup Flash ROM type; +- PME 1.0 support (no low power states D1/D2, no PME#) + +**************************************************************************************************/ + +#include "emu.h" +#include "pdc20262.h" + +#define LOG_WARN (1U << 1) + +#define VERBOSE (LOG_GENERAL | LOG_WARN) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) + + +DEFINE_DEVICE_TYPE(PDC20262, pdc20262_device, "pdc20262", "Promise PDC20262 FastTrak66 EIDE controller") + + + +pdc20262_device::pdc20262_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_card_device(mconfig, type, tag, owner, clock) + , m_ide1(*this, "ide1") + , m_ide2(*this, "ide2") + , m_irqs(*this, "irqs") + // HACK: how to get to get_pci_busmaster_space()? + , m_bus_master_space(*this, ":maincpu", 0) + , m_bios_rom(*this, "bios_rom") +{ + // Subsystems: + // 105a 4d30 Ultra Device on SuperTrak + // 105a 4d33 Ultra66 + // 105a 4d39 FastTrak66 + // class code is trusted, bp 0xca09c + // assume revision depending on BIOS + set_ids(0x105a4d38, 0x02, 0x018000, 0x105a4d33); +} + +pdc20262_device::pdc20262_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pdc20262_device(mconfig, PDC20262, tag, owner, clock) +{ +} + +ROM_START( pdc20262 ) + ROM_REGION32_LE( 0x8000, "bios_rom", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS("v200") + + ROM_SYSTEM_BIOS( 0, "v200", "Promise Ultra66 BIOS v2.00 (Build 18)" ) + ROMX_LOAD( "ul200b18.bin", 0x0000, 0x4000, CRC(71e48d73) SHA1(84d8c72118a3e26181573412e2cbb859691672de), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS( 1, "v114", "Promise Ultra66 BIOS v1.14 (Build 0728)" ) + ROMX_LOAD( "ul114b0728.bin", 0x0000, 0x4000, CRC(a71f0c3d) SHA1(ace4872c6060e9dd8458540c0f3193d1a9b4321a), ROM_BIOS(1) ) + + // v1.12 known to exist +ROM_END + +const tiny_rom_entry *pdc20262_device::device_rom_region() const +{ + return ROM_NAME(pdc20262); +} + + +void pdc20262_device::device_add_mconfig(machine_config &config) +{ + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set([this] (int state) { + irq_pin_w(0, state); + }); + + BUS_MASTER_IDE_CONTROLLER(config, m_ide1).options(ata_devices, "hdd", nullptr, false); + m_ide1->irq_handler().set([this] (int state) { + m_irq_state &= ~0x4; + m_irq_state |= (state << 2); + m_irqs->in_w<0>(state); + }); + m_ide1->set_bus_master_space(m_bus_master_space); + + BUS_MASTER_IDE_CONTROLLER(config, m_ide2).options(ata_devices, nullptr, nullptr, false); + m_ide2->irq_handler().set([this] (int state) { + m_irq_state &= ~0x40; + m_irq_state |= (state << 6); + m_irqs->in_w<1>(state); + }); + m_ide2->set_bus_master_space(m_bus_master_space); +} + +// $1f0 +void pdc20262_device::ide1_command_map(address_map &map) +{ + map(0, 7).rw(FUNC(pdc20262_device::ide1_read32_cs0_r), FUNC(pdc20262_device::ide1_write32_cs0_w)); +} + +// $3f4 +void pdc20262_device::ide1_control_map(address_map &map) +{ + map(2, 2).rw(FUNC(pdc20262_device::ide1_read_cs1_r), FUNC(pdc20262_device::ide1_write_cs1_w)); +} + +// $170 +void pdc20262_device::ide2_command_map(address_map &map) +{ + map(0, 7).rw(FUNC(pdc20262_device::ide2_read32_cs0_r), FUNC(pdc20262_device::ide2_write32_cs0_w)); +} + +// $374 +void pdc20262_device::ide2_control_map(address_map &map) +{ + map(2, 2).rw(FUNC(pdc20262_device::ide2_read_cs1_r), FUNC(pdc20262_device::ide2_write_cs1_w)); +} + +void pdc20262_device::bus_master_ide_control_map(address_map &map) +{ + map(0x00, 0x07).rw(m_ide1, FUNC(bus_master_ide_controller_device::bmdma_r), FUNC(bus_master_ide_controller_device::bmdma_w)); + map(0x08, 0x0f).rw(m_ide2, FUNC(bus_master_ide_controller_device::bmdma_r), FUNC(bus_master_ide_controller_device::bmdma_w)); + + map(0x11, 0x11).lrw8( + NAME([this] () { + return m_clock; + }), + NAME([this] (u8 data) { + LOG("extra $11: Clock set %02x\n", data); + m_clock = data; + }) + ); + +// map(0x1a, 0x1a) Primary Mode +// map(0x1b, 0x1b) Secondary Mode +/* + * upper nibble secondary, lower primary + * + * x--- error + * -x-- irq + * --x- FIFO full + * ---x FIFO empty + */ + map(0x1d, 0x1d).lr8( + NAME([this] () { + // FIXME: definitely requires a FIFO i/f + return m_irq_state | 1; + }) + ); +// map(0x1f, 0x1f) Ultra DMA speed flag +} + +void pdc20262_device::extra_map(address_map &map) +{ + // TODO: should be memory mapped versions of above, *nix driver seems to use this +// map(0x00, 0x07).m(*this, FUNC(pdc20262_device::ide1_command_map))); +// ... +} + +void pdc20262_device::device_start() +{ + pci_card_device::device_start(); + + add_map(8, M_IO, FUNC(pdc20262_device::ide1_command_map)); + add_map(4, M_IO, FUNC(pdc20262_device::ide1_control_map)); + add_map(8, M_IO, FUNC(pdc20262_device::ide2_command_map)); + add_map(4, M_IO, FUNC(pdc20262_device::ide2_control_map)); + add_map(32, M_IO, FUNC(pdc20262_device::bus_master_ide_control_map)); + // TODO: unknown size (a lot larger?), to be verified later thru PnP + add_map(64, M_MEM, FUNC(pdc20262_device::extra_map)); + + add_rom((u8 *)m_bios_rom->base(), 0x4000); + expansion_rom_base = 0xc8000; + + // INTA# + intr_pin = 1; +} + +void pdc20262_device::device_reset() +{ + pci_card_device::device_reset(); + + command = 0x0000; + command_mask = 7; + status = 0x0210; + + remap_cb(); +} + +void pdc20262_device::config_map(address_map &map) +{ + pci_card_device::config_map(map); + // latency timer + map(0x0d, 0x0d).lr8(NAME([] () { return 0x01; })); + // TODO: everything, starting from capptr_r override +} + +/* + * Start of legacy handling, to be moved out + */ + +uint32_t pdc20262_device::ide1_read32_cs0_r(offs_t offset, uint32_t mem_mask) +{ + if (!(command & 1)) + return 0xffffffff; + return m_ide1->read_cs0(offset, mem_mask); +} + +void pdc20262_device::ide1_write32_cs0_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (!(command & 1)) + return; + m_ide1->write_cs0(offset, data, mem_mask); +} + +uint32_t pdc20262_device::ide2_read32_cs0_r(offs_t offset, uint32_t mem_mask) +{ + if (!(command & 1)) + return 0xffffffff; + return m_ide2->read_cs0(offset, mem_mask); +} + +void pdc20262_device::ide2_write32_cs0_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (!(command & 1)) + return; + m_ide2->write_cs0(offset, data, mem_mask); +} + +uint8_t pdc20262_device::ide1_read_cs1_r() +{ + if (!(command & 1)) + return 0xff; + return m_ide1->read_cs1(1, 0xff0000) >> 16; +} + +void pdc20262_device::ide1_write_cs1_w(uint8_t data) +{ + if (!(command & 1)) + return; + m_ide1->write_cs1(1, data << 16, 0xff0000); +} + +uint8_t pdc20262_device::ide2_read_cs1_r() +{ + if (!(command & 1)) + return 0xff; + return m_ide2->read_cs1(1, 0xff0000) >> 16; +} + +void pdc20262_device::ide2_write_cs1_w(uint8_t data) +{ + if (!(command & 1)) + return; + m_ide2->write_cs1(1, data << 16, 0xff0000); +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/pdc20262.h mame-0.264+dfsg.1/src/devices/bus/pci/pdc20262.h --- mame-0.263+dfsg.1/src/devices/bus/pci/pdc20262.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/pdc20262.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,65 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_BUS_PCI_PDC20262_H +#define MAME_BUS_PCI_PDC20262_H + +#pragma once + +#include "pci_slot.h" +#include "machine/idectrl.h" +#include "machine/input_merger.h" + +class pdc20262_device : public pci_card_device +{ +public: + pdc20262_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + static constexpr feature_type imperfect_features() { return feature::DISK; } + +protected: + pdc20262_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + +// virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, +// uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + virtual void config_map(address_map &map) override; + +private: + void ide1_command_map(address_map &map); + void ide1_control_map(address_map &map); + void ide2_command_map(address_map &map); + void ide2_control_map(address_map &map); + void bus_master_ide_control_map(address_map &map); + void extra_map(address_map &map); + +// virtual void device_config_complete() override; + + required_device m_ide1; + required_device m_ide2; + required_device m_irqs; + required_address_space m_bus_master_space; + required_memory_region m_bios_rom; + + u8 m_clock = 0; + u8 m_irq_state = 0; + + uint32_t ide1_read32_cs0_r(offs_t offset, uint32_t mem_mask = ~0); + void ide1_write32_cs0_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + uint32_t ide2_read32_cs0_r(offs_t offset, uint32_t mem_mask = ~0); + void ide2_write32_cs0_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + uint8_t ide1_read_cs1_r(); + void ide1_write_cs1_w(uint8_t data); + uint8_t ide2_read_cs1_r(); + void ide2_write_cs1_w(uint8_t data); +}; + +DECLARE_DEVICE_TYPE(PDC20262, pdc20262_device) + +#endif // MAME_BUS_PCI_PDC20262_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/sis6326.cpp mame-0.264+dfsg.1/src/devices/bus/pci/sis6326.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/sis6326.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/sis6326.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,202 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +SiS 6326 + +**************************************************************************************************/ + +#include "emu.h" +#include "sis6326.h" + +#define LOG_WARN (1U << 1) +#define LOG_AGP (1U << 2) + +#define VERBOSE (LOG_GENERAL | LOG_WARN | LOG_AGP) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) +#define LOGAGP(...) LOGMASKED(LOG_AGP, __VA_ARGS__) + + +DEFINE_DEVICE_TYPE(SIS6326_AGP, sis6326_agp_device, "sis6326_agp", "SiS 6326 AGP card") + + + +sis6326_agp_device::sis6326_agp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_card_device(mconfig, type, tag, owner, clock) + , m_vga(*this, "vga") + , m_vga_rom(*this, "vga_rom") +{ + set_ids(0x10396326, 0xa0, 0x030000, 0x10396326); +} + +sis6326_agp_device::sis6326_agp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : sis6326_agp_device(mconfig, SIS6326_AGP, tag, owner, clock) +{ +} + +ROM_START( sis6326agp ) + ROM_REGION32_LE( 0x10000, "vga_rom", ROMREGION_ERASEFF ) + // Default is AOpen for supporting OpenGL + ROM_DEFAULT_BIOS("aopen") + + ROM_SYSTEM_BIOS( 0, "aopen", "AOpen PA50V 2.25" ) + ROMX_LOAD( "aopenpa50v.vbi", 0x000000, 0x008000, CRC(6c4c7518) SHA1(36bb29a23d565e34d548701acc248d50c99d7da4), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS( 1, "3dpro", "3DPro 4MB EDO 1.06" ) + ROMX_LOAD( "3dpro4mbedo.bin", 0x000000, 0x010000, CRC(f04b374c) SHA1(6eb96f7517df6eb566c615c2ab9ec5567035b6a5), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS( 2, "siso", "SiS6326 4MB 1.21d" ) + ROMX_LOAD( "4mbsdr.vbi", 0x000000, 0x00c000, CRC(a5f8c7f7) SHA1(9e5cfcf8d34e0c5829343179c87fb2b97f7a7f9c), ROM_BIOS(2) ) + ROM_SYSTEM_BIOS( 3, "sis", "SiS6326 4MB 1.25" ) + ROMX_LOAD( "sis6326agp.bin", 0x000000, 0x010000, CRC(a671255c) SHA1(332ab9499142e8f7a235afe046e8e8d21a28580d), ROM_BIOS(3) ) + + // basically identical to siso +// ROM_SYSTEM_BIOS( 3, "sisvbi", "SiS6326 4MB PCI 1.21d" ) +// ROMX_LOAD( "4mb_pci.vbi", 0x000000, 0x00c000, CRC(8fca47be) SHA1(7ce995ec0d8b9ac4f0f40ccd0a61d7fc209d313f), ROM_BIOS(3) ) +ROM_END + +const tiny_rom_entry *sis6326_agp_device::device_rom_region() const +{ + return ROM_NAME(sis6326agp); +} + +void sis6326_agp_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update(m_vga, FUNC(sis6236_vga_device::screen_update)); + + // TODO: barely similar, to be changed. + SIS6236_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // 4MB, max 8MB + m_vga->set_vram_size(4*1024*1024); +} + +void sis6326_agp_device::device_start() +{ + pci_card_device::device_start(); + + add_map(4*1024*1024, M_MEM, FUNC(sis6326_agp_device::vram_aperture_map)); + add_map(64*1024, M_MEM, FUNC(sis6326_agp_device::mmio_map)); + add_map(16, M_IO, FUNC(sis6326_agp_device::vmi_map)); + + add_rom((u8 *)m_vga_rom->base(), 0x10000); + expansion_rom_base = 0xc0000; + + // INTA# + // TODO: SRE D3 can strap this to no irq pin + intr_pin = 1; +} + +void sis6326_agp_device::device_reset() +{ + pci_card_device::device_reset(); + + // doc makes multiple ninja jumps in messing up these defaults + // bus master (hardwired) + command = 0x0004; + command_mask = 0x23; + // medium DEVSEL#, 66 MHz capable, has capabilities list + status = 0x0230; + + remap_cb(); +} + +u8 sis6326_agp_device::capptr_r() +{ + return 0x50; +} + +u32 sis6326_agp_device::agp_command_r(offs_t offset, uint32_t mem_mask) +{ + LOGAGP("Read AGP command [$58] %d %d %08x\n", m_agp.enable, m_agp.data_rate, mem_mask); + // TODO: enable gets cleared by AGP_RESET, or even from PCI RST# + return m_agp.enable << 8 | (m_agp.data_rate & 7); +} + +void sis6326_agp_device::agp_command_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + LOGAGP("Write AGP command [$c8] %08x & %08x\n", data, mem_mask); + + if (ACCESSING_BITS_8_15) + { + m_agp.enable = bool(BIT(m_agp.enable, 8)); + LOGAGP("- AGP_ENABLE = %d\n", m_agp.enable); + } + + if (ACCESSING_BITS_0_7) + { + // quick checker, to be translated into an AGP interface + std::map agp_transfer_rates = { + { 0, "(illegal 0)" }, + { 1, "1X" }, + { 2, "2X" }, + { 3, "(illegal 3)" } + }; + + // make sure the AGP DATA_RATE specs are honored + const u8 data_rate = data & 3; + LOGAGP("- DATA_RATE = %s enabled=%d\n", agp_transfer_rates.at(data_rate), m_agp.enable); + m_agp.data_rate = data_rate; + } +} + +void sis6326_agp_device::config_map(address_map &map) +{ + pci_card_device::config_map(map); + // AGP + map(0x50, 0x53).lr32(NAME([] () { return 0x00105c02; } )); + map(0x54, 0x57).lr32(NAME([] () { return 0x01000003; } )); + map(0x58, 0x5b).rw(FUNC(sis6326_agp_device::agp_command_r), FUNC(sis6326_agp_device::agp_command_w)); + map(0x5c, 0x5f).lr32(NAME([] () { return 0x00000000; } )); // NULL terminator +} + +void sis6326_agp_device::vram_aperture_map(address_map &map) +{ + map(0x0000000, 0x3ffffff).rw(m_vga, FUNC(sis6236_vga_device::mem_linear_r), FUNC(sis6236_vga_device::mem_linear_w)); +} + +void sis6326_agp_device::mmio_map(address_map &map) +{ +} + +void sis6326_agp_device::vmi_map(address_map &map) +{ +} + +// TODO: this should really be a subclass of VGA +void sis6326_agp_device::legacy_memory_map(address_map &map) +{ + map(0xa0000, 0xbffff).rw(FUNC(sis6326_agp_device::vram_r), FUNC(sis6326_agp_device::vram_w)); +} + +void sis6326_agp_device::legacy_io_map(address_map &map) +{ + map(0, 0x02f).m(m_vga, FUNC(sis6236_vga_device::io_map)); +} + +uint8_t sis6326_agp_device::vram_r(offs_t offset) +{ + return downcast(m_vga.target())->mem_r(offset); +} + +void sis6326_agp_device::vram_w(offs_t offset, uint8_t data) +{ + downcast(m_vga.target())->mem_w(offset, data); +} + +void sis6326_agp_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + if (BIT(command, 1)) + { + memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(sis6326_agp_device::vram_r)), write8sm_delegate(*this, FUNC(sis6326_agp_device::vram_w))); + } + + if (BIT(command, 0)) + { + io_space->install_device(0x03b0, 0x03df, *this, &sis6326_agp_device::legacy_io_map); + } +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/sis6326.h mame-0.264+dfsg.1/src/devices/bus/pci/sis6326.h --- mame-0.263+dfsg.1/src/devices/bus/pci/sis6326.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/sis6326.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,59 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_BUS_PCI_SIS6326_H +#define MAME_BUS_PCI_SIS6326_H + +#pragma once + +#include "pci_slot.h" +#include "video/pc_vga_sis.h" + +class sis6326_agp_device : public pci_card_device +{ +public: + sis6326_agp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + static constexpr feature_type unemulated_features() { return feature::GRAPHICS; } + +protected: + sis6326_agp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + virtual void config_map(address_map &map) override; + + virtual u8 capptr_r() override; + + void vram_aperture_map(address_map &map); + void mmio_map(address_map &map); + void vmi_map(address_map &map); +private: + required_device m_vga; + required_memory_region m_vga_rom; + + void legacy_memory_map(address_map &map); + void legacy_io_map(address_map &map); + + u8 vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); + + struct { + bool enable = false; + u8 data_rate = 0; + } m_agp; + + u32 agp_command_r(offs_t offset, uint32_t mem_mask); + void agp_command_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); +}; + +DECLARE_DEVICE_TYPE(SIS6326_AGP, sis6326_agp_device) + +#endif // MAME_BUS_PCI_SIS6326_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/virge_pci.cpp mame-0.264+dfsg.1/src/devices/bus/pci/virge_pci.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/virge_pci.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/virge_pci.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -128,12 +128,12 @@ uint8_t virge_pci_device::vram_r(offs_t offset) { - return downcast(m_vga.target())->mem_r(offset); + return downcast(m_vga.target())->mem_r(offset); } void virge_pci_device::vram_w(offs_t offset, uint8_t data) { - downcast(m_vga.target())->mem_w(offset, data); + downcast(m_vga.target())->mem_w(offset, data); } void virge_pci_device::postload() @@ -217,18 +217,23 @@ ROM_REGION(0x8000,"bios", 0) ROM_DEFAULT_BIOS("virge") - ROM_SYSTEM_BIOS( 0, "virge", "PCI S3 ViRGE v1.00-10" ) + ROM_SYSTEM_BIOS( 0, "virge", "S3 ViRGE v1.00-10" ) ROMX_LOAD("pci_m-v_virge-4s3.bin", 0x00000, 0x8000, CRC(d0a0f1de) SHA1(b7b41081974762a199610219bdeab149b7c7143d), ROM_BIOS(0) ) - ROM_SYSTEM_BIOS( 1, "virgeo", "PCI S3 ViRGE v1.00-05" ) + ROM_SYSTEM_BIOS( 1, "virgeo", "S3 ViRGE v1.00-05" ) ROMX_LOAD("s3virge.bin", 0x00000, 0x8000, CRC(a7983a85) SHA1(e885371816d3237f7badd57ccd602cd863c9c9f8), ROM_BIOS(1) ) ROM_IGNORE( 0x8000 ) ROM_END ROM_START( virgedx_pci ) ROM_REGION(0x8000,"bios", 0) - ROM_LOAD("s3virgedx.bin", 0x00000, 0x8000, CRC(0da83bd3) SHA1(228a2d644e1732cb5a2eb1291608c7050cf39229) ) - //ROMX_LOAD("virgedxdiamond.bin", 0x00000, 0x8000, CRC(58b0dcda) SHA1(b13ae6b04db6fc05a76d924ddf2efe150b823029), ROM_BIOS(2) ) + ROM_DEFAULT_BIOS("virgedx") + + ROM_SYSTEM_BIOS( 0, "virgedx", "S3 ViRGE/DX v2.01.13" ) + ROMX_LOAD("s3virgedx.bin", 0x00000, 0x8000, CRC(0da83bd3) SHA1(228a2d644e1732cb5a2eb1291608c7050cf39229), ROM_BIOS(0) ) + + ROM_SYSTEM_BIOS( 1, "dms3d2kp", "Diamond Stealth 3D 2000 Pro v3.04" ) + ROMX_LOAD("virgedxdiamond.bin", 0x00000, 0x8000, CRC(58b0dcda) SHA1(b13ae6b04db6fc05a76d924ddf2efe150b823029), ROM_BIOS(1) ) ROM_END const tiny_rom_entry *virge_pci_device::device_rom_region() const @@ -243,3 +248,4 @@ DEFINE_DEVICE_TYPE(VIRGE_PCI, virge_pci_device, "virge_pci", "S3 86C325 ViRGE") DEFINE_DEVICE_TYPE(VIRGEDX_PCI, virgedx_pci_device, "virgedx_pci", "S3 86C375 ViRGE/DX") +//VIRGEGX_PCI, /DX with SGRAM/SDRAM support diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/vision.cpp mame-0.264+dfsg.1/src/devices/bus/pci/vision.cpp --- mame-0.263+dfsg.1/src/devices/bus/pci/vision.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/vision.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,286 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +S3 Vision 864 / 868 / 964 / 968 + +TODO: +- Add Vision868 +- Add Trio32/Trio64, pillage roms from isa/svga_s3 +- Make ViRGE to derive from here rather than reinventing the wheel + +Notes: +- Some of these BIOSes are buggy in SDD VBETEST.EXE, doesn't return any video mode, + Reportedly mirocrys (vision964) and no9fx771 (vision968) has this inconvenient. + +**************************************************************************************************/ + +#include "emu.h" +#include "vision.h" + +#define LOG_WARN (1U << 1) + +#define VERBOSE (LOG_GENERAL | LOG_WARN) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) + + +DEFINE_DEVICE_TYPE(VISION864_PCI, vision864_pci_device, "vision864", "S3 86C864 Vision864") +// Vision868 +DEFINE_DEVICE_TYPE(VISION964_PCI, vision964_pci_device, "vision964", "S3 86C964 Vision964") +DEFINE_DEVICE_TYPE(VISION968_PCI, vision968_pci_device, "vision968", "S3 86C968 Vision968") + + + +vision864_pci_device::vision864_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_card_device(mconfig, type, tag, owner, clock) + , m_vga(*this, "vga") + , m_bios(*this, "bios") +{ +} + +vision864_pci_device::vision864_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : vision864_pci_device(mconfig, VISION864_PCI, tag, owner, clock) +{ + // device IDs: + // 88c0 = 86c864 DRAM v0 + // 88c1 = 86c864 DRAM v1 + // 88c2 = 86c864-P DRAM v2 + // 88c3 = 86c864-P DRAM v3 + // NOTE: class code = 0 (backward compatible VGA device) + set_ids(0x533388c1, 0x00, 0x000100, 0x00000000); +} + +ROM_START( vision864 ) + ROM_REGION32_LE( 0x8000, "bios", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS( 0, "vision864", "Phoenix S3 Vision864 1.04-01" ) + ROMX_LOAD( "bios.bin", 0x0000, 0x8000, CRC(791c9e0d) SHA1(340a64402958d2ee734d929dfce147d9afcf23f4), ROM_BIOS(0) ) + ROM_IGNORE( 0x8000 ) +ROM_END + +const tiny_rom_entry *vision864_pci_device::device_rom_region() const +{ + return ROM_NAME(vision864); +} + +void vision864_pci_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update("vga", FUNC(s3vision864_vga_device::screen_update)); + + S3_VISION864_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // 1MB, option for 2MB + m_vga->set_vram_size(2*1024*1024); +} + +void vision864_pci_device::device_start() +{ + pci_card_device::device_start(); + +// add_map(64 * 1024 * 1024, M_MEM | M_DISABLED, FUNC(vision864_pci_device::lfb_map)); +// set_map_address(0, 0x70000000); + + add_rom((u8 *)m_bios->base(), 0x8000); + expansion_rom_base = 0xc0000; + + // TODO: can't read the intr pin reg but still has an INTA# +} + +void vision864_pci_device::device_reset() +{ + pci_card_device::device_reset(); + + command = 0x0020; + command_mask = 0x23; + // Medium DEVSEL + status = 0x0200; + + remap_cb(); +} + +void vision864_pci_device::legacy_io_map(address_map &map) +{ + map(0, 0x02f).m(m_vga, FUNC(s3vision864_vga_device::io_map)); +} + +uint8_t vision864_pci_device::vram_r(offs_t offset) +{ + return downcast(m_vga.target())->mem_r(offset); +} + +void vision864_pci_device::vram_w(offs_t offset, uint8_t data) +{ + downcast(m_vga.target())->mem_w(offset, data); +} + +void vision864_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + if (BIT(command, 1)) + { + memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(vision864_pci_device::vram_r)), write8sm_delegate(*this, FUNC(vision864_pci_device::vram_w))); + } + + if (BIT(command, 0)) + { + io_space->install_device(0x03b0, 0x03df, *this, &vision864_pci_device::legacy_io_map); + } +} + +/****************** + * + * Vision964 + * + *****************/ + +vision964_pci_device::vision964_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : vision864_pci_device(mconfig, type, tag, owner, clock) +{ +} + +vision964_pci_device::vision964_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : vision964_pci_device(mconfig, VISION964_PCI, tag, owner, clock) +{ + // device IDs: + // 88d0-88d1 = 86c964 VRAM v0-1 + // 88d2-88d3 = 86c964-P VRAM v2-3 + // NOTE: class code = 0 (backward compatible VGA device) + set_ids(0x533388d0, 0x00, 0x000100, 0x00000000); +} + +ROM_START( vision964 ) + ROM_REGION32_LE( 0x8000, "bios", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS("mirocrys") + + ROM_SYSTEM_BIOS( 0, "mirocrys", "miroCRYSTAL Rev.2.13" ) + ROMX_LOAD( "mirocrystal.vbi", 0x0000, 0x8000, CRC(d0b0aa1c) SHA1(004e2432c4783f1539a7989e7d9ee422df09e695), ROM_BIOS(0) ) +ROM_END + +const tiny_rom_entry *vision964_pci_device::device_rom_region() const +{ + return ROM_NAME(vision964); +} + +void vision964_pci_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update("vga", FUNC(s3vision964_vga_device::screen_update)); + + S3_VISION964_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // 2MB/4MB/8MB + m_vga->set_vram_size(4*1024*1024); +} + + +/****************** + * + * Vision968 + * + *****************/ + +vision968_pci_device::vision968_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : vision964_pci_device(mconfig, VISION968_PCI, tag, owner, clock) +{ + // device IDs: + // 88f0-88f3 = 86c968 RAM v0-3 + // first device to actually have a real class code + set_ids(0x533388f0, 0x00, 0x030000, 0x00000000); +} + +ROM_START( vision968 ) + ROM_REGION32_LE( 0x8000, "bios", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS("elsaw2k") + + ROM_SYSTEM_BIOS( 0, "no9fx771", "Number Nine 9FX MotionFX 771 v2.45.11" ) + ROMX_LOAD( "no9motionfx771.bin", 0x0000, 0x8000, CRC(7732e382) SHA1(9ec2fe056712cef39bd8380d406be3c874ea5ec9), ROM_BIOS(0) ) + ROM_IGNORE( 0x8000 ) + + ROM_SYSTEM_BIOS( 1, "elsaw2k", "Elsa Winner 2000Pro/X-8 v1.21.01-B" ) + ROMX_LOAD( "elsaw20008m.bin", 0x0000, 0x8000, CRC(47563211) SHA1(f51a40956c3e6e7c86851d81f81ba5f77509d361), ROM_BIOS(1) ) + ROM_IGNORE( 0x8000 ) + + ROM_SYSTEM_BIOS( 2, "speamp64", "SPEA/Videoseven V7-Mercury P-64 v1.01-08" ) + ROMX_LOAD( "spea.bin", 0x0000, 0x8000, CRC(2caeadaf) SHA1(236829f1e6065a2f0ebee91f71891d8402f0ab5a), ROM_BIOS(2) ) + ROM_IGNORE( 0x8000 ) +ROM_END + +const tiny_rom_entry *vision968_pci_device::device_rom_region() const +{ + return ROM_NAME(vision968); +} + +void vision968_pci_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update("vga", FUNC(s3vision968_vga_device::screen_update)); + + S3_VISION968_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + // 2MB/4MB/8MB + m_vga->set_vram_size(4*1024*1024); +// m_vga->linear_config_changed().set(FUNC(s3vision864_vga_device::linear_config_changed_w)); +} + +void vision968_pci_device::device_start() +{ + pci_card_device::device_start(); + +// add_map(64 * 1024 * 1024, M_MEM | M_DISABLED, FUNC(vision968_pci_device::lfb_map)); + add_map(64 * 1024 * 1024, M_MEM, FUNC(vision968_pci_device::lfb_map)); + set_map_address(0, 0x70000000); + + add_rom((u8 *)m_bios->base(), 0x8000); + expansion_rom_base = 0xc0000; + + // INTA# + intr_pin = 1; +} + +void vision968_pci_device::device_reset() +{ + pci_card_device::device_reset(); + + command = 0x0020; + command_mask = 0x23; + // Adds fast back-to-back + status = 0x0280; + + remap_cb(); +} + +// TODO: 0x0200'0000 "mirror" (really an endian relocation?) +void vision968_pci_device::lfb_map(address_map &map) +{ + map(0x0000'0000, 0x00ff'ffff).rw(m_vga, FUNC(s3vision864_vga_device::mem_linear_r), FUNC(s3vision864_vga_device::mem_linear_w)); +// map(0x0100'0000, 0x0100'7fff) image transfer data + map(0x0100'8000, 0x0100'803f).m(FUNC(vision968_pci_device::config_map)); +// map(0x0100'8100, 0x0100'816f) packed copro regs +// map(0x0100'82e8, 0x0100'82e8) current ypos +// map(0x0100'82ea, 0x0100'82ea) current ypos-2 + map(0x0100'83b0, 0x0100'83df).m(m_vga, FUNC(s3vision968_vga_device::io_map)); +// map(0x0100'8502, 0x0100'8502) (VGA $0102 alias) +// map(0x0100'8504, 0x0100'8504) (VGA $42e8 alias) +// map(0x0100'8508, 0x0100'8508) (VGA $46e8 alias) +// map(0x0100'850c, 0x0100'850c) (VGA $4ae8 alias) +// map(0x0100'86e8, 0x0100'8eea) PnP copro region +// map(0x0101'0000, 0x0101'3fff) Pixel formatter data transfer +// map(0x0101'4000, 0x0101'7fff) Pixel formatter Mask data +// map(0x0101'8080, 0x0101'809f) Pixel formatter regs +} + +void vision968_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + vision964_pci_device::map_extra( + memory_window_start, memory_window_end, memory_offset, memory_space, + io_window_start, io_window_end, io_offset, io_space + ); + // TODO: new MMIO goes here +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/pci/vision.h mame-0.264+dfsg.1/src/devices/bus/pci/vision.h --- mame-0.263+dfsg.1/src/devices/bus/pci/vision.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pci/vision.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,76 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_BUS_PCI_S3VISION_PCI_H +#define MAME_BUS_PCI_S3VISION_PCI_H + +#pragma once + +#include "pci_slot.h" + +#include "video/pc_vga_s3.h" + +class vision864_pci_device : public pci_card_device +{ +public: + vision864_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + static constexpr feature_type imperfect_features() { return feature::GRAPHICS; } + + void legacy_io_map(address_map &map); + +protected: + vision864_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + required_device m_vga; + required_memory_region m_bios; +private: + u8 vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); +}; + +class vision964_pci_device : public vision864_pci_device +{ +public: + vision964_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + vision964_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; +}; + +class vision968_pci_device : public vision964_pci_device +{ +public: + vision968_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_start() override; + virtual void device_reset() override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + void lfb_map(address_map &map); +}; + +DECLARE_DEVICE_TYPE(VISION864_PCI, vision864_pci_device) +DECLARE_DEVICE_TYPE(VISION964_PCI, vision964_pci_device) +DECLARE_DEVICE_TYPE(VISION968_PCI, vision968_pci_device) + +#endif // MAME_BUS_PCI_S3VISION_PCI_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg100/plg100.cpp mame-0.264+dfsg.1/src/devices/bus/plg100/plg100.cpp --- mame-0.263+dfsg.1/src/devices/bus/plg100/plg100.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg100/plg100.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert - -#include "emu.h" -#include "plg100.h" - -#include "vl.h" - -DEFINE_DEVICE_TYPE(PLG100_CONNECTOR, plg100_connector, "plg100_connector", "PLG100 extension connector") - -plg100_connector::plg100_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PLG100_CONNECTOR, tag, owner, clock), - device_single_card_slot_interface(mconfig, *this), - device_mixer_interface(mconfig, *this, 2), - m_midi_tx(*this) -{ -} - -void plg100_connector::device_start() -{ - save_item(NAME(m_state_system_is_annoying)); -} - -void plg100_connector::midi_rx(int state) -{ - auto card = get_card_device(); - if(card) - card->midi_rx(state); -} - -void plg100_intf(device_slot_interface &device) -{ - device.option_add("vl", PLG100_VL); -} - -device_plg100_interface::device_plg100_interface(const machine_config &mconfig, device_t &device) : - device_interface(device, "plg100"), - m_connector(nullptr) -{ -} - -device_plg100_interface::~device_plg100_interface() -{ -} - -void device_plg100_interface::interface_pre_start() -{ - m_connector = downcast(device().owner()); -} diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg100/plg100.h mame-0.264+dfsg.1/src/devices/bus/plg100/plg100.h --- mame-0.263+dfsg.1/src/devices/bus/plg100/plg100.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg100/plg100.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert - -// The PLG100 series is a bunch of proprietary plugins for the Yamaha -// MU series of expanders. It mostly provides two midi-rate (and midi -// protocol) serial lines (in and out) and two stereo serial sample -// streams (in and out too). - -// Known existing cards: -// PLG100-DX: DX7 as a plugin -// PLG100-SG: Singing speech synthesis, e.g. a Vocaloid before the Vocaloid existed -// PLG100-VH: Voice Harmonizer, harmony effects on the A/D inputs -// PLG100-VL: Virtual Acoustic Synthesis, physical-modelling synthesis, a VL70-m on a plugin card -// PLG100-XG: MU50 as a plugin - -#ifndef MAME_BUS_PLG100_PLG100_H -#define MAME_BUS_PLG100_PLG100_H - -#pragma once - -class device_plg100_interface; - -class plg100_connector: public device_t, public device_single_card_slot_interface, public device_mixer_interface -{ -public: - template - plg100_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) - : plg100_connector(mconfig, tag, owner, (uint32_t)0) - { - option_reset(); - opts(*this); - set_default_option(dflt); - set_fixed(false); - } - - plg100_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - void midi_rx(int state); - auto midi_tx() { return m_midi_tx.bind(); } - - void do_midi_tx(int state) { m_midi_tx(state); } - -protected: - bool m_state_system_is_annoying = true; - devcb_write_line m_midi_tx; - - virtual void device_start() override; -}; - -class device_plg100_interface: public device_interface -{ -public: - virtual ~device_plg100_interface(); - - virtual void midi_rx(int state) = 0; - -protected: - plg100_connector *m_connector; - - device_plg100_interface(const machine_config &mconfig, device_t &device); - - virtual void interface_pre_start() override; -}; - -DECLARE_DEVICE_TYPE(PLG100_CONNECTOR, plg100_connector) - -void plg100_intf(device_slot_interface &device); - -#endif // MAME_BUS_PLG100_PLG100_H - diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg100/vl.cpp mame-0.264+dfsg.1/src/devices/bus/plg100/vl.cpp --- mame-0.263+dfsg.1/src/devices/bus/plg100/vl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg100/vl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: Olivier Galibert - -// Yamaha PLG100-VL - -// Virtual Acoustic Synthesis, physical-modelling synthesis, VL70-m on a plugin board - -// Build around a h8 for the control and a dsp-v for the synthesis - -#include "emu.h" -#include "vl.h" - -#include "cpu/h8/h83002.h" -#include "sound/dspv.h" - -namespace { - -class plg100_vl_device : public device_t, public device_plg100_interface -{ -public: - plg100_vl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); - virtual ~plg100_vl_device(); - - virtual void midi_rx(int state) override; - -protected: - virtual void device_start() override; - virtual void device_reset() override; - const tiny_rom_entry *device_rom_region() const override; - virtual void device_add_mconfig(machine_config &config) override; - -private: - required_device m_cpu; - required_device m_dspv; - - void map(address_map &map); -}; - -plg100_vl_device::plg100_vl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, PLG100_VL, tag, owner, clock), - device_plg100_interface(mconfig, *this), - m_cpu(*this, "cpu"), - m_dspv(*this, "dspv") -{ -} - -plg100_vl_device::~plg100_vl_device() -{ -} - -void plg100_vl_device::midi_rx(int state) -{ - m_cpu->sci_rx_w<0>(state); -} - -void plg100_vl_device::map(address_map &map) -{ - map(0x000000, 0x0fffff).rom().region("cpu", 0); - map(0x400000, 0x40007f).m(m_dspv, FUNC(dspv_device::map)); - map(0x200000, 0x20ffff).ram(); -} - -void plg100_vl_device::device_add_mconfig(machine_config &config) -{ - H83002(config, m_cpu, 10_MHz_XTAL); - m_cpu->set_addrmap(AS_PROGRAM, &plg100_vl_device::map); - m_cpu->write_sci_tx<1>().set([this] (int state) { m_connector->do_midi_tx(state); }); - - DSPV(config, m_dspv, 22.5792_MHz_XTAL); - m_dspv->add_route(0, DEVICE_SELF_OWNER, 1.0, AUTO_ALLOC_INPUT, 0); - m_dspv->add_route(1, DEVICE_SELF_OWNER, 1.0, AUTO_ALLOC_INPUT, 1); -} - -ROM_START( plg100_vl ) - ROM_REGION( 0x100000, "cpu", 0 ) - ROM_LOAD16_WORD_SWAP( "xt47810.ic03", 0x000000, 0x100000, CRC(ef472e45) SHA1(13d54c33a4708c77de2dc1e02210da107add6ce6) ) -ROM_END - -void plg100_vl_device::device_start() -{ -} - -void plg100_vl_device::device_reset() -{ - // Active-low, wired to gnd - m_cpu->set_input_line(0, ASSERT_LINE); -} - -const tiny_rom_entry *plg100_vl_device::device_rom_region() const -{ - return ROM_NAME(plg100_vl); -} - -} // anonymous namespace - -DEFINE_DEVICE_TYPE_PRIVATE(PLG100_VL, device_plg100_interface, plg100_vl_device, "plg100_vl", "Yamaha PLG100-VL") diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg100/vl.h mame-0.264+dfsg.1/src/devices/bus/plg100/vl.h --- mame-0.263+dfsg.1/src/devices/bus/plg100/vl.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg100/vl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert - -#ifndef MAME_BUS_PLG100_VL_H -#define MAME_BUS_PLG100_VL_H - -// Yamaha PLG100-VL - -#pragma once - -#include "plg100.h" - -DECLARE_DEVICE_TYPE(PLG100_VL, device_plg100_interface) - -#endif // MAME_BUS_PLG100_VL_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg100-vl.cpp mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg100-vl.cpp --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg100-vl.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg100-vl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,96 @@ +// license:BSD-3-Clause +// copyright-holders: Olivier Galibert + +// Yamaha PLG100-VL + +// Virtual Acoustic Synthesis, physical-modelling synthesis, VL70-m on a plugin board + +// Build around a h8 for the control and a dsp-v for the synthesis + +#include "emu.h" +#include "plg100-vl.h" + +#include "cpu/h8/h83002.h" +#include "sound/dspv.h" + +namespace { + +class plg100_vl_device : public device_t, public device_plg1x0_interface +{ +public: + plg100_vl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + virtual ~plg100_vl_device(); + + virtual void midi_rx(int state) override; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + required_device m_cpu; + required_device m_dspv; + + void map(address_map &map); +}; + +plg100_vl_device::plg100_vl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, PLG100_VL, tag, owner, clock), + device_plg1x0_interface(mconfig, *this), + m_cpu(*this, "cpu"), + m_dspv(*this, "dspv") +{ +} + +plg100_vl_device::~plg100_vl_device() +{ +} + +void plg100_vl_device::midi_rx(int state) +{ + m_cpu->sci_rx_w<1>(state); +} + +void plg100_vl_device::map(address_map &map) +{ + map(0x000000, 0x0fffff).rom().region("cpu", 0); + map(0x400000, 0x40007f).m(m_dspv, FUNC(dspv_device::map)); + map(0x200000, 0x20ffff).ram(); +} + +void plg100_vl_device::device_add_mconfig(machine_config &config) +{ + H83002(config, m_cpu, 10_MHz_XTAL); + m_cpu->set_addrmap(AS_PROGRAM, &plg100_vl_device::map); + m_cpu->write_sci_tx<1>().set([this] (int state) { m_connector->do_midi_tx(state); }); + + DSPV(config, m_dspv, 22.5792_MHz_XTAL); + m_dspv->add_route(0, DEVICE_SELF_OWNER, 1.0, AUTO_ALLOC_INPUT, 0); + m_dspv->add_route(1, DEVICE_SELF_OWNER, 1.0, AUTO_ALLOC_INPUT, 1); +} + +ROM_START( plg100_vl ) + ROM_REGION( 0x100000, "cpu", 0 ) + ROM_LOAD16_WORD_SWAP( "xt47810.ic03", 0x000000, 0x100000, CRC(ef472e45) SHA1(13d54c33a4708c77de2dc1e02210da107add6ce6) ) +ROM_END + +void plg100_vl_device::device_start() +{ +} + +void plg100_vl_device::device_reset() +{ + // Active-low, wired to gnd + m_cpu->set_input_line(0, ASSERT_LINE); +} + +const tiny_rom_entry *plg100_vl_device::device_rom_region() const +{ + return ROM_NAME(plg100_vl); +} + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(PLG100_VL, device_plg1x0_interface, plg100_vl_device, "plg100_vl", "Yamaha PLG100-VL") diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg100-vl.h mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg100-vl.h --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg100-vl.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg100-vl.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,15 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +#ifndef MAME_BUS_PLG1X0_PLG100VL_H +#define MAME_BUS_PLG1X0_PLG100VL_H + +// Yamaha PLG100-VL + +#pragma once + +#include "plg1x0.h" + +DECLARE_DEVICE_TYPE(PLG100_VL, device_plg1x0_interface) + +#endif // MAME_BUS_PLG1X0_PLG100_VL_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg150-ap.cpp mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg150-ap.cpp --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg150-ap.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg150-ap.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,92 @@ +// license:BSD-3-Clause +// copyright-holders: Olivier Galibert + +// Yamaha PLG150-AP + +// Acoustic Piano, a plugin dedicated to a high-quality piano sound + +// Dual SWX00 + +#include "emu.h" +#include "plg150-ap.h" + +#include "cpu/h8/swx00.h" + +namespace { + +class plg150_ap_device : public device_t, public device_plg1x0_interface +{ +public: + plg150_ap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + virtual ~plg150_ap_device(); + + virtual void midi_rx(int state) override; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + required_device m_cpu; + + void map(address_map &map); +}; + +plg150_ap_device::plg150_ap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, PLG150_AP, tag, owner, clock), + device_plg1x0_interface(mconfig, *this), + m_cpu(*this, "cpu") +{ +} + +plg150_ap_device::~plg150_ap_device() +{ +} + +void plg150_ap_device::midi_rx(int state) +{ + m_cpu->sci_rx_w<1>(state); +} + +void plg150_ap_device::map(address_map &map) +{ + map(0x000000, 0x07ffff).rom().region("cpu", 0); + map(0x200000, 0x207fff).ram(); +} + +void plg150_ap_device::device_add_mconfig(machine_config &config) +{ + SWX00(config, m_cpu, 8.4672_MHz_XTAL*2, 1); + m_cpu->set_addrmap(AS_PROGRAM, &plg150_ap_device::map); + m_cpu->write_sci_tx<1>().set([this] (int state) { m_connector->do_midi_tx(state); }); + m_cpu->sci_set_external_clock_period(0, attotime::from_hz(500000)); + m_cpu->sci_set_external_clock_period(1, attotime::from_hz(500000)); +} + +ROM_START( plg150_ap ) + ROM_REGION( 0x80000, "cpu", 0 ) + ROM_LOAD16_WORD_SWAP( "x5757b0.ic03", 0x00000, 0x80000, CRC(5383b363) SHA1(b8e8e0673439c80dc9aecd6638f1c20454c82080) ) + + ROM_REGION( 0x1000000, "swx00", 0 ) + ROM_LOAD( "x575810.ic09", 0x000000, 0x800000, CRC(273b4574) SHA1(b33d67f7fe3a020c19133cc52bd6a228227941c5) ) + ROM_LOAD( "x575910.ic11", 0x800000, 0x800000, CRC(32a37ef3) SHA1(c0b5dfb1fbb5a3ddd33e6303039fbc197478abd2) ) +ROM_END + +void plg150_ap_device::device_start() +{ +} + +void plg150_ap_device::device_reset() +{ +} + +const tiny_rom_entry *plg150_ap_device::device_rom_region() const +{ + return ROM_NAME(plg150_ap); +} + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(PLG150_AP, device_plg1x0_interface, plg150_ap_device, "plg150_ap", "Yamaha PLG150-AP") diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg150-ap.h mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg150-ap.h --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg150-ap.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg150-ap.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,15 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +#ifndef MAME_BUS_PLG1X0_PLG150AP_H +#define MAME_BUS_PLG1X0_PLG150AP_H + +// Yamaha PLG150-AP + +#pragma once + +#include "plg1x0.h" + +DECLARE_DEVICE_TYPE(PLG150_AP, device_plg1x0_interface) + +#endif // MAME_BUS_PLG1X0_PLG150_AP_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg1x0.cpp mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg1x0.cpp --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg1x0.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg1x0.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,51 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +#include "emu.h" +#include "plg1x0.h" + +#include "plg100-vl.h" +#include "plg150-ap.h" + +DEFINE_DEVICE_TYPE(PLG1X0_CONNECTOR, plg1x0_connector, "plg1x0_connector", "PLG1x0 extension connector") + +plg1x0_connector::plg1x0_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, PLG1X0_CONNECTOR, tag, owner, clock), + device_single_card_slot_interface(mconfig, *this), + device_mixer_interface(mconfig, *this, 2), + m_midi_tx(*this) +{ +} + +void plg1x0_connector::device_start() +{ + save_item(NAME(m_state_system_is_annoying)); +} + +void plg1x0_connector::midi_rx(int state) +{ + auto card = get_card_device(); + if(card) + card->midi_rx(state); +} + +void plg1x0_intf(device_slot_interface &device) +{ + device.option_add("plg100vl", PLG100_VL); + device.option_add("plg150ap", PLG150_AP); +} + +device_plg1x0_interface::device_plg1x0_interface(const machine_config &mconfig, device_t &device) : + device_interface(device, "plg1x0"), + m_connector(nullptr) +{ +} + +device_plg1x0_interface::~device_plg1x0_interface() +{ +} + +void device_plg1x0_interface::interface_pre_start() +{ + m_connector = downcast(device().owner()); +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg1x0.h mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg1x0.h --- mame-0.263+dfsg.1/src/devices/bus/plg1x0/plg1x0.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/plg1x0/plg1x0.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,82 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// The PLG100 series is a bunch of proprietary plugins for the Yamaha +// MU series of expanders. It mostly provides two midi-rate (and midi +// protocol) serial lines (in and out) and two stereo serial sample +// streams (in and out too). +// +// The PLG150 series, the successor, seems essentially compatible. +// The main difference is (in some cases) nvram to save settings. + +// Known existing cards: +// PLG100-DX: DX7 as a plugin +// PLG100-SG: Singing speech synthesis, e.g. a Vocaloid before the Vocaloid existed +// PLG100-VH: Voice Harmonizer, harmony effects on the A/D inputs +// PLG100-VL: Virtual Acoustic Synthesis, physical-modelling synthesis, a VL70-m on a plugin card +// PLG100-XG: MU50 as a plugin +// +// PLG150-AN: Analog Physical Modeling +// PLG150-AP: Acoustic Piano +// PLG150-DR: Drums +// PLG150-DX: DX7 as a plugin +// PLG150-PC: Latin drums +// PLG150-PF: Piano +// PLG150-VL: Virtual Acoustic Synthesis + + +#ifndef MAME_BUS_PLG1X0_PLG1X0_H +#define MAME_BUS_PLG1X0_PLG1X0_H + +#pragma once + +class device_plg1x0_interface; + +class plg1x0_connector: public device_t, public device_single_card_slot_interface, public device_mixer_interface +{ +public: + template + plg1x0_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : plg1x0_connector(mconfig, tag, owner, (uint32_t)0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + + plg1x0_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void midi_rx(int state); + auto midi_tx() { return m_midi_tx.bind(); } + + void do_midi_tx(int state) { m_midi_tx(state); } + +protected: + bool m_state_system_is_annoying = true; + devcb_write_line m_midi_tx; + + virtual void device_start() override; +}; + +class device_plg1x0_interface: public device_interface +{ +public: + virtual ~device_plg1x0_interface(); + + virtual void midi_rx(int state) = 0; + +protected: + plg1x0_connector *m_connector; + + device_plg1x0_interface(const machine_config &mconfig, device_t &device); + + virtual void interface_pre_start() override; +}; + +DECLARE_DEVICE_TYPE(PLG1X0_CONNECTOR, plg1x0_connector) + +void plg1x0_intf(device_slot_interface &device); + +#endif // MAME_BUS_PLG1X0_PLG1X0_H + diff -Nru mame-0.263+dfsg.1/src/devices/bus/pofo/ccm.cpp mame-0.264+dfsg.1/src/devices/bus/pofo/ccm.cpp --- mame-0.263+dfsg.1/src/devices/bus/pofo/ccm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pofo/ccm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,8 @@ #include "softlist_dev.h" +#include + //************************************************************************** @@ -70,15 +72,25 @@ std::pair portfolio_memory_card_slot_device::call_load() { + std::error_condition err; + if (m_card) { if (!loaded_through_softlist()) - fread(m_card->m_rom, length()); + { + size_t const size = length(); + size_t actual; + std::tie(err, m_card->m_rom, actual) = read(image_core_file(), size); + if (!err && (actual != size)) + err = std::errc::io_error; + } else + { load_software_region("rom", m_card->m_rom); + } } - return std::make_pair(std::error_condition(), std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/pofo/hpc104.cpp mame-0.264+dfsg.1/src/devices/bus/pofo/hpc104.cpp --- mame-0.263+dfsg.1/src/devices/bus/pofo/hpc104.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pofo/hpc104.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -141,6 +141,25 @@ } +void pofo_hpc104_device::nvram_default() +{ +} + + +bool pofo_hpc104_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram, 0x40000); + return !err && (actual == 0x40000); +} + + +bool pofo_hpc104_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram, 0x40000); + return !err; +} + + //------------------------------------------------- // nrdi_r - read //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/pofo/hpc104.h mame-0.264+dfsg.1/src/devices/bus/pofo/hpc104.h --- mame-0.263+dfsg.1/src/devices/bus/pofo/hpc104.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pofo/hpc104.h 2024-03-25 14:00:46.000000000 +0000 @@ -33,20 +33,18 @@ protected: pofo_hpc104_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // optional information overrides + // device_t implementation virtual void device_add_mconfig(machine_config &config) override; virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; - // device_nvram_interface overrides - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram, 0x40000, actual) && actual == 0x40000; } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram, 0x40000, actual) && actual == 0x40000; } + // device_nvram_interface implementation + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; - // device_portfolio_expansion_slot_interface overrides + // device_portfolio_expansion_slot_interface implementation virtual bool nmd1() override { return m_ccm->cdet_r(); } virtual uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/pofo/ram.cpp mame-0.264+dfsg.1/src/devices/bus/pofo/ram.cpp --- mame-0.263+dfsg.1/src/devices/bus/pofo/ram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pofo/ram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -44,6 +44,25 @@ } +void portfolio_ram_card_device::nvram_default() +{ +} + + +bool portfolio_ram_card_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram, m_nvram.bytes()); + return !err && (actual == m_nvram.bytes()); +} + + +bool portfolio_ram_card_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram, m_nvram.bytes()); + return !err; +} + + //------------------------------------------------- // nrdi_r - read //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/pofo/ram.h mame-0.264+dfsg.1/src/devices/bus/pofo/ram.h --- mame-0.263+dfsg.1/src/devices/bus/pofo/ram.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/pofo/ram.h 2024-03-25 14:00:46.000000000 +0000 @@ -30,15 +30,15 @@ portfolio_ram_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - // device-level overrides + // device_t implementation virtual void device_start() override; - // device_nvram_interface overrides - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram, m_nvram.bytes(), actual) && actual == m_nvram.bytes(); } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram, m_nvram.bytes(), actual) && actual == m_nvram.bytes(); } + // device_nvram_interface implementation + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; - // device_portfolio_memory_card_slot_interface overrides + // device_portfolio_memory_card_slot_interface implementation virtual bool cdet() override { return 0; } virtual uint8_t nrdi_r(offs_t offset) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/ql/rom.cpp mame-0.264+dfsg.1/src/devices/bus/ql/rom.cpp --- mame-0.263+dfsg.1/src/devices/bus/ql/rom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ql/rom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,8 @@ #include "emu.h" #include "rom.h" +#include + //************************************************************************** @@ -87,11 +89,17 @@ std::pair ql_rom_cartridge_slot_device::call_load() { + std::error_condition err; + if (m_card) { if (!loaded_through_softlist()) { - fread(m_card->m_rom, length()); + size_t const size = length(); + size_t actual; + std::tie(err, m_card->m_rom, actual) = util::read(image_core_file(), size); + if (!err && (actual != size)) + err = std::errc::io_error; } else { @@ -99,7 +107,7 @@ } } - return std::make_pair(std::error_condition(), std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/rs232/loopback.cpp mame-0.264+dfsg.1/src/devices/bus/rs232/loopback.cpp --- mame-0.263+dfsg.1/src/devices/bus/rs232/loopback.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/rs232/loopback.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,7 +4,7 @@ #include "emu.h" #include "loopback.h" -DEFINE_DEVICE_TYPE(RS232_LOOPBACK, rs232_loopback_device, "rs232_loopback", "RS232 Loopback") +DEFINE_DEVICE_TYPE(RS232_LOOPBACK, rs232_loopback_device, "rs232_loopback", "RS-232 Loopback") rs232_loopback_device::rs232_loopback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, RS232_LOOPBACK, tag, owner, clock) @@ -43,7 +43,7 @@ } } -DEFINE_DEVICE_TYPE(DEC_RS232_LOOPBACK, dec_rs232_loopback_device, "dec_rs232_loopback", "RS232 Loopback (DEC 12-15336-00)") +DEFINE_DEVICE_TYPE(DEC_RS232_LOOPBACK, dec_rs232_loopback_device, "dec_rs232_loopback", "RS-232 Loopback (DEC 12-15336-00)") dec_rs232_loopback_device::dec_rs232_loopback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, DEC_RS232_LOOPBACK, tag, owner, clock) diff -Nru mame-0.263+dfsg.1/src/devices/bus/rs232/null_modem.cpp mame-0.264+dfsg.1/src/devices/bus/rs232/null_modem.cpp --- mame-0.263+dfsg.1/src/devices/bus/rs232/null_modem.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/rs232/null_modem.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -149,4 +149,4 @@ } } -DEFINE_DEVICE_TYPE(NULL_MODEM, null_modem_device, "null_modem", "RS232 Null Modem") +DEFINE_DEVICE_TYPE(NULL_MODEM, null_modem_device, "null_modem", "RS-232 Null Modem") diff -Nru mame-0.263+dfsg.1/src/devices/bus/rs232/pty.cpp mame-0.264+dfsg.1/src/devices/bus/rs232/pty.cpp --- mame-0.263+dfsg.1/src/devices/bus/rs232/pty.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/rs232/pty.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -159,4 +159,4 @@ } } -DEFINE_DEVICE_TYPE(PSEUDO_TERMINAL, pseudo_terminal_device, "pseudo_terminal", "Pseudo terminal") +DEFINE_DEVICE_TYPE(PSEUDO_TERMINAL, pseudo_terminal_device, "pseudo_terminal", "Pseudo Terminal") diff -Nru mame-0.263+dfsg.1/src/devices/bus/rs232/rs232_sync_io.cpp mame-0.264+dfsg.1/src/devices/bus/rs232/rs232_sync_io.cpp --- mame-0.263+dfsg.1/src/devices/bus/rs232/rs232_sync_io.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/rs232/rs232_sync_io.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -198,4 +198,4 @@ m_clk_timer->adjust(period , 0 , period); } -DEFINE_DEVICE_TYPE(RS232_SYNC_IO, rs232_sync_io_device, "rs232_sync_io", "RS232 Synchronous I/O") +DEFINE_DEVICE_TYPE(RS232_SYNC_IO, rs232_sync_io_device, "rs232_sync_io", "RS-232 Synchronous I/O") diff -Nru mame-0.263+dfsg.1/src/devices/bus/s100/seals8k.cpp mame-0.264+dfsg.1/src/devices/bus/s100/seals8k.cpp --- mame-0.263+dfsg.1/src/devices/bus/s100/seals8k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/s100/seals8k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -164,8 +164,8 @@ bool s100_8k_sc_bb_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_ram.get(), 0x2000, actual) && actual == 0x2000; + auto const [err, actual] = read(file, m_ram.get(), 0x2000); + return !err && (actual == 0x2000); } @@ -175,8 +175,8 @@ bool s100_8k_sc_bb_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_ram.get(), 0x2000, actual) && actual == 0x2000; + auto const [err, actual] = write(file, m_ram.get(), 0x2000); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/bus/saitek_osa/maestro.cpp mame-0.264+dfsg.1/src/devices/bus/saitek_osa/maestro.cpp --- mame-0.263+dfsg.1/src/devices/bus/saitek_osa/maestro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/saitek_osa/maestro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,8 +39,8 @@ #include "softlist_dev.h" -DEFINE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device, "osa_maestro", "Maestro B-D") -DEFINE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device, "osa_analyst", "Analyst") +DEFINE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device, "osa_maestro", "Saitek OSA Maestro B-D") +DEFINE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device, "osa_analyst", "Saitek OSA Analyst") //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/saitek_osa/maestroa.cpp mame-0.264+dfsg.1/src/devices/bus/saitek_osa/maestroa.cpp --- mame-0.263+dfsg.1/src/devices/bus/saitek_osa/maestroa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/saitek_osa/maestroa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -29,7 +29,7 @@ #include "softlist_dev.h" -DEFINE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device, "osa_maestroa", "Maestro A") +DEFINE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device, "osa_maestroa", "Saitek OSA Maestro A") //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/saitek_osa/sparc.cpp mame-0.264+dfsg.1/src/devices/bus/saitek_osa/sparc.cpp --- mame-0.263+dfsg.1/src/devices/bus/saitek_osa/sparc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/saitek_osa/sparc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -36,7 +36,7 @@ #include "sparc.h" -DEFINE_DEVICE_TYPE(OSA_SPARC, saitekosa_sparc_device, "osa_sparc", "Sparc") +DEFINE_DEVICE_TYPE(OSA_SPARC, saitekosa_sparc_device, "osa_sparc", "Saitek OSA Sparc") //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/saturn/bram.cpp mame-0.264+dfsg.1/src/devices/bus/saturn/bram.cpp --- mame-0.263+dfsg.1/src/devices/bus/saturn/bram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/saturn/bram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,14 +65,14 @@ bool saturn_bram_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_ext_bram[0], m_ext_bram.size(), actual) && actual == m_ext_bram.size(); + auto const [err, actual] = read(file, &m_ext_bram[0], m_ext_bram.size()); + return !err && (actual == m_ext_bram.size()); } bool saturn_bram_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_ext_bram[0], m_ext_bram.size(), actual) && actual == m_ext_bram.size(); + auto const [err, actual] = write(file, &m_ext_bram[0], m_ext_bram.size()); + return !err; } void saturn_bram_device::nvram_default() diff -Nru mame-0.263+dfsg.1/src/devices/bus/scv/slot.cpp mame-0.264+dfsg.1/src/devices/bus/scv/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/scv/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/scv/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -236,8 +236,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = get_cart_type(&rom[0], len); char const *const slot_string = scv_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/sega8/sega8_slot.cpp mame-0.264+dfsg.1/src/devices/bus/sega8/sega8_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/sega8/sega8_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/sega8/sega8_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -669,8 +669,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short uint32_t const offset = ((len % 0x4000) == 512) ? 512 : 0; diff -Nru mame-0.263+dfsg.1/src/devices/bus/snes/snes_slot.cpp mame-0.264+dfsg.1/src/devices/bus/snes/snes_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/snes/snes_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/snes/snes_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1044,8 +1044,7 @@ std::vector rom(len); int type = 0, addon = 0; - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check for error result or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &rom[0], len); // FIXME: check for error result or read returning short offset = snes_skip_header(&rom[0], len); diff -Nru mame-0.263+dfsg.1/src/devices/bus/ti99/gromport/gkracker.cpp mame-0.264+dfsg.1/src/devices/bus/ti99/gromport/gkracker.cpp --- mame-0.263+dfsg.1/src/devices/bus/ti99/gromport/gkracker.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ti99/gromport/gkracker.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -149,7 +149,8 @@ { m_romspace_selected = (state==ASSERT_LINE); // Propagate to the guest - if (m_cartridge != nullptr) m_cartridge->romgq_line(state); + if (m_cartridge != nullptr) + m_cartridge->romgq_line(state); } /* @@ -158,12 +159,14 @@ void ti99_gkracker_device::set_gromlines(line_state mline, line_state moline, line_state gsq) { m_grom_selected = (gsq==ASSERT_LINE); - if (m_cartridge != nullptr) m_cartridge->set_gromlines(mline, moline, gsq); + if (m_cartridge != nullptr) + m_cartridge->set_gromlines(mline, moline, gsq); } void ti99_gkracker_device::gclock_in(int state) { - if (m_cartridge != nullptr) m_cartridge->gclock_in(state); + if (m_cartridge != nullptr) + m_cartridge->gclock_in(state); } /* @@ -171,7 +174,7 @@ */ bool ti99_gkracker_device::is_grom_idle() { - return (m_cartridge != nullptr)? m_cartridge->is_grom_idle() : false; + return (m_cartridge != nullptr) ? m_cartridge->is_grom_idle() : false; } void ti99_gkracker_device::readz(offs_t offset, uint8_t *value) @@ -307,12 +310,14 @@ void ti99_gkracker_device::crureadz(offs_t offset, uint8_t *value) { - if (m_cartridge != nullptr) m_cartridge->crureadz(offset, value); + if (m_cartridge != nullptr) + m_cartridge->crureadz(offset, value); } void ti99_gkracker_device::cruwrite(offs_t offset, uint8_t data) { - if (m_cartridge != nullptr) m_cartridge->cruwrite(offset, data); + if (m_cartridge != nullptr) + m_cartridge->cruwrite(offset, data); } INPUT_CHANGED_MEMBER( ti99_gkracker_device::gk_changed ) @@ -378,8 +383,8 @@ bool ti99_gkracker_device::nvram_read(util::read_stream &file) { - size_t readsize; - if (file.read(m_ram_ptr, 81920, readsize)) + auto const [err, readsize] = util::read(file, m_ram_ptr, 81920); + if (err) return false; LOGMASKED(LOG_GKRACKER, "Reading NVRAM\n"); // If we increased the size, fill the remaining parts with 0 @@ -393,8 +398,8 @@ bool ti99_gkracker_device::nvram_write(util::write_stream &file) { LOGMASKED(LOG_GKRACKER, "Writing NVRAM\n"); - size_t writesize; - return !file.write(m_ram_ptr, 81920, writesize) && writesize == 81920; + auto const [err, writesize] = util::write(file, m_ram_ptr, 81920); + return !err; } void ti99_gkracker_device::device_start() diff -Nru mame-0.263+dfsg.1/src/devices/bus/ti99/internal/buffram.cpp mame-0.264+dfsg.1/src/devices/bus/ti99/internal/buffram.cpp --- mame-0.263+dfsg.1/src/devices/bus/ti99/internal/buffram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ti99/internal/buffram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -47,14 +47,14 @@ bool buffered_ram_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_mem.get(), m_size, actual) && actual == m_size; + auto const [err, actual] = util::read(file, m_mem.get(), m_size); + return !err && (actual == m_size); } bool buffered_ram_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_mem.get(), m_size, actual) && actual == m_size; + auto const [err, actua] = util::write(file, m_mem.get(), m_size); + return !err; } } // end namespace bus::ti99::internal diff -Nru mame-0.263+dfsg.1/src/devices/bus/ti99/peb/evpc.cpp mame-0.264+dfsg.1/src/devices/bus/ti99/peb/evpc.cpp --- mame-0.263+dfsg.1/src/devices/bus/ti99/peb/evpc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ti99/peb/evpc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -133,8 +133,8 @@ bool snug_enhanced_video_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_novram.get(), NOVRAM_SIZE, actual) && actual == NOVRAM_SIZE; + auto const [err, actual] = util::read(file, m_novram.get(), NOVRAM_SIZE); + return !err && (actual == NOVRAM_SIZE); } //------------------------------------------------- @@ -144,8 +144,8 @@ bool snug_enhanced_video_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_novram.get(), NOVRAM_SIZE, actual) && actual == NOVRAM_SIZE; + auto const [err, actual] = util::write(file, m_novram.get(), NOVRAM_SIZE); + return !err; } /* diff -Nru mame-0.263+dfsg.1/src/devices/bus/ti99/peb/horizon.cpp mame-0.264+dfsg.1/src/devices/bus/ti99/peb/horizon.cpp --- mame-0.263+dfsg.1/src/devices/bus/ti99/peb/horizon.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/ti99/peb/horizon.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -324,7 +324,6 @@ */ void horizon_ramdisk_device::crureadz(offs_t offset, uint8_t *value) { - return; } /* @@ -463,8 +462,8 @@ // Read complete file, at most ramsize+dsrsize // Mind that the configuration may have changed - size_t filesize; - if (file.read(&buffer[0], ramsize + dsrsize, filesize)) + auto const [err, filesize] = util::read(file, &buffer[0], ramsize + dsrsize); + if (err) return false; int nvramsize = int(filesize) - dsrsize; @@ -493,8 +492,8 @@ memcpy(&buffer[ramsize], m_dsrram->pointer(), dsrsize); // Store both parts in one file - size_t filesize; - return !file.write(buffer.get(), ramsize + dsrsize, filesize) && filesize == ramsize + dsrsize; + auto const [err, filesize] = util::write(file, buffer.get(), ramsize + dsrsize); + return !err; } bool horizon_ramdisk_device::nvram_can_write() const diff -Nru mame-0.263+dfsg.1/src/devices/bus/vcs/vcs_slot.cpp mame-0.264+dfsg.1/src/devices/bus/vcs/vcs_slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/vcs/vcs_slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vcs/vcs_slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -774,8 +774,7 @@ hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short int const type = identify_cart_type(&rom[0], len); char const *const slot_string = vcs_get_slot(type); diff -Nru mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/ctrl.cpp mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/ctrl.cpp --- mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/ctrl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/ctrl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,6 +65,7 @@ // SLOT_INTERFACE( vcs_control_port_devices ) //------------------------------------------------- +#include "cx85.h" #include "joybooster.h" #include "joystick.h" #include "keypad.h" @@ -82,6 +83,7 @@ device.option_add("joybstr", VCS_JOYSTICK_BOOSTER); device.option_add("wheel", VCS_WHEEL); device.option_add("keypad", VCS_KEYPAD); + device.option_add("cx85", ATARI_CX85); } void a800_control_port_devices(device_slot_interface &device) diff -Nru mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/cx85.cpp mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/cx85.cpp --- mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/cx85.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/cx85.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,126 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/********************************************************************** + + Atari CX85 Numeric Keypad + + Normal Atari 400/800 usage has this connect to controller port 2. + +**********************************************************************/ + +#include "emu.h" +#include "cx85.h" + +#include "machine/rescap.h" + + +//************************************************************************** +// DEVICE TYPE DEFINITION +//************************************************************************** + +DEFINE_DEVICE_TYPE(ATARI_CX85, atari_cx85_device, "atari_cx85", "Atari CX85 Numeric Keypad") + + +//************************************************************************** +// INPUT PORTS +//************************************************************************** + +static INPUT_PORTS_START(atari_cx85) + PORT_START("X1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_PLUS_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("X2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad + Enter") PORT_CODE(KEYCODE_ENTER_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("X3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad .") PORT_CODE(KEYCODE_DEL_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("X4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad F4 (Yes)") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad F2 (No)") PORT_CODE(KEYCODE_SLASH_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad F3 (Delete)") PORT_CODE(KEYCODE_ASTERISK) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Keypad F1 (Escape)") PORT_CODE(KEYCODE_NUMLOCK) +INPUT_PORTS_END + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// atari_cx85_device - constructor +//------------------------------------------------- + +atari_cx85_device::atari_cx85_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, ATARI_CX85, tag, owner, clock) + , device_vcs_control_port_interface(mconfig, *this) + , m_encoder(*this, "encoder") +{ +} + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void atari_cx85_device::device_add_mconfig(machine_config &config) +{ + MM74C923(config, m_encoder, 0); // MCM74C923N + m_encoder->set_cap_osc(CAP_U(.1)); + m_encoder->set_cap_debounce(CAP_U(.47)); + m_encoder->data_tri_callback().set_constant(0); + m_encoder->x1_rd_callback().set_ioport("X1"); + m_encoder->x2_rd_callback().set_ioport("X2"); + m_encoder->x3_rd_callback().set_ioport("X3"); + m_encoder->x4_rd_callback().set_ioport("X4"); + m_encoder->da_wr_callback().set(FUNC(atari_cx85_device::trigger_w)).invert(); +} + +//------------------------------------------------- +// device_input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor atari_cx85_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(atari_cx85); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void atari_cx85_device::device_start() +{ +} + +//------------------------------------------------- +// vcs_joy_r - read digital inputs +//------------------------------------------------- + +u8 atari_cx85_device::vcs_joy_r() +{ + // 74C923 outputs are buffered through 4049B + return (~m_encoder->read() & 0x0f) | (m_encoder->da_r() ? 0 : 0x20); +} + +//------------------------------------------------- +// vcs_pot_x_r - sample B pot +//------------------------------------------------- + +u8 atari_cx85_device::vcs_pot_x_r() +{ + // Schematics suggests this should also be inverted through 4049B, but drivers seem to work the opposite way + return BIT(m_encoder->read(), 4) ? 0xff : 0; +} diff -Nru mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/cx85.h mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/cx85.h --- mame-0.263+dfsg.1/src/devices/bus/vcs_ctrl/cx85.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vcs_ctrl/cx85.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/********************************************************************** + + Atari CX85 Numeric Keypad + +**********************************************************************/ + +#ifndef MAME_BUS_VCS_CTRL_CX85_H +#define MAME_BUS_VCS_CTRL_CX85_H + +#pragma once + +#include "ctrl.h" +#include "machine/mm74c922.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> atari_cx85_device + +class atari_cx85_device : public device_t, + public device_vcs_control_port_interface +{ +public: + // construction/destruction + atari_cx85_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + + // device_vcs_control_port_interface overrides + virtual u8 vcs_joy_r() override; + virtual u8 vcs_pot_x_r() override; + + virtual bool has_pot_x() override { return true; } + virtual bool has_pot_y() override { return false; } // pin 9 not used + +private: + required_device m_encoder; +}; + + +// device type declaration +DECLARE_DEVICE_TYPE(ATARI_CX85, atari_cx85_device) + +#endif // MAME_BUS_VCS_CTRL_CX85_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/vectrex/slot.cpp mame-0.264+dfsg.1/src/devices/bus/vectrex/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/vectrex/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vectrex/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -194,8 +194,7 @@ std::uint64_t size; hook.image_file()->length(size); std::vector rom(size); - std::size_t actual; - hook.image_file()->read(&rom[0], size, actual); + read(*hook.image_file(), &rom[0], size); int type = VECTREX_STD; if (!memcmp(&rom[0x06], "SRAM", 4)) // FIXME: bounds check! diff -Nru mame-0.263+dfsg.1/src/devices/bus/vic10/exp.cpp mame-0.264+dfsg.1/src/devices/bus/vic10/exp.cpp --- mame-0.263+dfsg.1/src/devices/bus/vic10/exp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vic10/exp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,8 @@ #include "formats/cbm_crt.h" +#include + //************************************************************************** // DEVICE DEFINITIONS @@ -88,20 +90,29 @@ { if (!loaded_through_softlist()) { + util::core_file &file = image_core_file(); size_t const size = length(); if (is_filetype("80")) { - fread(m_card->m_lorom, 0x2000); + size_t actual; + std::tie(err, m_card->m_lorom, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; - if (size == 0x4000) + if (!err && (size == 0x4000)) { - fread(m_card->m_uprom, 0x2000); + std::tie(err, m_card->m_uprom, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; } } else if (is_filetype("e0")) { - fread(m_card->m_uprom, size); + size_t actual; + std::tie(err, m_card->m_uprom, actual) = read(file, size); + if (!err && (actual != size)) + err = std::errc::io_error; } else if (is_filetype("crt")) { @@ -110,7 +121,7 @@ int exrom = 1; int game = 1; - if (cbm_crt_read_header(image_core_file(), &roml_size, &romh_size, &exrom, &game)) + if (cbm_crt_read_header(file, &roml_size, &romh_size, &exrom, &game)) { uint8_t *roml = nullptr; uint8_t *romh = nullptr; @@ -121,7 +132,7 @@ if (roml_size) roml = m_card->m_lorom.get(); if (romh_size) romh = m_card->m_lorom.get(); - cbm_crt_read_data(image_core_file(), roml, romh); + cbm_crt_read_data(file, roml, romh); } } else diff -Nru mame-0.263+dfsg.1/src/devices/bus/vic20/exp.cpp mame-0.264+dfsg.1/src/devices/bus/vic20/exp.cpp --- mame-0.263+dfsg.1/src/devices/bus/vic20/exp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vic20/exp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,10 @@ #include "emu.h" #include "exp.h" +#include "multibyte.h" + +#include + //************************************************************************** @@ -89,34 +93,144 @@ std::pair vic20_expansion_slot_device::call_load() { + std::error_condition err; + if (m_card) { if (!loaded_through_softlist()) { - if (is_filetype("20")) fread(m_card->m_blk1, 0x2000); - else if (is_filetype("40")) fread(m_card->m_blk2, 0x2000); - else if (is_filetype("60")) fread(m_card->m_blk3, 0x2000); - else if (is_filetype("70")) fread(m_card->m_blk3, 0x2000, 0x1000); - else if (is_filetype("a0")) fread(m_card->m_blk5, 0x2000); - else if (is_filetype("b0")) fread(m_card->m_blk5, 0x2000, 0x1000); + util::core_file &file = image_core_file(); + + if (is_filetype("20")) + { + size_t actual; + std::tie(err, m_card->m_blk1, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + } + else if (is_filetype("40")) + { + size_t actual; + std::tie(err, m_card->m_blk2, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + } + else if (is_filetype("60")) + { + size_t actual; + std::tie(err, m_card->m_blk3, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + } + else if (is_filetype("70")) + { + try + { + m_card->m_blk3 = make_unique_clear(0x2000); + size_t actual; + std::tie(err, actual) = read(file, &m_card->m_blk3[0x1000], 0x1000); + if (!err && (actual != 0x1000)) + err = std::errc::io_error; + } + catch (std::bad_alloc const &) + { + err = std::errc::not_enough_memory; + } + } + else if (is_filetype("a0")) + { + size_t actual; + std::tie(err, m_card->m_blk5, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + } + else if (is_filetype("b0")) + { + try + { + m_card->m_blk5 = make_unique_clear(0x2000); + size_t actual; + std::tie(err, actual) = read(file, &m_card->m_blk5[0x1000], 0x1000); + if (!err && (actual != 0x1000)) + err = std::errc::io_error; + } + catch (std::bad_alloc const &) + { + err = std::errc::not_enough_memory; + } + } else if (is_filetype("crt")) { + size_t actual; + // read the header uint8_t header[2]; - fread(&header, 2); - uint16_t const address = (header[1] << 8) | header[0]; + std::tie(err, actual) = read(file, &header, 2); + if (!err && (actual != 2)) + err = std::errc::io_error; - switch (address) + if (!err) { - case 0x2000: fread(m_card->m_blk1, 0x2000); break; - case 0x4000: fread(m_card->m_blk2, 0x2000); break; - case 0x6000: fread(m_card->m_blk3, 0x2000); break; - case 0x7000: fread(m_card->m_blk3, 0x2000, 0x1000); break; - case 0xa000: fread(m_card->m_blk5, 0x2000); break; - case 0xb000: fread(m_card->m_blk5, 0x2000, 0x1000); break; - default: return std::make_pair(image_error::INVALIDIMAGE, "Unsupported address in CRT file header"); + uint16_t const address = get_u16le(&header[0]); + switch (address) + { + case 0x2000: + std::tie(err, m_card->m_blk1, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + break; + case 0x4000: + std::tie(err, m_card->m_blk2, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + break; + case 0x6000: + std::tie(err, m_card->m_blk3, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + break; + case 0x7000: + try + { + m_card->m_blk3 = make_unique_clear(0x2000); + size_t actual; + std::tie(err, actual) = read(file, &m_card->m_blk3[0x1000], 0x1000); + if (!err && (actual != 0x1000)) + err = std::errc::io_error; + } + catch (std::bad_alloc const &) + { + err = std::errc::not_enough_memory; + } + break; + case 0xa000: + std::tie(err, m_card->m_blk5, actual) = read(file, 0x2000); + if (!err && (actual != 0x2000)) + err = std::errc::io_error; + break; + case 0xb000: + try + { + m_card->m_blk5 = make_unique_clear(0x2000); + size_t actual; + std::tie(err, actual) = read(file, &m_card->m_blk5[0x1000], 0x1000); + if (!err && (actual != 0x1000)) + err = std::errc::io_error; + } + catch (std::bad_alloc const &) + { + err = std::errc::not_enough_memory; + } + break; + default: + return std::make_pair(image_error::INVALIDIMAGE, "Unsupported address in CRT file header"); + } } } + else + { + err = image_error::INVALIDIMAGE; + } } else { @@ -127,7 +241,7 @@ } } - return std::make_pair(std::error_condition(), std::string()); + return std::make_pair(err, std::string()); } diff -Nru mame-0.263+dfsg.1/src/devices/bus/vic20/megacart.cpp mame-0.264+dfsg.1/src/devices/bus/vic20/megacart.cpp --- mame-0.263+dfsg.1/src/devices/bus/vic20/megacart.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vic20/megacart.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,6 +65,25 @@ } +void vic20_megacart_device::nvram_default() +{ +} + + +bool vic20_megacart_device::nvram_read(util::read_stream &file) +{ + auto const [err, actual] = read(file, m_nvram, 0x2000); + return !err && (actual == 0x2000); +} + + +bool vic20_megacart_device::nvram_write(util::write_stream &file) +{ + auto const [err, actual] = write(file, m_nvram, 0x2000); + return !err; +} + + //------------------------------------------------- // vic20_cd_r - cartridge data read //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/bus/vic20/megacart.h mame-0.264+dfsg.1/src/devices/bus/vic20/megacart.h --- mame-0.263+dfsg.1/src/devices/bus/vic20/megacart.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/vic20/megacart.h 2024-03-25 14:00:46.000000000 +0000 @@ -30,19 +30,17 @@ vic20_megacart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - // device-level overrides + // device_t implementation + virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override; - - // device_nvram_interface overrides - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read(m_nvram, 0x2000, actual) && actual == 0x2000; } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(m_nvram, 0x2000, actual) && actual == 0x2000; } + // device_nvram_interface implementation + virtual void nvram_default() override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; - // device_vic20_expansion_card_interface overrides + // device_vic20_expansion_card_interface implementation virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override; virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override; diff -Nru mame-0.263+dfsg.1/src/devices/bus/wswan/slot.cpp mame-0.264+dfsg.1/src/devices/bus/wswan/slot.cpp --- mame-0.263+dfsg.1/src/devices/bus/wswan/slot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/wswan/slot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -290,8 +290,7 @@ int type; u32 nvram; - size_t actual; - hook.image_file()->read(&rom[0], size, actual); + /*[err, actual] =*/ read(*hook.image_file(), &rom[0], size); // nvram size is not really used here, but we set it up nevertheless type = get_cart_type(&rom[0], size, nvram); diff -Nru mame-0.263+dfsg.1/src/devices/bus/x68k/x68k_neptunex.cpp mame-0.264+dfsg.1/src/devices/bus/x68k/x68k_neptunex.cpp --- mame-0.263+dfsg.1/src/devices/bus/x68k/x68k_neptunex.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/x68k/x68k_neptunex.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,8 +53,9 @@ m_slot->space().install_readwrite_handler(0xece000,0xece3ff, read16s_delegate(*this, FUNC(x68k_neptune_device::x68k_neptune_port_r)), write16s_delegate(*this, FUNC(x68k_neptune_device::x68k_neptune_port_w)), 0xffffffff); } -void x68k_neptune_device::device_reset() { - memcpy(m_prom, m_dp8390->get_mac(), 6); +void x68k_neptune_device::device_reset() +{ + memcpy(m_prom, &m_dp8390->get_mac()[0], 6); } uint16_t x68k_neptune_device::x68k_neptune_port_r(offs_t offset, uint16_t mem_mask) diff -Nru mame-0.263+dfsg.1/src/devices/bus/z88/ram.cpp mame-0.264+dfsg.1/src/devices/bus/z88/ram.cpp --- mame-0.263+dfsg.1/src/devices/bus/z88/ram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/z88/ram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,18 +11,97 @@ #include "emu.h" #include "ram.h" -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ + +namespace { //************************************************************************** -// GLOBAL VARIABLES +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(Z88_32K_RAM, z88_32k_ram_device, "z88_32k_ram", "Z88 32KB RAM") -DEFINE_DEVICE_TYPE(Z88_128K_RAM, z88_128k_ram_device, "z88_128k_ram", "Z88 128KB RAM") -DEFINE_DEVICE_TYPE(Z88_512K_RAM, z88_512k_ram_device, "z88_512k_ram", "Z88 512KB RAM") -DEFINE_DEVICE_TYPE(Z88_1024K_RAM, z88_1024k_ram_device, "z88_1024k_ram", "Z88 1024KB RAM") +// ======================> z88_32k_ram_device + +class z88_32k_ram_device : public device_t, + public device_nvram_interface, + public device_z88cart_interface +{ +public: + // construction/destruction + z88_32k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + z88_32k_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t implementations + virtual void device_start() override; + + // device_nvram_interface implementation + virtual void nvram_default() override + { + } + virtual bool nvram_read(util::read_stream &file) override + { + auto const [err, actual] = util::read(file, get_cart_base(), get_cart_size()); + return !err && (actual == get_cart_size()); + } + virtual bool nvram_write(util::write_stream &file) override + { + auto const [err, actual] = util::write(file, get_cart_base(), get_cart_size()); + return !err; + } + + // z88cart_interface implementation + virtual uint8_t read(offs_t offset) override; + virtual void write(offs_t offset, uint8_t data) override; + virtual uint8_t* get_cart_base() override; + virtual uint32_t get_cart_size() override { return 0x8000; } + +protected: + // internal state + uint8_t * m_ram; +}; + +// ======================> z88_128k_ram_device + +class z88_128k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_128k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x20000; } +}; + +// ======================> z88_512k_ram_device + +class z88_512k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_512k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x80000; } +}; + +// ======================> z88_1024k_ram_device + +class z88_1024k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_1024k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface overrides + virtual uint32_t get_cart_size() override { return 0x100000; } +}; + +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ //************************************************************************** // LIVE DEVICE @@ -109,3 +188,15 @@ { m_ram[offset & (get_cart_size() - 1)] = data; } + +} // anonymous namespace + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(Z88_32K_RAM, device_z88cart_interface, z88_32k_ram_device, "z88_32k_ram", "Z88 32KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_128K_RAM, device_z88cart_interface, z88_128k_ram_device, "z88_128k_ram", "Z88 128KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_512K_RAM, device_z88cart_interface, z88_512k_ram_device, "z88_512k_ram", "Z88 512KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_1024K_RAM, device_z88cart_interface, z88_1024k_ram_device, "z88_1024k_ram", "Z88 1024KB RAM") diff -Nru mame-0.263+dfsg.1/src/devices/bus/z88/ram.h mame-0.264+dfsg.1/src/devices/bus/z88/ram.h --- mame-0.263+dfsg.1/src/devices/bus/z88/ram.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/z88/ram.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,85 +7,10 @@ #include "z88.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> z88_32k_ram_device - -class z88_32k_ram_device : public device_t, - public device_nvram_interface, - public device_z88cart_interface -{ -public: - // construction/destruction - z88_32k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - z88_32k_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - // device-level overrides - virtual void device_start() override; - - // device_nvram_interface overrides - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read (get_cart_base(), get_cart_size(), actual) && actual == get_cart_size(); } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(get_cart_base(), get_cart_size(), actual) && actual == get_cart_size(); } - - // z88cart_interface overrides - virtual uint8_t read(offs_t offset) override; - virtual void write(offs_t offset, uint8_t data) override; - virtual uint8_t* get_cart_base() override; - virtual uint32_t get_cart_size() override { return 0x8000; } - -protected: - // internal state - uint8_t * m_ram; -}; - -// ======================> z88_128k_ram_device - -class z88_128k_ram_device : public z88_32k_ram_device -{ -public: - // construction/destruction - z88_128k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // z88cart_interface overrides - virtual uint32_t get_cart_size() override { return 0x20000; } -}; - -// ======================> z88_512k_ram_device - -class z88_512k_ram_device : public z88_32k_ram_device -{ -public: - // construction/destruction - z88_512k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // z88cart_interface overrides - virtual uint32_t get_cart_size() override { return 0x80000; } -}; - -// ======================> z88_1024k_ram_device - -class z88_1024k_ram_device : public z88_32k_ram_device -{ -public: - // construction/destruction - z88_1024k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // z88cart_interface overrides - virtual uint32_t get_cart_size() override { return 0x100000; } -}; - -// device type definition -DECLARE_DEVICE_TYPE(Z88_32K_RAM, z88_32k_ram_device) -DECLARE_DEVICE_TYPE(Z88_128K_RAM, z88_128k_ram_device) -DECLARE_DEVICE_TYPE(Z88_512K_RAM, z88_512k_ram_device) -DECLARE_DEVICE_TYPE(Z88_1024K_RAM, z88_1024k_ram_device) +// device type declarations +DECLARE_DEVICE_TYPE(Z88_32K_RAM, device_z88cart_interface) +DECLARE_DEVICE_TYPE(Z88_128K_RAM, device_z88cart_interface) +DECLARE_DEVICE_TYPE(Z88_512K_RAM, device_z88cart_interface) +DECLARE_DEVICE_TYPE(Z88_1024K_RAM, device_z88cart_interface) #endif // MAME_BUS_Z88_RAM_H diff -Nru mame-0.263+dfsg.1/src/devices/bus/z88/rom.cpp mame-0.264+dfsg.1/src/devices/bus/z88/rom.cpp --- mame-0.263+dfsg.1/src/devices/bus/z88/rom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/z88/rom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,17 +11,91 @@ #include "emu.h" #include "rom.h" -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ + +namespace { //************************************************************************** -// GLOBAL VARIABLES +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(Z88_32K_ROM, z88_32k_rom_device, "z88_32k_rom", "Z88 32KB ROM") -DEFINE_DEVICE_TYPE(Z88_128K_ROM, z88_128k_rom_device, "z88_128k_rom", "Z88 128KB ROM") -DEFINE_DEVICE_TYPE(Z88_256K_ROM, z88_256k_rom_device, "z88_256k_rom", "Z88 256KB ROM") +// ======================> z88_32k_rom_device + +class z88_32k_rom_device : public device_t, + public device_nvram_interface, + public device_z88cart_interface +{ +public: + // construction/destruction + z88_32k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + z88_32k_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t implementation + virtual void device_start() override; + + // device_nvram_interface implementation + virtual void nvram_default() override + { + } + virtual bool nvram_read(util::read_stream &file) override + { + auto const [err, actual] = util::read(file, get_cart_base(), get_cart_size()); + return !err && (actual == get_cart_size()); + } + virtual bool nvram_write(util::write_stream &file) override + { + auto const [err, actual] = util::write(file, get_cart_base(), get_cart_size()); + return !err; + } + virtual bool nvram_can_write() const override + { + return m_modified; // Save only if the EPROM has been programmed + } + + // z88cart_interface implementation + virtual uint8_t read(offs_t offset) override; + virtual void write(offs_t offset, uint8_t data) override; + virtual void vpp_w(int state) override { m_vpp_state = state; } + virtual uint8_t* get_cart_base() override; + virtual uint32_t get_cart_size() override { return 0x8000; } + +protected: + // internal state + uint8_t * m_rom; + int m_vpp_state; + bool m_modified; +}; + +// ======================> z88_128k_rom_device + +class z88_128k_rom_device : public z88_32k_rom_device +{ +public: + // construction/destruction + z88_128k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x20000; } +}; + +// ======================> z88_256k_rom_device + +class z88_256k_rom_device : public z88_32k_rom_device +{ +public: + // construction/destruction + z88_256k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x40000; } +}; + +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ //************************************************************************** // LIVE DEVICE @@ -111,3 +185,13 @@ } } +} // anonymous namespace + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(Z88_32K_ROM, device_z88cart_interface, z88_32k_rom_device, "z88_32k_rom", "Z88 32KB ROM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_128K_ROM, device_z88cart_interface, z88_128k_rom_device, "z88_128k_rom", "Z88 128KB ROM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_256K_ROM, device_z88cart_interface, z88_256k_rom_device, "z88_256k_rom", "Z88 256KB ROM") diff -Nru mame-0.263+dfsg.1/src/devices/bus/z88/rom.h mame-0.264+dfsg.1/src/devices/bus/z88/rom.h --- mame-0.263+dfsg.1/src/devices/bus/z88/rom.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/bus/z88/rom.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,75 +7,9 @@ #include "z88.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> z88_32k_rom_device - -class z88_32k_rom_device : public device_t, - public device_nvram_interface, - public device_z88cart_interface -{ -public: - // construction/destruction - z88_32k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - z88_32k_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - // device-level overrides - virtual void device_start() override; - - // device_nvram_interface overrides - virtual void nvram_default() override { } - virtual bool nvram_read(util::read_stream &file) override { size_t actual; return !file.read (get_cart_base(), get_cart_size(), actual) && actual == get_cart_size(); } - virtual bool nvram_write(util::write_stream &file) override { size_t actual; return !file.write(get_cart_base(), get_cart_size(), actual) && actual == get_cart_size(); } - virtual bool nvram_can_write() const override { return m_modified; } // Save only if the EPROM has been programmed - - // z88cart_interface overrides - virtual uint8_t read(offs_t offset) override; - virtual void write(offs_t offset, uint8_t data) override; - virtual void vpp_w(int state) override { m_vpp_state = state; } - virtual uint8_t* get_cart_base() override; - virtual uint32_t get_cart_size() override { return 0x8000; } - -protected: - // internal state - uint8_t * m_rom; - int m_vpp_state; - bool m_modified; -}; - -// ======================> z88_128k_rom_device - -class z88_128k_rom_device : public z88_32k_rom_device -{ -public: - // construction/destruction - z88_128k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // z88cart_interface overrides - virtual uint32_t get_cart_size() override { return 0x20000; } -}; - -// ======================> z88_256k_rom_device - -class z88_256k_rom_device : public z88_32k_rom_device -{ -public: - // construction/destruction - z88_256k_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // z88cart_interface overrides - virtual uint32_t get_cart_size() override { return 0x40000; } -}; - -// device type definition -DECLARE_DEVICE_TYPE(Z88_32K_ROM, z88_32k_rom_device) -DECLARE_DEVICE_TYPE(Z88_128K_ROM, z88_128k_rom_device) -DECLARE_DEVICE_TYPE(Z88_256K_ROM, z88_256k_rom_device) +// device type declarations +DECLARE_DEVICE_TYPE(Z88_32K_ROM, device_z88cart_interface) +DECLARE_DEVICE_TYPE(Z88_128K_ROM, device_z88cart_interface) +DECLARE_DEVICE_TYPE(Z88_256K_ROM, device_z88cart_interface) #endif // MAME_BUS_Z88_ROM_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/amis2000/amis2000d.cpp mame-0.264+dfsg.1/src/devices/cpu/amis2000/amis2000d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/amis2000/amis2000d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/amis2000/amis2000d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,19 @@ #include "emu.h" #include "amis2000d.h" + +// common lookup tables + +enum amis2000_disassembler::e_mnemonics : unsigned +{ + mLAB = 0, mLAE, mLAI, mLBE, mLBEP, mLBF, mLBZ, mXAB, mXABU, mXAE, + mLAM, mXC, mXCI, mXCD, mSTM, mRSM, + mADD, mADCS, mADIS, mAND, mXOR, mCMA, mSTC, mRSC, mSF1, mRF1, mSF2, mRF2, + mSAM, mSZM, mSBE, mSZC, mSOS, mSZK, mSZI, mTF1, mTF2, + mPP, mJMP, mJMS, mRT, mRTS, mNOP, mHALT, + mINP, mOUT, mDISB, mDISN, mMVS, mPSH, mPSL, mEUR +}; + const char *const amis2000_disassembler::s_mnemonics[] = { "LAB", "LAE", "LAI", "LBE", "LBEP", "LBF", "LBZ", "XAB", "XABU", "XAE", @@ -83,6 +96,9 @@ mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP }; + +// disasm + offs_t amis2000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { u8 op = opcodes.r8(pc); @@ -112,8 +128,3 @@ return 1 | s_flags[instr] | SUPPORTED; } - -u32 amis2000_disassembler::opcode_alignment() const -{ - return 1; -} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/amis2000/amis2000d.h mame-0.264+dfsg.1/src/devices/cpu/amis2000/amis2000d.h --- mame-0.263+dfsg.1/src/devices/cpu/amis2000/amis2000d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/amis2000/amis2000d.h 2024-03-25 14:00:46.000000000 +0000 @@ -17,20 +17,11 @@ amis2000_disassembler() = default; virtual ~amis2000_disassembler() = default; - virtual u32 opcode_alignment() const override; + virtual u32 opcode_alignment() const override { return 1; } virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum e_mnemonics - { - mLAB = 0, mLAE, mLAI, mLBE, mLBEP, mLBF, mLBZ, mXAB, mXABU, mXAE, - mLAM, mXC, mXCI, mXCD, mSTM, mRSM, - mADD, mADCS, mADIS, mAND, mXOR, mCMA, mSTC, mRSC, mSF1, mRF1, mSF2, mRF2, - mSAM, mSZM, mSBE, mSZC, mSOS, mSZK, mSZI, mTF1, mTF2, - mPP, mJMP, mJMS, mRT, mRTS, mNOP, mHALT, - mINP, mOUT, mDISB, mDISN, mMVS, mPSH, mPSL, mEUR - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonics[]; static const s8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/avr8/avr8.cpp mame-0.264+dfsg.1/src/devices/cpu/avr8/avr8.cpp --- mame-0.263+dfsg.1/src/devices/cpu/avr8/avr8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/avr8/avr8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -566,6 +566,9 @@ map(0x003f, 0x003f).w(FUNC(avr8_device::eecr_w)); map(0x0043, 0x0043).w(FUNC(avr8_device::gtccr_w)); map(0x0044, 0x0044).w(FUNC(avr8_device::tccr0a_w)); + map(0x0045, 0x0045).w(FUNC(avr8_device::tccr0b_w)); + map(0x0047, 0x0047).w(FUNC(avr8_device::ocr0a_w)); + map(0x0048, 0x0048).w(FUNC(avr8_device::ocr0b_w)); map(0x004a, 0x004a).w(FUNC(avr8_device::gpior1_w)); map(0x004b, 0x004b).w(FUNC(avr8_device::gpior2_w)); map(0x004c, 0x004c).w(FUNC(avr8_device::spcr_w)); @@ -1958,7 +1961,7 @@ if (m_timer_top[t] == -1) { m_timer_top[t] = 0; - LOGMASKED((LOG_TIMER0 + t), "%s: update_timer_waveform_gen_mode: Timer %d - Unsupported waveform generation type: %d\n", machine().describe_context(), t, mode); + LOGMASKED((LOG_TIMER0 << t), "%s: update_timer_waveform_gen_mode: Timer %d - Unsupported waveform generation type: %d\n", machine().describe_context(), t, mode); } } @@ -2025,7 +2028,7 @@ if (m_ocr2_not_reached_yet) { // Turn off - m_r[PORTD] |= 1 << 7; + m_r[PORTD] &= ~(1 << 7); m_gpio_out_cb[GPIOD](m_r[PORTD]); m_ocr2_not_reached_yet = false; } @@ -2188,11 +2191,11 @@ const uint16_t old_prescale = s_prescale_values[(Timer == 2) ? 1 : 0][old_clock_select]; m_timer_prescale[Timer] = (uint16_t)prescale_divisor; - LOGMASKED(LOG_TIMER0 + Timer, "%s: update_timer_clock_source: t = %d, cs = %d\n", machine().describe_context(), Timer, clock_select); + LOGMASKED(LOG_TIMER0 << Timer, "%s: update_timer_clock_source: t = %d, cs = %d\n", machine().describe_context(), Timer, clock_select); if (prescale_divisor == -1) { - LOGMASKED(LOG_TIMER0 + Timer, "%s: timer%d: update_timer_clock_source: External trigger mode not implemented yet\n", machine().describe_context(), Timer); + LOGMASKED(LOG_TIMER0 << Timer, "%s: timer%d: update_timer_clock_source: External trigger mode not implemented yet\n", machine().describe_context(), Timer); m_timer_prescale[Timer] = 0xffff; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/avr8/avr8ops.hxx mame-0.264+dfsg.1/src/devices/cpu/avr8/avr8ops.hxx --- mame-0.263+dfsg.1/src/devices/cpu/avr8/avr8ops.hxx 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/avr8/avr8ops.hxx 2024-03-25 14:00:46.000000000 +0000 @@ -1047,9 +1047,7 @@ const uint8_t res = 0 - rd; m_r[SREG] &= ~(SREG_MASK_C | SREG_MASK_Z | SREG_MASK_N | SREG_MASK_V | SREG_MASK_S | SREG_MASK_H); if (res == 0) - { m_r[SREG] |= SREG_MASK_Z; - } else { m_r[SREG] |= SREG_MASK_C; @@ -1122,7 +1120,7 @@ void avr8_base_device::op_ijmp(uint16_t op) { - m_pc = (ZREG - 1) << 1; + m_pc = (ZREG << 1) - 2; } void avr8_base_device::op_eijmp(uint16_t op) @@ -1135,12 +1133,12 @@ const uint8_t rd = m_r[RD5(op)]; const uint8_t res = rd - 1; m_r[SREG] &= ~(SREG_MASK_V | SREG_MASK_N | SREG_MASK_S | SREG_MASK_Z); - if (rd == 0x7f) + if (res == 0) + m_r[SREG] |= SREG_MASK_Z; + else if (res == 0x7f) m_r[SREG] |= SREG_MASK_V | SREG_MASK_S; else if (BIT(res, 7)) m_r[SREG] |= SREG_MASK_N | SREG_MASK_S; - else if (res == 0) - m_r[SREG] |= SREG_MASK_Z; m_r[RD5(op)] = res; } @@ -1148,8 +1146,7 @@ { uint32_t offs = KCONST22(op) << 16; m_pc += 2; - uint16_t wordval = m_program->read_word(m_pc); - offs |= wordval; + offs |= m_program->read_word(m_pc); m_pc = offs << 1; m_pc -= 2; } @@ -1234,18 +1231,21 @@ const uint8_t rr = m_r[25 + (DCONST(op) << 1)]; const uint16_t pd = ((rr << 8) | rd) + KCONST6(op); m_r[SREG] &= ~(SREG_MASK_V | SREG_MASK_N | SREG_MASK_S | SREG_MASK_Z | SREG_MASK_C); - if (pd == 0) - m_r[SREG] |= SREG_MASK_Z; - else if (BIT(pd, 15)) + if (BIT(pd, 15)) { m_r[SREG] |= SREG_MASK_N; - if (!BIT(rr, 7)) - m_r[SREG] |= SREG_MASK_V; - else + if (BIT(rr, 7)) m_r[SREG] |= SREG_MASK_S; + else + m_r[SREG] |= SREG_MASK_V; + } + else + { + if (pd == 0) + m_r[SREG] |= SREG_MASK_Z; + if (BIT(rr, 7)) + m_r[SREG] |= SREG_MASK_C; } - if (BIT(rr, 7) && !BIT(pd, 15)) - m_r[SREG] |= SREG_MASK_C; m_r[24 + (DCONST(op) << 1)] = pd & 0x00ff; m_r[25 + (DCONST(op) << 1)] = (pd >> 8) & 0x00ff; } @@ -1256,16 +1256,19 @@ const uint8_t rr = m_r[25 + (DCONST(op) << 1)]; const uint16_t pd = ((rr << 8) | rd) - KCONST6(op); m_r[SREG] &= ~(SREG_MASK_V | SREG_MASK_N | SREG_MASK_S | SREG_MASK_Z | SREG_MASK_C); - m_r[SREG] |= (pd == 0) ? SREG_MASK_Z : 0; if (BIT(pd, 15)) { + m_r[SREG] |= SREG_MASK_N | SREG_MASK_S; + if (!BIT(rr, 7)) + m_r[SREG] |= SREG_MASK_C; + } + else + { + if (pd == 0) + m_r[SREG] |= SREG_MASK_Z; if (BIT(rr, 7)) - m_r[SREG] |= SREG_MASK_N | SREG_MASK_S | SREG_MASK_C; - else - m_r[SREG] |= SREG_MASK_N | SREG_MASK_S; + m_r[SREG] |= SREG_MASK_V | SREG_MASK_S; } - else if (BIT(rr, 7)) - m_r[SREG] |= SREG_MASK_V | SREG_MASK_S; m_r[24 + (DCONST(op) << 1)] = pd & 0x00ff; m_r[25 + (DCONST(op) << 1)] = (pd >> 8) & 0x00ff; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/cops1/cops1d.cpp mame-0.264+dfsg.1/src/devices/cpu/cops1/cops1d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/cops1/cops1d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/cops1/cops1d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -32,6 +32,18 @@ // common lookup tables +enum cops1_common_disassembler::e_mnemonics : unsigned +{ + mILL, + mAD, mADD, mSUB, mCOMP, m0TA, mADX, mHXA, mTAM, mSC, mRSC, mTC, + mTIN, mTF, mTKB, mTIR, + mBTD, mDSPA, mDSPS, mAXO, mLDF, mREAD, + mGO, mCALL, mRET, mRETS, mLG, mLGCALL, mNOP, + mEXC, mEXCM, mEXCP, mMTA, mLM, + mSM1, mSM2, mSM4, mSM8, mRSM1, mRSM2, mRSM4, mRSM8, mTM, + mLB, mLBL, mATB, mBTA, mHXBR +}; + const char *const cops1_common_disassembler::s_name[] = { "?", diff -Nru mame-0.263+dfsg.1/src/devices/cpu/cops1/cops1d.h mame-0.264+dfsg.1/src/devices/cpu/cops1/cops1d.h --- mame-0.263+dfsg.1/src/devices/cpu/cops1/cops1d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/cops1/cops1d.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,19 +25,7 @@ virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x3f) | m_r2l[pc & 0x3f]; } protected: - // opcode mnemonics - enum e_mnemonics - { - mILL, - mAD, mADD, mSUB, mCOMP, m0TA, mADX, mHXA, mTAM, mSC, mRSC, mTC, - mTIN, mTF, mTKB, mTIR, - mBTD, mDSPA, mDSPS, mAXO, mLDF, mREAD, - mGO, mCALL, mRET, mRETS, mLG, mLGCALL, mNOP, - mEXC, mEXCM, mEXCP, mMTA, mLM, - mSM1, mSM2, mSM4, mSM8, mRSM1, mRSM2, mRSM4, mRSM8, mTM, - mLB, mLBL, mATB, mBTA, mHXBR - }; - + enum e_mnemonics : unsigned; static const char *const s_name[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.cpp mame-0.264+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,27 @@ #include "emu.h" #include "e0c6200d.h" + +// common lookup tables + +enum e0c6200_disassembler::e_mnemonics : unsigned +{ + em_JP, em_RETD, em_CALL, em_CALZ, + em_LD, em_LBPX, em_ADC, em_CP, em_ADD, em_SUB, em_SBC, em_AND, em_OR, em_XOR, + em_RLC, em_FAN, em_PSET, em_LDPX, em_LDPY, em_SET, em_RST, em_INC, em_DEC, + em_RRC, em_ACPX, em_ACPY, em_SCPX, em_SCPY, em_PUSH, em_POP, + em_RETS, em_RET, em_JPBA, em_HALT, em_SLP, em_NOP5, em_NOP7, + em_NOT, em_SCF, em_SZF, em_SDF, em_EI, em_DI, em_RDF, em_RZF, em_RCF, em_ILL +}; + +enum e0c6200_disassembler::e_params : unsigned +{ + ep_S, ep_E, ep_I, ep_R0, ep_R2, ep_R4, ep_Q, + ep_cC, ep_cNC, ep_cZ, ep_cNZ, + ep_A, ep_B, ep_X, ep_Y, ep_MX, ep_MY, ep_XP, ep_XH, ep_XL, ep_YP, ep_YH, ep_YL, + ep_P, ep_F, ep_MN, ep_SP, ep_SPH, ep_SPL +}; + const char *const e0c6200_disassembler::em_name[] = { "JP", "RETD", "CALL", "CALZ", @@ -53,6 +74,8 @@ }; +// disasm + std::string e0c6200_disassembler::decode_param(u16 opcode, int param) { int bits = ep_bits[param] & 0xf; @@ -671,23 +694,3 @@ return 1 | ((op & 0xf00) == 0 ? 0 : em_flags[m]) | SUPPORTED; } - -u32 e0c6200_disassembler::opcode_alignment() const -{ - return 1; -} - -u32 e0c6200_disassembler::interface_flags() const -{ - return PAGED2LEVEL; -} - -u32 e0c6200_disassembler::page_address_bits() const -{ - return 8; -} - -u32 e0c6200_disassembler::page2_address_bits() const -{ - return 4; -} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.h mame-0.264+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.h --- mame-0.263+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/e0c6200/e0c6200d.h 2024-03-25 14:00:46.000000000 +0000 @@ -17,32 +17,16 @@ e0c6200_disassembler() = default; virtual ~e0c6200_disassembler() = default; - virtual u32 opcode_alignment() const override; - virtual u32 interface_flags() const override; - virtual u32 page_address_bits() const override; - virtual u32 page2_address_bits() const override; + virtual u32 opcode_alignment() const override { return 1; } + virtual u32 interface_flags() const override { return PAGED2LEVEL; } + virtual u32 page_address_bits() const override { return 8; } + virtual u32 page2_address_bits() const override { return 4; } virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum e_mnemonics - { - em_JP, em_RETD, em_CALL, em_CALZ, - em_LD, em_LBPX, em_ADC, em_CP, em_ADD, em_SUB, em_SBC, em_AND, em_OR, em_XOR, - em_RLC, em_FAN, em_PSET, em_LDPX, em_LDPY, em_SET, em_RST, em_INC, em_DEC, - em_RRC, em_ACPX, em_ACPY, em_SCPX, em_SCPY, em_PUSH, em_POP, - em_RETS, em_RET, em_JPBA, em_HALT, em_SLP, em_NOP5, em_NOP7, - em_NOT, em_SCF, em_SZF, em_SDF, em_EI, em_DI, em_RDF, em_RZF, em_RCF, em_ILL - }; - - enum e_params - { - ep_S, ep_E, ep_I, ep_R0, ep_R2, ep_R4, ep_Q, - ep_cC, ep_cNC, ep_cZ, ep_cNZ, - ep_A, ep_B, ep_X, ep_Y, ep_MX, ep_MY, ep_XP, ep_XH, ep_XL, ep_YP, ep_YH, ep_YL, - ep_P, ep_F, ep_MN, ep_SP, ep_SPH, ep_SPL - }; - + enum e_mnemonics : unsigned; + enum e_params : unsigned; static const char *const em_name[]; static const u32 em_flags[]; static const u16 ep_bits[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -100,6 +100,8 @@ #include "emu.h" #include "g65816.h" +#include "g65816cm.h" + DEFINE_DEVICE_TYPE(G65816, g65816_device, "w65c816", "WDC W65C816") DEFINE_DEVICE_TYPE(G65802, g65802_device, "w65c802", "WDC W65C802") @@ -258,10 +260,10 @@ unsigned g65816_device::g65816i_read_8_direct(unsigned address) { - if (FLAG_E) + if (FLAG_E && !MAKE_UINT_8(REGISTER_D)) { /* force address into zero page */ - address = REGISTER_D + MAKE_UINT_8(address - REGISTER_D); + address = REGISTER_D | MAKE_UINT_8(address); CLOCKS -= (bus_5A22_cycle_burst(address)); } else @@ -290,10 +292,10 @@ void g65816_device::g65816i_write_8_direct(unsigned address, unsigned value) { - if (FLAG_E) + if (FLAG_E && !MAKE_UINT_8(REGISTER_D)) { /* force address into zero page */ - address = REGISTER_D + MAKE_UINT_8(address - REGISTER_D); + address = REGISTER_D | MAKE_UINT_8(address); CLOCKS -= (bus_5A22_cycle_burst(address)); } else @@ -307,58 +309,68 @@ unsigned g65816_device::g65816i_read_16_normal(unsigned address) { return g65816i_read_8_normal(address) | - (g65816i_read_8_normal(address+1)<<8); + (g65816i_read_8_normal(address + 1) << 8); } unsigned g65816_device::g65816i_read_16_immediate(unsigned address) { return g65816i_read_8_immediate(address) | - (g65816i_read_8_immediate(address+1)<<8); + (g65816i_read_8_immediate(address + 1) << 8); } unsigned g65816_device::g65816i_read_16_direct(unsigned address) { return g65816i_read_8_direct(address) | - (g65816i_read_8_direct(address+1)<<8); + (g65816i_read_8_direct(address + 1) << 8); +} + +unsigned g65816_device::g65816i_read_16_direct_x(unsigned address) +{ + if (FLAG_E && MAKE_UINT_8(REGISTER_D)) + { + // The (direct,X) addressing mode has a bug in which the high byte is + // wrapped within the page if E = 1 and D&0xFF != 0. + uint8_t lo = g65816i_read_8_direct(address); + uint8_t hi = g65816i_read_8_direct((address & 0xffff00) | + MAKE_UINT_8(address + 1)); + return lo | (hi<<8); + } + else + { + return g65816i_read_16_direct(address); + } } unsigned g65816_device::g65816i_read_16_vector(unsigned address) { return g65816i_read_8_vector(address) | - (g65816i_read_8_vector(address+1)<<8); + (g65816i_read_8_vector(address + 1) << 8); } void g65816_device::g65816i_write_16_normal(unsigned address, unsigned value) { - g65816i_write_8_normal(address, value&0xff); - g65816i_write_8_normal(address+1, value>>8); + g65816i_write_8_normal(address, value & 0xff); + g65816i_write_8_normal(address + 1, value >> 8); } void g65816_device::g65816i_write_16_direct(unsigned address, unsigned value) { - g65816i_write_8_direct(address, value&0xff); - g65816i_write_8_direct(address+1, value>>8); + g65816i_write_8_direct(address, value & 0xff); + g65816i_write_8_direct(address + 1, value >> 8); } unsigned g65816_device::g65816i_read_24_normal(unsigned address) { return g65816i_read_8_normal(address) | - (g65816i_read_8_normal(address+1)<<8) | - (g65816i_read_8_normal(address+2)<<16); + (g65816i_read_8_normal(address + 1) << 8) | + (g65816i_read_8_normal(address + 2) << 16); } unsigned g65816_device::g65816i_read_24_immediate(unsigned address) { return g65816i_read_8_immediate(address) | - (g65816i_read_8_immediate(address+1)<<8) | - (g65816i_read_8_immediate(address+2)<<16); -} - -unsigned g65816_device::g65816i_read_24_direct(unsigned address) -{ - return g65816i_read_8_direct(address) | - (g65816i_read_8_direct(address+1)<<8) | - (g65816i_read_8_direct(address+2)<<16); + (g65816i_read_8_immediate(address + 1) << 8) | + (g65816i_read_8_immediate(address + 2) << 16); } @@ -371,11 +383,11 @@ g65816i_write_8_normal(REGISTER_S, value); if (FLAG_E) { - REGISTER_S = MAKE_UINT_8(REGISTER_S-1) | 0x100; + REGISTER_S = MAKE_UINT_8(REGISTER_S - 1) | 0x100; } else { - REGISTER_S = MAKE_UINT_16(REGISTER_S-1); + REGISTER_S = MAKE_UINT_16(REGISTER_S - 1); } } @@ -383,19 +395,19 @@ { if (FLAG_E) { - REGISTER_S = MAKE_UINT_8(REGISTER_S+1) | 0x100; + REGISTER_S = MAKE_UINT_8(REGISTER_S + 1) | 0x100; } else { - REGISTER_S = MAKE_UINT_16(REGISTER_S+1); + REGISTER_S = MAKE_UINT_16(REGISTER_S + 1); } return g65816i_read_8_normal(REGISTER_S); } void g65816_device::g65816i_push_16(unsigned value) { - g65816i_push_8(value>>8); - g65816i_push_8(value&0xff); + g65816i_push_8(value >> 8); + g65816i_push_8(value & 0xff); } unsigned g65816_device::g65816i_pull_16() @@ -406,9 +418,9 @@ void g65816_device::g65816i_push_24(unsigned value) { - g65816i_push_8(value>>16); - g65816i_push_8((value>>8)&0xff); - g65816i_push_8(value&0xff); + g65816i_push_8(value >> 16); + g65816i_push_8((value >> 8) & 0xff); + g65816i_push_8(value & 0xff); } unsigned g65816_device::g65816i_pull_24() @@ -418,6 +430,51 @@ return ((res + 1) & 0xffff) | (g65816i_pull_8() << 16); } +void g65816_device::g65816i_push_8_native(unsigned value) +{ + g65816i_write_8_normal(REGISTER_S, value); + REGISTER_S = MAKE_UINT_16(REGISTER_S - 1); +} + +unsigned g65816_device::g65816i_pull_8_native() +{ + REGISTER_S = MAKE_UINT_16(REGISTER_S + 1); + return g65816i_read_8_normal(REGISTER_S); +} + +void g65816_device::g65816i_push_16_native(unsigned value) +{ + g65816i_push_8_native(value >> 8); + g65816i_push_8_native(value & 0xff); +} + +unsigned g65816_device::g65816i_pull_16_native() +{ + unsigned res = g65816i_pull_8_native(); + return res | (g65816i_pull_8_native() << 8); +} + +void g65816_device::g65816i_push_24_native(unsigned value) +{ + g65816i_push_8_native(value >> 16); + g65816i_push_8_native((value >> 8) & 0xff); + g65816i_push_8_native(value & 0xff); +} + +unsigned g65816_device::g65816i_pull_24_native() +{ + unsigned res = g65816i_pull_8_native(); + res |= g65816i_pull_8_native() << 8; + return ((res + 1) & 0xffff) | (g65816i_pull_8_native() << 16); +} + +void g65816_device::g65816i_update_reg_s() +{ + if (FLAG_E) + { + REGISTER_S = MAKE_UINT_8(REGISTER_S) | 0x100; + } +} /* ======================================================================== */ /* ============================ PROGRAM COUNTER =========================== */ @@ -431,7 +488,7 @@ void g65816_device::g65816i_jump_24(unsigned address) { - REGISTER_PB = address&0xff0000; + REGISTER_PB = address & 0xff0000; REGISTER_PC = MAKE_UINT_16(address); g65816i_jumping(REGISTER_PC); } @@ -442,7 +499,7 @@ { unsigned old_pc = REGISTER_PC; REGISTER_PC = MAKE_UINT_16(REGISTER_PC + MAKE_INT_8(offset)); - if((REGISTER_PC^old_pc)&0xff00) + if ((REGISTER_PC ^ old_pc) & 0xff00) CLK(1); } else @@ -467,7 +524,7 @@ { if (FLAG_M) { - if(!(value & FLAGPOS_M)) + if (!(value & FLAGPOS_M)) { REGISTER_A |= REGISTER_B; REGISTER_B = 0; @@ -476,7 +533,7 @@ } else { - if(value & FLAGPOS_M) + if (value & FLAGPOS_M) { REGISTER_B = REGISTER_A & 0xff00; REGISTER_A = MAKE_UINT_8(REGISTER_A); @@ -485,28 +542,28 @@ } if (FLAG_X) { - if(!(value & FLAGPOS_X)) + if (!(value & FLAGPOS_X)) { FLAG_X = XFLAG_CLEAR; } } else { - if(value & FLAGPOS_X) + if (value & FLAGPOS_X) { REGISTER_X = MAKE_UINT_8(REGISTER_X); REGISTER_Y = MAKE_UINT_8(REGISTER_Y); FLAG_X = XFLAG_SET; } } - g65816i_set_execution_mode((FLAG_M>>4) | (FLAG_X>>4)); + g65816i_set_execution_mode((FLAG_M >> 4) | (FLAG_X >> 4)); } void g65816_device::g65816i_set_flag_e(unsigned value) { if (FLAG_E) { - if(!value) + if (!value) { FLAG_E = EFLAG_CLEAR; g65816i_set_execution_mode(EXECUTION_MODE_M1X1); @@ -549,7 +606,7 @@ /* Get the Processor Status Register */ unsigned g65816_device::g65816i_get_reg_p() { - return (FLAG_N&0x80) | + return (FLAG_N & 0x80) | ((FLAG_V>>1)&0x40) | FLAG_M | FLAG_X | @@ -628,7 +685,7 @@ else { CLK(8); - g65816i_push_8(REGISTER_PB>>16); + g65816i_push_8(REGISTER_PB >> 16); g65816i_push_16(REGISTER_PC); g65816i_push_8(g65816i_get_reg_p()); FLAG_D = DFLAG_CLEAR; @@ -653,7 +710,7 @@ else { CLK(8); - g65816i_push_8(REGISTER_PB>>16); + g65816i_push_8(REGISTER_PB >> 16); g65816i_push_16(REGISTER_PC); g65816i_push_8(g65816i_get_reg_p()); FLAG_D = DFLAG_CLEAR; @@ -686,15 +743,15 @@ unsigned g65816_device::EA_ALX() {return EA_AL() + REGISTER_X;} unsigned g65816_device::EA_AY() {unsigned tmp = EA_A(); if((tmp^(tmp+REGISTER_Y))&0xff00) CLK(1); return tmp + REGISTER_Y;} unsigned g65816_device::EA_DI() {return REGISTER_DB | g65816i_read_16_direct(EA_D());} -unsigned g65816_device::EA_DLI() {return g65816i_read_24_direct(EA_D());} +unsigned g65816_device::EA_DLI() {return g65816i_read_24_normal(EA_D());} unsigned g65816_device::EA_AI() {return g65816i_read_16_normal(g65816i_read_16_immediate(EA_IMM16()));} unsigned g65816_device::EA_ALI() {return g65816i_read_24_normal(EA_A());} -unsigned g65816_device::EA_DXI() {return REGISTER_DB | g65816i_read_16_direct(EA_DX());} +unsigned g65816_device::EA_DXI() {return REGISTER_DB | g65816i_read_16_direct_x(EA_DX());} unsigned g65816_device::EA_DIY() {unsigned tmp = REGISTER_DB | g65816i_read_16_direct(EA_D()); if((tmp^(tmp+REGISTER_Y))&0xff00) CLK(1); return tmp + REGISTER_Y;} -unsigned g65816_device::EA_DLIY() {return g65816i_read_24_direct(EA_D()) + REGISTER_Y;} +unsigned g65816_device::EA_DLIY() {return g65816i_read_24_normal(EA_D()) + REGISTER_Y;} unsigned g65816_device::EA_AXI() {return g65816i_read_16_normal(MAKE_UINT_16(g65816i_read_16_immediate(EA_IMM16()) + REGISTER_X));} unsigned g65816_device::EA_S() {return MAKE_UINT_16(REGISTER_S + g65816i_read_8_immediate(EA_IMM8()));} -unsigned g65816_device::EA_SIY() {return MAKE_UINT_16(g65816i_read_16_normal(REGISTER_S + g65816i_read_8_immediate(EA_IMM8())) + REGISTER_Y) | REGISTER_DB;} +unsigned g65816_device::EA_SIY() {return (g65816i_read_16_normal(REGISTER_S + g65816i_read_8_immediate(EA_IMM8())) | REGISTER_DB) + REGISTER_Y;} @@ -767,7 +824,7 @@ void g65816_device::g65816_set_pc(unsigned val) { REGISTER_PC = MAKE_UINT_16(val); - REGISTER_PB = (val >> 16) & 0xFF; + REGISTER_PB = (val >> 16) & 0xff; g65816_jumping(REGISTER_PB | REGISTER_PC); } @@ -787,7 +844,7 @@ unsigned g65816_device::g65816_get_reg(int regnum) { /* Set the function tables to emulation mode if the FTABLE is nullptr */ - if( FTABLE_GET_REG == nullptr ) + if (FTABLE_GET_REG == nullptr) g65816i_set_execution_mode(EXECUTION_MODE_E); return (this->*FTABLE_GET_REG)(regnum); @@ -823,7 +880,7 @@ void g65816_device::g65816_restore_state() { // restore proper function pointers - g65816i_set_execution_mode((FLAG_M>>4) | (FLAG_X>>4)); + g65816i_set_execution_mode((FLAG_M >> 4) | (FLAG_X >> 4)); // make sure the memory system can keep up g65816i_jumping(REGISTER_PB | REGISTER_PC); @@ -984,14 +1041,14 @@ m_debugger_temp = m_db>>16; break; case G65816_P: - m_debugger_temp = (m_flag_n&0x80) | - ((m_flag_v>>1)&0x40) | + m_debugger_temp = (m_flag_n & 0x80) | + ((m_flag_v >> 1)&0x40) | m_flag_m | m_flag_x | m_flag_d | m_flag_i | - ((!m_flag_z)<<1) | - ((m_flag_c>>8)&1); + ((!m_flag_z) << 1) | + ((m_flag_c >> 8) & 1); break; case G65816_A: m_debugger_temp = m_a | m_b; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816.h mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816.h --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816.h 2024-03-25 14:00:46.000000000 +0000 @@ -6,7 +6,6 @@ #pragma once #include "g65816ds.h" -#include "g65816cm.h" /* ======================================================================== */ /* =============================== COPYRIGHT ============================== */ @@ -157,18 +156,25 @@ unsigned g65816i_read_16_normal(unsigned address); unsigned g65816i_read_16_immediate(unsigned address); unsigned g65816i_read_16_direct(unsigned address); + unsigned g65816i_read_16_direct_x(unsigned address); unsigned g65816i_read_16_vector(unsigned address); void g65816i_write_16_normal(unsigned address, unsigned value); void g65816i_write_16_direct(unsigned address, unsigned value); unsigned g65816i_read_24_normal(unsigned address); unsigned g65816i_read_24_immediate(unsigned address); - unsigned g65816i_read_24_direct(unsigned address); void g65816i_push_8(unsigned value); unsigned g65816i_pull_8(); void g65816i_push_16(unsigned value); unsigned g65816i_pull_16(); void g65816i_push_24(unsigned value); unsigned g65816i_pull_24(); + void g65816i_push_8_native(unsigned value); + unsigned g65816i_pull_8_native(); + void g65816i_push_16_native(unsigned value); + unsigned g65816i_pull_16_native(); + void g65816i_push_24_native(unsigned value); + unsigned g65816i_pull_24_native(); + void g65816i_update_reg_s(); void g65816i_jump_16(unsigned address); void g65816i_jump_24(unsigned address); void g65816i_branch_8(unsigned offset); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816cm.h mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816cm.h --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816cm.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816cm.h 2024-03-25 14:00:46.000000000 +0000 @@ -1,16 +1,22 @@ // license:BSD-3-Clause // copyright-holders:Karl Stenerud +#ifndef MAME_CPU_G65816_G65816CM_H +#define MAME_CPU_G65816_G65816CM_H + #pragma once -#ifndef __G65816CM_H__ -#define __G65816CM_H__ + +/* ======================================================================== */ +/* ================================ INCLUDES ============================== */ +/* ======================================================================== */ + +#include #define g65816i_branching(A) #define g65816i_jumping(A) -#undef G65816_CALL_DEBUGGER #define G65816_CALL_DEBUGGER(x) debugger_instruction_hook(x) #define g65816_read_8(addr) m_data.read_byte(addr) @@ -22,13 +28,6 @@ /* ======================================================================== */ -/* ================================ INCLUDES ============================== */ -/* ======================================================================== */ - -#include - - -/* ======================================================================== */ /* ================================ GENERAL =============================== */ /* ======================================================================== */ @@ -242,4 +241,4 @@ /* ======================================================================== */ /* ================================== CPU ================================= */ /* ======================================================================== */ -#endif /* __G65816CM_H__ */ +#endif // MAME_CPU_G65816_G65816CM_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816ds.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816ds.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816ds.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816ds.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -15,7 +15,33 @@ #include "emu.h" #include "g65816ds.h" -g65816_disassembler::g65816_disassembler(config *conf) : m_config(conf) +enum class g65816_disassembler::op : unsigned +{ + ADC, AND, ASL, BCC, BCS, BEQ, BIT, BMI, BNE, BPL, BRA, + BRK, BRL, BVC, BVS, CLC, CLD, CLI, CLV, CMP, COP, CPX, + CPY, DEA, DEC, DEX, DEY, EOR, INA, INC, INX, INY, JML, + JMP, JSL, JSR, LDA, LDX, LDY, LSR, MVN, MVP, NOP, ORA, + PEA, PEI, PER, PHA, PHB, PHD, PHK, PHP, PHX, PHY, PLA, + PLB, PLD, PLP, PLX, PLY, REP, ROL, ROR, RTI, RTL, RTS, + SBC, SEC, SED, SEI, SEP, STA, STP, STX, STY, STZ, TAX, + TAY, TCS, TCD, TDC, TRB, TSB, TSC, TSX, TXA, TXS, TXY, + TYA, TYX, WAI, WDM, XBA, XCE +}; + +class g65816_disassembler::opcode_struct { + public: + op m_name; + u8 flag; + u8 ea; + + opcode_struct(op n, u8 f, u8 e); + const char *name() const; + bool is_call() const; + bool is_return() const; + bool is_cond() const; + }; + +g65816_disassembler::g65816_disassembler(const config *conf) : m_config(conf) { } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816ds.h mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816ds.h --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816ds.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816ds.h 2024-03-25 14:00:46.000000000 +0000 @@ -1,9 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Karl Stenerud +#ifndef MAME_CPU_G65816_G65816DS_H +#define MAME_CPU_G65816_G65816DS_H + #pragma once -#ifndef __G65816DS_H__ -#define __G65816DS_H__ /* ======================================================================== */ /* =============================== COPYRIGHT ============================== */ /* ======================================================================== */ @@ -25,13 +26,14 @@ { public: class config { + protected: + ~config() = default; public: - virtual ~config() = default; virtual bool get_m_flag() const = 0; virtual bool get_x_flag() const = 0; }; - g65816_disassembler(config *conf); + g65816_disassembler(const config *conf); virtual u32 opcode_alignment() const override; virtual u32 interface_flags() const override; @@ -39,18 +41,7 @@ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum class op : unsigned - { - ADC , AND , ASL , BCC , BCS , BEQ , BIT , BMI , BNE , BPL , BRA , - BRK , BRL , BVC , BVS , CLC , CLD , CLI , CLV , CMP , COP , CPX , - CPY , DEA , DEC , DEX , DEY , EOR , INA , INC , INX , INY , JML , - JMP , JSL , JSR , LDA , LDX , LDY , LSR , MVN , MVP , NOP , ORA , - PEA , PEI , PER , PHA , PHB , PHD , PHK , PHP , PHX , PHY , PLA , - PLB , PLD , PLP , PLX , PLY , REP , ROL , ROR , RTI , RTL , RTS , - SBC , SEC , SED , SEI , SEP , STA , STP , STX , STY , STZ , TAX , - TAY , TCS , TCD , TDC , TRB , TSB , TSC , TSX , TXA , TXS , TXY , - TYA , TYX , WAI , WDM , XBA , XCE - }; + enum class op : unsigned; enum { @@ -66,26 +57,15 @@ X /* check x bit */ }; - class opcode_struct { - public: - op m_name; - u8 flag; - u8 ea; - - opcode_struct(op n, u8 f, u8 e); - const char *name() const; - bool is_call() const; - bool is_return() const; - bool is_cond() const; - }; + class opcode_struct; static const char *const s_opnames[]; static const opcode_struct s_opcodes[256]; - config *m_config; + const config *m_config; std::string int_8_str(u8 val); std::string int_16_str(u16 val); }; -#endif /* __G65816DS_H__ */ +#endif // MAME_CPU_G65816_G65816DS_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o0.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o0.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o0.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o0.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,4 +4,4 @@ #include "g65816.h" #include "g65816cm.h" #define EXECUTION_MODE EXECUTION_MODE_M0X0 -#include "g65816op.h" +#include "g65816op.ipp" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o1.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o1.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,4 +4,4 @@ #include "g65816.h" #include "g65816cm.h" #define EXECUTION_MODE EXECUTION_MODE_M0X1 -#include "g65816op.h" +#include "g65816op.ipp" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o2.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o2.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,4 +4,4 @@ #include "g65816.h" #include "g65816cm.h" #define EXECUTION_MODE EXECUTION_MODE_M1X0 -#include "g65816op.h" +#include "g65816op.ipp" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o3.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o3.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,4 +4,4 @@ #include "g65816.h" #include "g65816cm.h" #define EXECUTION_MODE EXECUTION_MODE_M1X1 -#include "g65816op.h" +#include "g65816op.ipp" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o4.cpp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o4.cpp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816o4.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816o4.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,4 +4,4 @@ #include "g65816.h" #include "g65816cm.h" #define EXECUTION_MODE EXECUTION_MODE_E -#include "g65816op.h" +#include "g65816op.ipp" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816op.h mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816op.h --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816op.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816op.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1955 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Karl Stenerud - -/* ======================================================================== */ -/* ============================= CONFIGURATION ============================ */ -/* ======================================================================== */ - -#undef FLAG_SET_E -#undef FLAG_SET_M -#undef FLAG_SET_X -#if EXECUTION_MODE == EXECUTION_MODE_E -#define FLAG_SET_E 1 -#define FLAG_SET_M 1 -#define FLAG_SET_X 1 -#elif EXECUTION_MODE == EXECUTION_MODE_M0X0 -#define FLAG_SET_E 0 -#define FLAG_SET_M 0 -#define FLAG_SET_X 0 -#elif EXECUTION_MODE == EXECUTION_MODE_M0X1 -#define FLAG_SET_E 0 -#define FLAG_SET_M 0 -#define FLAG_SET_X 1 -#elif EXECUTION_MODE == EXECUTION_MODE_M1X0 -#define FLAG_SET_E 0 -#define FLAG_SET_M 1 -#define FLAG_SET_X 0 -#elif EXECUTION_MODE == EXECUTION_MODE_M1X1 -#define FLAG_SET_E 0 -#define FLAG_SET_M 1 -#define FLAG_SET_X 1 -#endif - -#undef VECTOR_IRQ -#undef VECTOR_NMI -#undef VECTOR_ABORT -#undef VECTOR_BRK -#undef VECTOR_COP - -#if FLAG_SET_E -#define VECTOR_IRQ VECTOR_IRQ_E -#define VECTOR_NMI VECTOR_NMI_E -#define VECTOR_ABORT VECTOR_ABORT_E -#define VECTOR_BRK VECTOR_BRK_E -#define VECTOR_COP VECTOR_COP_E -#else /* FLAG_SET_E */ -#define VECTOR_IRQ VECTOR_IRQ_N -#define VECTOR_NMI VECTOR_NMI_N -#define VECTOR_ABORT VECTOR_ABORT_N -#define VECTOR_BRK VECTOR_BRK_N -#define VECTOR_COP VECTOR_COP_N -#endif - - - -/* ======================================================================== */ -/* ========================== EFFECTIVE ADDRESSES ========================= */ -/* ======================================================================== */ - -/* Effective-address based memory access macros */ -#define read_8_NORM(A) g65816i_read_8_normal(A) -#define read_8_IMM(A) g65816i_read_8_immediate(A) -#define read_8_OP(A) g65816i_read_8_opcode(A) -#define read_8_D(A) g65816i_read_8_direct(A) -#define read_8_A(A) g65816i_read_8_normal(A) -#define read_8_AL(A) g65816i_read_8_normal(A) -#define read_8_DX(A) g65816i_read_8_direct(A) -#define read_8_DY(A) g65816i_read_8_direct(A) -#define read_8_AX(A) g65816i_read_8_normal(A) -#define read_8_ALX(A) g65816i_read_8_normal(A) -#define read_8_AY(A) g65816i_read_8_normal(A) -#define read_8_DI(A) g65816i_read_8_normal(A) -#define read_8_DLI(A) g65816i_read_8_normal(A) -#define read_8_AI(A) g65816i_read_8_normal(A) -#define read_8_ALI(A) g65816i_read_8_normal(A) -#define read_8_DXI(A) g65816i_read_8_normal(A) -#define read_8_DIY(A) g65816i_read_8_normal(A) -#define read_8_DLIY(A) g65816i_read_8_normal(A) -#define read_8_S(A) g65816i_read_8_normal(A) -#define read_8_SIY(A) g65816i_read_8_normal(A) - -#define read_16_NORM(A) g65816i_read_16_normal(A) -#define read_16_IMM(A) g65816i_read_16_immediate(A) -#define read_16_D(A) g65816i_read_16_direct(A) -#define read_16_A(A) g65816i_read_16_normal(A) -#define read_16_AL(A) g65816i_read_16_normal(A) -#define read_16_DX(A) g65816i_read_16_direct(A) -#define read_16_DY(A) g65816i_read_16_direct(A) -#define read_16_AX(A) g65816i_read_16_normal(A) -#define read_16_ALX(A) g65816i_read_16_normal(A) -#define read_16_AY(A) g65816i_read_16_normal(A) -#define read_16_DI(A) g65816i_read_16_normal(A) -#define read_16_DLI(A) g65816i_read_16_normal(A) -#define read_16_AI(A) g65816i_read_16_normal(A) -#define read_16_ALI(A) g65816i_read_16_normal(A) -#define read_16_DXI(A) g65816i_read_16_normal(A) -#define read_16_DIY(A) g65816i_read_16_normal(A) -#define read_16_DLIY(A) g65816i_read_16_normal(A) -#define read_16_AXI(A) g65816i_read_16_immediate(A) -#define read_16_S(A) g65816i_read_16_normal(A) -#define read_16_SIY(A) g65816i_read_16_normal(A) - -#define read_24_NORM(A) g65816i_read_24_normal(A) -#define read_24_IMM(A) g65816i_read_24_immediate(A) -#define read_24_D(A) g65816i_read_24_direct(A) -#define read_24_A(A) g65816i_read_24_normal(A) -#define read_24_AL(A) g65816i_read_24_normal(A) -#define read_24_DX(A) g65816i_read_24_direct(A) -#define read_24_DY(A) g65816i_read_24_direct(A) -#define read_24_AX(A) g65816i_read_24_normal(A) -#define read_24_ALX(A) g65816i_read_24_normal(A) -#define read_24_AY(A) g65816i_read_24_normal(A) -#define read_24_DI(A) g65816i_read_24_normal(A) -#define read_24_DLI(A) g65816i_read_24_normal(A) -#define read_24_AI(A) g65816i_read_24_normal(A) -#define read_24_ALI(A) g65816i_read_24_normal(A) -#define read_24_DXI(A) g65816i_read_24_normal(A) -#define read_24_DIY(A) g65816i_read_24_normal(A) -#define read_24_DLIY(A) g65816i_read_24_normal(A) -#define read_24_S(A) g65816i_read_24_normal(A) -#define read_24_SIY(A) g65816i_read_24_normal(A) - -#define write_8_NORM(A, V) g65816i_write_8_normal(A, V) -#define write_8_D(A, V) g65816i_write_8_direct(A, V) -#define write_8_A(A, V) g65816i_write_8_normal(A, V) -#define write_8_AL(A, V) g65816i_write_8_normal(A, V) -#define write_8_DX(A, V) g65816i_write_8_direct(A, V) -#define write_8_DY(A, V) g65816i_write_8_direct(A, V) -#define write_8_AX(A, V) g65816i_write_8_normal(A, V) -#define write_8_ALX(A, V) g65816i_write_8_normal(A, V) -#define write_8_AY(A, V) g65816i_write_8_normal(A, V) -#define write_8_DI(A, V) g65816i_write_8_normal(A, V) -#define write_8_DLI(A, V) g65816i_write_8_normal(A, V) -#define write_8_AI(A, V) g65816i_write_8_normal(A, V) -#define write_8_ALI(A, V) g65816i_write_8_normal(A, V) -#define write_8_DXI(A, V) g65816i_write_8_normal(A, V) -#define write_8_DIY(A, V) g65816i_write_8_normal(A, V) -#define write_8_DLIY(A, V) g65816i_write_8_normal(A, V) -#define write_8_S(A, V) g65816i_write_8_normal(A, V) -#define write_8_SIY(A, V) g65816i_write_8_normal(A, V) - -#define write_16_NORM(A, V) g65816i_write_16_normal(A, V) -#define write_16_D(A, V) g65816i_write_16_direct(A, V) -#define write_16_A(A, V) g65816i_write_16_normal(A, V) -#define write_16_AL(A, V) g65816i_write_16_normal(A, V) -#define write_16_DX(A, V) g65816i_write_16_direct(A, V) -#define write_16_DY(A, V) g65816i_write_16_direct(A, V) -#define write_16_AX(A, V) g65816i_write_16_normal(A, V) -#define write_16_ALX(A, V) g65816i_write_16_normal(A, V) -#define write_16_AY(A, V) g65816i_write_16_normal(A, V) -#define write_16_DI(A, V) g65816i_write_16_normal(A, V) -#define write_16_DLI(A, V) g65816i_write_16_normal(A, V) -#define write_16_AI(A, V) g65816i_write_16_normal(A, V) -#define write_16_ALI(A, V) g65816i_write_16_normal(A, V) -#define write_16_DXI(A, V) g65816i_write_16_normal(A, V) -#define write_16_DIY(A, V) g65816i_write_16_normal(A, V) -#define write_16_DLIY(A, V) g65816i_write_16_normal(A, V) -#define write_16_S(A, V) g65816i_write_16_normal(A, V) -#define write_16_SIY(A, V) g65816i_write_16_normal(A, V) - - -#define OPER_8_IMM() read_8_IMM(EA_IMM8()) -#define OPER_8_D() read_8_D(EA_D()) -#define OPER_8_A() read_8_A(EA_A()) -#define OPER_8_AL() read_8_AL(EA_AL()) -#define OPER_8_DX() read_8_DX(EA_DX()) -#define OPER_8_DY() read_8_DY(EA_DY()) -#define OPER_8_AX() read_8_AX(EA_AX()) -#define OPER_8_ALX() read_8_ALX(EA_ALX()) -#define OPER_8_AY() read_8_AY(EA_AY()) -#define OPER_8_DI() read_8_DI(EA_DI()) -#define OPER_8_DLI() read_8_DLI(EA_DLI()) -#define OPER_8_AI() read_8_AI(EA_AI()) -#define OPER_8_ALI() read_8_ALI(EA_ALI()) -#define OPER_8_DXI() read_8_DXI(EA_DXI()) -#define OPER_8_DIY() read_8_DIY(EA_DIY()) -#define OPER_8_DLIY() read_8_DLIY(EA_DLIY()) -#define OPER_8_S() read_8_S(EA_S()) -#define OPER_8_SIY() read_8_SIY(EA_SIY()) - -#define OPER_16_IMM() read_16_IMM(EA_IMM16()) -#define OPER_16_D() read_16_D(EA_D()) -#define OPER_16_A() read_16_A(EA_A()) -#define OPER_16_AL() read_16_AL(EA_AL()) -#define OPER_16_DX() read_16_DX(EA_DX()) -#define OPER_16_DY() read_16_DY(EA_DY()) -#define OPER_16_AX() read_16_AX(EA_AX()) -#define OPER_16_ALX() read_16_ALX(EA_ALX()) -#define OPER_16_AY() read_16_AY(EA_AY()) -#define OPER_16_DI() read_16_DI(EA_DI()) -#define OPER_16_DLI() read_16_DLI(EA_DLI()) -#define OPER_16_AI() read_16_AI(EA_AI()) -#define OPER_16_ALI() read_16_ALI(EA_ALI()) -#define OPER_16_DXI() read_16_DXI(EA_DXI()) -#define OPER_16_DIY() read_16_DIY(EA_DIY()) -#define OPER_16_DLIY() read_16_DLIY(EA_DLIY()) -#define OPER_16_S() read_16_S(EA_S()) -#define OPER_16_SIY() read_16_SIY(EA_SIY()) - -#define OPER_24_IMM() read_24_IMM(EA_IMM24()) -#define OPER_24_D() read_24_D(EA_D()) -#define OPER_24_A() read_24_A(EA_A()) -#define OPER_24_AL() read_24_AL(EA_AL()) -#define OPER_24_DX() read_24_DX(EA_DX()) -#define OPER_24_DY() read_24_DY(EA_DY()) -#define OPER_24_AX() read_24_AX(EA_AX()) -#define OPER_24_ALX() read_24_ALX(EA_ALX()) -#define OPER_24_AY() read_24_AY(EA_AY()) -#define OPER_24_DI() read_24_DI(EA_DI()) -#define OPER_24_DLI() read_24_DLI(EA_DLI()) -#define OPER_24_AI() read_24_AI(EA_AI()) -#define OPER_24_ALI() read_24_ALI(EA_ALI()) -#define OPER_24_DXI() read_24_DXI(EA_DXI()) -#define OPER_24_DIY() read_24_DIY(EA_DIY()) -#define OPER_24_DLIY() read_24_DLIY(EA_DLIY()) -#define OPER_24_S() read_24_S(EA_S()) -#define OPER_24_SIY() read_24_SIY(EA_SIY()) - - - -/* ======================================================================== */ -/* =========================== OPERATION MACROS =========================== */ -/* ======================================================================== */ - -/* M6502 Add With Carry */ -#undef OP_ADC -#if FLAG_SET_M -#define OP_ADC(MODE) \ - { \ - unsigned tmp16; \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - SRC = OPER_8_##MODE(); \ - if(FLAG_D) \ - { \ - int32_t result, r0, r1, carry; \ - r0 = REGISTER_A; \ - r1 = SRC; \ - carry = CFLAG_1(); \ - result = (r0 & 0x0f) + (r1 & 0x0f) + (carry << 0); \ - if (result > 0x09) result += 0x06; \ - carry = result > 0x0f; \ - result = (r0 & 0xf0) + (r1 & 0xf0) + (carry << 4) + (result & 0x0f); \ - FLAG_V = ~(r0 ^ SRC) & (r0 ^ result) & 0x80; \ - if (result > 0x9f) result += 0x60; \ - FLAG_C = (result > 0xff) ? 0x100 : 0; \ - FLAG_N = (result & 0x80); \ - FLAG_Z = REGISTER_A = MAKE_UINT_8(result); \ - } \ - else \ - { \ - FLAG_C = tmp16 = REGISTER_A + SRC + CFLAG_1(); \ - FLAG_V = VFLAG_ADD_8(SRC, REGISTER_A, FLAG_C); \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(tmp16); \ - } \ - } - -#else -#define OP_ADC(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - SRC = OPER_16_##MODE(); \ - int32_t result, r0, r1, carry; \ - r0 = REGISTER_A; \ - r1 = SRC; \ - carry = CFLAG_1(); \ - if (!FLAG_D) \ - { \ - result = r0 + r1 + carry; \ - } \ - else \ - { \ - result = (r0 & 0x000f) + (r1 & 0x000f) + (carry << 0); \ - if(result > 0x0009) result += 0x0006; \ - carry = result > 0x000f; \ - result = (r0 & 0x00f0) + (r1 & 0x00f0) + (carry << 4) + (result & 0x000f); \ - if(result > 0x009f) result += 0x0060; \ - carry = result > 0x00ff; \ - result = (r0 & 0x0f00) + (r1 & 0x0f00) + (carry << 8) + (result & 0x00ff); \ - if(result > 0x09ff) result += 0x0600; \ - carry = result > 0x0fff; \ - result = (r0 & 0xf000) + (r1 & 0xf000) + (carry << 12) + (result & 0x0fff); \ - } \ - FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x8000; \ - FLAG_V >>= 8; \ - if (FLAG_D && result > 0x9fff) result += 0x6000; \ - FLAG_C = (result > 0xffff) ? 0x100 : 0; \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(result); \ - FLAG_N = NFLAG_16(REGISTER_A); -#endif - -/* M6502 Logical AND with accumulator */ -#undef OP_AND -#if FLAG_SET_M -#define OP_AND(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = FLAG_Z = REGISTER_A &= OPER_8_##MODE() -#else -#define OP_AND(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_Z = REGISTER_A &= OPER_16_##MODE(); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Arithmetic Shift Left accumulator */ -#undef OP_ASL -#if FLAG_SET_M -#define OP_ASL() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = REGISTER_A << 1; \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C) -#else -#define OP_ASL() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = REGISTER_A << 1; \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = CFLAG_16(FLAG_C) -#endif - -/* M6502 Arithmetic Shift Left operand */ -#undef OP_ASLM -#if FLAG_SET_M -#define OP_ASLM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_C = read_8_##MODE(DST) << 1; \ - FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_ASLM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_C = read_16_##MODE(DST) << 1; \ - FLAG_Z = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = CFLAG_16(FLAG_C); \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* M6502 Branch on Condition Code */ -#undef OP_BCC -#define OP_BCC(COND) \ - DST = OPER_8_IMM(); \ - if(COND) \ - { \ - CLK(CLK_OP + CLK_RELATIVE_8 + 1); \ - g65816i_branch_8(DST); \ - BREAKOUT; \ - } \ - CLK(CLK_OP + CLK_RELATIVE_8); -/* M6502 Set flags according to bits */ -#undef OP_BIT -#if FLAG_SET_M -#define OP_BIT(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = OPER_8_##MODE(); \ - FLAG_Z = FLAG_N & REGISTER_A; \ - FLAG_V = FLAG_N << 1 -#else -#define OP_BIT(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_N = OPER_16_##MODE(); \ - FLAG_Z = FLAG_N & REGISTER_A; \ - FLAG_N = NFLAG_16(FLAG_N); \ - FLAG_V = FLAG_N << 1 -#endif - -/* G65816 Set flags according to bits (immediate addressing mode) */ -#undef OP_BITI -#if FLAG_SET_M -#define OP_BITI() \ - CLK(CLK_OP + CLK_R8 + CLK_IMM); \ - FLAG_Z = REGISTER_A & OPER_8_IMM() -#else -#define OP_BITI() \ - CLK(CLK_OP + CLK_R16 + CLK_IMM); \ - FLAG_Z = REGISTER_A & OPER_16_IMM() -#endif - -/* M6502 Cause a Break interrupt */ -#undef OP_BRK -#define OP_BRK() \ - REGISTER_PC++; \ - g65816i_interrupt_software(VECTOR_BRK) - -/* G65816 Branch Always */ -#undef OP_BRA -#define OP_BRA() \ - CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_8); \ - g65816i_branch_8(OPER_8_IMM()) - -/* G65816 Branch Always Long */ -#undef OP_BRL -#define OP_BRL() \ - CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_16); \ - g65816i_branch_16(OPER_16_IMM()) - -/* M6502 Clear Carry flag */ -#undef OP_CLC -#define OP_CLC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = CFLAG_CLEAR - -/* M6502 Clear Decimal flag */ -#undef OP_CLD -#define OP_CLD() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_D = DFLAG_CLEAR - -/* M6502 Clear Interrupt Mask flag */ -#undef OP_CLI -#define OP_CLI() \ - CLK(CLK_OP + CLK_IMPLIED); \ - g65816i_set_flag_i(IFLAG_CLEAR) - -/* M6502 Clear oVerflow flag */ -#undef OP_CLV -#define OP_CLV() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_V = VFLAG_CLEAR - -/* M6502 Compare operand to accumulator */ -/* Unusual behavior: C flag is inverted */ -#undef OP_CMP -#if FLAG_SET_M -#define OP_CMP(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_C = REGISTER_A - OPER_8_##MODE(); \ - FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ - FLAG_C ^= CFLAG_SET -#else -#define OP_CMP(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_C = REGISTER_A - OPER_16_##MODE(); \ - FLAG_Z = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = ~CFLAG_16(FLAG_C) -#endif - -/* M6502 Compare operand to index register */ -/* Unusual behavior: C flag is inverted */ -#undef OP_CMPX -#if FLAG_SET_X -#define OP_CMPX(REG, MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_C = REG - OPER_8_##MODE(); \ - FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ - FLAG_C ^= CFLAG_SET -#else -#define OP_CMPX(REG, MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_C = REG - OPER_16_##MODE(); \ - FLAG_Z = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = ~CFLAG_16(FLAG_C) -#endif - -/* G65816 Coprocessor operation */ -#undef OP_COP -#define OP_COP() \ - REGISTER_PC++; \ - g65816i_interrupt_software(VECTOR_COP) - -/* M6502 Decrement accumulator */ -#undef OP_DEC -#if FLAG_SET_M -#define OP_DEC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(REGISTER_A - 1) -#else -#define OP_DEC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(REGISTER_A - 1); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Decrement operand */ -#undef OP_DECM -#if FLAG_SET_M -#define OP_DECM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) - 1); \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_DECM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) - 1); \ - FLAG_N = NFLAG_16(FLAG_Z); \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* M6502 Decrement index register */ -#undef OP_DECX -#if FLAG_SET_X -#define OP_DECX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG - 1) -#else -#define OP_DECX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = MAKE_UINT_16(REG - 1); \ - FLAG_N = NFLAG_16(REG) -#endif - -/* M6502 Exclusive Or operand to accumulator */ -#undef OP_EOR -#if FLAG_SET_M -#define OP_EOR(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = FLAG_Z = REGISTER_A ^= OPER_8_##MODE() -#else -#define OP_EOR(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_Z = REGISTER_A ^= OPER_16_##MODE(); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Increment accumulator */ -#undef OP_INC -#if FLAG_SET_M -#define OP_INC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(REGISTER_A + 1) -#else -#define OP_INC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(REGISTER_A + 1); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Increment operand */ -#undef OP_INCM -#if FLAG_SET_M -#define OP_INCM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) + 1); \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_INCM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) + 1); \ - FLAG_N = NFLAG_16(FLAG_Z); \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* M6502 Increment index register */ -#undef OP_INCX -#if FLAG_SET_X -#define OP_INCX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG + 1) -#else -#define OP_INCX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = MAKE_UINT_16(REG + 1); \ - FLAG_N = NFLAG_16(REG) -#endif - -/* G65816 Jump Long */ -#undef OP_JMLAI -#define OP_JMLAI() \ - CLK(CLK_OP + CLK_AI + 1); \ - g65816i_jump_24(read_24_A(OPER_16_IMM())) - -/* M6502 Jump */ -#undef OP_JMP -#define OP_JMP(MODE) \ - CLK(CLK_OP + CLK_##MODE); \ - g65816i_jump_16(EA_##MODE()) - -/* M6502 Jump absolute indexed indirect */ -#undef OP_JMPAXI -#define OP_JMPAXI() \ - CLK(CLK_OP + CLK_AXI); \ - g65816i_jump_16(read_16_AXI(REGISTER_PB | (MAKE_UINT_16(OPER_16_IMM() + REGISTER_X)))) - -/* G65816 Jump absolute long */ -#undef OP_JMPAL -#define OP_JMPAL() \ - CLK(CLK_OP + CLK_AL); \ - g65816i_jump_24(EA_AL()) - -/* G65816 Jump to Subroutine Long */ -/* Unusual behavior: stacks PC-1 */ -#undef OP_JSL -#define OP_JSL(MODE) \ - CLK(CLK_OP + CLK_W24 + CLK_##MODE + 1); \ - DST = EA_##MODE(); \ - g65816i_push_8(REGISTER_PB>>16); \ - g65816i_push_16(REGISTER_PC-1); \ - g65816i_jump_24(DST) - -/* M6502 Jump to Subroutine */ -/* Unusual behavior: stacks PC-1 */ -#undef OP_JSR -#define OP_JSR(MODE) \ - CLK(6); \ - DST = EA_##MODE(); \ - g65816i_push_16(REGISTER_PC-1); \ - g65816i_jump_16(DST) - -/* M6502 Jump to Subroutine */ -/* Unusual behavior: stacks PC-1 */ -#undef OP_JSRAXI -#define OP_JSRAXI() \ - CLK(8); \ - DST = read_16_AXI(REGISTER_PB | (MAKE_UINT_16(OPER_16_IMM() + REGISTER_X))); \ - g65816i_push_16(REGISTER_PC-1); \ - g65816i_jump_16(DST) - -/* M6502 Load accumulator with operand */ -#undef OP_LDA -#if FLAG_SET_M -#define OP_LDA(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = FLAG_Z = REGISTER_A = OPER_8_##MODE() -#else -#define OP_LDA(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_Z = REGISTER_A = OPER_16_##MODE(); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Load index register with operand */ -#undef OP_LDX -#if FLAG_SET_X -#define OP_LDX(REG, MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = FLAG_Z = REG = OPER_8_##MODE() -#else -#define OP_LDX(REG, MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_Z = REG = OPER_16_##MODE(); \ - FLAG_N = NFLAG_16(REG) -#endif - -/* M6502 Logical Shift Right accumulator */ -#undef OP_LSR -#if FLAG_SET_M -#define OP_LSR() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = 0; \ - FLAG_C = REGISTER_A << 8; \ - FLAG_Z = REGISTER_A >>= 1 -#else -#define OP_LSR() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_N = 0; \ - FLAG_C = REGISTER_A << 8; \ - FLAG_Z = REGISTER_A >>= 1 -#endif - -/* M6502 Logical Shift Right operand */ -#undef OP_LSRM -#if FLAG_SET_M -#define OP_LSRM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_N = 0; \ - FLAG_Z = read_8_##MODE(DST); \ - FLAG_C = FLAG_Z << 8; \ - FLAG_Z >>= 1; \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_LSRM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_N = 0; \ - FLAG_Z = read_16_##MODE(DST); \ - FLAG_C = FLAG_Z << 8; \ - FLAG_Z >>= 1; \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* G65816 Move Block Negative */ -#undef OP_MVN -#if FLAG_SET_M -#if FLAG_SET_X -#define OP_MVN() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_8(REGISTER_X+1); \ - REGISTER_Y = MAKE_UINT_8(REGISTER_Y+1); \ - REGISTER_A--; \ - REGISTER_A &= 0xff; \ - if ((REGISTER_A&0xff) != 0xff) \ - {\ - REGISTER_PC -= 3; \ - }\ - else \ - { \ - REGISTER_B -= 0x100;\ - REGISTER_B &= 0xff00; \ - if ((REGISTER_B & 0xff00) != 0xff00)\ - { \ - REGISTER_PC -= 3;\ - } \ - } -#else -#define OP_MVN() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_16(REGISTER_X+1); \ - REGISTER_Y = MAKE_UINT_16(REGISTER_Y+1); \ - REGISTER_A--; \ - REGISTER_A &= 0xff; \ - if ((REGISTER_A&0xff) != 0xff) \ - {\ - REGISTER_PC -= 3; \ - }\ - else \ - { \ - REGISTER_B -= 0x100;\ - REGISTER_B &= 0xff00; \ - if ((REGISTER_B & 0xff00) != 0xff00)\ - { \ - REGISTER_PC -= 3;\ - } \ - } -#endif -#else -#if FLAG_SET_X -#define OP_MVN() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - REGISTER_A |= REGISTER_B; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_8(REGISTER_X+1); \ - REGISTER_Y = MAKE_UINT_8(REGISTER_Y+1); \ - REGISTER_A--; \ - if ((REGISTER_A&0xffff) != 0xffff) \ - {\ - REGISTER_PC -= 3; \ - } -#else -#define OP_MVN() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - REGISTER_A |= REGISTER_B; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_16(REGISTER_X+1); \ - REGISTER_Y = MAKE_UINT_16(REGISTER_Y+1); \ - REGISTER_A--; \ - if ((REGISTER_A&0xffff) != 0xffff) \ - {\ - REGISTER_PC -= 3; \ - } -#endif -#endif - -/* G65816 Move Block Positive */ -#undef OP_MVP -#if FLAG_SET_M -#if FLAG_SET_X -#define OP_MVP() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_8(REGISTER_X-1); \ - REGISTER_Y = MAKE_UINT_8(REGISTER_Y-1); \ - REGISTER_A--; \ - REGISTER_A &= 0xff; \ - if ((REGISTER_A&0xff) != 0xff) \ - {\ - REGISTER_PC -= 3; \ - }\ - else \ - { \ - REGISTER_B -= 0x100;\ - REGISTER_B &= 0xff00; \ - if ((REGISTER_B & 0xff00) != 0xff00)\ - { \ - REGISTER_PC -= 3;\ - } \ - } -#else -#define OP_MVP() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_16(REGISTER_X-1); \ - REGISTER_Y = MAKE_UINT_16(REGISTER_Y-1); \ - REGISTER_A--; \ - REGISTER_A &= 0xff; \ - if ((REGISTER_A&0xff) != 0xff) \ - {\ - REGISTER_PC -= 3; \ - }\ - else \ - { \ - REGISTER_B -= 0x100;\ - REGISTER_B &= 0xff00; \ - if ((REGISTER_B & 0xff00) != 0xff00)\ - { \ - REGISTER_PC -= 3;\ - } \ - } -#endif -#else -#if FLAG_SET_X -#define OP_MVP() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - REGISTER_A |= REGISTER_B; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_8(REGISTER_X-1); \ - REGISTER_Y = MAKE_UINT_8(REGISTER_Y-1); \ - REGISTER_A--; \ - if ((REGISTER_A&0xffff) != 0xffff) \ - {\ - REGISTER_PC -= 3; \ - } -#else -#define OP_MVP() \ - DST = OPER_8_IMM()<<16; \ - SRC = OPER_8_IMM()<<16; \ - REGISTER_DB = DST; \ - REGISTER_A |= REGISTER_B; \ - CLK(7); \ - write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ - REGISTER_X = MAKE_UINT_16(REGISTER_X-1); \ - REGISTER_Y = MAKE_UINT_16(REGISTER_Y-1); \ - REGISTER_A--; \ - if ((REGISTER_A&0xffff) != 0xffff) \ - {\ - REGISTER_PC -= 3; \ - } -#endif -#endif - -/* M6502 No Operation */ -#undef OP_NOP -#define OP_NOP() \ - CLK(CLK_OP + CLK_IMPLIED) - -/* M6502 Logical OR operand to accumulator */ -#undef OP_ORA -#if FLAG_SET_M -#define OP_ORA(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - FLAG_N = FLAG_Z = REGISTER_A |= OPER_8_ ## MODE() -#else -#define OP_ORA(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - FLAG_Z = REGISTER_A |= OPER_16_##MODE(); \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* G65816 Push Effective Address */ -#undef OP_PEA -#define OP_PEA() \ - CLK(CLK_OP + CLK_R16 + CLK_W16); \ - g65816i_push_16(OPER_16_IMM()) - -/* G65816 Push Effective Indirect Address */ -#undef OP_PEI -#define OP_PEI() \ - CLK(CLK_OP + CLK_R16 + CLK_W16 + CLK_D); \ - g65816i_push_16(EA_DI()) - -/* G65816 Push Effective PC-Relative Address */ -#undef OP_PER -#define OP_PER() \ - CLK(CLK_OP + CLK_R16 + CLK_W16 + 1); \ - SRC = OPER_16_IMM(); \ - g65816i_push_16(REGISTER_PC + SRC) - -/* M6502 Push accumulator to the stack */ -#undef OP_PHA -#if FLAG_SET_M -#define OP_PHA() \ - CLK(CLK_OP + CLK_W8 + 1); \ - g65816i_push_8(REGISTER_A) -#else -#define OP_PHA() \ - CLK(CLK_OP + CLK_W16 + 1); \ - g65816i_push_16(REGISTER_A) -#endif - -/* M6502 Push index register to the stack */ -#undef OP_PHX -#if FLAG_SET_X -#define OP_PHX(REG) \ - CLK(CLK_OP + CLK_W8 + 1); \ - g65816i_push_8(REG) -#else -#define OP_PHX(REG) \ - CLK(CLK_OP + CLK_W16 + 1); \ - g65816i_push_16(REG) -#endif - -/* G65816 Push data bank register */ -#undef OP_PHB -#define OP_PHB() \ - CLK(CLK_OP + CLK_W8 + 1); \ - g65816i_push_8(REGISTER_DB>>16) - -/* G65816 Push direct register */ -#undef OP_PHD -#define OP_PHD() \ - CLK(CLK_OP + CLK_W16 + 1); \ - g65816i_push_16(REGISTER_D) - -/* G65816 Push program bank register */ -#undef OP_PHK -#define OP_PHK() \ - CLK(CLK_OP + CLK_W8 + 1); \ - g65816i_push_8(REGISTER_PB>>16) - -/* M6502 Push the Processor Status Register to the stack */ -#undef OP_PHP -#define OP_PHP() \ - CLK(CLK_OP + CLK_W8 + 1); \ - g65816i_push_8(g65816i_get_reg_p()) - -/* M6502 Pull accumulator from the stack */ -#undef OP_PLA -#if FLAG_SET_M -#define OP_PLA() \ - CLK(CLK_OP + CLK_R8 + 2); \ - FLAG_N = FLAG_Z = REGISTER_A = g65816i_pull_8() -#else -#define OP_PLA() \ - CLK(CLK_OP + CLK_R16 + 2); \ - FLAG_Z = REGISTER_A = g65816i_pull_16(); \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* M6502 Pull index register from the stack */ -#undef OP_PLX -#if FLAG_SET_X -#define OP_PLX(REG) \ - CLK(CLK_OP + CLK_R8 + 2); \ - FLAG_N = FLAG_Z = REG = g65816i_pull_8() -#else -#define OP_PLX(REG) \ - CLK(CLK_OP + CLK_R16 + 2); \ - FLAG_Z = REG = g65816i_pull_16(); \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Pull data bank register */ -#undef OP_PLB -#define OP_PLB() \ - CLK(CLK_OP + CLK_R8 + 2); \ - FLAG_N = FLAG_Z = g65816i_pull_8(); \ - REGISTER_DB = FLAG_Z << 16 - -/* G65816 Pull direct register */ -#undef OP_PLD -#define OP_PLD() \ - CLK(CLK_OP + CLK_R16 + 2); \ - FLAG_Z = REGISTER_D = g65816i_pull_16(); \ - FLAG_N = NFLAG_16(FLAG_Z) - -/* M6502 Pull the Processor Status Register from the stack */ -#undef OP_PLP -#define OP_PLP() \ - CLK(CLK_OP + CLK_R8 + 2); \ - g65816i_set_reg_p(g65816i_pull_8()) - -/* G65816 Reset Program status word */ -#undef OP_REP -#define OP_REP() \ - CLK(CLK_OP + CLK_R8 + 1); \ - g65816i_set_reg_p(g65816i_get_reg_p() & ~OPER_8_IMM()) - -/* M6502 Rotate Left the accumulator */ -#undef OP_ROL -#if FLAG_SET_M -#define OP_ROL() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = (REGISTER_A<<1) | CFLAG_1(); \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C) -#else -#define OP_ROL() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = (REGISTER_A<<1) | CFLAG_1(); \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = CFLAG_16(FLAG_C) -#endif - -/* M6502 Rotate Left an operand */ -#undef OP_ROLM -#if FLAG_SET_M -#define OP_ROLM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_C = (read_8_##MODE(DST)<<1) | CFLAG_1(); \ - FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_ROLM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_C = (read_16_##MODE(DST)<<1) | CFLAG_1(); \ - FLAG_Z = MAKE_UINT_16(FLAG_C); \ - FLAG_N = NFLAG_16(FLAG_C); \ - FLAG_C = CFLAG_16(FLAG_C); \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* M6502 Rotate Right the accumulator */ -#undef OP_ROR -#if FLAG_SET_M -#define OP_ROR() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_A |= FLAG_C & 0x100; \ - FLAG_C = REGISTER_A << 8; \ - FLAG_N = FLAG_Z = REGISTER_A >>= 1 -#else -#define OP_ROR() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_A |= (FLAG_C<<8) & 0x10000; \ - FLAG_C = REGISTER_A << 8; \ - FLAG_Z = REGISTER_A >>= 1; \ - FLAG_N = NFLAG_16(REGISTER_A) -#endif - -/* M6502 Rotate Right an operand */ -#undef OP_RORM -#if FLAG_SET_M -#define OP_RORM(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_8_##MODE(DST) | (FLAG_C & 0x100); \ - FLAG_C = FLAG_Z << 8; \ - FLAG_N = FLAG_Z >>= 1; \ - write_8_##MODE(DST, FLAG_Z) -#else -#define OP_RORM(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_16_##MODE(DST) | ((FLAG_C<<8) & 0x10000); \ - FLAG_C = FLAG_Z << 8; \ - FLAG_Z >>= 1; \ - FLAG_N = NFLAG_16(FLAG_Z); \ - write_16_##MODE(DST, FLAG_Z) -#endif - -/* M6502 Return from Interrupt */ -#undef OP_RTI -#if FLAG_SET_E -#define OP_RTI() \ - CLK(7); \ - g65816i_set_reg_p(g65816i_pull_8()); \ - g65816i_jump_16(g65816i_pull_16()) -#else -#define OP_RTI() \ - CLK(8); \ - g65816i_set_reg_p(g65816i_pull_8()); \ - g65816i_jump_16(g65816i_pull_16()); \ - REGISTER_PB = g65816i_pull_8() << 16 -#endif - -/* G65816 Return from Subroutine Long */ -/* Unusual behavior: Gets PC and increments */ -#undef OP_RTL -#define OP_RTL() \ - CLK(6); \ - g65816i_jump_24(g65816i_pull_24()) - -/* M6502 Return from Subroutine */ -/* Unusual behavior: Gets PC and increments */ -#undef OP_RTS -#define OP_RTS() \ - CLK(6); \ - g65816i_jump_16(g65816i_pull_16()+1) - -/* M6502 Subtract with Carry */ -/* Unusual behavior: C flag is inverted */ -#undef OP_SBC -#if FLAG_SET_M -#define OP_SBC(MODE) \ - CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ - SRC = OPER_8_##MODE(); \ - if(!FLAG_D) \ - { \ - FLAG_C = ~FLAG_C; \ - FLAG_C = REGISTER_A - SRC - CFLAG_1(); \ - FLAG_V = VFLAG_SUB_8(SRC, REGISTER_A, FLAG_C); \ - FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C); \ - FLAG_C = ~FLAG_C; \ - BREAKOUT; \ - } \ - else \ - { \ - int32_t result, r0, r1, carry; \ - r0 = REGISTER_A; \ - r1 = SRC; \ - r1 ^= 0xff; \ - carry = CFLAG_1(); \ - result = (r0 & 0x0f) + (r1 & 0x0f) + (carry << 0); \ - if (result <= 0x0f) result -= 0x06; \ - carry = result > 0x0f; \ - result = (r0 & 0xf0) + (r1 & 0xf0) + (carry << 4) + (result & 0x0f); \ - FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x80; \ - if (result <= 0xff) result -= 0x60; \ - FLAG_C = (result > 0xff) ? 0x100 : 0; \ - FLAG_N = (result & 0x80); \ - FLAG_Z = REGISTER_A = MAKE_UINT_8(result); \ - } -#else -#define OP_SBC(MODE) \ - CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ - SRC = OPER_16_##MODE(); \ - int32_t result, r0, r1, carry; \ - r0 = REGISTER_A; \ - r1 = SRC; \ - r1 ^= 0xffff; \ - carry = CFLAG_1(); \ - if (!FLAG_D) \ - { \ - result = r0 + r1 + carry; \ - } \ - else \ - { \ - result = (r0 & 0x000f) + (r1 & 0x000f) + (carry << 0); \ - if(result <= 0x000f) result -= 0x0006; \ - carry = result > 0x000f; \ - result = (r0 & 0x00f0) + (r1 & 0x00f0) + (carry << 4) + (result & 0x000f); \ - if(result <= 0x00ff) result -= 0x0060; \ - carry = result > 0x00ff; \ - result = (r0 & 0x0f00) + (r1 & 0x0f00) + (carry << 8) + (result & 0x00ff); \ - if(result <= 0x0fff) result -= 0x0600; \ - carry = result > 0x0fff; \ - result = (r0 & 0xf000) + (r1 & 0xf000) + (carry << 12) + (result & 0x0fff); \ - } \ - FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x8000; \ - FLAG_V >>= 8; \ - if (FLAG_D && result <= 0xffff) result -= 0x6000; \ - FLAG_C = (result > 0xffff) ? 0x100 : 0; \ - FLAG_Z = REGISTER_A = MAKE_UINT_16(result); \ - FLAG_N = NFLAG_16(REGISTER_A); -#endif - - -/* M6502 Set Carry flag */ -#undef OP_SEC -#define OP_SEC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_C = CFLAG_SET - -/* M6502 Set Decimal flag */ -#undef OP_SED -#define OP_SED() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_D = DFLAG_SET - -/* M6502 Set Interrupt Mask flag */ -#undef OP_SEI -#define OP_SEI() \ - CLK(CLK_OP + CLK_IMPLIED); \ - g65816i_set_flag_i(IFLAG_SET) - -/* G65816 Set Program status word */ -#undef OP_SEP -#define OP_SEP() \ - CLK(CLK_OP + CLK_R8 + 1); \ - g65816i_set_reg_p(g65816i_get_reg_p() | OPER_8_IMM()) - -/* M6502 Store accumulator to memory */ -#undef OP_STA -#if FLAG_SET_M -#define OP_STA(MODE) \ - CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ - write_8_##MODE(EA_##MODE(), REGISTER_A) -#else -#define OP_STA(MODE) \ - CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ - write_16_##MODE(EA_##MODE(), REGISTER_A) -#endif - -/* M6502 Store index register to memory */ -#undef OP_STX -#if FLAG_SET_X -#define OP_STX(REG, MODE) \ - CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ - write_8_##MODE(EA_##MODE(), REG) -#else -#define OP_STX(REG, MODE) \ - CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ - write_16_##MODE(EA_##MODE(), REG) -#endif - -/* M6502 Store zero to memory */ -#undef OP_STZ -#if FLAG_SET_M -#define OP_STZ(MODE) \ - CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ - write_8_##MODE(EA_##MODE(), 0) -#else -#define OP_STZ(MODE) \ - CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ - write_16_##MODE(EA_##MODE(), 0) -#endif - -/* G65816 Stop the clock */ -#undef OP_STP -#define OP_STP() \ - USE_ALL_CLKS(); \ - CPU_STOPPED |= STOP_LEVEL_STOP - -/* M6502 Transfer accumulator to index */ -#undef OP_TAX -#if FLAG_SET_M -#if FLAG_SET_X -#define OP_TAX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = REGISTER_A; \ - FLAG_N = NFLAG_8(FLAG_Z) -#else /* FLAG_SET_X */ -#define OP_TAX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = REGISTER_B | REGISTER_A; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif /* FLAG_SET_X */ -#else /* FLAG_SET_M */ -#if FLAG_SET_X -#define OP_TAX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = MAKE_UINT_8(REGISTER_A); \ - FLAG_N = NFLAG_8(FLAG_Z) -#else /* FLAG_SET_X */ -#define OP_TAX(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REG = REGISTER_A; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif /* FLAG_SET_X */ -#endif /* FLAG_SET_M */ - - -/* M6502 Transfer index to accumulator */ -#undef OP_TXA -#if FLAG_SET_M -#define OP_TXA(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = MAKE_UINT_8(REG); \ - FLAG_N = NFLAG_8(FLAG_Z) -#else -#define OP_TXA(REG) \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = REG; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Transfer C to direct register */ -#undef OP_TCD -#if FLAG_SET_M -#define OP_TCD() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_D = REGISTER_A | REGISTER_B; \ - FLAG_N = NFLAG_16(FLAG_Z) -#else -#define OP_TCD() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_D = REGISTER_A; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Transfer direct register to C */ -#undef OP_TDC -#if FLAG_SET_M -#define OP_TDC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_D; \ - FLAG_N = NFLAG_16(FLAG_Z); \ - REGISTER_A = MAKE_UINT_8(REGISTER_D); \ - REGISTER_B = REGISTER_D & 0xff00 -#else -#define OP_TDC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = REGISTER_D; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Transfer C to stack pointer */ -#undef OP_TCS -#if FLAG_SET_E -#define OP_TCS() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_S = MAKE_UINT_8(REGISTER_A) | 0x100 -#else -#define OP_TCS() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_S = REGISTER_A | REGISTER_B -#endif - -/* G65816 Transfer stack pointer to C */ -#undef OP_TSC -#if FLAG_SET_M -#define OP_TSC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_S; \ - FLAG_N = NFLAG_16(FLAG_Z); \ - REGISTER_A = MAKE_UINT_8(REGISTER_S); \ - REGISTER_B = REGISTER_S & 0xff00 -#else -#define OP_TSC() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_A = REGISTER_S; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* M6502 Transfer stack pointer to X */ -#undef OP_TSX -#if FLAG_SET_X -#define OP_TSX() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_X = MAKE_UINT_8(REGISTER_S); \ - FLAG_N = NFLAG_8(FLAG_Z) -#else -#define OP_TSX() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_X = REGISTER_S; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* M6502 Transfer X to stack pointer */ -#undef OP_TXS -#if FLAG_SET_E -#define OP_TXS() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_S = MAKE_UINT_8(REGISTER_X) | 0x100 -#else -#define OP_TXS() \ - CLK(CLK_OP + CLK_IMPLIED); \ - REGISTER_S = REGISTER_X -#endif - -/* G65816 Transfer X to Y */ -#undef OP_TXY -#if FLAG_SET_X -#define OP_TXY() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_Y = REGISTER_X; \ - FLAG_N = NFLAG_8(FLAG_Z) -#else -#define OP_TXY() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_Y = REGISTER_X; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Transfer Y to X */ -#undef OP_TYX -#if FLAG_SET_X -#define OP_TYX() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_X = REGISTER_Y; \ - FLAG_N = NFLAG_8(FLAG_Z) -#else -#define OP_TYX() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_X = REGISTER_Y; \ - FLAG_N = NFLAG_16(FLAG_Z) -#endif - -/* G65816 Test and reset bit */ -#undef OP_TRB -#if FLAG_SET_M -#define OP_TRB(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_8_##MODE(DST); \ - write_8_##MODE(DST, FLAG_Z & ~REGISTER_A); \ - FLAG_Z &= REGISTER_A -#else -#define OP_TRB(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_16_##MODE(DST); \ - write_16_##MODE(DST, FLAG_Z & ~REGISTER_A); \ - FLAG_Z &= REGISTER_A -#endif - -/* G65816 Test and set bit */ -#undef OP_TSB -#if FLAG_SET_M -#define OP_TSB(MODE) \ - CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_8_##MODE(DST); \ - write_8_##MODE(DST, FLAG_Z | REGISTER_A); \ - FLAG_Z &= REGISTER_A -#else -#define OP_TSB(MODE) \ - CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ - DST = EA_##MODE(); \ - FLAG_Z = read_16_##MODE(DST); \ - write_16_##MODE(DST, FLAG_Z | REGISTER_A); \ - FLAG_Z &= REGISTER_A -#endif - -/* G65816 Wait for interrupt */ -#undef OP_WAI -#define OP_WAI() \ - USE_ALL_CLKS(); \ - CPU_STOPPED |= STOP_LEVEL_WAI - -/* G65816 William D. Mensch, JR. (65816 designer) - future expansion */ -#undef OP_WDM -#define OP_WDM() \ - CLK(CLK_OP + CLK_IMPLIED); \ - SRC = OPER_8_IMM(); \ - m_wdm_w(SRC); - -/* G65816 Exchange accum high and low bytes */ -#undef OP_XBA -#if FLAG_SET_M -#define OP_XBA() \ - CLK(CLK_OP + CLK_IMPLIED); \ - FLAG_Z = REGISTER_B>>8; \ - REGISTER_B = REGISTER_A<<8; \ - REGISTER_A = FLAG_Z; \ - FLAG_N = NFLAG_8(FLAG_Z) -#else -#define OP_XBA() \ - CLK(CLK_OP + CLK_IMPLIED + 1); \ - FLAG_Z = REGISTER_A >> 8; \ - REGISTER_A = MAKE_UINT_16(REGISTER_A<<8) | FLAG_Z; \ - FLAG_N = NFLAG_8(FLAG_Z) -#endif - -/* G65816 Exchange carry and emulation bits */ -#undef OP_XCE -#define OP_XCE() \ - CLK(CLK_OP + CLK_IMPLIED); \ - SRC = CFLAG_1(); \ - FLAG_C = FLAG_E<<8; \ - g65816i_set_flag_e(SRC) - - - - -/* ======================================================================== */ -/* ======================== OPCODE & FUNCTION TABLES ====================== */ -/* ======================================================================== */ - -#undef OP -#undef O -#undef TABLE_OPCODES -#undef TABLE_FUNCTION - -#if FLAG_SET_E -#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _E() {OPERATION;} -#define O(CODE) &g65816_device::g65816i_ ## CODE ## _E -#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_E[256] -#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _E ARGS - -#else - -#if !FLAG_SET_M && !FLAG_SET_X -#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M0X0() {OPERATION;} -#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M0X0 -#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M0X0[256] -#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M0X0 ARGS - -#elif !FLAG_SET_M && FLAG_SET_X - -#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M0X1() {OPERATION;} -#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M0X1 -#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M0X1[256] -#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M0X1 ARGS - -#elif FLAG_SET_M && !FLAG_SET_X - -#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M1X0() {OPERATION;} -#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M1X0 -#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M1X0[256] -#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M1X0 ARGS - -#elif FLAG_SET_M && FLAG_SET_X - -#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M1X1() {OPERATION;} -#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M1X1 -#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M1X1[256] -#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M1X1 ARGS - -#endif -#endif -#define BREAKOUT return - - - -/* OP FUNCTION Comment */ -OP(00, OP_BRK ( ) ) /* BRK */ -OP(01, OP_ORA ( DXI ) ) /* ORA dxi */ -OP(02, OP_COP ( ) ) /* COP (G) */ -OP(03, OP_ORA ( S ) ) /* ORA s (G) */ -OP(04, OP_TSB ( D ) ) /* TSB d (C) */ -OP(05, OP_ORA ( D ) ) /* ORA d */ -OP(06, OP_ASLM ( D ) ) /* ASL d */ -OP(07, OP_ORA ( DLI ) ) /* ORA dli (G) */ -OP(08, OP_PHP ( ) ) /* PHP */ -OP(09, OP_ORA ( IMM ) ) /* ORA imm */ -OP(0a, OP_ASL ( ) ) /* ASL acc */ -OP(0b, OP_PHD ( ) ) /* PHD (G) */ -OP(0c, OP_TSB ( A ) ) /* TSB a (C) */ -OP(0d, OP_ORA ( A ) ) /* ORA a */ -OP(0e, OP_ASLM ( A ) ) /* ASL a */ -OP(0f, OP_ORA ( AL ) ) /* ORA al (G) */ -OP(10, OP_BCC ( COND_PL() ) ) /* BPL */ -OP(11, OP_ORA ( DIY ) ) /* ORA diy */ -OP(12, OP_ORA ( DI ) ) /* ORA di (C) */ -OP(13, OP_ORA ( SIY ) ) /* ORA siy (G) */ -OP(14, OP_TRB ( D ) ) /* TRB d (C) */ -OP(15, OP_ORA ( DX ) ) /* ORA dx */ -OP(16, OP_ASLM ( DX ) ) /* ASL dx */ -OP(17, OP_ORA ( DLIY ) ) /* ORA dliy(C) */ -OP(18, OP_CLC ( ) ) /* CLC */ -OP(19, OP_ORA ( AY ) ) /* ORA ay */ -OP(1a, OP_INC ( ) ) /* INA (C) */ -OP(1b, OP_TCS ( ) ) /* TCS (G) */ -OP(1c, OP_TRB ( A ) ) /* TRB a (C) */ -OP(1d, OP_ORA ( AX ) ) /* ORA ax */ -OP(1e, OP_ASLM ( AX ) ) /* ASL ax */ -OP(1f, OP_ORA ( ALX ) ) /* ORA alx (G) */ -OP(20, OP_JSR ( A ) ) /* JSR a */ -OP(21, OP_AND ( DXI ) ) /* AND dxi */ -OP(22, OP_JSL ( AL ) ) /* JSL al (G) */ -OP(23, OP_AND ( S ) ) /* AND s (G) */ -OP(24, OP_BIT ( D ) ) /* BIT d */ -OP(25, OP_AND ( D ) ) /* AND d */ -OP(26, OP_ROLM ( D ) ) /* ROL d */ -OP(27, OP_AND ( DLI ) ) /* AND dli (G) */ -OP(28, OP_PLP ( ) ) /* PLP */ -OP(29, OP_AND ( IMM ) ) /* AND imm */ -OP(2a, OP_ROL ( ) ) /* ROL acc */ -OP(2b, OP_PLD ( ) ) /* PLD (G) */ -OP(2c, OP_BIT ( A ) ) /* BIT a */ -OP(2d, OP_AND ( A ) ) /* AND a */ -OP(2e, OP_ROLM ( A ) ) /* ROL a */ -OP(2f, OP_AND ( AL ) ) /* AND al (G) */ -OP(30, OP_BCC ( COND_MI() ) ) /* BMI */ -OP(31, OP_AND ( DIY ) ) /* AND diy */ -OP(32, OP_AND ( DI ) ) /* AND di (C) */ -OP(33, OP_AND ( SIY ) ) /* AND siy */ -OP(34, OP_BIT ( DX ) ) /* BIT dx (C) */ -OP(35, OP_AND ( DX ) ) /* AND dx */ -OP(36, OP_ROLM ( DX ) ) /* ROL dx */ -OP(37, OP_AND ( DLIY ) ) /* AND dliy(G) */ -OP(38, OP_SEC ( ) ) /* SEC */ -OP(39, OP_AND ( AY ) ) /* AND ay */ -OP(3a, OP_DEC ( ) ) /* DEA (C) */ -OP(3b, OP_TSC ( ) ) /* TSC (G) */ -OP(3c, OP_BIT ( AX ) ) /* BIT abx (C) */ -OP(3d, OP_AND ( AX ) ) /* AND ax */ -OP(3e, OP_ROLM ( AX ) ) /* ROL ax */ -OP(3f, OP_AND ( ALX ) ) /* AND alx (G) */ -OP(40, OP_RTI ( ) ) /* RTI */ -OP(41, OP_EOR ( DXI ) ) /* EOR dxi */ -OP(42, OP_WDM ( ) ) /* WDM */ -OP(43, OP_EOR ( S ) ) /* EOR s (G) */ -OP(44, OP_MVP ( ) ) /* MVP (G) */ -OP(45, OP_EOR ( D ) ) /* EOR d */ -OP(46, OP_LSRM ( D ) ) /* LSR d */ -OP(47, OP_EOR ( DLI ) ) /* EOR dli (G) */ -OP(48, OP_PHA ( ) ) /* PHA */ -OP(49, OP_EOR ( IMM ) ) /* EOR imm */ -OP(4a, OP_LSR ( ) ) /* LSR acc */ -OP(4b, OP_PHK ( ) ) /* PHK (G) */ -OP(4c, OP_JMP ( A ) ) /* JMP a */ -OP(4d, OP_EOR ( A ) ) /* EOR a */ -OP(4e, OP_LSRM ( A ) ) /* LSR a */ -OP(4f, OP_EOR ( AL ) ) /* EOR al (G) */ -OP(50, OP_BCC ( COND_VC() ) ) /* BVC */ -OP(51, OP_EOR ( DIY ) ) /* EOR diy */ -OP(52, OP_EOR ( DI ) ) /* EOR di (C) */ -OP(53, OP_EOR ( SIY ) ) /* EOR siy (G) */ -OP(54, OP_MVN ( ) ) /* MVN (G) */ -OP(55, OP_EOR ( DX ) ) /* EOR dx */ -OP(56, OP_LSRM ( DX ) ) /* LSR dx */ -OP(57, OP_EOR ( DLIY ) ) /* EOR dliy(G) */ -OP(58, OP_CLI ( ) ) /* CLI */ -OP(59, OP_EOR ( AY ) ) /* EOR ay */ -OP(5a, OP_PHX ( REGISTER_Y ) ) /* PHY (C) */ -OP(5b, OP_TCD ( ) ) /* TCD (G) */ -OP(5c, OP_JMPAL( ) ) /* JMP al (G) */ -OP(5d, OP_EOR ( AX ) ) /* EOR ax */ -OP(5e, OP_LSRM ( AX ) ) /* LSR ax */ -OP(5f, OP_EOR ( ALX ) ) /* EOR alx (G) */ -OP(60, OP_RTS ( ) ) /* RTS */ -OP(61, OP_ADC ( DXI ) ) /* ADC dxi */ -OP(62, OP_PER ( ) ) /* PER (G) */ -OP(63, OP_ADC ( S ) ) /* ADC s (G) */ -OP(64, OP_STZ ( D ) ) /* STZ d (C) */ -OP(65, OP_ADC ( D ) ) /* ADC d */ -OP(66, OP_RORM ( D ) ) /* ROR d */ -OP(67, OP_ADC ( DLI ) ) /* ADC dli (G) */ -OP(68, OP_PLA ( ) ) /* PLA */ -OP(69, OP_ADC ( IMM ) ) /* ADC imm */ -OP(6a, OP_ROR ( ) ) /* ROR acc */ -OP(6b, OP_RTL ( ) ) /* RTL (G) */ -OP(6c, OP_JMP ( AI ) ) /* JMP ai */ -OP(6d, OP_ADC ( A ) ) /* ADC a */ -OP(6e, OP_RORM ( A ) ) /* ROR a */ -OP(6f, OP_ADC ( AL ) ) /* ADC al (G) */ -OP(70, OP_BCC ( COND_VS() ) ) /* BVS */ -OP(71, OP_ADC ( DIY ) ) /* ADC diy */ -OP(72, OP_ADC ( DI ) ) /* ADC di (G) */ -OP(73, OP_ADC ( SIY ) ) /* ADC siy (G) */ -OP(74, OP_STZ ( DX ) ) /* STZ dx (C) */ -OP(75, OP_ADC ( DX ) ) /* ADC dx */ -OP(76, OP_RORM ( DX ) ) /* ROR dx */ -OP(77, OP_ADC ( DLIY ) ) /* ADC dliy(G) */ -OP(78, OP_SEI ( ) ) /* SEI */ -OP(79, OP_ADC ( AY ) ) /* ADC ay */ -OP(7a, OP_PLX ( REGISTER_Y ) ) /* PLY (C) */ -OP(7b, OP_TDC ( ) ) /* TDC (G) */ -OP(7c, OP_JMPAXI( ) ) /* JMP axi (C) */ -OP(7d, OP_ADC ( AX ) ) /* ADC ax */ -OP(7e, OP_RORM ( AX ) ) /* ROR ax */ -OP(7f, OP_ADC ( ALX ) ) /* ADC alx (G) */ -OP(80, OP_BRA ( ) ) /* BRA (C) */ -OP(81, OP_STA ( DXI ) ) /* STA dxi */ -OP(82, OP_BRL ( ) ) /* BRL (G) */ -OP(83, OP_STA ( S ) ) /* STA s (G) */ -OP(84, OP_STX ( REGISTER_Y, D ) ) /* STY d */ -OP(85, OP_STA ( D ) ) /* STA d */ -OP(86, OP_STX ( REGISTER_X, D ) ) /* STX d */ -OP(87, OP_STA ( DLI ) ) /* STA dli (G) */ -OP(88, OP_DECX ( REGISTER_Y ) ) /* DEY */ -OP(89, OP_BITI ( ) ) /* BIT imm (C) */ -OP(8a, OP_TXA ( REGISTER_X ) ) /* TXA */ -OP(8b, OP_PHB ( ) ) /* PHB (G) */ -OP(8c, OP_STX ( REGISTER_Y, A ) ) /* STY a */ -OP(8d, OP_STA ( A ) ) /* STA a */ -OP(8e, OP_STX ( REGISTER_X, A ) ) /* STX a */ -OP(8f, OP_STA ( AL ) ) /* STA al (G) */ -OP(90, OP_BCC ( COND_CC() ) ) /* BCC */ -OP(91, OP_STA ( DIY ) ) /* STA diy */ -OP(92, OP_STA ( DI ) ) /* STA di (C) */ -OP(93, OP_STA ( SIY ) ) /* STA siy (G) */ -OP(94, OP_STX ( REGISTER_Y, DX ) ) /* STY dx */ -OP(95, OP_STA ( DX ) ) /* STA dx */ -OP(96, OP_STX ( REGISTER_X, DY ) ) /* STX dy */ -OP(97, OP_STA ( DLIY ) ) /* STA dliy(G) */ -OP(98, OP_TXA ( REGISTER_Y ) ) /* TYA */ -OP(99, OP_STA ( AY ) ) /* STA ay */ -OP(9a, OP_TXS ( ) ) /* TXS */ -OP(9b, OP_TXY ( ) ) /* TXY (G) */ -OP(9c, OP_STZ ( A ) ) /* STZ a (C) */ -OP(9d, OP_STA ( AX ) ) /* STA ax */ -OP(9e, OP_STZ ( AX ) ) /* STZ ax (C) */ -OP(9f, OP_STA ( ALX ) ) /* STA alx (G) */ -OP(a0, OP_LDX ( REGISTER_Y, IMM ) ) /* LDY imm */ -OP(a1, OP_LDA ( DXI ) ) /* LDA dxi */ -OP(a2, OP_LDX ( REGISTER_X, IMM ) ) /* LDX imm */ -OP(a3, OP_LDA ( S ) ) /* LDA s (G) */ -OP(a4, OP_LDX ( REGISTER_Y, D ) ) /* LDY d */ -OP(a5, OP_LDA ( D ) ) /* LDA d */ -OP(a6, OP_LDX ( REGISTER_X, D ) ) /* LDX d */ -OP(a7, OP_LDA ( DLI ) ) /* LDA dli (G) */ -OP(a8, OP_TAX ( REGISTER_Y ) ) /* TAY */ -OP(a9, OP_LDA ( IMM ) ) /* LDA imm */ -OP(aa, OP_TAX ( REGISTER_X ) ) /* TAX */ -OP(ab, OP_PLB ( ) ) /* PLB (G) */ -OP(ac, OP_LDX ( REGISTER_Y, A ) ) /* LDY a */ -OP(ad, OP_LDA ( A ) ) /* LDA a */ -OP(ae, OP_LDX ( REGISTER_X, A ) ) /* LDX a */ -OP(af, OP_LDA ( AL ) ) /* LDA al (G) */ -OP(b0, OP_BCC ( COND_CS() ) ) /* BCS */ -OP(b1, OP_LDA ( DIY ) ) /* LDA diy */ -OP(b2, OP_LDA ( DI ) ) /* LDA di (C) */ -OP(b3, OP_LDA ( SIY ) ) /* LDA siy (G) */ -OP(b4, OP_LDX ( REGISTER_Y, DX ) ) /* LDY dx */ -OP(b5, OP_LDA ( DX ) ) /* LDA dx */ -OP(b6, OP_LDX ( REGISTER_X, DY ) ) /* LDX dy */ -OP(b7, OP_LDA ( DLIY ) ) /* LDA dliy(G) */ -OP(b8, OP_CLV ( ) ) /* CLV */ -OP(b9, OP_LDA ( AY ) ) /* LDA ay */ -OP(ba, OP_TSX ( ) ) /* TSX */ -OP(bb, OP_TYX ( ) ) /* TYX (G) */ -OP(bc, OP_LDX ( REGISTER_Y, AX ) ) /* LDY ax */ -OP(bd, OP_LDA ( AX ) ) /* LDA ax */ -OP(be, OP_LDX ( REGISTER_X, AY ) ) /* LDX ay */ -OP(bf, OP_LDA ( ALX ) ) /* LDA alx (G) */ -OP(c0, OP_CMPX ( REGISTER_Y, IMM ) ) /* CPY imm */ -OP(c1, OP_CMP ( DXI ) ) /* CMP dxi */ -OP(c2, OP_REP ( ) ) /* REP (G) */ -OP(c3, OP_CMP ( S ) ) /* CMP s (G) */ -OP(c4, OP_CMPX ( REGISTER_Y, D ) ) /* CPY d */ -OP(c5, OP_CMP ( D ) ) /* CMP d */ -OP(c6, OP_DECM ( D ) ) /* DEC d */ -OP(c7, OP_CMP ( DLI ) ) /* CMP dli (G) */ -OP(c8, OP_INCX ( REGISTER_Y ) ) /* INY */ -OP(c9, OP_CMP ( IMM ) ) /* CMP imm */ -OP(ca, OP_DECX ( REGISTER_X ) ) /* DEX */ -OP(cb, OP_WAI ( ) ) /* WAI (G) */ -OP(cc, OP_CMPX ( REGISTER_Y, A ) ) /* CPY a */ -OP(cd, OP_CMP ( A ) ) /* CMP a */ -OP(ce, OP_DECM ( A ) ) /* DEC a */ -OP(cf, OP_CMP ( AL ) ) /* CMP al (G) */ -OP(d0, OP_BCC ( COND_NE() ) ) /* BNE */ -OP(d1, OP_CMP ( DIY ) ) /* CMP diy */ -OP(d2, OP_CMP ( DI ) ) /* CMP di (C) */ -OP(d3, OP_CMP ( SIY ) ) /* CMP siy (G) */ -OP(d4, OP_PEI ( ) ) /* PEI (G) */ -OP(d5, OP_CMP ( DX ) ) /* CMP dx */ -OP(d6, OP_DECM ( DX ) ) /* DEC dx */ -OP(d7, OP_CMP ( DLIY ) ) /* CMP dliy(G) */ -OP(d8, OP_CLD ( ) ) /* CLD */ -OP(d9, OP_CMP ( AY ) ) /* CMP ay */ -OP(da, OP_PHX ( REGISTER_X ) ) /* PHX (C) */ -OP(db, OP_STP ( ) ) /* STP (G) */ -OP(dc, OP_JMLAI( ) ) /* JML ai (G) */ -OP(dd, OP_CMP ( AX ) ) /* CMP ax */ -OP(de, OP_DECM ( AX ) ) /* DEC ax */ -OP(df, OP_CMP ( ALX ) ) /* CMP alx (G) */ -OP(e0, OP_CMPX ( REGISTER_X, IMM ) ) /* CPX imm */ -OP(e1, OP_SBC ( DXI ) ) /* SBC dxi */ -OP(e2, OP_SEP ( ) ) /* SEP imm (G) */ -OP(e3, OP_SBC ( S ) ) /* SBC s (G) */ -OP(e4, OP_CMPX ( REGISTER_X, D ) ) /* CPX d */ -OP(e5, OP_SBC ( D ) ) /* SBC d */ -OP(e6, OP_INCM ( D ) ) /* INC d */ -OP(e7, OP_SBC ( DLI ) ) /* SBC dli (G) */ -OP(e8, OP_INCX ( REGISTER_X ) ) /* INX */ -OP(e9, OP_SBC ( IMM ) ) /* SBC imm */ -OP(ea, OP_NOP ( ) ) /* NOP */ -OP(eb, OP_XBA ( ) ) /* XBA (G) */ -OP(ec, OP_CMPX ( REGISTER_X, A ) ) /* CPX a */ -OP(ed, OP_SBC ( A ) ) /* SBC a */ -OP(ee, OP_INCM ( A ) ) /* INC a */ -OP(ef, OP_SBC ( AL ) ) /* SBC al (G) */ -OP(f0, OP_BCC ( COND_EQ() ) ) /* BEQ */ -OP(f1, OP_SBC ( DIY ) ) /* SBC diy */ -OP(f2, OP_SBC ( DI ) ) /* SBC di (C) */ -OP(f3, OP_SBC ( SIY ) ) /* SBC siy (G) */ -OP(f4, OP_PEA ( ) ) /* PEA (G) */ -OP(f5, OP_SBC ( DX ) ) /* SBC dx */ -OP(f6, OP_INCM ( DX ) ) /* INC dx */ -OP(f7, OP_SBC ( DLIY ) ) /* SBC dliy(G) */ -OP(f8, OP_SED ( ) ) /* SED */ -OP(f9, OP_SBC ( AY ) ) /* SBC ay */ -OP(fa, OP_PLX ( REGISTER_X ) ) /* PLX (C) */ -OP(fb, OP_XCE ( ) ) /* XCE (G) */ -OP(fc, OP_JSRAXI( ) ) /* JSR axi (G) */ -OP(fd, OP_SBC ( AX ) ) /* SBC ax */ -OP(fe, OP_INCM ( AX ) ) /* INC ax */ -OP(ff, OP_SBC ( ALX ) ) /* SBC alx (G) */ - - - -TABLE_OPCODES = -{ - O(00),O(01),O(02),O(03),O(04),O(05),O(06),O(07), - O(08),O(09),O(0a),O(0b),O(0c),O(0d),O(0e),O(0f), - O(10),O(11),O(12),O(13),O(14),O(15),O(16),O(17), - O(18),O(19),O(1a),O(1b),O(1c),O(1d),O(1e),O(1f), - O(20),O(21),O(22),O(23),O(24),O(25),O(26),O(27), - O(28),O(29),O(2a),O(2b),O(2c),O(2d),O(2e),O(2f), - O(30),O(31),O(32),O(33),O(34),O(35),O(36),O(37), - O(38),O(39),O(3a),O(3b),O(3c),O(3d),O(3e),O(3f), - O(40),O(41),O(42),O(43),O(44),O(45),O(46),O(47), - O(48),O(49),O(4a),O(4b),O(4c),O(4d),O(4e),O(4f), - O(50),O(51),O(52),O(53),O(54),O(55),O(56),O(57), - O(58),O(59),O(5a),O(5b),O(5c),O(5d),O(5e),O(5f), - O(60),O(61),O(62),O(63),O(64),O(65),O(66),O(67), - O(68),O(69),O(6a),O(6b),O(6c),O(6d),O(6e),O(6f), - O(70),O(71),O(72),O(73),O(74),O(75),O(76),O(77), - O(78),O(79),O(7a),O(7b),O(7c),O(7d),O(7e),O(7f), - O(80),O(81),O(82),O(83),O(84),O(85),O(86),O(87), - O(88),O(89),O(8a),O(8b),O(8c),O(8d),O(8e),O(8f), - O(90),O(91),O(92),O(93),O(94),O(95),O(96),O(97), - O(98),O(99),O(9a),O(9b),O(9c),O(9d),O(9e),O(9f), - O(a0),O(a1),O(a2),O(a3),O(a4),O(a5),O(a6),O(a7), - O(a8),O(a9),O(aa),O(ab),O(ac),O(ad),O(ae),O(af), - O(b0),O(b1),O(b2),O(b3),O(b4),O(b5),O(b6),O(b7), - O(b8),O(b9),O(ba),O(bb),O(bc),O(bd),O(be),O(bf), - O(c0),O(c1),O(c2),O(c3),O(c4),O(c5),O(c6),O(c7), - O(c8),O(c9),O(ca),O(cb),O(cc),O(cd),O(ce),O(cf), - O(d0),O(d1),O(d2),O(d3),O(d4),O(d5),O(d6),O(d7), - O(d8),O(d9),O(da),O(db),O(dc),O(dd),O(de),O(df), - O(e0),O(e1),O(e2),O(e3),O(e4),O(e5),O(e6),O(e7), - O(e8),O(e9),O(ea),O(eb),O(ec),O(ed),O(ee),O(ef), - O(f0),O(f1),O(f2),O(f3),O(f4),O(f5),O(f6),O(f7), - O(f8),O(f9),O(fa),O(fb),O(fc),O(fd),O(fe),O(ff) -}; - - - -/* Assert or clear a line on the CPU */ -TABLE_FUNCTION(void, set_line, (int line, int state)) -{ - switch(line) - { - case G65816_LINE_IRQ: - switch(state) - { - case CLEAR_LINE: - LINE_IRQ = 0; - return; - case ASSERT_LINE: - case HOLD_LINE: - LINE_IRQ = 1; - } - if(FLAG_I) - { - if(CPU_STOPPED & STOP_LEVEL_WAI) - { - CPU_STOPPED &= ~STOP_LEVEL_WAI; - } - return; - } - return; - case G65816_LINE_NMI: - if(state == CLEAR_LINE) - { - LINE_NMI = 0; - return; - } - if(!LINE_NMI) - { - LINE_NMI = 1; - CPU_STOPPED &= ~STOP_LEVEL_WAI; - if(!CPU_STOPPED) - g65816i_interrupt_nmi(); - } - return; - case G65816_LINE_SO: - FLAG_V = VFLAG_SET; - break; - case G65816_LINE_RESET: - case G65816_LINE_ABORT: - case G65816_LINE_RDY: - return; - } - - LINE_IRQ=1; // FIXME: this can't be right! -} - - - -/* Get a register from the CPU core */ -TABLE_FUNCTION(unsigned, get_reg, (int regnum)) -{ - switch(regnum) - { - case G65816_A: return REGISTER_B | REGISTER_A; - case G65816_X: return REGISTER_X; - case G65816_Y: return REGISTER_Y; - case G65816_S: return REGISTER_S; - case STATE_GENPC: return REGISTER_PC; - case G65816_PC: return REGISTER_PC; - case G65816_PB: return REGISTER_PB >> 16; - case G65816_DB: return REGISTER_DB >> 16; - case G65816_D: return REGISTER_D; - case G65816_P: return g65816i_get_reg_p(); - case G65816_NMI_STATE: return LINE_NMI; - case G65816_IRQ_STATE: return LINE_IRQ; - case STATE_GENPCBASE: return REGISTER_PPC; - case _5A22_FASTROM: return m_fastROM; - } - return 0; -} - - - -TABLE_FUNCTION(void, set_reg, (int regnum, unsigned val)) -{ - switch(regnum) - { - case STATE_GENPC: case G65816_PC: REGISTER_PC = MAKE_UINT_16(val); break; -#if FLAG_SET_E - case G65816_S: REGISTER_S = MAKE_UINT_8(val) | 0x100; break; -#else - case G65816_S: REGISTER_S = MAKE_UINT_16(val); break; -#endif - case G65816_P: g65816i_set_reg_p(val); break; -#if FLAG_SET_M - case G65816_A: REGISTER_A = MAKE_UINT_8(val); REGISTER_B = val&0xff00; break; -#else - case G65816_A: REGISTER_A = MAKE_UINT_16(val); break; -#endif -#if FLAG_SET_X - case G65816_X: REGISTER_X = MAKE_UINT_8(val); break; - case G65816_Y: REGISTER_Y = MAKE_UINT_8(val); break; -#else - case G65816_X: REGISTER_X = MAKE_UINT_16(val); break; - case G65816_Y: REGISTER_Y = MAKE_UINT_16(val); break; -#endif - case G65816_DB: REGISTER_DB = MAKE_UINT_8(val); break; - case G65816_PB: REGISTER_PB = MAKE_UINT_8(val); break; - case G65816_NMI_STATE: (this->*FTABLE_SET_LINE)(G65816_LINE_NMI, val == 0 ? CLEAR_LINE : ASSERT_LINE); break; - case G65816_IRQ_STATE: (this->*FTABLE_SET_LINE)(G65816_LINE_IRQ, val == 0 ? CLEAR_LINE : ASSERT_LINE); break; - case _5A22_FASTROM: m_fastROM = val; break; - } -} - - - -#if EXECUTION_MODE == EXECUTION_MODE_E -#define g65816i_correct_mode() (FLAG_E == EFLAG_SET) -#elif EXECUTION_MODE == EXECUTION_MODE_M0X0 -#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_CLEAR) && (FLAG_X == XFLAG_CLEAR)) -#elif EXECUTION_MODE == EXECUTION_MODE_M0X1 -#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_CLEAR) && (FLAG_X == XFLAG_SET)) -#elif EXECUTION_MODE == EXECUTION_MODE_M1X0 -#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_SET) && (FLAG_X == XFLAG_CLEAR)) -#elif EXECUTION_MODE == EXECUTION_MODE_M1X1 -#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_SET) && (FLAG_X == XFLAG_SET)) -#else -#error Invalid EXECUTION_MODE -#endif - - - -TABLE_FUNCTION(int, execute, (int clocks)) -{ - // do a check here also in case we're in STOP_WAI mode - this'll clear it when the IRQ happens - g65816i_check_maskable_interrupt(); - - if (!CPU_STOPPED) - { - CLOCKS = clocks; - do - { - /* Note that I'm doing a per-instruction interrupt - * check until this core is working well enough - * to start trying fancy stuff. - */ - g65816i_check_maskable_interrupt(); - - REGISTER_PPC = REGISTER_PC; - G65816_CALL_DEBUGGER(REGISTER_PB | REGISTER_PC); - - REGISTER_PC++; - REGISTER_IR = read_8_OP(REGISTER_PB | REGISTER_PPC); - (this->*FTABLE_OPCODES[REGISTER_IR])(); - } while((CLOCKS > 0) && g65816i_correct_mode()); - return clocks - CLOCKS; - } - return clocks; -} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816op.ipp mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816op.ipp --- mame-0.263+dfsg.1/src/devices/cpu/g65816/g65816op.ipp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/g65816/g65816op.ipp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,1964 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud + +/* ======================================================================== */ +/* ============================= CONFIGURATION ============================ */ +/* ======================================================================== */ + +#undef FLAG_SET_E +#undef FLAG_SET_M +#undef FLAG_SET_X +#if EXECUTION_MODE == EXECUTION_MODE_E +#define FLAG_SET_E 1 +#define FLAG_SET_M 1 +#define FLAG_SET_X 1 +#elif EXECUTION_MODE == EXECUTION_MODE_M0X0 +#define FLAG_SET_E 0 +#define FLAG_SET_M 0 +#define FLAG_SET_X 0 +#elif EXECUTION_MODE == EXECUTION_MODE_M0X1 +#define FLAG_SET_E 0 +#define FLAG_SET_M 0 +#define FLAG_SET_X 1 +#elif EXECUTION_MODE == EXECUTION_MODE_M1X0 +#define FLAG_SET_E 0 +#define FLAG_SET_M 1 +#define FLAG_SET_X 0 +#elif EXECUTION_MODE == EXECUTION_MODE_M1X1 +#define FLAG_SET_E 0 +#define FLAG_SET_M 1 +#define FLAG_SET_X 1 +#endif + +#undef VECTOR_IRQ +#undef VECTOR_NMI +#undef VECTOR_ABORT +#undef VECTOR_BRK +#undef VECTOR_COP + +#if FLAG_SET_E +#define VECTOR_IRQ VECTOR_IRQ_E +#define VECTOR_NMI VECTOR_NMI_E +#define VECTOR_ABORT VECTOR_ABORT_E +#define VECTOR_BRK VECTOR_BRK_E +#define VECTOR_COP VECTOR_COP_E +#else /* FLAG_SET_E */ +#define VECTOR_IRQ VECTOR_IRQ_N +#define VECTOR_NMI VECTOR_NMI_N +#define VECTOR_ABORT VECTOR_ABORT_N +#define VECTOR_BRK VECTOR_BRK_N +#define VECTOR_COP VECTOR_COP_N +#endif + + + +/* ======================================================================== */ +/* ========================== EFFECTIVE ADDRESSES ========================= */ +/* ======================================================================== */ + +/* Effective-address based memory access macros */ +#define read_8_NORM(A) g65816i_read_8_normal(A) +#define read_8_IMM(A) g65816i_read_8_immediate(A) +#define read_8_OP(A) g65816i_read_8_opcode(A) +#define read_8_D(A) g65816i_read_8_direct(A) +#define read_8_A(A) g65816i_read_8_normal(A) +#define read_8_AL(A) g65816i_read_8_normal(A) +#define read_8_DX(A) g65816i_read_8_direct(A) +#define read_8_DY(A) g65816i_read_8_direct(A) +#define read_8_AX(A) g65816i_read_8_normal(A) +#define read_8_ALX(A) g65816i_read_8_normal(A) +#define read_8_AY(A) g65816i_read_8_normal(A) +#define read_8_DI(A) g65816i_read_8_normal(A) +#define read_8_DLI(A) g65816i_read_8_normal(A) +#define read_8_AI(A) g65816i_read_8_normal(A) +#define read_8_ALI(A) g65816i_read_8_normal(A) +#define read_8_DXI(A) g65816i_read_8_normal(A) +#define read_8_DIY(A) g65816i_read_8_normal(A) +#define read_8_DLIY(A) g65816i_read_8_normal(A) +#define read_8_S(A) g65816i_read_8_normal(A) +#define read_8_SIY(A) g65816i_read_8_normal(A) + +#define read_16_NORM(A) g65816i_read_16_normal(A) +#define read_16_IMM(A) g65816i_read_16_immediate(A) +#define read_16_D(A) g65816i_read_16_direct(A) +#define read_16_A(A) g65816i_read_16_normal(A) +#define read_16_AL(A) g65816i_read_16_normal(A) +#define read_16_DX(A) g65816i_read_16_direct(A) +#define read_16_DY(A) g65816i_read_16_direct(A) +#define read_16_AX(A) g65816i_read_16_normal(A) +#define read_16_ALX(A) g65816i_read_16_normal(A) +#define read_16_AY(A) g65816i_read_16_normal(A) +#define read_16_DI(A) g65816i_read_16_normal(A) +#define read_16_DLI(A) g65816i_read_16_normal(A) +#define read_16_AI(A) g65816i_read_16_normal(A) +#define read_16_ALI(A) g65816i_read_16_normal(A) +#define read_16_DXI(A) g65816i_read_16_normal(A) +#define read_16_DIY(A) g65816i_read_16_normal(A) +#define read_16_DLIY(A) g65816i_read_16_normal(A) +#define read_16_AXI(A) g65816i_read_16_immediate(A) +#define read_16_S(A) g65816i_read_16_normal(A) +#define read_16_SIY(A) g65816i_read_16_normal(A) + +#define read_24_NORM(A) g65816i_read_24_normal(A) +#define read_24_IMM(A) g65816i_read_24_immediate(A) +#define read_24_D(A) g65816i_read_24_normal(A) +#define read_24_A(A) g65816i_read_24_normal(A) +#define read_24_AL(A) g65816i_read_24_normal(A) +#define read_24_DX(A) g65816i_read_24_normal(A) +#define read_24_DY(A) g65816i_read_24_normal(A) +#define read_24_AX(A) g65816i_read_24_normal(A) +#define read_24_ALX(A) g65816i_read_24_normal(A) +#define read_24_AY(A) g65816i_read_24_normal(A) +#define read_24_DI(A) g65816i_read_24_normal(A) +#define read_24_DLI(A) g65816i_read_24_normal(A) +#define read_24_AI(A) g65816i_read_24_normal(A) +#define read_24_ALI(A) g65816i_read_24_normal(A) +#define read_24_DXI(A) g65816i_read_24_normal(A) +#define read_24_DIY(A) g65816i_read_24_normal(A) +#define read_24_DLIY(A) g65816i_read_24_normal(A) +#define read_24_S(A) g65816i_read_24_normal(A) +#define read_24_SIY(A) g65816i_read_24_normal(A) + +#define write_8_NORM(A, V) g65816i_write_8_normal(A, V) +#define write_8_D(A, V) g65816i_write_8_direct(A, V) +#define write_8_A(A, V) g65816i_write_8_normal(A, V) +#define write_8_AL(A, V) g65816i_write_8_normal(A, V) +#define write_8_DX(A, V) g65816i_write_8_direct(A, V) +#define write_8_DY(A, V) g65816i_write_8_direct(A, V) +#define write_8_AX(A, V) g65816i_write_8_normal(A, V) +#define write_8_ALX(A, V) g65816i_write_8_normal(A, V) +#define write_8_AY(A, V) g65816i_write_8_normal(A, V) +#define write_8_DI(A, V) g65816i_write_8_normal(A, V) +#define write_8_DLI(A, V) g65816i_write_8_normal(A, V) +#define write_8_AI(A, V) g65816i_write_8_normal(A, V) +#define write_8_ALI(A, V) g65816i_write_8_normal(A, V) +#define write_8_DXI(A, V) g65816i_write_8_normal(A, V) +#define write_8_DIY(A, V) g65816i_write_8_normal(A, V) +#define write_8_DLIY(A, V) g65816i_write_8_normal(A, V) +#define write_8_S(A, V) g65816i_write_8_normal(A, V) +#define write_8_SIY(A, V) g65816i_write_8_normal(A, V) + +#define write_16_NORM(A, V) g65816i_write_16_normal(A, V) +#define write_16_D(A, V) g65816i_write_16_direct(A, V) +#define write_16_A(A, V) g65816i_write_16_normal(A, V) +#define write_16_AL(A, V) g65816i_write_16_normal(A, V) +#define write_16_DX(A, V) g65816i_write_16_direct(A, V) +#define write_16_DY(A, V) g65816i_write_16_direct(A, V) +#define write_16_AX(A, V) g65816i_write_16_normal(A, V) +#define write_16_ALX(A, V) g65816i_write_16_normal(A, V) +#define write_16_AY(A, V) g65816i_write_16_normal(A, V) +#define write_16_DI(A, V) g65816i_write_16_normal(A, V) +#define write_16_DLI(A, V) g65816i_write_16_normal(A, V) +#define write_16_AI(A, V) g65816i_write_16_normal(A, V) +#define write_16_ALI(A, V) g65816i_write_16_normal(A, V) +#define write_16_DXI(A, V) g65816i_write_16_normal(A, V) +#define write_16_DIY(A, V) g65816i_write_16_normal(A, V) +#define write_16_DLIY(A, V) g65816i_write_16_normal(A, V) +#define write_16_S(A, V) g65816i_write_16_normal(A, V) +#define write_16_SIY(A, V) g65816i_write_16_normal(A, V) + + +#define OPER_8_IMM() read_8_IMM(EA_IMM8()) +#define OPER_8_D() read_8_D(EA_D()) +#define OPER_8_A() read_8_A(EA_A()) +#define OPER_8_AL() read_8_AL(EA_AL()) +#define OPER_8_DX() read_8_DX(EA_DX()) +#define OPER_8_DY() read_8_DY(EA_DY()) +#define OPER_8_AX() read_8_AX(EA_AX()) +#define OPER_8_ALX() read_8_ALX(EA_ALX()) +#define OPER_8_AY() read_8_AY(EA_AY()) +#define OPER_8_DI() read_8_DI(EA_DI()) +#define OPER_8_DLI() read_8_DLI(EA_DLI()) +#define OPER_8_AI() read_8_AI(EA_AI()) +#define OPER_8_ALI() read_8_ALI(EA_ALI()) +#define OPER_8_DXI() read_8_DXI(EA_DXI()) +#define OPER_8_DIY() read_8_DIY(EA_DIY()) +#define OPER_8_DLIY() read_8_DLIY(EA_DLIY()) +#define OPER_8_S() read_8_S(EA_S()) +#define OPER_8_SIY() read_8_SIY(EA_SIY()) + +#define OPER_16_IMM() read_16_IMM(EA_IMM16()) +#define OPER_16_D() read_16_D(EA_D()) +#define OPER_16_A() read_16_A(EA_A()) +#define OPER_16_AL() read_16_AL(EA_AL()) +#define OPER_16_DX() read_16_DX(EA_DX()) +#define OPER_16_DY() read_16_DY(EA_DY()) +#define OPER_16_AX() read_16_AX(EA_AX()) +#define OPER_16_ALX() read_16_ALX(EA_ALX()) +#define OPER_16_AY() read_16_AY(EA_AY()) +#define OPER_16_DI() read_16_DI(EA_DI()) +#define OPER_16_DLI() read_16_DLI(EA_DLI()) +#define OPER_16_AI() read_16_AI(EA_AI()) +#define OPER_16_ALI() read_16_ALI(EA_ALI()) +#define OPER_16_DXI() read_16_DXI(EA_DXI()) +#define OPER_16_DIY() read_16_DIY(EA_DIY()) +#define OPER_16_DLIY() read_16_DLIY(EA_DLIY()) +#define OPER_16_S() read_16_S(EA_S()) +#define OPER_16_SIY() read_16_SIY(EA_SIY()) + +#define OPER_24_IMM() read_24_IMM(EA_IMM24()) +#define OPER_24_D() read_24_D(EA_D()) +#define OPER_24_A() read_24_A(EA_A()) +#define OPER_24_AL() read_24_AL(EA_AL()) +#define OPER_24_DX() read_24_DX(EA_DX()) +#define OPER_24_DY() read_24_DY(EA_DY()) +#define OPER_24_AX() read_24_AX(EA_AX()) +#define OPER_24_ALX() read_24_ALX(EA_ALX()) +#define OPER_24_AY() read_24_AY(EA_AY()) +#define OPER_24_DI() read_24_DI(EA_DI()) +#define OPER_24_DLI() read_24_DLI(EA_DLI()) +#define OPER_24_AI() read_24_AI(EA_AI()) +#define OPER_24_ALI() read_24_ALI(EA_ALI()) +#define OPER_24_DXI() read_24_DXI(EA_DXI()) +#define OPER_24_DIY() read_24_DIY(EA_DIY()) +#define OPER_24_DLIY() read_24_DLIY(EA_DLIY()) +#define OPER_24_S() read_24_S(EA_S()) +#define OPER_24_SIY() read_24_SIY(EA_SIY()) + + + +/* ======================================================================== */ +/* =========================== OPERATION MACROS =========================== */ +/* ======================================================================== */ + +/* M6502 Add With Carry */ +#undef OP_ADC +#if FLAG_SET_M +#define OP_ADC(MODE) \ + { \ + unsigned tmp16; \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + SRC = OPER_8_##MODE(); \ + if(FLAG_D) \ + { \ + int32_t result, r0, r1, carry; \ + r0 = REGISTER_A; \ + r1 = SRC; \ + carry = CFLAG_1(); \ + result = (r0 & 0x0f) + (r1 & 0x0f) + (carry << 0); \ + if (result > 0x09) result += 0x06; \ + carry = result > 0x0f; \ + result = (r0 & 0xf0) + (r1 & 0xf0) + (carry << 4) + (result & 0x0f); \ + FLAG_V = ~(r0 ^ SRC) & (r0 ^ result) & 0x80; \ + if (result > 0x9f) result += 0x60; \ + FLAG_C = (result > 0xff) ? 0x100 : 0; \ + FLAG_N = (result & 0x80); \ + FLAG_Z = REGISTER_A = MAKE_UINT_8(result); \ + } \ + else \ + { \ + FLAG_C = tmp16 = REGISTER_A + SRC + CFLAG_1(); \ + FLAG_V = VFLAG_ADD_8(SRC, REGISTER_A, FLAG_C); \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(tmp16); \ + } \ + } + +#else +#define OP_ADC(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + SRC = OPER_16_##MODE(); \ + int32_t result, r0, r1, carry; \ + r0 = REGISTER_A; \ + r1 = SRC; \ + carry = CFLAG_1(); \ + if (!FLAG_D) \ + { \ + result = r0 + r1 + carry; \ + } \ + else \ + { \ + result = (r0 & 0x000f) + (r1 & 0x000f) + (carry << 0); \ + if(result > 0x0009) result += 0x0006; \ + carry = result > 0x000f; \ + result = (r0 & 0x00f0) + (r1 & 0x00f0) + (carry << 4) + (result & 0x000f); \ + if(result > 0x009f) result += 0x0060; \ + carry = result > 0x00ff; \ + result = (r0 & 0x0f00) + (r1 & 0x0f00) + (carry << 8) + (result & 0x00ff); \ + if(result > 0x09ff) result += 0x0600; \ + carry = result > 0x0fff; \ + result = (r0 & 0xf000) + (r1 & 0xf000) + (carry << 12) + (result & 0x0fff); \ + } \ + FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x8000; \ + FLAG_V >>= 8; \ + if (FLAG_D && result > 0x9fff) result += 0x6000; \ + FLAG_C = (result > 0xffff) ? 0x100 : 0; \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(result); \ + FLAG_N = NFLAG_16(REGISTER_A); +#endif + +/* M6502 Logical AND with accumulator */ +#undef OP_AND +#if FLAG_SET_M +#define OP_AND(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = FLAG_Z = REGISTER_A &= OPER_8_##MODE() +#else +#define OP_AND(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_Z = REGISTER_A &= OPER_16_##MODE(); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Arithmetic Shift Left accumulator */ +#undef OP_ASL +#if FLAG_SET_M +#define OP_ASL() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = REGISTER_A << 1; \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C) +#else +#define OP_ASL() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = REGISTER_A << 1; \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = CFLAG_16(FLAG_C) +#endif + +/* M6502 Arithmetic Shift Left operand */ +#undef OP_ASLM +#if FLAG_SET_M +#define OP_ASLM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_C = read_8_##MODE(DST) << 1; \ + FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_ASLM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_C = read_16_##MODE(DST) << 1; \ + FLAG_Z = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = CFLAG_16(FLAG_C); \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* M6502 Branch on Condition Code */ +#undef OP_BCC +#define OP_BCC(COND) \ + DST = OPER_8_IMM(); \ + if(COND) \ + { \ + CLK(CLK_OP + CLK_RELATIVE_8 + 1); \ + g65816i_branch_8(DST); \ + BREAKOUT; \ + } \ + CLK(CLK_OP + CLK_RELATIVE_8); +/* M6502 Set flags according to bits */ +#undef OP_BIT +#if FLAG_SET_M +#define OP_BIT(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = OPER_8_##MODE(); \ + FLAG_Z = FLAG_N & REGISTER_A; \ + FLAG_V = FLAG_N << 1 +#else +#define OP_BIT(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_N = OPER_16_##MODE(); \ + FLAG_Z = FLAG_N & REGISTER_A; \ + FLAG_N = NFLAG_16(FLAG_N); \ + FLAG_V = FLAG_N << 1 +#endif + +/* G65816 Set flags according to bits (immediate addressing mode) */ +#undef OP_BITI +#if FLAG_SET_M +#define OP_BITI() \ + CLK(CLK_OP + CLK_R8 + CLK_IMM); \ + FLAG_Z = REGISTER_A & OPER_8_IMM() +#else +#define OP_BITI() \ + CLK(CLK_OP + CLK_R16 + CLK_IMM); \ + FLAG_Z = REGISTER_A & OPER_16_IMM() +#endif + +/* M6502 Cause a Break interrupt */ +#undef OP_BRK +#define OP_BRK() \ + REGISTER_PC++; \ + g65816i_interrupt_software(VECTOR_BRK) + +/* G65816 Branch Always */ +#undef OP_BRA +#define OP_BRA() \ + CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_8); \ + g65816i_branch_8(OPER_8_IMM()) + +/* G65816 Branch Always Long */ +#undef OP_BRL +#define OP_BRL() \ + CLK(CLK_OP + CLK_IMPLIED + CLK_RELATIVE_16); \ + g65816i_branch_16(OPER_16_IMM()) + +/* M6502 Clear Carry flag */ +#undef OP_CLC +#define OP_CLC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = CFLAG_CLEAR + +/* M6502 Clear Decimal flag */ +#undef OP_CLD +#define OP_CLD() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_D = DFLAG_CLEAR + +/* M6502 Clear Interrupt Mask flag */ +#undef OP_CLI +#define OP_CLI() \ + CLK(CLK_OP + CLK_IMPLIED); \ + g65816i_set_flag_i(IFLAG_CLEAR) + +/* M6502 Clear oVerflow flag */ +#undef OP_CLV +#define OP_CLV() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_V = VFLAG_CLEAR + +/* M6502 Compare operand to accumulator */ +/* Unusual behavior: C flag is inverted */ +#undef OP_CMP +#if FLAG_SET_M +#define OP_CMP(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_C = REGISTER_A - OPER_8_##MODE(); \ + FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ + FLAG_C ^= CFLAG_SET +#else +#define OP_CMP(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_C = REGISTER_A - OPER_16_##MODE(); \ + FLAG_Z = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = ~CFLAG_16(FLAG_C) +#endif + +/* M6502 Compare operand to index register */ +/* Unusual behavior: C flag is inverted */ +#undef OP_CMPX +#if FLAG_SET_X +#define OP_CMPX(REG, MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_C = REG - OPER_8_##MODE(); \ + FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ + FLAG_C ^= CFLAG_SET +#else +#define OP_CMPX(REG, MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_C = REG - OPER_16_##MODE(); \ + FLAG_Z = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = ~CFLAG_16(FLAG_C) +#endif + +/* G65816 Coprocessor operation */ +#undef OP_COP +#define OP_COP() \ + REGISTER_PC++; \ + g65816i_interrupt_software(VECTOR_COP) + +/* M6502 Decrement accumulator */ +#undef OP_DEC +#if FLAG_SET_M +#define OP_DEC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(REGISTER_A - 1) +#else +#define OP_DEC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(REGISTER_A - 1); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Decrement operand */ +#undef OP_DECM +#if FLAG_SET_M +#define OP_DECM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) - 1); \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_DECM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) - 1); \ + FLAG_N = NFLAG_16(FLAG_Z); \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* M6502 Decrement index register */ +#undef OP_DECX +#if FLAG_SET_X +#define OP_DECX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG - 1) +#else +#define OP_DECX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = MAKE_UINT_16(REG - 1); \ + FLAG_N = NFLAG_16(REG) +#endif + +/* M6502 Exclusive Or operand to accumulator */ +#undef OP_EOR +#if FLAG_SET_M +#define OP_EOR(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = FLAG_Z = REGISTER_A ^= OPER_8_##MODE() +#else +#define OP_EOR(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_Z = REGISTER_A ^= OPER_16_##MODE(); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Increment accumulator */ +#undef OP_INC +#if FLAG_SET_M +#define OP_INC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(REGISTER_A + 1) +#else +#define OP_INC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(REGISTER_A + 1); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Increment operand */ +#undef OP_INCM +#if FLAG_SET_M +#define OP_INCM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_N = FLAG_Z = MAKE_UINT_8(read_8_##MODE(DST) + 1); \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_INCM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = MAKE_UINT_16(read_16_##MODE(DST) + 1); \ + FLAG_N = NFLAG_16(FLAG_Z); \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* M6502 Increment index register */ +#undef OP_INCX +#if FLAG_SET_X +#define OP_INCX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = FLAG_Z = REG = MAKE_UINT_8(REG + 1) +#else +#define OP_INCX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = MAKE_UINT_16(REG + 1); \ + FLAG_N = NFLAG_16(REG) +#endif + +/* G65816 Jump Long */ +#undef OP_JMLAI +#define OP_JMLAI() \ + CLK(CLK_OP + CLK_AI + 1); \ + g65816i_jump_24(read_24_A(OPER_16_IMM())) + +/* M6502 Jump */ +#undef OP_JMP +#define OP_JMP(MODE) \ + CLK(CLK_OP + CLK_##MODE); \ + g65816i_jump_16(EA_##MODE()) + +/* M6502 Jump absolute indexed indirect */ +#undef OP_JMPAXI +#define OP_JMPAXI() \ + CLK(CLK_OP + CLK_AXI); \ + g65816i_jump_16(read_16_AXI(REGISTER_PB | (MAKE_UINT_16(OPER_16_IMM() + REGISTER_X)))) + +/* G65816 Jump absolute long */ +#undef OP_JMPAL +#define OP_JMPAL() \ + CLK(CLK_OP + CLK_AL); \ + g65816i_jump_24(EA_AL()) + +/* G65816 Jump to Subroutine Long */ +/* Unusual behavior: stacks PC-1 */ +#undef OP_JSL +#define OP_JSL(MODE) \ + CLK(CLK_OP + CLK_W24 + CLK_##MODE + 1); \ + DST = EA_##MODE(); \ + g65816i_push_8_native(REGISTER_PB>>16); \ + g65816i_push_16_native(REGISTER_PC-1); \ + g65816i_update_reg_s(); \ + g65816i_jump_24(DST) + +/* M6502 Jump to Subroutine */ +/* Unusual behavior: stacks PC-1 */ +#undef OP_JSR +#define OP_JSR(MODE) \ + CLK(6); \ + DST = EA_##MODE(); \ + g65816i_push_16(REGISTER_PC-1); \ + g65816i_jump_16(DST) + +/* G65816 Jump to Subroutine */ +/* Unusual behavior: stacks PC-1 */ +#undef OP_JSRAXI +#define OP_JSRAXI() \ + CLK(8); \ + DST = read_16_AXI(REGISTER_PB | (MAKE_UINT_16(OPER_16_IMM() + REGISTER_X))); \ + g65816i_push_16_native(REGISTER_PC-1); \ + g65816i_update_reg_s(); \ + g65816i_jump_16(DST) + +/* M6502 Load accumulator with operand */ +#undef OP_LDA +#if FLAG_SET_M +#define OP_LDA(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = FLAG_Z = REGISTER_A = OPER_8_##MODE() +#else +#define OP_LDA(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_Z = REGISTER_A = OPER_16_##MODE(); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Load index register with operand */ +#undef OP_LDX +#if FLAG_SET_X +#define OP_LDX(REG, MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = FLAG_Z = REG = OPER_8_##MODE() +#else +#define OP_LDX(REG, MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_Z = REG = OPER_16_##MODE(); \ + FLAG_N = NFLAG_16(REG) +#endif + +/* M6502 Logical Shift Right accumulator */ +#undef OP_LSR +#if FLAG_SET_M +#define OP_LSR() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = 0; \ + FLAG_C = REGISTER_A << 8; \ + FLAG_Z = REGISTER_A >>= 1 +#else +#define OP_LSR() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_N = 0; \ + FLAG_C = REGISTER_A << 8; \ + FLAG_Z = REGISTER_A >>= 1 +#endif + +/* M6502 Logical Shift Right operand */ +#undef OP_LSRM +#if FLAG_SET_M +#define OP_LSRM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_N = 0; \ + FLAG_Z = read_8_##MODE(DST); \ + FLAG_C = FLAG_Z << 8; \ + FLAG_Z >>= 1; \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_LSRM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_N = 0; \ + FLAG_Z = read_16_##MODE(DST); \ + FLAG_C = FLAG_Z << 8; \ + FLAG_Z >>= 1; \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* G65816 Move Block Negative */ +#undef OP_MVN +#if FLAG_SET_M +#if FLAG_SET_X +#define OP_MVN() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_8(REGISTER_X+1); \ + REGISTER_Y = MAKE_UINT_8(REGISTER_Y+1); \ + REGISTER_A--; \ + REGISTER_A &= 0xff; \ + if ((REGISTER_A&0xff) != 0xff) \ + {\ + REGISTER_PC -= 3; \ + }\ + else \ + { \ + REGISTER_B -= 0x100;\ + REGISTER_B &= 0xff00; \ + if ((REGISTER_B & 0xff00) != 0xff00)\ + { \ + REGISTER_PC -= 3;\ + } \ + } +#else +#define OP_MVN() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_16(REGISTER_X+1); \ + REGISTER_Y = MAKE_UINT_16(REGISTER_Y+1); \ + REGISTER_A--; \ + REGISTER_A &= 0xff; \ + if ((REGISTER_A&0xff) != 0xff) \ + {\ + REGISTER_PC -= 3; \ + }\ + else \ + { \ + REGISTER_B -= 0x100;\ + REGISTER_B &= 0xff00; \ + if ((REGISTER_B & 0xff00) != 0xff00)\ + { \ + REGISTER_PC -= 3;\ + } \ + } +#endif +#else +#if FLAG_SET_X +#define OP_MVN() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + REGISTER_A |= REGISTER_B; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_8(REGISTER_X+1); \ + REGISTER_Y = MAKE_UINT_8(REGISTER_Y+1); \ + REGISTER_A--; \ + if ((REGISTER_A&0xffff) != 0xffff) \ + {\ + REGISTER_PC -= 3; \ + } +#else +#define OP_MVN() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + REGISTER_A |= REGISTER_B; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_16(REGISTER_X+1); \ + REGISTER_Y = MAKE_UINT_16(REGISTER_Y+1); \ + REGISTER_A--; \ + if ((REGISTER_A&0xffff) != 0xffff) \ + {\ + REGISTER_PC -= 3; \ + } +#endif +#endif + +/* G65816 Move Block Positive */ +#undef OP_MVP +#if FLAG_SET_M +#if FLAG_SET_X +#define OP_MVP() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_8(REGISTER_X-1); \ + REGISTER_Y = MAKE_UINT_8(REGISTER_Y-1); \ + REGISTER_A--; \ + REGISTER_A &= 0xff; \ + if ((REGISTER_A&0xff) != 0xff) \ + {\ + REGISTER_PC -= 3; \ + }\ + else \ + { \ + REGISTER_B -= 0x100;\ + REGISTER_B &= 0xff00; \ + if ((REGISTER_B & 0xff00) != 0xff00)\ + { \ + REGISTER_PC -= 3;\ + } \ + } +#else +#define OP_MVP() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_16(REGISTER_X-1); \ + REGISTER_Y = MAKE_UINT_16(REGISTER_Y-1); \ + REGISTER_A--; \ + REGISTER_A &= 0xff; \ + if ((REGISTER_A&0xff) != 0xff) \ + {\ + REGISTER_PC -= 3; \ + }\ + else \ + { \ + REGISTER_B -= 0x100;\ + REGISTER_B &= 0xff00; \ + if ((REGISTER_B & 0xff00) != 0xff00)\ + { \ + REGISTER_PC -= 3;\ + } \ + } +#endif +#else +#if FLAG_SET_X +#define OP_MVP() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + REGISTER_A |= REGISTER_B; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_8(REGISTER_X-1); \ + REGISTER_Y = MAKE_UINT_8(REGISTER_Y-1); \ + REGISTER_A--; \ + if ((REGISTER_A&0xffff) != 0xffff) \ + {\ + REGISTER_PC -= 3; \ + } +#else +#define OP_MVP() \ + DST = OPER_8_IMM()<<16; \ + SRC = OPER_8_IMM()<<16; \ + REGISTER_DB = DST; \ + REGISTER_A |= REGISTER_B; \ + CLK(7); \ + write_8_NORM(DST | REGISTER_Y, read_8_NORM(SRC | REGISTER_X)); \ + REGISTER_X = MAKE_UINT_16(REGISTER_X-1); \ + REGISTER_Y = MAKE_UINT_16(REGISTER_Y-1); \ + REGISTER_A--; \ + if ((REGISTER_A&0xffff) != 0xffff) \ + {\ + REGISTER_PC -= 3; \ + } +#endif +#endif + +/* M6502 No Operation */ +#undef OP_NOP +#define OP_NOP() \ + CLK(CLK_OP + CLK_IMPLIED) + +/* M6502 Logical OR operand to accumulator */ +#undef OP_ORA +#if FLAG_SET_M +#define OP_ORA(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + FLAG_N = FLAG_Z = REGISTER_A |= OPER_8_ ## MODE() +#else +#define OP_ORA(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + FLAG_Z = REGISTER_A |= OPER_16_##MODE(); \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* G65816 Push Effective Address */ +#undef OP_PEA +#define OP_PEA() \ + CLK(CLK_OP + CLK_R16 + CLK_W16); \ + g65816i_push_16_native(OPER_16_IMM()); \ + g65816i_update_reg_s() + +/* G65816 Push Effective Indirect Address */ +#undef OP_PEI +#define OP_PEI() \ + CLK(CLK_OP + CLK_R16 + CLK_W16 + CLK_D); \ + g65816i_push_16_native(REGISTER_DB | g65816i_read_16_normal(EA_D())); \ + g65816i_update_reg_s() + +/* G65816 Push Effective PC-Relative Address */ +#undef OP_PER +#define OP_PER() \ + CLK(CLK_OP + CLK_R16 + CLK_W16 + 1); \ + SRC = OPER_16_IMM(); \ + g65816i_push_16_native(REGISTER_PC + SRC); \ + g65816i_update_reg_s() + +/* M6502 Push accumulator to the stack */ +#undef OP_PHA +#if FLAG_SET_M +#define OP_PHA() \ + CLK(CLK_OP + CLK_W8 + 1); \ + g65816i_push_8(REGISTER_A) +#else +#define OP_PHA() \ + CLK(CLK_OP + CLK_W16 + 1); \ + g65816i_push_16(REGISTER_A) +#endif + +/* M6502 Push index register to the stack */ +#undef OP_PHX +#if FLAG_SET_X +#define OP_PHX(REG) \ + CLK(CLK_OP + CLK_W8 + 1); \ + g65816i_push_8(REG) +#else +#define OP_PHX(REG) \ + CLK(CLK_OP + CLK_W16 + 1); \ + g65816i_push_16(REG) +#endif + +/* G65816 Push data bank register */ +#undef OP_PHB +#define OP_PHB() \ + CLK(CLK_OP + CLK_W8 + 1); \ + g65816i_push_8(REGISTER_DB>>16) + +/* G65816 Push direct register */ +#undef OP_PHD +#define OP_PHD() \ + CLK(CLK_OP + CLK_W16 + 1); \ + g65816i_push_16_native(REGISTER_D); \ + g65816i_update_reg_s() + +/* G65816 Push program bank register */ +#undef OP_PHK +#define OP_PHK() \ + CLK(CLK_OP + CLK_W8 + 1); \ + g65816i_push_8(REGISTER_PB>>16) + +/* M6502 Push the Processor Status Register to the stack */ +#undef OP_PHP +#define OP_PHP() \ + CLK(CLK_OP + CLK_W8 + 1); \ + g65816i_push_8(g65816i_get_reg_p()) + +/* M6502 Pull accumulator from the stack */ +#undef OP_PLA +#if FLAG_SET_M +#define OP_PLA() \ + CLK(CLK_OP + CLK_R8 + 2); \ + FLAG_N = FLAG_Z = REGISTER_A = g65816i_pull_8() +#else +#define OP_PLA() \ + CLK(CLK_OP + CLK_R16 + 2); \ + FLAG_Z = REGISTER_A = g65816i_pull_16(); \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* M6502 Pull index register from the stack */ +#undef OP_PLX +#if FLAG_SET_X +#define OP_PLX(REG) \ + CLK(CLK_OP + CLK_R8 + 2); \ + FLAG_N = FLAG_Z = REG = g65816i_pull_8() +#else +#define OP_PLX(REG) \ + CLK(CLK_OP + CLK_R16 + 2); \ + FLAG_Z = REG = g65816i_pull_16(); \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Pull data bank register */ +#undef OP_PLB +#define OP_PLB() \ + CLK(CLK_OP + CLK_R8 + 2); \ + FLAG_N = FLAG_Z = g65816i_pull_8_native(); \ + g65816i_update_reg_s(); \ + REGISTER_DB = FLAG_Z << 16 + +/* G65816 Pull direct register */ +#undef OP_PLD +#define OP_PLD() \ + CLK(CLK_OP + CLK_R16 + 2); \ + FLAG_Z = REGISTER_D = g65816i_pull_16_native(); \ + g65816i_update_reg_s(); \ + FLAG_N = NFLAG_16(FLAG_Z) + +/* M6502 Pull the Processor Status Register from the stack */ +#undef OP_PLP +#define OP_PLP() \ + CLK(CLK_OP + CLK_R8 + 2); \ + g65816i_set_reg_p(g65816i_pull_8()) + +/* G65816 Reset Program status word */ +#undef OP_REP +#define OP_REP() \ + CLK(CLK_OP + CLK_R8 + 1); \ + g65816i_set_reg_p(g65816i_get_reg_p() & ~OPER_8_IMM()) + +/* M6502 Rotate Left the accumulator */ +#undef OP_ROL +#if FLAG_SET_M +#define OP_ROL() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = (REGISTER_A<<1) | CFLAG_1(); \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C) +#else +#define OP_ROL() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = (REGISTER_A<<1) | CFLAG_1(); \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = CFLAG_16(FLAG_C) +#endif + +/* M6502 Rotate Left an operand */ +#undef OP_ROLM +#if FLAG_SET_M +#define OP_ROLM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_C = (read_8_##MODE(DST)<<1) | CFLAG_1(); \ + FLAG_N = FLAG_Z = MAKE_UINT_8(FLAG_C); \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_ROLM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_C = (read_16_##MODE(DST)<<1) | CFLAG_1(); \ + FLAG_Z = MAKE_UINT_16(FLAG_C); \ + FLAG_N = NFLAG_16(FLAG_C); \ + FLAG_C = CFLAG_16(FLAG_C); \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* M6502 Rotate Right the accumulator */ +#undef OP_ROR +#if FLAG_SET_M +#define OP_ROR() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_A |= FLAG_C & 0x100; \ + FLAG_C = REGISTER_A << 8; \ + FLAG_N = FLAG_Z = REGISTER_A >>= 1 +#else +#define OP_ROR() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_A |= (FLAG_C<<8) & 0x10000; \ + FLAG_C = REGISTER_A << 8; \ + FLAG_Z = REGISTER_A >>= 1; \ + FLAG_N = NFLAG_16(REGISTER_A) +#endif + +/* M6502 Rotate Right an operand */ +#undef OP_RORM +#if FLAG_SET_M +#define OP_RORM(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_8_##MODE(DST) | (FLAG_C & 0x100); \ + FLAG_C = FLAG_Z << 8; \ + FLAG_N = FLAG_Z >>= 1; \ + write_8_##MODE(DST, FLAG_Z) +#else +#define OP_RORM(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_16_##MODE(DST) | ((FLAG_C<<8) & 0x10000); \ + FLAG_C = FLAG_Z << 8; \ + FLAG_Z >>= 1; \ + FLAG_N = NFLAG_16(FLAG_Z); \ + write_16_##MODE(DST, FLAG_Z) +#endif + +/* M6502 Return from Interrupt */ +#undef OP_RTI +#if FLAG_SET_E +#define OP_RTI() \ + CLK(7); \ + g65816i_set_reg_p(g65816i_pull_8()); \ + g65816i_jump_16(g65816i_pull_16()) +#else +#define OP_RTI() \ + CLK(8); \ + g65816i_set_reg_p(g65816i_pull_8()); \ + g65816i_jump_16(g65816i_pull_16()); \ + REGISTER_PB = g65816i_pull_8() << 16 +#endif + +/* G65816 Return from Subroutine Long */ +/* Unusual behavior: Gets PC and increments */ +#undef OP_RTL +#define OP_RTL() \ + CLK(6); \ + g65816i_jump_24(g65816i_pull_24_native()); \ + g65816i_update_reg_s() + +/* M6502 Return from Subroutine */ +/* Unusual behavior: Gets PC and increments */ +#undef OP_RTS +#define OP_RTS() \ + CLK(6); \ + g65816i_jump_16(g65816i_pull_16()+1) + +/* M6502 Subtract with Carry */ +/* Unusual behavior: C flag is inverted */ +#undef OP_SBC +#if FLAG_SET_M +#define OP_SBC(MODE) \ + CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ + SRC = OPER_8_##MODE(); \ + if(!FLAG_D) \ + { \ + FLAG_C = ~FLAG_C; \ + FLAG_C = REGISTER_A - SRC - CFLAG_1(); \ + FLAG_V = VFLAG_SUB_8(SRC, REGISTER_A, FLAG_C); \ + FLAG_N = FLAG_Z = REGISTER_A = MAKE_UINT_8(FLAG_C); \ + FLAG_C = ~FLAG_C; \ + BREAKOUT; \ + } \ + else \ + { \ + int32_t result, r0, r1, carry; \ + r0 = REGISTER_A; \ + r1 = SRC; \ + r1 ^= 0xff; \ + carry = CFLAG_1(); \ + result = (r0 & 0x0f) + (r1 & 0x0f) + (carry << 0); \ + if (result <= 0x0f) result -= 0x06; \ + carry = result > 0x0f; \ + result = (r0 & 0xf0) + (r1 & 0xf0) + (carry << 4) + (result & 0x0f); \ + FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x80; \ + if (result <= 0xff) result -= 0x60; \ + FLAG_C = (result > 0xff) ? 0x100 : 0; \ + FLAG_N = (result & 0x80); \ + FLAG_Z = REGISTER_A = MAKE_UINT_8(result); \ + } +#else +#define OP_SBC(MODE) \ + CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ + SRC = OPER_16_##MODE(); \ + int32_t result, r0, r1, carry; \ + r0 = REGISTER_A; \ + r1 = SRC; \ + r1 ^= 0xffff; \ + carry = CFLAG_1(); \ + if (!FLAG_D) \ + { \ + result = r0 + r1 + carry; \ + } \ + else \ + { \ + result = (r0 & 0x000f) + (r1 & 0x000f) + (carry << 0); \ + if(result <= 0x000f) result -= 0x0006; \ + carry = result > 0x000f; \ + result = (r0 & 0x00f0) + (r1 & 0x00f0) + (carry << 4) + (result & 0x000f); \ + if(result <= 0x00ff) result -= 0x0060; \ + carry = result > 0x00ff; \ + result = (r0 & 0x0f00) + (r1 & 0x0f00) + (carry << 8) + (result & 0x00ff); \ + if(result <= 0x0fff) result -= 0x0600; \ + carry = result > 0x0fff; \ + result = (r0 & 0xf000) + (r1 & 0xf000) + (carry << 12) + (result & 0x0fff); \ + } \ + FLAG_V = ~(r0 ^ r1) & (r0 ^ result) & 0x8000; \ + FLAG_V >>= 8; \ + if (FLAG_D && result <= 0xffff) result -= 0x6000; \ + FLAG_C = (result > 0xffff) ? 0x100 : 0; \ + FLAG_Z = REGISTER_A = MAKE_UINT_16(result); \ + FLAG_N = NFLAG_16(REGISTER_A); +#endif + + +/* M6502 Set Carry flag */ +#undef OP_SEC +#define OP_SEC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_C = CFLAG_SET + +/* M6502 Set Decimal flag */ +#undef OP_SED +#define OP_SED() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_D = DFLAG_SET + +/* M6502 Set Interrupt Mask flag */ +#undef OP_SEI +#define OP_SEI() \ + CLK(CLK_OP + CLK_IMPLIED); \ + g65816i_set_flag_i(IFLAG_SET) + +/* G65816 Set Program status word */ +#undef OP_SEP +#define OP_SEP() \ + CLK(CLK_OP + CLK_R8 + 1); \ + g65816i_set_reg_p(g65816i_get_reg_p() | OPER_8_IMM()) + +/* M6502 Store accumulator to memory */ +#undef OP_STA +#if FLAG_SET_M +#define OP_STA(MODE) \ + CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ + write_8_##MODE(EA_##MODE(), REGISTER_A) +#else +#define OP_STA(MODE) \ + CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ + write_16_##MODE(EA_##MODE(), REGISTER_A) +#endif + +/* M6502 Store index register to memory */ +#undef OP_STX +#if FLAG_SET_X +#define OP_STX(REG, MODE) \ + CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ + write_8_##MODE(EA_##MODE(), REG) +#else +#define OP_STX(REG, MODE) \ + CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ + write_16_##MODE(EA_##MODE(), REG) +#endif + +/* M6502 Store zero to memory */ +#undef OP_STZ +#if FLAG_SET_M +#define OP_STZ(MODE) \ + CLK(CLK_OP + CLK_W8 + CLK_W_##MODE); \ + write_8_##MODE(EA_##MODE(), 0) +#else +#define OP_STZ(MODE) \ + CLK(CLK_OP + CLK_W16 + CLK_W_##MODE); \ + write_16_##MODE(EA_##MODE(), 0) +#endif + +/* G65816 Stop the clock */ +#undef OP_STP +#define OP_STP() \ + USE_ALL_CLKS(); \ + CPU_STOPPED |= STOP_LEVEL_STOP + +/* M6502 Transfer accumulator to index */ +#undef OP_TAX +#if FLAG_SET_M +#if FLAG_SET_X +#define OP_TAX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = REGISTER_A; \ + FLAG_N = NFLAG_8(FLAG_Z) +#else /* FLAG_SET_X */ +#define OP_TAX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = REGISTER_B | REGISTER_A; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif /* FLAG_SET_X */ +#else /* FLAG_SET_M */ +#if FLAG_SET_X +#define OP_TAX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = MAKE_UINT_8(REGISTER_A); \ + FLAG_N = NFLAG_8(FLAG_Z) +#else /* FLAG_SET_X */ +#define OP_TAX(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REG = REGISTER_A; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif /* FLAG_SET_X */ +#endif /* FLAG_SET_M */ + + +/* M6502 Transfer index to accumulator */ +#undef OP_TXA +#if FLAG_SET_M +#define OP_TXA(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = MAKE_UINT_8(REG); \ + FLAG_N = NFLAG_8(FLAG_Z) +#else +#define OP_TXA(REG) \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = REG; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Transfer C to direct register */ +#undef OP_TCD +#if FLAG_SET_M +#define OP_TCD() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_D = REGISTER_A | REGISTER_B; \ + FLAG_N = NFLAG_16(FLAG_Z) +#else +#define OP_TCD() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_D = REGISTER_A; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Transfer direct register to C */ +#undef OP_TDC +#if FLAG_SET_M +#define OP_TDC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_D; \ + FLAG_N = NFLAG_16(FLAG_Z); \ + REGISTER_A = MAKE_UINT_8(REGISTER_D); \ + REGISTER_B = REGISTER_D & 0xff00 +#else +#define OP_TDC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = REGISTER_D; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Transfer C to stack pointer */ +#undef OP_TCS +#if FLAG_SET_E +#define OP_TCS() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_S = MAKE_UINT_8(REGISTER_A) | 0x100 +#else +#define OP_TCS() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_S = REGISTER_A | REGISTER_B +#endif + +/* G65816 Transfer stack pointer to C */ +#undef OP_TSC +#if FLAG_SET_M +#define OP_TSC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_S; \ + FLAG_N = NFLAG_16(FLAG_Z); \ + REGISTER_A = MAKE_UINT_8(REGISTER_S); \ + REGISTER_B = REGISTER_S & 0xff00 +#else +#define OP_TSC() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_A = REGISTER_S; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* M6502 Transfer stack pointer to X */ +#undef OP_TSX +#if FLAG_SET_X +#define OP_TSX() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_X = MAKE_UINT_8(REGISTER_S); \ + FLAG_N = NFLAG_8(FLAG_Z) +#else +#define OP_TSX() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_X = REGISTER_S; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* M6502 Transfer X to stack pointer */ +#undef OP_TXS +#if FLAG_SET_E +#define OP_TXS() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_S = MAKE_UINT_8(REGISTER_X) | 0x100 +#else +#define OP_TXS() \ + CLK(CLK_OP + CLK_IMPLIED); \ + REGISTER_S = REGISTER_X +#endif + +/* G65816 Transfer X to Y */ +#undef OP_TXY +#if FLAG_SET_X +#define OP_TXY() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_Y = REGISTER_X; \ + FLAG_N = NFLAG_8(FLAG_Z) +#else +#define OP_TXY() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_Y = REGISTER_X; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Transfer Y to X */ +#undef OP_TYX +#if FLAG_SET_X +#define OP_TYX() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_X = REGISTER_Y; \ + FLAG_N = NFLAG_8(FLAG_Z) +#else +#define OP_TYX() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_X = REGISTER_Y; \ + FLAG_N = NFLAG_16(FLAG_Z) +#endif + +/* G65816 Test and reset bit */ +#undef OP_TRB +#if FLAG_SET_M +#define OP_TRB(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_8_##MODE(DST); \ + write_8_##MODE(DST, FLAG_Z & ~REGISTER_A); \ + FLAG_Z &= REGISTER_A +#else +#define OP_TRB(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_16_##MODE(DST); \ + write_16_##MODE(DST, FLAG_Z & ~REGISTER_A); \ + FLAG_Z &= REGISTER_A +#endif + +/* G65816 Test and set bit */ +#undef OP_TSB +#if FLAG_SET_M +#define OP_TSB(MODE) \ + CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_8_##MODE(DST); \ + write_8_##MODE(DST, FLAG_Z | REGISTER_A); \ + FLAG_Z &= REGISTER_A +#else +#define OP_TSB(MODE) \ + CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ + DST = EA_##MODE(); \ + FLAG_Z = read_16_##MODE(DST); \ + write_16_##MODE(DST, FLAG_Z | REGISTER_A); \ + FLAG_Z &= REGISTER_A +#endif + +/* G65816 Wait for interrupt */ +#undef OP_WAI +#define OP_WAI() \ + USE_ALL_CLKS(); \ + CPU_STOPPED |= STOP_LEVEL_WAI + +/* G65816 William D. Mensch, JR. (65816 designer) - future expansion */ +#undef OP_WDM +#define OP_WDM() \ + CLK(CLK_OP + CLK_IMPLIED); \ + SRC = OPER_8_IMM(); \ + m_wdm_w(SRC); + +/* G65816 Exchange accum high and low bytes */ +#undef OP_XBA +#if FLAG_SET_M +#define OP_XBA() \ + CLK(CLK_OP + CLK_IMPLIED); \ + FLAG_Z = REGISTER_B>>8; \ + REGISTER_B = REGISTER_A<<8; \ + REGISTER_A = FLAG_Z; \ + FLAG_N = NFLAG_8(FLAG_Z) +#else +#define OP_XBA() \ + CLK(CLK_OP + CLK_IMPLIED + 1); \ + FLAG_Z = REGISTER_A >> 8; \ + REGISTER_A = MAKE_UINT_16(REGISTER_A<<8) | FLAG_Z; \ + FLAG_N = NFLAG_8(FLAG_Z) +#endif + +/* G65816 Exchange carry and emulation bits */ +#undef OP_XCE +#define OP_XCE() \ + CLK(CLK_OP + CLK_IMPLIED); \ + SRC = CFLAG_1(); \ + FLAG_C = FLAG_E<<8; \ + g65816i_set_flag_e(SRC) + + + + +/* ======================================================================== */ +/* ======================== OPCODE & FUNCTION TABLES ====================== */ +/* ======================================================================== */ + +#undef OP +#undef O +#undef TABLE_OPCODES +#undef TABLE_FUNCTION + +#if FLAG_SET_E +#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _E() {OPERATION;} +#define O(CODE) &g65816_device::g65816i_ ## CODE ## _E +#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_E[256] +#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _E ARGS + +#else + +#if !FLAG_SET_M && !FLAG_SET_X +#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M0X0() {OPERATION;} +#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M0X0 +#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M0X0[256] +#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M0X0 ARGS + +#elif !FLAG_SET_M && FLAG_SET_X + +#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M0X1() {OPERATION;} +#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M0X1 +#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M0X1[256] +#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M0X1 ARGS + +#elif FLAG_SET_M && !FLAG_SET_X + +#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M1X0() {OPERATION;} +#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M1X0 +#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M1X0[256] +#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M1X0 ARGS + +#elif FLAG_SET_M && FLAG_SET_X + +#define OP(CODE, OPERATION) void g65816_device::g65816i_ ## CODE ## _M1X1() {OPERATION;} +#define O(CODE) &g65816_device::g65816i_ ## CODE ## _M1X1 +#define TABLE_OPCODES const g65816_device::opcode_func g65816_device::g65816i_opcodes_M1X1[256] +#define TABLE_FUNCTION(RTYPE, NAME, ARGS) RTYPE g65816_device::g65816i_ ## NAME ## _M1X1 ARGS + +#endif +#endif +#define BREAKOUT return + + + +/* OP FUNCTION Comment */ +OP(00, OP_BRK ( ) ) /* BRK */ +OP(01, OP_ORA ( DXI ) ) /* ORA dxi */ +OP(02, OP_COP ( ) ) /* COP (G) */ +OP(03, OP_ORA ( S ) ) /* ORA s (G) */ +OP(04, OP_TSB ( D ) ) /* TSB d (C) */ +OP(05, OP_ORA ( D ) ) /* ORA d */ +OP(06, OP_ASLM ( D ) ) /* ASL d */ +OP(07, OP_ORA ( DLI ) ) /* ORA dli (G) */ +OP(08, OP_PHP ( ) ) /* PHP */ +OP(09, OP_ORA ( IMM ) ) /* ORA imm */ +OP(0a, OP_ASL ( ) ) /* ASL acc */ +OP(0b, OP_PHD ( ) ) /* PHD (G) */ +OP(0c, OP_TSB ( A ) ) /* TSB a (C) */ +OP(0d, OP_ORA ( A ) ) /* ORA a */ +OP(0e, OP_ASLM ( A ) ) /* ASL a */ +OP(0f, OP_ORA ( AL ) ) /* ORA al (G) */ +OP(10, OP_BCC ( COND_PL() ) ) /* BPL */ +OP(11, OP_ORA ( DIY ) ) /* ORA diy */ +OP(12, OP_ORA ( DI ) ) /* ORA di (C) */ +OP(13, OP_ORA ( SIY ) ) /* ORA siy (G) */ +OP(14, OP_TRB ( D ) ) /* TRB d (C) */ +OP(15, OP_ORA ( DX ) ) /* ORA dx */ +OP(16, OP_ASLM ( DX ) ) /* ASL dx */ +OP(17, OP_ORA ( DLIY ) ) /* ORA dliy(C) */ +OP(18, OP_CLC ( ) ) /* CLC */ +OP(19, OP_ORA ( AY ) ) /* ORA ay */ +OP(1a, OP_INC ( ) ) /* INA (C) */ +OP(1b, OP_TCS ( ) ) /* TCS (G) */ +OP(1c, OP_TRB ( A ) ) /* TRB a (C) */ +OP(1d, OP_ORA ( AX ) ) /* ORA ax */ +OP(1e, OP_ASLM ( AX ) ) /* ASL ax */ +OP(1f, OP_ORA ( ALX ) ) /* ORA alx (G) */ +OP(20, OP_JSR ( A ) ) /* JSR a */ +OP(21, OP_AND ( DXI ) ) /* AND dxi */ +OP(22, OP_JSL ( AL ) ) /* JSL al (G) */ +OP(23, OP_AND ( S ) ) /* AND s (G) */ +OP(24, OP_BIT ( D ) ) /* BIT d */ +OP(25, OP_AND ( D ) ) /* AND d */ +OP(26, OP_ROLM ( D ) ) /* ROL d */ +OP(27, OP_AND ( DLI ) ) /* AND dli (G) */ +OP(28, OP_PLP ( ) ) /* PLP */ +OP(29, OP_AND ( IMM ) ) /* AND imm */ +OP(2a, OP_ROL ( ) ) /* ROL acc */ +OP(2b, OP_PLD ( ) ) /* PLD (G) */ +OP(2c, OP_BIT ( A ) ) /* BIT a */ +OP(2d, OP_AND ( A ) ) /* AND a */ +OP(2e, OP_ROLM ( A ) ) /* ROL a */ +OP(2f, OP_AND ( AL ) ) /* AND al (G) */ +OP(30, OP_BCC ( COND_MI() ) ) /* BMI */ +OP(31, OP_AND ( DIY ) ) /* AND diy */ +OP(32, OP_AND ( DI ) ) /* AND di (C) */ +OP(33, OP_AND ( SIY ) ) /* AND siy */ +OP(34, OP_BIT ( DX ) ) /* BIT dx (C) */ +OP(35, OP_AND ( DX ) ) /* AND dx */ +OP(36, OP_ROLM ( DX ) ) /* ROL dx */ +OP(37, OP_AND ( DLIY ) ) /* AND dliy(G) */ +OP(38, OP_SEC ( ) ) /* SEC */ +OP(39, OP_AND ( AY ) ) /* AND ay */ +OP(3a, OP_DEC ( ) ) /* DEA (C) */ +OP(3b, OP_TSC ( ) ) /* TSC (G) */ +OP(3c, OP_BIT ( AX ) ) /* BIT abx (C) */ +OP(3d, OP_AND ( AX ) ) /* AND ax */ +OP(3e, OP_ROLM ( AX ) ) /* ROL ax */ +OP(3f, OP_AND ( ALX ) ) /* AND alx (G) */ +OP(40, OP_RTI ( ) ) /* RTI */ +OP(41, OP_EOR ( DXI ) ) /* EOR dxi */ +OP(42, OP_WDM ( ) ) /* WDM */ +OP(43, OP_EOR ( S ) ) /* EOR s (G) */ +OP(44, OP_MVP ( ) ) /* MVP (G) */ +OP(45, OP_EOR ( D ) ) /* EOR d */ +OP(46, OP_LSRM ( D ) ) /* LSR d */ +OP(47, OP_EOR ( DLI ) ) /* EOR dli (G) */ +OP(48, OP_PHA ( ) ) /* PHA */ +OP(49, OP_EOR ( IMM ) ) /* EOR imm */ +OP(4a, OP_LSR ( ) ) /* LSR acc */ +OP(4b, OP_PHK ( ) ) /* PHK (G) */ +OP(4c, OP_JMP ( A ) ) /* JMP a */ +OP(4d, OP_EOR ( A ) ) /* EOR a */ +OP(4e, OP_LSRM ( A ) ) /* LSR a */ +OP(4f, OP_EOR ( AL ) ) /* EOR al (G) */ +OP(50, OP_BCC ( COND_VC() ) ) /* BVC */ +OP(51, OP_EOR ( DIY ) ) /* EOR diy */ +OP(52, OP_EOR ( DI ) ) /* EOR di (C) */ +OP(53, OP_EOR ( SIY ) ) /* EOR siy (G) */ +OP(54, OP_MVN ( ) ) /* MVN (G) */ +OP(55, OP_EOR ( DX ) ) /* EOR dx */ +OP(56, OP_LSRM ( DX ) ) /* LSR dx */ +OP(57, OP_EOR ( DLIY ) ) /* EOR dliy(G) */ +OP(58, OP_CLI ( ) ) /* CLI */ +OP(59, OP_EOR ( AY ) ) /* EOR ay */ +OP(5a, OP_PHX ( REGISTER_Y ) ) /* PHY (C) */ +OP(5b, OP_TCD ( ) ) /* TCD (G) */ +OP(5c, OP_JMPAL( ) ) /* JMP al (G) */ +OP(5d, OP_EOR ( AX ) ) /* EOR ax */ +OP(5e, OP_LSRM ( AX ) ) /* LSR ax */ +OP(5f, OP_EOR ( ALX ) ) /* EOR alx (G) */ +OP(60, OP_RTS ( ) ) /* RTS */ +OP(61, OP_ADC ( DXI ) ) /* ADC dxi */ +OP(62, OP_PER ( ) ) /* PER (G) */ +OP(63, OP_ADC ( S ) ) /* ADC s (G) */ +OP(64, OP_STZ ( D ) ) /* STZ d (C) */ +OP(65, OP_ADC ( D ) ) /* ADC d */ +OP(66, OP_RORM ( D ) ) /* ROR d */ +OP(67, OP_ADC ( DLI ) ) /* ADC dli (G) */ +OP(68, OP_PLA ( ) ) /* PLA */ +OP(69, OP_ADC ( IMM ) ) /* ADC imm */ +OP(6a, OP_ROR ( ) ) /* ROR acc */ +OP(6b, OP_RTL ( ) ) /* RTL (G) */ +OP(6c, OP_JMP ( AI ) ) /* JMP ai */ +OP(6d, OP_ADC ( A ) ) /* ADC a */ +OP(6e, OP_RORM ( A ) ) /* ROR a */ +OP(6f, OP_ADC ( AL ) ) /* ADC al (G) */ +OP(70, OP_BCC ( COND_VS() ) ) /* BVS */ +OP(71, OP_ADC ( DIY ) ) /* ADC diy */ +OP(72, OP_ADC ( DI ) ) /* ADC di (G) */ +OP(73, OP_ADC ( SIY ) ) /* ADC siy (G) */ +OP(74, OP_STZ ( DX ) ) /* STZ dx (C) */ +OP(75, OP_ADC ( DX ) ) /* ADC dx */ +OP(76, OP_RORM ( DX ) ) /* ROR dx */ +OP(77, OP_ADC ( DLIY ) ) /* ADC dliy(G) */ +OP(78, OP_SEI ( ) ) /* SEI */ +OP(79, OP_ADC ( AY ) ) /* ADC ay */ +OP(7a, OP_PLX ( REGISTER_Y ) ) /* PLY (C) */ +OP(7b, OP_TDC ( ) ) /* TDC (G) */ +OP(7c, OP_JMPAXI( ) ) /* JMP axi (C) */ +OP(7d, OP_ADC ( AX ) ) /* ADC ax */ +OP(7e, OP_RORM ( AX ) ) /* ROR ax */ +OP(7f, OP_ADC ( ALX ) ) /* ADC alx (G) */ +OP(80, OP_BRA ( ) ) /* BRA (C) */ +OP(81, OP_STA ( DXI ) ) /* STA dxi */ +OP(82, OP_BRL ( ) ) /* BRL (G) */ +OP(83, OP_STA ( S ) ) /* STA s (G) */ +OP(84, OP_STX ( REGISTER_Y, D ) ) /* STY d */ +OP(85, OP_STA ( D ) ) /* STA d */ +OP(86, OP_STX ( REGISTER_X, D ) ) /* STX d */ +OP(87, OP_STA ( DLI ) ) /* STA dli (G) */ +OP(88, OP_DECX ( REGISTER_Y ) ) /* DEY */ +OP(89, OP_BITI ( ) ) /* BIT imm (C) */ +OP(8a, OP_TXA ( REGISTER_X ) ) /* TXA */ +OP(8b, OP_PHB ( ) ) /* PHB (G) */ +OP(8c, OP_STX ( REGISTER_Y, A ) ) /* STY a */ +OP(8d, OP_STA ( A ) ) /* STA a */ +OP(8e, OP_STX ( REGISTER_X, A ) ) /* STX a */ +OP(8f, OP_STA ( AL ) ) /* STA al (G) */ +OP(90, OP_BCC ( COND_CC() ) ) /* BCC */ +OP(91, OP_STA ( DIY ) ) /* STA diy */ +OP(92, OP_STA ( DI ) ) /* STA di (C) */ +OP(93, OP_STA ( SIY ) ) /* STA siy (G) */ +OP(94, OP_STX ( REGISTER_Y, DX ) ) /* STY dx */ +OP(95, OP_STA ( DX ) ) /* STA dx */ +OP(96, OP_STX ( REGISTER_X, DY ) ) /* STX dy */ +OP(97, OP_STA ( DLIY ) ) /* STA dliy(G) */ +OP(98, OP_TXA ( REGISTER_Y ) ) /* TYA */ +OP(99, OP_STA ( AY ) ) /* STA ay */ +OP(9a, OP_TXS ( ) ) /* TXS */ +OP(9b, OP_TXY ( ) ) /* TXY (G) */ +OP(9c, OP_STZ ( A ) ) /* STZ a (C) */ +OP(9d, OP_STA ( AX ) ) /* STA ax */ +OP(9e, OP_STZ ( AX ) ) /* STZ ax (C) */ +OP(9f, OP_STA ( ALX ) ) /* STA alx (G) */ +OP(a0, OP_LDX ( REGISTER_Y, IMM ) ) /* LDY imm */ +OP(a1, OP_LDA ( DXI ) ) /* LDA dxi */ +OP(a2, OP_LDX ( REGISTER_X, IMM ) ) /* LDX imm */ +OP(a3, OP_LDA ( S ) ) /* LDA s (G) */ +OP(a4, OP_LDX ( REGISTER_Y, D ) ) /* LDY d */ +OP(a5, OP_LDA ( D ) ) /* LDA d */ +OP(a6, OP_LDX ( REGISTER_X, D ) ) /* LDX d */ +OP(a7, OP_LDA ( DLI ) ) /* LDA dli (G) */ +OP(a8, OP_TAX ( REGISTER_Y ) ) /* TAY */ +OP(a9, OP_LDA ( IMM ) ) /* LDA imm */ +OP(aa, OP_TAX ( REGISTER_X ) ) /* TAX */ +OP(ab, OP_PLB ( ) ) /* PLB (G) */ +OP(ac, OP_LDX ( REGISTER_Y, A ) ) /* LDY a */ +OP(ad, OP_LDA ( A ) ) /* LDA a */ +OP(ae, OP_LDX ( REGISTER_X, A ) ) /* LDX a */ +OP(af, OP_LDA ( AL ) ) /* LDA al (G) */ +OP(b0, OP_BCC ( COND_CS() ) ) /* BCS */ +OP(b1, OP_LDA ( DIY ) ) /* LDA diy */ +OP(b2, OP_LDA ( DI ) ) /* LDA di (C) */ +OP(b3, OP_LDA ( SIY ) ) /* LDA siy (G) */ +OP(b4, OP_LDX ( REGISTER_Y, DX ) ) /* LDY dx */ +OP(b5, OP_LDA ( DX ) ) /* LDA dx */ +OP(b6, OP_LDX ( REGISTER_X, DY ) ) /* LDX dy */ +OP(b7, OP_LDA ( DLIY ) ) /* LDA dliy(G) */ +OP(b8, OP_CLV ( ) ) /* CLV */ +OP(b9, OP_LDA ( AY ) ) /* LDA ay */ +OP(ba, OP_TSX ( ) ) /* TSX */ +OP(bb, OP_TYX ( ) ) /* TYX (G) */ +OP(bc, OP_LDX ( REGISTER_Y, AX ) ) /* LDY ax */ +OP(bd, OP_LDA ( AX ) ) /* LDA ax */ +OP(be, OP_LDX ( REGISTER_X, AY ) ) /* LDX ay */ +OP(bf, OP_LDA ( ALX ) ) /* LDA alx (G) */ +OP(c0, OP_CMPX ( REGISTER_Y, IMM ) ) /* CPY imm */ +OP(c1, OP_CMP ( DXI ) ) /* CMP dxi */ +OP(c2, OP_REP ( ) ) /* REP (G) */ +OP(c3, OP_CMP ( S ) ) /* CMP s (G) */ +OP(c4, OP_CMPX ( REGISTER_Y, D ) ) /* CPY d */ +OP(c5, OP_CMP ( D ) ) /* CMP d */ +OP(c6, OP_DECM ( D ) ) /* DEC d */ +OP(c7, OP_CMP ( DLI ) ) /* CMP dli (G) */ +OP(c8, OP_INCX ( REGISTER_Y ) ) /* INY */ +OP(c9, OP_CMP ( IMM ) ) /* CMP imm */ +OP(ca, OP_DECX ( REGISTER_X ) ) /* DEX */ +OP(cb, OP_WAI ( ) ) /* WAI (G) */ +OP(cc, OP_CMPX ( REGISTER_Y, A ) ) /* CPY a */ +OP(cd, OP_CMP ( A ) ) /* CMP a */ +OP(ce, OP_DECM ( A ) ) /* DEC a */ +OP(cf, OP_CMP ( AL ) ) /* CMP al (G) */ +OP(d0, OP_BCC ( COND_NE() ) ) /* BNE */ +OP(d1, OP_CMP ( DIY ) ) /* CMP diy */ +OP(d2, OP_CMP ( DI ) ) /* CMP di (C) */ +OP(d3, OP_CMP ( SIY ) ) /* CMP siy (G) */ +OP(d4, OP_PEI ( ) ) /* PEI (G) */ +OP(d5, OP_CMP ( DX ) ) /* CMP dx */ +OP(d6, OP_DECM ( DX ) ) /* DEC dx */ +OP(d7, OP_CMP ( DLIY ) ) /* CMP dliy(G) */ +OP(d8, OP_CLD ( ) ) /* CLD */ +OP(d9, OP_CMP ( AY ) ) /* CMP ay */ +OP(da, OP_PHX ( REGISTER_X ) ) /* PHX (C) */ +OP(db, OP_STP ( ) ) /* STP (G) */ +OP(dc, OP_JMLAI( ) ) /* JML ai (G) */ +OP(dd, OP_CMP ( AX ) ) /* CMP ax */ +OP(de, OP_DECM ( AX ) ) /* DEC ax */ +OP(df, OP_CMP ( ALX ) ) /* CMP alx (G) */ +OP(e0, OP_CMPX ( REGISTER_X, IMM ) ) /* CPX imm */ +OP(e1, OP_SBC ( DXI ) ) /* SBC dxi */ +OP(e2, OP_SEP ( ) ) /* SEP imm (G) */ +OP(e3, OP_SBC ( S ) ) /* SBC s (G) */ +OP(e4, OP_CMPX ( REGISTER_X, D ) ) /* CPX d */ +OP(e5, OP_SBC ( D ) ) /* SBC d */ +OP(e6, OP_INCM ( D ) ) /* INC d */ +OP(e7, OP_SBC ( DLI ) ) /* SBC dli (G) */ +OP(e8, OP_INCX ( REGISTER_X ) ) /* INX */ +OP(e9, OP_SBC ( IMM ) ) /* SBC imm */ +OP(ea, OP_NOP ( ) ) /* NOP */ +OP(eb, OP_XBA ( ) ) /* XBA (G) */ +OP(ec, OP_CMPX ( REGISTER_X, A ) ) /* CPX a */ +OP(ed, OP_SBC ( A ) ) /* SBC a */ +OP(ee, OP_INCM ( A ) ) /* INC a */ +OP(ef, OP_SBC ( AL ) ) /* SBC al (G) */ +OP(f0, OP_BCC ( COND_EQ() ) ) /* BEQ */ +OP(f1, OP_SBC ( DIY ) ) /* SBC diy */ +OP(f2, OP_SBC ( DI ) ) /* SBC di (C) */ +OP(f3, OP_SBC ( SIY ) ) /* SBC siy (G) */ +OP(f4, OP_PEA ( ) ) /* PEA (G) */ +OP(f5, OP_SBC ( DX ) ) /* SBC dx */ +OP(f6, OP_INCM ( DX ) ) /* INC dx */ +OP(f7, OP_SBC ( DLIY ) ) /* SBC dliy(G) */ +OP(f8, OP_SED ( ) ) /* SED */ +OP(f9, OP_SBC ( AY ) ) /* SBC ay */ +OP(fa, OP_PLX ( REGISTER_X ) ) /* PLX (C) */ +OP(fb, OP_XCE ( ) ) /* XCE (G) */ +OP(fc, OP_JSRAXI( ) ) /* JSR axi (G) */ +OP(fd, OP_SBC ( AX ) ) /* SBC ax */ +OP(fe, OP_INCM ( AX ) ) /* INC ax */ +OP(ff, OP_SBC ( ALX ) ) /* SBC alx (G) */ + + + +TABLE_OPCODES = +{ + O(00),O(01),O(02),O(03),O(04),O(05),O(06),O(07), + O(08),O(09),O(0a),O(0b),O(0c),O(0d),O(0e),O(0f), + O(10),O(11),O(12),O(13),O(14),O(15),O(16),O(17), + O(18),O(19),O(1a),O(1b),O(1c),O(1d),O(1e),O(1f), + O(20),O(21),O(22),O(23),O(24),O(25),O(26),O(27), + O(28),O(29),O(2a),O(2b),O(2c),O(2d),O(2e),O(2f), + O(30),O(31),O(32),O(33),O(34),O(35),O(36),O(37), + O(38),O(39),O(3a),O(3b),O(3c),O(3d),O(3e),O(3f), + O(40),O(41),O(42),O(43),O(44),O(45),O(46),O(47), + O(48),O(49),O(4a),O(4b),O(4c),O(4d),O(4e),O(4f), + O(50),O(51),O(52),O(53),O(54),O(55),O(56),O(57), + O(58),O(59),O(5a),O(5b),O(5c),O(5d),O(5e),O(5f), + O(60),O(61),O(62),O(63),O(64),O(65),O(66),O(67), + O(68),O(69),O(6a),O(6b),O(6c),O(6d),O(6e),O(6f), + O(70),O(71),O(72),O(73),O(74),O(75),O(76),O(77), + O(78),O(79),O(7a),O(7b),O(7c),O(7d),O(7e),O(7f), + O(80),O(81),O(82),O(83),O(84),O(85),O(86),O(87), + O(88),O(89),O(8a),O(8b),O(8c),O(8d),O(8e),O(8f), + O(90),O(91),O(92),O(93),O(94),O(95),O(96),O(97), + O(98),O(99),O(9a),O(9b),O(9c),O(9d),O(9e),O(9f), + O(a0),O(a1),O(a2),O(a3),O(a4),O(a5),O(a6),O(a7), + O(a8),O(a9),O(aa),O(ab),O(ac),O(ad),O(ae),O(af), + O(b0),O(b1),O(b2),O(b3),O(b4),O(b5),O(b6),O(b7), + O(b8),O(b9),O(ba),O(bb),O(bc),O(bd),O(be),O(bf), + O(c0),O(c1),O(c2),O(c3),O(c4),O(c5),O(c6),O(c7), + O(c8),O(c9),O(ca),O(cb),O(cc),O(cd),O(ce),O(cf), + O(d0),O(d1),O(d2),O(d3),O(d4),O(d5),O(d6),O(d7), + O(d8),O(d9),O(da),O(db),O(dc),O(dd),O(de),O(df), + O(e0),O(e1),O(e2),O(e3),O(e4),O(e5),O(e6),O(e7), + O(e8),O(e9),O(ea),O(eb),O(ec),O(ed),O(ee),O(ef), + O(f0),O(f1),O(f2),O(f3),O(f4),O(f5),O(f6),O(f7), + O(f8),O(f9),O(fa),O(fb),O(fc),O(fd),O(fe),O(ff) +}; + + + +/* Assert or clear a line on the CPU */ +TABLE_FUNCTION(void, set_line, (int line, int state)) +{ + switch(line) + { + case G65816_LINE_IRQ: + switch(state) + { + case CLEAR_LINE: + LINE_IRQ = 0; + return; + case ASSERT_LINE: + case HOLD_LINE: + LINE_IRQ = 1; + } + if(FLAG_I) + { + if(CPU_STOPPED & STOP_LEVEL_WAI) + { + CPU_STOPPED &= ~STOP_LEVEL_WAI; + } + return; + } + return; + case G65816_LINE_NMI: + if(state == CLEAR_LINE) + { + LINE_NMI = 0; + return; + } + if(!LINE_NMI) + { + LINE_NMI = 1; + CPU_STOPPED &= ~STOP_LEVEL_WAI; + if(!CPU_STOPPED) + g65816i_interrupt_nmi(); + } + return; + case G65816_LINE_SO: + FLAG_V = VFLAG_SET; + break; + case G65816_LINE_RESET: + case G65816_LINE_ABORT: + case G65816_LINE_RDY: + return; + } + + LINE_IRQ=1; // FIXME: this can't be right! +} + + + +/* Get a register from the CPU core */ +TABLE_FUNCTION(unsigned, get_reg, (int regnum)) +{ + switch(regnum) + { + case G65816_A: return REGISTER_B | REGISTER_A; + case G65816_X: return REGISTER_X; + case G65816_Y: return REGISTER_Y; + case G65816_S: return REGISTER_S; + case STATE_GENPC: return REGISTER_PC; + case G65816_PC: return REGISTER_PC; + case G65816_PB: return REGISTER_PB >> 16; + case G65816_DB: return REGISTER_DB >> 16; + case G65816_D: return REGISTER_D; + case G65816_P: return g65816i_get_reg_p(); + case G65816_NMI_STATE: return LINE_NMI; + case G65816_IRQ_STATE: return LINE_IRQ; + case STATE_GENPCBASE: return REGISTER_PPC; + case _5A22_FASTROM: return m_fastROM; + } + return 0; +} + + + +TABLE_FUNCTION(void, set_reg, (int regnum, unsigned val)) +{ + switch(regnum) + { + case STATE_GENPC: case G65816_PC: REGISTER_PC = MAKE_UINT_16(val); break; +#if FLAG_SET_E + case G65816_S: REGISTER_S = MAKE_UINT_8(val) | 0x100; break; +#else + case G65816_S: REGISTER_S = MAKE_UINT_16(val); break; +#endif + case G65816_P: g65816i_set_reg_p(val); break; +#if FLAG_SET_M + case G65816_A: REGISTER_A = MAKE_UINT_8(val); REGISTER_B = val&0xff00; break; +#else + case G65816_A: REGISTER_A = MAKE_UINT_16(val); break; +#endif +#if FLAG_SET_X + case G65816_X: REGISTER_X = MAKE_UINT_8(val); break; + case G65816_Y: REGISTER_Y = MAKE_UINT_8(val); break; +#else + case G65816_X: REGISTER_X = MAKE_UINT_16(val); break; + case G65816_Y: REGISTER_Y = MAKE_UINT_16(val); break; +#endif + case G65816_DB: REGISTER_DB = MAKE_UINT_8(val); break; + case G65816_PB: REGISTER_PB = MAKE_UINT_8(val); break; + case G65816_NMI_STATE: (this->*FTABLE_SET_LINE)(G65816_LINE_NMI, val == 0 ? CLEAR_LINE : ASSERT_LINE); break; + case G65816_IRQ_STATE: (this->*FTABLE_SET_LINE)(G65816_LINE_IRQ, val == 0 ? CLEAR_LINE : ASSERT_LINE); break; + case _5A22_FASTROM: m_fastROM = val; break; + } +} + + + +#if EXECUTION_MODE == EXECUTION_MODE_E +#define g65816i_correct_mode() (FLAG_E == EFLAG_SET) +#elif EXECUTION_MODE == EXECUTION_MODE_M0X0 +#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_CLEAR) && (FLAG_X == XFLAG_CLEAR)) +#elif EXECUTION_MODE == EXECUTION_MODE_M0X1 +#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_CLEAR) && (FLAG_X == XFLAG_SET)) +#elif EXECUTION_MODE == EXECUTION_MODE_M1X0 +#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_SET) && (FLAG_X == XFLAG_CLEAR)) +#elif EXECUTION_MODE == EXECUTION_MODE_M1X1 +#define g65816i_correct_mode() ((FLAG_E == EFLAG_CLEAR) && (FLAG_M == MFLAG_SET) && (FLAG_X == XFLAG_SET)) +#else +#error Invalid EXECUTION_MODE +#endif + + + +TABLE_FUNCTION(int, execute, (int clocks)) +{ + // do a check here also in case we're in STOP_WAI mode - this'll clear it when the IRQ happens + g65816i_check_maskable_interrupt(); + + if (!CPU_STOPPED) + { + CLOCKS = clocks; + do + { + /* Note that I'm doing a per-instruction interrupt + * check until this core is working well enough + * to start trying fancy stuff. + */ + g65816i_check_maskable_interrupt(); + + REGISTER_PPC = REGISTER_PC; + G65816_CALL_DEBUGGER(REGISTER_PB | REGISTER_PC); + + REGISTER_PC++; + REGISTER_IR = read_8_OP(REGISTER_PB | REGISTER_PPC); + (this->*FTABLE_OPCODES[REGISTER_IR])(); + } while((CLOCKS > 0) && g65816i_correct_mode()); + return clocks - CLOCKS; + } + return clocks; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/gt913.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/gt913.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/gt913.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/gt913.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -253,6 +253,12 @@ recompute_bcount(event_time); } +void gt913_device::notify_standby(int state) +{ + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); +} + void gt913_device::execute_set_input(int inputnum, int state) { m_intc->set_input(inputnum, state); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/gt913.h mame-0.264+dfsg.1/src/devices/cpu/h8/gt913.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/gt913.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/gt913.h 2024-03-25 14:00:46.000000000 +0000 @@ -56,6 +56,7 @@ virtual void update_irq_filter() override; virtual void interrupt_taken() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void irq_setup() override; virtual void execute_set_input(int inputnum, int state) override; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,8 @@ TODO: - use logmacro and be quiet by default, same for H8 peripherals that currently have "static constexpr int V" + - Verify H8H opcode map, some opcodes currently for H8H are H8S-only. + Base H8/300 (eg. H8/325) opcode map is correct. - NVRAM won't work properly when it goes into SSBY (software standby mode) and the power button triggers an IRQ to wake up instead of RES. Obviously, MAME always starts at reset-phase at power-on, so it's more @@ -38,15 +40,14 @@ m_standby_cb(*this), m_PPC(0), m_NPC(0), m_PC(0), m_PIR(0), m_EXR(0), m_CCR(0), m_MAC(0), m_MACF(0), m_TMP1(0), m_TMP2(0), m_TMPR(0), m_inst_state(0), m_inst_substate(0), m_icount(0), m_bcount(0), - m_irq_vector(0), m_taken_irq_vector(0), m_irq_level(0), m_taken_irq_level(0), m_irq_required(false), m_irq_nmi(false), - m_standby_pending(false), m_nvram_defval(0), m_nvram_battery(true) + m_irq_vector(0), m_taken_irq_vector(0), m_irq_level(0), m_taken_irq_level(0), m_irq_nmi(false), + m_standby_pending(false), m_standby_time(0), m_nvram_defval(0), m_nvram_battery(true) { m_supports_advanced = false; m_mode_advanced = false; m_mode_a20 = false; m_has_exr = false; m_has_mac = false; - m_mac_saturating = false; m_has_trace = false; m_has_hc = true; nvram_enable_backup(false); // disable nvram by default @@ -145,6 +146,9 @@ state_add(H8_R7, "ER7", m_TMPR).callimport().callexport().formatstr("%9s"); } + save_item(NAME(m_current_dma)); + save_item(NAME(m_cycles_base)); + save_item(NAME(m_PPC)); save_item(NAME(m_NPC)); save_item(NAME(m_PC)); @@ -153,17 +157,24 @@ save_item(NAME(m_R)); save_item(NAME(m_EXR)); save_item(NAME(m_CCR)); + save_item(NAME(m_MAC)); + save_item(NAME(m_MACF)); save_item(NAME(m_TMP1)); save_item(NAME(m_TMP2)); + save_item(NAME(m_TMPR)); + save_item(NAME(m_inst_state)); save_item(NAME(m_inst_substate)); + save_item(NAME(m_requested_state)); + save_item(NAME(m_bcount)); + save_item(NAME(m_count_before_instruction_step)); save_item(NAME(m_irq_vector)); save_item(NAME(m_taken_irq_vector)); save_item(NAME(m_irq_level)); save_item(NAME(m_taken_irq_level)); save_item(NAME(m_irq_nmi)); - save_item(NAME(m_current_dma)); save_item(NAME(m_standby_pending)); + save_item(NAME(m_standby_time)); save_item(NAME(m_nvram_battery)); set_icountptr(m_icount); @@ -189,6 +200,7 @@ void h8_device::device_reset() { + m_cycles_base = machine().time().as_ticks(clock()); m_inst_state = STATE_RESET; m_inst_substate = 0; m_count_before_instruction_step = 0; @@ -215,11 +227,10 @@ if(!m_nvram_battery) return true; - size_t actual; - // internal RAM if(m_internal_ram) { - if(file.write(&m_internal_ram[0], m_internal_ram.bytes(), actual) || m_internal_ram.bytes() != actual) + auto const [err, actual] = write(file, &m_internal_ram[0], m_internal_ram.bytes()); + if(err) return false; } @@ -234,11 +245,10 @@ bool h8_device::nvram_read(util::read_stream &file) { - size_t actual; - // internal RAM if(m_internal_ram) { - if(file.read(&m_internal_ram[0], m_internal_ram.bytes(), actual) || m_internal_ram.bytes() != actual) + auto const [err, actual] = read(file, &m_internal_ram[0], m_internal_ram.bytes()); + if (err || (m_internal_ram.bytes() != actual)) return false; } @@ -579,6 +589,7 @@ // wake up from software standby with an external interrupt if(standby() && m_irq_vector) { + notify_standby(0); resume(SUSPEND_REASON_CLOCK); m_standby_cb(0); take_interrupt(); @@ -612,13 +623,14 @@ u8 h8_device::do_addx8(u8 v1, u8 v2) { - u16 res = v1 + v2 + (m_CCR & F_C ? 1 : 0); + u8 c = m_CCR & F_C ? 1 : 0; + u16 res = v1 + v2 + c; m_CCR &= ~(F_N|F_V|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; - if(((v1 & 0xf) + (v2 & 0xf) + (m_CCR & F_C ? 1 : 0)) & 0x10) + if(m_has_hc) { + if(((v1 & 0xf) + (v2 & 0xf) + c) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(u8(res)) m_CCR &= ~F_Z; @@ -633,13 +645,14 @@ u8 h8_device::do_subx8(u8 v1, u8 v2) { - u16 res = v1 - v2 - (m_CCR & F_C ? 1 : 0); + u8 c = m_CCR & F_C ? 1 : 0; + u16 res = v1 - v2 - c; m_CCR &= ~(F_N|F_V|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; - if(((v1 & 0xf) - (v2 & 0xf) - (m_CCR & F_C ? 1 : 0)) & 0x10) + if(m_has_hc) { + if(((v1 & 0xf) - (v2 & 0xf) - c) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(u8(res)) m_CCR &= ~F_Z; @@ -695,11 +708,11 @@ { u16 res = v1 + v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xf) + (v2 & 0xf)) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u8(res)) m_CCR |= F_Z; @@ -716,11 +729,11 @@ { u32 res = v1 + v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfff) + (v2 & 0xfff)) & 0x1000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u16(res)) m_CCR |= F_Z; @@ -737,11 +750,11 @@ { u64 res = u64(v1) + u64(v2); m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfffffff) + (v2 & 0xfffffff)) & 0x10000000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u32(res)) m_CCR |= F_Z; @@ -797,11 +810,11 @@ { u16 res = v1 - v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xf) - (v2 & 0xf)) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u8(res)) m_CCR |= F_Z; @@ -818,11 +831,11 @@ { u32 res = v1 - v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfff) - (v2 & 0xfff)) & 0x1000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u16(res)) m_CCR |= F_Z; @@ -839,11 +852,11 @@ { u64 res = u64(v1) - u64(v2); m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfffffff) - (v2 & 0xfffffff)) & 0x10000000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u32(res)) m_CCR |= F_Z; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8.h 2024-03-25 14:00:46.000000000 +0000 @@ -49,6 +49,7 @@ void nvram_set_default_value(u16 val) { m_nvram_defval = val; } // default is 0 auto standby_cb() { return m_standby_cb.bind(); } // notifier (not an output pin) int standby() { return suspended(SUSPEND_REASON_CLOCK) ? 1 : 0; } + u64 standby_time() { return m_standby_time; } void internal_update(); void set_irq(int irq_vector, int irq_level, bool irq_nmi); @@ -65,6 +66,8 @@ void do_sci_tx(int sci, int state) { m_sci_tx[sci](state); } void do_sci_clk(int sci, int state) { m_sci_clk[sci](state); } + u64 now_as_cycles() const { return machine().time().as_ticks(clock()) - m_cycles_base; } + protected: enum { // digital I/O ports @@ -153,19 +156,20 @@ h8_dma_state *m_dma_channel[8]; int m_current_dma; h8_dtc_state *m_current_dtc; + u64 m_cycles_base; - u32 m_PPC; // previous program counter - u32 m_NPC; // next start-of-instruction program counter - u32 m_PC; // program counter - u16 m_PIR; // Prefetched word - u16 m_IR[5]; // Fetched instruction - u16 m_R[16]; // Rn (0-7), En (8-15, h8-300h+) - u8 m_EXR; // Interrupt/trace register (h8s/2000+) - u8 m_CCR; // Condition-code register - s64 m_MAC; // Multiply accumulator (h8s/2600+) - u8 m_MACF; // MAC flags (h8s/2600+) - u32 m_TMP1, m_TMP2; - u32 m_TMPR; // For debugger ER register import + u32 m_PPC; // previous program counter + u32 m_NPC; // next start-of-instruction program counter + u32 m_PC; // program counter + u16 m_PIR; // Prefetched word + u16 m_IR[5]; // Fetched instruction + u16 m_R[16]; // Rn (0-7), En (8-15, h8-300h+) + u8 m_EXR; // Interrupt/trace register (h8s/2000+) + u8 m_CCR; // Condition-code register + s64 m_MAC; // Multiply accumulator (h8s/2600+) + u8 m_MACF; // MAC flags (h8s/2600+) + u32 m_TMP1, m_TMP2; + u32 m_TMPR; // For debugger ER register import bool m_has_exr, m_has_mac, m_has_trace, m_supports_advanced, m_mode_advanced, m_mode_a20, m_mac_saturating; bool m_has_hc; // GT913's CCR bit 5 is I, not H @@ -174,8 +178,8 @@ int m_icount, m_bcount, m_count_before_instruction_step; int m_irq_vector, m_taken_irq_vector; int m_irq_level, m_taken_irq_level; - bool m_irq_required, m_irq_nmi; - bool m_standby_pending; + bool m_irq_nmi, m_standby_pending; + u64 m_standby_time; u16 m_nvram_defval; bool m_nvram_battery; @@ -186,6 +190,7 @@ virtual void update_irq_filter() = 0; virtual void interrupt_taken() = 0; virtual void internal_update(u64 current_time) = 0; + virtual void notify_standby(int state) = 0; void recompute_bcount(u64 event_time); virtual int trace_setup(); virtual int trapa_setup(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8.lst mame-0.264+dfsg.1/src/devices/cpu/h8/h8.lst --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8.lst 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8.lst 2024-03-25 14:00:46.000000000 +0000 @@ -353,9 +353,9 @@ m_TMP2 = r32_r(m_IR[1] >> 4); m_TMP2 -= 4; r32_w(m_IR[1] >> 4, m_TMP2); + set_nzv32(m_TMP1); write16(m_TMP2, m_TMP1 >> 16); write16(m_TMP2+2, m_TMP1); - set_nzv32(m_TMP1); prefetch_done(); 01006f00 ffffff88 0 mov.l r32d16h r32l h @@ -742,6 +742,8 @@ 0180 ffff 0 sleep - - prefetch_start if(m_standby_pending) { + m_standby_time = total_cycles(); + notify_standby(1); suspend(SUSPEND_REASON_CLOCK, true); m_standby_cb(1); } else { @@ -1293,18 +1295,14 @@ prefetch 1750 fff0 0 extu.w r16l - h - m_CCR &= ~(F_N|F_Z|F_V); m_TMP1 = u8(r16_r(m_IR[0])); - if(!m_TMP1) - m_CCR |= F_Z; + set_nzv16(m_TMP1); r16_w(m_IR[0], m_TMP1); prefetch 1770 fff8 0 extu.l r32l - h - m_CCR &= ~(F_N|F_Z|F_V); m_TMP1 = u16(r32_r(m_IR[0])); - if(!m_TMP1) - m_CCR |= F_Z; + set_nzv32(m_TMP1); r32_w(m_IR[0], m_TMP1); prefetch @@ -1321,18 +1319,14 @@ prefetch 17d0 fff0 0 exts.w r16l - h - m_CCR &= ~(F_N|F_Z|F_V); m_TMP1 = s8(r16_r(m_IR[0])); - if(!m_TMP1) - m_CCR |= F_Z; + set_nzv16(m_TMP1); r16_w(m_IR[0], m_TMP1); prefetch 17f0 fff8 0 exts.l r32l - h - m_CCR &= ~(F_N|F_Z|F_V); m_TMP1 = s16(r32_r(m_IR[0])); - if(!m_TMP1) - m_CCR |= F_Z; + set_nzv32(m_TMP1); r32_w(m_IR[0], m_TMP1); prefetch @@ -1582,20 +1576,19 @@ 5670 ffff 0 rte - - h fetch m_TMP1 = r32_r(7); + if(exr_in_stack()) { + m_EXR = (read16(m_TMP1) >> 8) | EXR_NC; + m_TMP1 += 2; + } + m_TMP2 = read16(m_TMP1); + m_CCR = m_TMP2 >> 8; if(m_mode_advanced) { - if(exr_in_stack()) { - m_EXR = (read16(m_TMP1) >> 8) | EXR_NC; - m_TMP1 += 2; - } - m_TMP2 = read16(m_TMP1); - m_CCR = m_TMP2 >> 8; m_TMP2 = (m_TMP2 & 0xff) << 16; m_TMP2 |= read16(m_TMP1+2); - r32_w(7, m_TMP1+4); } else { - m_TMP2 = read16(m_TMP1); - r32_w(7, m_TMP1+2); + m_TMP2 = read16(m_TMP1+2); } + r32_w(7, m_TMP1+4); internal(1); m_PC = m_TMP2; update_irq_filter(); @@ -1751,7 +1744,7 @@ 5f00 ff00 0 jsr abs8i - h fetch_noinc - m_TMP2 = m_PPC; + m_TMP2 = m_PC; if(m_mode_advanced) { m_TMP1 = read16(m_IR[0] & 0xff) << 16; m_TMP1 |= read16((m_IR[0] & 0xff) + 2); @@ -1877,67 +1870,67 @@ r8_w(m_IR[0], m_TMP1); prefetch_done(); -6a106300 ffffff0f 1 btst r8h abs16 h +6a106300 ffffff0f 1 btst r8h abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); btst r8_r(m_IR[2] >> 4) prefetch -6a107300 ffffff8f 1 btst imm3 abs16 h +6a107300 ffffff8f 1 btst imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); btst m_IR[2] >> 4 prefetch -6a107400 ffffff8f 1 bor imm3 abs16 h +6a107400 ffffff8f 1 bor imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bor m_IR[2] >> 4 prefetch -6a107480 ffffff8f 1 bior imm3 abs16 h +6a107480 ffffff8f 1 bior imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bior m_IR[2] >> 4 prefetch -6a107500 ffffff8f 1 bxor imm3 abs16 h +6a107500 ffffff8f 1 bxor imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bxor m_IR[2] >> 4 prefetch -6a107580 ffffff8f 1 bixor imm3 abs16 h +6a107580 ffffff8f 1 bixor imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bixor m_IR[2] >> 4 prefetch -6a107600 ffffff8f 1 band imm3 abs16 h +6a107600 ffffff8f 1 band imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); band m_IR[2] >> 4 prefetch -6a107680 ffffff8f 1 biand imm3 abs16 h +6a107680 ffffff8f 1 biand imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); biand m_IR[2] >> 4 prefetch -6a107700 ffffff8f 1 bld imm3 abs16 h +6a107700 ffffff8f 1 bld imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bld m_IR[2] >> 4 prefetch -6a107780 ffffff8f 1 bild imm3 abs16 h +6a107780 ffffff8f 1 bild imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); bild m_IR[2] >> 4 prefetch -6a186000 ffffff0f 1 bset r8h abs16 h +6a186000 ffffff0f 1 bset r8h abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1945,7 +1938,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a186100 ffffff0f 1 bnot r8h abs16 h +6a186100 ffffff0f 1 bnot r8h abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1953,7 +1946,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a186200 ffffff0f 1 bclr r8h abs16 h +6a186200 ffffff0f 1 bclr r8h abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1961,15 +1954,15 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a186700 ffffff8f 1 bst imm3 abs16 h - m_TMP2 = s16(m_IR[2]); +6a186700 ffffff8f 1 bst imm3 abs16 s20 + m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start bst m_IR[2] >> 4 write8(m_TMP2, m_TMP1); prefetch_done(); -6a186780 ffffff8f 1 bist imm3 abs16 h +6a186780 ffffff8f 1 bist imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1977,7 +1970,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a187000 ffffff8f 1 bset imm3 abs16 h +6a187000 ffffff8f 1 bset imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1985,7 +1978,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a187100 ffffff8f 1 bnot imm3 abs16 h +6a187100 ffffff8f 1 bnot imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -1993,7 +1986,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a187200 ffffff8f 1 bclr imm3 abs16 h +6a187200 ffffff8f 1 bclr imm3 abs16 s20 m_TMP2 = s16(m_IR[1]); m_TMP1 = read8(m_TMP2); prefetch_start @@ -2008,67 +2001,67 @@ r8_w(m_IR[0], m_TMP1); prefetch_done(); -6a306300 ffffff0f 2 btst r8h abs32 h +6a306300 ffffff0f 2 btst r8h abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); btst r8_r(m_IR[3] >> 4) prefetch -6a307300 ffffff8f 2 btst imm3 abs32 h +6a307300 ffffff8f 2 btst imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); btst m_IR[3] >> 4 prefetch -6a307400 ffffff8f 2 bor imm3 abs32 h +6a307400 ffffff8f 2 bor imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bor m_IR[3] >> 4 prefetch -6a307480 ffffff8f 2 bior imm3 abs32 h +6a307480 ffffff8f 2 bior imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bior m_IR[3] >> 4 prefetch -6a307500 ffffff8f 2 bxor imm3 abs32 h +6a307500 ffffff8f 2 bxor imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bxor m_IR[3] >> 4 prefetch -6a307580 ffffff8f 2 bixor imm3 abs32 h +6a307580 ffffff8f 2 bixor imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bixor m_IR[3] >> 4 prefetch -6a307600 ffffff8f 2 band imm3 abs32 h +6a307600 ffffff8f 2 band imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); band m_IR[3] >> 4 prefetch -6a307680 ffffff8f 2 biand imm3 abs32 h +6a307680 ffffff8f 2 biand imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); biand m_IR[3] >> 4 prefetch -6a307700 ffffff8f 2 bld imm3 abs32 h +6a307700 ffffff8f 2 bld imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bld m_IR[3] >> 4 prefetch -6a307780 ffffff8f 2 bild imm3 abs32 h +6a307780 ffffff8f 2 bild imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); bild m_IR[3] >> 4 prefetch -6a386000 ffffff0f 2 bset r8h abs32 h +6a386000 ffffff0f 2 bset r8h abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2076,7 +2069,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a386100 ffffff0f 2 bnot r8h abs32 h +6a386100 ffffff0f 2 bnot r8h abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2084,7 +2077,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a386200 ffffff0f 2 bclr r8h abs32 h +6a386200 ffffff0f 2 bclr r8h abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2092,7 +2085,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a386700 ffffff8f 2 bst imm3 abs32 h +6a386700 ffffff8f 2 bst imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2100,7 +2093,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a386780 ffffff8f 2 bist imm3 abs32 h +6a386780 ffffff8f 2 bist imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2108,7 +2101,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a387000 ffffff8f 2 bset imm3 abs32 h +6a387000 ffffff8f 2 bset imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2116,7 +2109,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a387100 ffffff8f 2 bnot imm3 abs32 h +6a387100 ffffff8f 2 bnot imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2124,7 +2117,7 @@ write8(m_TMP2, m_TMP1); prefetch_done(); -6a387200 ffffff8f 2 bclr imm3 abs32 h +6a387200 ffffff8f 2 bclr imm3 abs32 s20 m_TMP2 = (m_IR[1] << 16) | m_IR[2]; m_TMP1 = read8(m_TMP2); prefetch_start @@ -2874,7 +2867,7 @@ m_TMP2 = 0xffffff00 | m_IR[0]; m_TMP1 = read8(m_TMP2); prefetch_start - bst m_IR[0] >> 4 + bst m_IR[1] >> 4 write8(m_TMP2, m_TMP1); prefetch_done(); @@ -2882,7 +2875,7 @@ m_TMP2 = 0xffffff00 | m_IR[0]; m_TMP1 = read8(m_TMP2); prefetch_start - bist m_IR[0] >> 4 + bist m_IR[1] >> 4 write8(m_TMP2, m_TMP1); prefetch_done(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83002.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83002.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83002.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83002.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -233,6 +233,19 @@ recompute_bcount(event_time); } +void h83002_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83002_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83002.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83002.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83002.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83002.h 2024-03-25 14:00:46.000000000 +0000 @@ -86,6 +86,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83003.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83003.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83003.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83003.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -260,6 +260,19 @@ recompute_bcount(event_time); } +void h83003_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83003_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83003.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83003.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83003.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83003.h 2024-03-25 14:00:46.000000000 +0000 @@ -96,6 +96,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83006.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83006.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83006.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83006.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -227,6 +227,22 @@ recompute_bcount(event_time); } +void h83006_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_sci[2]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer8_2->notify_standby(state); + m_timer8_3->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83006_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83006.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83006.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83006.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83006.h 2024-03-25 14:00:46.000000000 +0000 @@ -79,6 +79,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83008.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83008.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83008.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83008.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -204,6 +204,21 @@ recompute_bcount(event_time); } +void h83008_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer8_2->notify_standby(state); + m_timer8_3->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83008_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83008.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83008.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83008.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83008.h 2024-03-25 14:00:46.000000000 +0000 @@ -76,6 +76,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83032.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83032.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83032.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83032.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -228,6 +228,18 @@ recompute_bcount(event_time); } +void h83032_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83032_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83032.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83032.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83032.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83032.h 2024-03-25 14:00:46.000000000 +0000 @@ -86,6 +86,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83042.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83042.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83042.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83042.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -263,6 +263,19 @@ recompute_bcount(event_time); } +void h83042_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83042_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83042.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83042.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83042.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83042.h 2024-03-25 14:00:46.000000000 +0000 @@ -94,6 +94,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83048.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83048.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83048.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83048.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -268,6 +268,19 @@ recompute_bcount(event_time); } +void h83048_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83048_device::device_start() { h8h_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83048.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83048.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83048.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83048.h 2024-03-25 14:00:46.000000000 +0000 @@ -98,6 +98,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83217.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83217.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83217.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83217.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,280 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, hap +/*************************************************************************** + + h83217.cpp + + H8/3217 family emulation + + TODO: + - H8/3212 and H8/3202 have less internal modules + - PWM timer module + - Host Interface module + - optional I2C bus module + - keyboard matrix interrupt + - TCONR @ 0xff9f (timer connection) + - SEDGR @ 0xffa8 (edge sense) + - WSCR @ 0xffc2 (waitstate control) + - finish STCR emulation + - finish SYSCR emulation + +***************************************************************************/ + +#include "emu.h" +#include "h83217.h" + +DEFINE_DEVICE_TYPE(H83217, h83217_device, "h83217", "Hitachi H8/3217") +DEFINE_DEVICE_TYPE(H83216, h83216_device, "h83216", "Hitachi H8/3216") +DEFINE_DEVICE_TYPE(H83214, h83214_device, "h83214", "Hitachi H8/3214") +DEFINE_DEVICE_TYPE(H83212, h83212_device, "h83212", "Hitachi H8/3212") +DEFINE_DEVICE_TYPE(H83202, h83202_device, "h83202", "Hitachi H8/3202") + + +h83217_device::h83217_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size) : + h8_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(h83217_device::map), this)), + m_intc(*this, "intc"), + m_port(*this, "port%u", 1), + m_timer8(*this, "timer8_%u", 0), + m_timer16(*this, "timer16"), + m_timer16_0(*this, "timer16:0"), + m_watchdog(*this, "watchdog"), + m_ram_view(*this, "ram_view"), + m_rom_size(rom_size), + m_ram_size(ram_size), + m_md(3) +{ +} + +h83217_device::h83217_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h83217_device(mconfig, H83217, tag, owner, clock, 0xf000, 0x800) +{ +} + +h83216_device::h83216_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h83217_device(mconfig, H83216, tag, owner, clock, 0xc000, 0x800) +{ +} + +h83214_device::h83214_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h83217_device(mconfig, H83214, tag, owner, clock, 0x8000, 0x400) +{ +} + +h83212_device::h83212_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h83217_device(mconfig, H83212, tag, owner, clock, 0x4000, 0x200) +{ +} + +h83202_device::h83202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h83217_device(mconfig, H83202, tag, owner, clock, 0x4000, 0x200) +{ +} + +void h83217_device::map(address_map &map) +{ + if(m_md >= 2) + map(0x0000, m_rom_size - 1).rom(); + + map(0xff80 - m_ram_size, 0xff7f).view(m_ram_view); + m_ram_view[0](0xff80 - m_ram_size, 0xff7f).ram().share(m_internal_ram); + + map(0xff90, 0xff90).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::tcr_r), FUNC(h8325_timer16_channel_device::tcr_w)); + map(0xff91, 0xff91).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::tsr_r), FUNC(h8325_timer16_channel_device::tsr_w)); + map(0xff92, 0xff93).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::tcnt_r), FUNC(h8325_timer16_channel_device::tcnt_w)); + map(0xff94, 0xff95).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::ocra_r), FUNC(h8325_timer16_channel_device::ocra_w)); + map(0xff96, 0xff97).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::ocrb_r), FUNC(h8325_timer16_channel_device::ocrb_w)); + map(0xff98, 0xff99).r(m_timer16_0, FUNC(h8325_timer16_channel_device::icr_r)); + + map(0xff9a, 0xff9a).rw(m_timer8[2], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); + map(0xff9b, 0xff9b).rw(m_timer8[2], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); + map(0xff9c, 0xff9d).rw(m_timer8[2], FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)); + map(0xff9e, 0xff9e).rw(m_timer8[2], FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); + + map(0xffaa, 0xffab).rw(m_watchdog, FUNC(h8_watchdog_device::wd_r), FUNC(h8_watchdog_device::wd_w)); + + map(0xffac, 0xffac).rw(m_port[0], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffad, 0xffad).rw(m_port[1], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffae, 0xffae).rw(m_port[2], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffb0, 0xffb0).w(m_port[0], FUNC(h8_port_device::ddr_w)); + map(0xffb1, 0xffb1).w(m_port[1], FUNC(h8_port_device::ddr_w)); + map(0xffb2, 0xffb2).rw(m_port[0], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffb3, 0xffb3).rw(m_port[1], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffb4, 0xffb4).w(m_port[2], FUNC(h8_port_device::ddr_w)); + map(0xffb5, 0xffb5).w(m_port[3], FUNC(h8_port_device::ddr_w)); + map(0xffb6, 0xffb6).rw(m_port[2], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffb7, 0xffb7).rw(m_port[3], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffb8, 0xffb8).w(m_port[4], FUNC(h8_port_device::ddr_w)); + map(0xffb9, 0xffb9).w(m_port[5], FUNC(h8_port_device::ddr_w)); + map(0xffba, 0xffba).rw(m_port[4], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffbb, 0xffbb).rw(m_port[5], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + map(0xffbc, 0xffbc).w(m_port[6], FUNC(h8_port_device::ddr_w)); + map(0xffbe, 0xffbe).rw(m_port[6], FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w)); + + map(0xffc3, 0xffc3).rw(FUNC(h83217_device::stcr_r), FUNC(h83217_device::stcr_w)); + map(0xffc4, 0xffc4).rw(FUNC(h83217_device::syscr_r), FUNC(h83217_device::syscr_w)); + map(0xffc5, 0xffc5).r(FUNC(h83217_device::mdcr_r)); + map(0xffc6, 0xffc6).lr8(NAME([this]() { return m_intc->iscr_r() | ~0x47; })); + map(0xffc6, 0xffc6).lw8(NAME([this](u8 data) { m_intc->iscr_w(data & 0x47); })); + map(0xffc7, 0xffc7).lr8(NAME([this]() { return m_intc->ier_r() | ~0x47; })); + map(0xffc7, 0xffc7).lw8(NAME([this](u8 data) { m_intc->ier_w(data & 0x47); })); + + map(0xffc8, 0xffc8).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); + map(0xffc9, 0xffc9).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); + map(0xffca, 0xffcb).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)); + map(0xffcc, 0xffcc).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); + map(0xffd0, 0xffd0).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); + map(0xffd1, 0xffd1).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); + map(0xffd2, 0xffd3).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)); + map(0xffd4, 0xffd4).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); + + map(0xffd8, 0xffd8).rw(m_sci[0], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffd9, 0xffd9).rw(m_sci[0], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffda, 0xffda).rw(m_sci[0], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffdb, 0xffdb).rw(m_sci[0], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffdc, 0xffdc).rw(m_sci[0], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffdd, 0xffdd).r(m_sci[0], FUNC(h8_sci_device::rdr_r)); + map(0xffe0, 0xffe0).rw(m_sci[1], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffe1, 0xffe1).rw(m_sci[1], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffe2, 0xffe2).rw(m_sci[1], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffe3, 0xffe3).rw(m_sci[1], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffe4, 0xffe4).rw(m_sci[1], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffe5, 0xffe5).r(m_sci[1], FUNC(h8_sci_device::rdr_r)); +} + +void h83217_device::device_add_mconfig(machine_config &config) +{ + H8_INTC(config, m_intc, *this); + H8_PORT(config, m_port[0], *this, h8_device::PORT_1, 0x00, 0x00); + H8_PORT(config, m_port[1], *this, h8_device::PORT_2, 0x00, 0x00); + H8_PORT(config, m_port[2], *this, h8_device::PORT_3, 0x00, 0x00); + H8_PORT(config, m_port[3], *this, h8_device::PORT_4, 0x00, 0x00); + H8_PORT(config, m_port[4], *this, h8_device::PORT_5, 0x00, 0xc0); + H8_PORT(config, m_port[5], *this, h8_device::PORT_6, 0x00, 0x80); + H8_PORT(config, m_port[6], *this, h8_device::PORT_7, 0x00, 0x00); + H8_TIMER8_CHANNEL(config, m_timer8[0], *this, m_intc, 23, 24, 25, 8, 2, 64, 32, 1024, 256); + H8_TIMER8_CHANNEL(config, m_timer8[1], *this, m_intc, 26, 27, 28, 8, 2, 64, 128, 1024, 2048); + H8_TIMER8_CHANNEL(config, m_timer8[2], *this, m_intc, 47, 48, 49, 1, 1, 2, 2, 512, 512); + H8_TIMER16(config, m_timer16, *this, 1, 0xff); + H8325_TIMER16_CHANNEL(config, m_timer16_0, *this, m_intc, 19); + H8_SCI(config, m_sci[0], 0, *this, m_intc, 29, 30, 31, 32); + H8_SCI(config, m_sci[1], 1, *this, m_intc, 33, 34, 35, 36); + H8_WATCHDOG(config, m_watchdog, *this, m_intc, 44, h8_watchdog_device::B); +} + +void h83217_device::execute_set_input(int inputnum, int state) +{ + m_intc->set_input(inputnum, state); +} + +void h83217_device::irq_setup() +{ + m_CCR |= F_I; +} + +void h83217_device::update_irq_filter() +{ + if(m_CCR & F_I) + m_intc->set_filter(2, -1); + else + m_intc->set_filter(0, -1); +} + +void h83217_device::interrupt_taken() +{ + standard_irq_callback(m_intc->interrupt_taken(m_taken_irq_vector), m_NPC); +} + +void h83217_device::internal_update(u64 current_time) +{ + u64 event_time = 0; + + add_event(event_time, m_sci[0]->internal_update(current_time)); + add_event(event_time, m_sci[1]->internal_update(current_time)); + add_event(event_time, m_timer8[0]->internal_update(current_time)); + add_event(event_time, m_timer8[1]->internal_update(current_time)); + add_event(event_time, m_timer8[2]->internal_update(current_time)); + add_event(event_time, m_timer16_0->internal_update(current_time)); + add_event(event_time, m_watchdog->internal_update(current_time)); + + recompute_bcount(event_time); +} + +void h83217_device::notify_standby(int state) +{ + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + + for (auto & timer8 : m_timer8) + timer8->notify_standby(state); + + m_timer16_0->notify_standby(state); + m_watchdog->notify_standby(state); +} + +void h83217_device::device_start() +{ + h8_device::device_start(); + + m_stcr = 0; + m_syscr = 0; + + save_item(NAME(m_md)); + save_item(NAME(m_stcr)); + save_item(NAME(m_syscr)); +} + +void h83217_device::device_reset() +{ + h8_device::device_reset(); + + m_stcr = 0x00; + m_syscr = 0x09; + m_ram_view.select(0); +} + +u8 h83217_device::stcr_r() +{ + return m_stcr; +} + +void h83217_device::stcr_w(u8 data) +{ + logerror("stcr = %02x\n", data); + + // ICKS0/1 + m_timer8[0]->set_extra_clock_bit(BIT(data, 0)); + m_timer8[1]->set_extra_clock_bit(BIT(data, 1)); + + m_stcr = data; +} + +u8 h83217_device::syscr_r() +{ + return m_syscr; +} + +void h83217_device::syscr_w(u8 data) +{ + logerror("syscr = %02x\n", data); + + // RAME + if(data & 1) + m_ram_view.select(0); + else + m_ram_view.disable(); + + // NMIEG + m_intc->set_nmi_edge(BIT(data, 2)); + + // SSBY + m_standby_pending = bool(data & 0x80); + + m_syscr = (m_syscr & 0x08) | (data & 0xf7); +} + +u8 h83217_device::mdcr_r() +{ + if(!machine().side_effects_disabled()) + logerror("mdcr_r\n"); + return (m_md & 0x03) | 0xe4; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83217.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83217.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83217.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83217.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,120 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, hap +/*************************************************************************** + + h83217.h + + H8/3217 family emulation + + H8-300-based mcus. + + Variant ROM RAM + H8/3217 60K 2K + H8/3216 48K 2K + H8/3214 32K 1K + H8/3212 16K 512B + H8/3202 16K 512B + +***************************************************************************/ + +#ifndef MAME_CPU_H8_H83217_H +#define MAME_CPU_H8_H83217_H + +#pragma once + +#include "h8.h" + +#include "h8_intc.h" +#include "h8_port.h" +#include "h8_timer8.h" +#include "h8_timer16.h" +#include "h8_sci.h" +#include "h8_watchdog.h" + +class h83217_device : public h8_device { +public: + h83217_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // I/O ports + auto read_port1() { return m_read_port [PORT_1].bind(); } + auto write_port1() { return m_write_port[PORT_1].bind(); } + auto read_port2() { return m_read_port [PORT_2].bind(); } + auto write_port2() { return m_write_port[PORT_2].bind(); } + auto read_port3() { return m_read_port [PORT_3].bind(); } + auto write_port3() { return m_write_port[PORT_3].bind(); } + auto read_port4() { return m_read_port [PORT_4].bind(); } + auto write_port4() { return m_write_port[PORT_4].bind(); } + auto read_port5() { return m_read_port [PORT_5].bind(); } + auto write_port5() { return m_write_port[PORT_5].bind(); } + auto read_port6() { return m_read_port [PORT_6].bind(); } + auto write_port6() { return m_write_port[PORT_6].bind(); } + auto read_port7() { return m_read_port [PORT_7].bind(); } + auto write_port7() { return m_write_port[PORT_7].bind(); } + + // MD pins, default mode 3 (single chip) + void set_mode(u8 mode) { m_md = mode & 3; } + + u8 stcr_r(); + void stcr_w(u8 data); + u8 syscr_r(); + void syscr_w(u8 data); + u8 mdcr_r(); + +protected: + h83217_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size); + + required_device m_intc; + required_device_array m_port; + required_device_array m_timer8; + required_device m_timer16; + required_device m_timer16_0; + required_device m_watchdog; + + memory_view m_ram_view; + + u32 m_rom_size; + u32 m_ram_size; + u8 m_md; + u8 m_stcr; + u8 m_syscr; + + virtual void update_irq_filter() override; + virtual void interrupt_taken() override; + virtual void irq_setup() override; + virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; + virtual void device_add_mconfig(machine_config &config) override; + void map(address_map &map); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void execute_set_input(int inputnum, int state) override; +}; + +class h83216_device : public h83217_device { +public: + h83216_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h83214_device : public h83217_device { +public: + h83214_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h83212_device : public h83217_device { +public: + h83212_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h83202_device : public h83217_device { +public: + h83202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +DECLARE_DEVICE_TYPE(H83217, h83217_device) +DECLARE_DEVICE_TYPE(H83216, h83216_device) +DECLARE_DEVICE_TYPE(H83214, h83214_device) +DECLARE_DEVICE_TYPE(H83212, h83212_device) +DECLARE_DEVICE_TYPE(H83202, h83202_device) + +#endif // MAME_CPU_H8_H83217_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8325.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8325.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8325.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8325.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,8 +9,8 @@ TODO: - serial controllers are slightly different, has 3 interrupt sources instead of 4 - - HCSR register @ 0xfffe (port 3 handshake) - - FNCR register @ 0xffff (16-bit timer noise canceler) + - HCSR @ 0xfffe (port 3 handshake) + - FNCR @ 0xffff (16-bit timer noise canceler) ***************************************************************************/ @@ -25,7 +25,7 @@ DEFINE_DEVICE_TYPE(H8322, h8322_device, "h8322", "Hitachi H8/322") -h8325_device::h8325_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 start) : +h8325_device::h8325_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size) : h8_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(h8325_device::map), this)), m_intc(*this, "intc"), m_port(*this, "port%u", 1), @@ -33,45 +33,49 @@ m_timer16(*this, "timer16"), m_timer16_0(*this, "timer16:0"), m_ram_view(*this, "ram_view"), - m_ram_start(start), + m_rom_size(rom_size), + m_ram_size(ram_size), m_md(3) { } h83257_device::h83257_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H83257, tag, owner, clock, 0xf780) + h8325_device(mconfig, H83257, tag, owner, clock, 0xf000, 0x800) { } h83256_device::h83256_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H83256, tag, owner, clock, 0xf780) + h8325_device(mconfig, H83256, tag, owner, clock, 0xc000, 0x800) { } h8325_device::h8325_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H8325, tag, owner, clock, 0xfb80) + h8325_device(mconfig, H8325, tag, owner, clock, 0x8000, 0x400) { } h8324_device::h8324_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H8324, tag, owner, clock, 0xfb80) + h8325_device(mconfig, H8324, tag, owner, clock, 0x6000, 0x400) { } h8323_device::h8323_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H8323, tag, owner, clock, 0xfd80) + h8325_device(mconfig, H8323, tag, owner, clock, 0x4000, 0x200) { } h8322_device::h8322_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8325_device(mconfig, H8322, tag, owner, clock, 0xfe80) + h8325_device(mconfig, H8322, tag, owner, clock, 0x2000, 0x100) { } void h8325_device::map(address_map &map) { - map(m_ram_start, 0xff7f).view(m_ram_view); - m_ram_view[0](m_ram_start, 0xff7f).ram().share(m_internal_ram); + if(m_md >= 2) + map(0x0000, m_rom_size - 1).rom(); + + map(0xff80 - m_ram_size, 0xff7f).view(m_ram_view); + m_ram_view[0](0xff80 - m_ram_size, 0xff7f).ram().share(m_internal_ram); map(0xff90, 0xff90).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::tcr_r), FUNC(h8325_timer16_channel_device::tcr_w)); map(0xff91, 0xff91).rw(m_timer16_0, FUNC(h8325_timer16_channel_device::tsr_r), FUNC(h8325_timer16_channel_device::tsr_w)); @@ -97,8 +101,10 @@ map(0xffc4, 0xffc4).rw(FUNC(h8325_device::syscr_r), FUNC(h8325_device::syscr_w)); map(0xffc5, 0xffc5).r(FUNC(h8325_device::mdcr_r)); - map(0xffc6, 0xffc6).rw(m_intc, FUNC(h8325_intc_device::iscr_r), FUNC(h8325_intc_device::iscr_w)); - map(0xffc7, 0xffc7).rw(m_intc, FUNC(h8325_intc_device::ier_r), FUNC(h8325_intc_device::ier_w)); + map(0xffc6, 0xffc6).lr8(NAME([this]() { return m_intc->iscr_r() | ~0x77; })); + map(0xffc6, 0xffc6).lw8(NAME([this](u8 data) { m_intc->iscr_w(data & 0x77); })); + map(0xffc7, 0xffc7).lr8(NAME([this]() { return m_intc->ier_r() | ~0x07; })); + map(0xffc7, 0xffc7).lw8(NAME([this](u8 data) { m_intc->ier_w(data & 0x07); })); map(0xffc8, 0xffc8).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); map(0xffc9, 0xffc9).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); @@ -177,6 +183,15 @@ recompute_bcount(event_time); } +void h8325_device::notify_standby(int state) +{ + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer8[0]->notify_standby(state); + m_timer8[1]->notify_standby(state); + m_timer16_0->notify_standby(state); +} + void h8325_device::device_start() { h8_device::device_start(); @@ -197,7 +212,7 @@ m_ram_view.select(0); // MD pins are latched at reset - m_mds = m_md & 3; + m_mds = m_md; } u8 h8325_device::syscr_r() @@ -210,7 +225,7 @@ logerror("syscr = %02x\n", data); // RAME - if (data & 1) + if(data & 1) m_ram_view.select(0); else m_ram_view.disable(); @@ -228,5 +243,5 @@ { if(!machine().side_effects_disabled()) logerror("mdcr_r\n"); - return m_mds | 0xe4; + return (m_mds & 0x03) | 0xe4; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8325.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8325.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8325.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8325.h 2024-03-25 14:00:46.000000000 +0000 @@ -8,7 +8,7 @@ H8-300-based mcus. - Variant ROM RAM + Variant ROM RAM H8/3257 60K 2K H8/3256 48K 2K H8/325 32K 1K @@ -24,6 +24,7 @@ #pragma once #include "h8.h" + #include "h8_intc.h" #include "h8_port.h" #include "h8_timer8.h" @@ -51,14 +52,14 @@ auto write_port7() { return m_write_port[PORT_7].bind(); } // MD pins, default mode 3 (single chip) - void set_mode(u8 mode) { m_md = mode; } + void set_mode(u8 mode) { m_md = mode & 3; } u8 syscr_r(); void syscr_w(u8 data); u8 mdcr_r(); protected: - h8325_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 start); + h8325_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size); virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 2 - 1) / 2; } virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); } @@ -71,7 +72,8 @@ memory_view m_ram_view; - u32 m_ram_start; + u32 m_rom_size; + u32 m_ram_size; u8 m_md; u8 m_mds; u8 m_syscr; @@ -80,6 +82,7 @@ virtual void interrupt_taken() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83337.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h83337.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83337.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83337.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,7 +7,12 @@ H8-3337 family emulation TODO: - - 16-bit timer module is different + - 16-bit timer module is different from how it's implemented in h8_timer16.cpp + - PWM timer module + - Host Interface module + - finish WSCR emulation, CKDBL flag would need support in peripherals + - finish STCR emulation + - finish SYSCR emulation ***************************************************************************/ @@ -37,7 +42,6 @@ m_timer16(*this, "timer16"), m_timer16_0(*this, "timer16:0"), m_watchdog(*this, "watchdog"), - m_syscr(0), m_ram_start(start) { } @@ -189,15 +193,36 @@ recompute_bcount(event_time); } +void h83337_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer16_0->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h83337_device::device_start() { h8_device::device_start(); + + m_wscr = 0; + m_stcr = 0; + m_syscr = 0; + + save_item(NAME(m_wscr)); + save_item(NAME(m_stcr)); save_item(NAME(m_syscr)); } void h83337_device::device_reset() { h8_device::device_reset(); + + m_wscr = 0x08; + m_stcr = 0x00; m_syscr = 0x09; } @@ -208,30 +233,35 @@ void h83337_device::syscr_w(u8 data) { - m_syscr = data; logerror("syscr = %02x\n", data); + m_syscr = (m_syscr & 0x08) | (data & 0xf7); } u8 h83337_device::wscr_r() { - return 0x00; + return m_wscr; } void h83337_device::wscr_w(u8 data) { logerror("wscr = %02x\n", data); + m_wscr = data; } u8 h83337_device::stcr_r() { - return 0x00; + return m_stcr; } void h83337_device::stcr_w(u8 data) { logerror("stcr = %02x\n", data); - m_timer8_0->set_extra_clock_bit(data & 0x01); - m_timer8_1->set_extra_clock_bit(data & 0x02); + + // ICKS0/1 + m_timer8_0->set_extra_clock_bit(BIT(data, 0)); + m_timer8_1->set_extra_clock_bit(BIT(data, 1)); + + m_stcr = data; } u8 h83337_device::mdcr_r() diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h83337.h mame-0.264+dfsg.1/src/devices/cpu/h8/h83337.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h83337.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h83337.h 2024-03-25 14:00:46.000000000 +0000 @@ -23,6 +23,7 @@ #pragma once #include "h8.h" + #include "h8_intc.h" #include "h8_adc.h" #include "h8_port.h" @@ -82,13 +83,16 @@ required_device m_timer16_0; required_device m_watchdog; - u8 m_syscr; u32 m_ram_start; + u8 m_wscr; + u8 m_stcr; + u8 m_syscr; virtual void update_irq_filter() override; virtual void interrupt_taken() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_adc.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_adc.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_adc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_adc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,7 +11,7 @@ DEFINE_DEVICE_TYPE(H8_ADC_3337, h8_adc_3337_device, "h8_adc_3337", "H8/3337 ADC") DEFINE_DEVICE_TYPE(H8_ADC_3006, h8_adc_3006_device, "h8_adc_3006", "H8/3006 ADC") DEFINE_DEVICE_TYPE(H8_ADC_2245, h8_adc_2245_device, "h8_adc_2245", "H8/2245 ADC") -DEFINE_DEVICE_TYPE(H8_ADC_2320, h8_adc_2320_device, "h8_adc_2320", "H8/2320 ADC") +DEFINE_DEVICE_TYPE(H8_ADC_2319, h8_adc_2319_device, "h8_adc_2319", "H8/2319 ADC") DEFINE_DEVICE_TYPE(H8_ADC_2357, h8_adc_2357_device, "h8_adc_2357", "H8/2357 ADC") DEFINE_DEVICE_TYPE(H8_ADC_2655, h8_adc_2655_device, "h8_adc_2655", "H8/2655 ADC") @@ -110,8 +110,8 @@ save_item(NAME(m_channel)); save_item(NAME(m_count)); save_item(NAME(m_analog_powered)); - save_item(NAME(m_next_event)); save_item(NAME(m_adtrg)); + save_item(NAME(m_next_event)); } void h8_adc_device::device_reset() @@ -149,6 +149,12 @@ return m_next_event; } +void h8_adc_device::notify_standby(int state) +{ + if(!state && m_next_event) + m_next_event += m_cpu->total_cycles() - m_cpu->standby_time(); +} + void h8_adc_device::conversion_wait(bool first, bool poweron, u64 current_time) { if(current_time) @@ -358,29 +364,29 @@ } -h8_adc_2320_device::h8_adc_2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8_adc_device(mconfig, H8_ADC_2320, tag, owner, clock) +h8_adc_2319_device::h8_adc_2319_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8_adc_device(mconfig, H8_ADC_2319, tag, owner, clock) { m_register_mask = 3; } -int h8_adc_2320_device::conversion_time(bool first, bool poweron) +int h8_adc_2319_device::conversion_time(bool first, bool poweron) { int tm; if(first) - if(m_adcr & 0x04) + if(m_adcr & 0x08) tm = m_adcsr & 0x08 ? 134 : 266; else - tm = m_adcsr & 0x08 ? 68 : 580; + tm = m_adcsr & 0x08 ? 68 : 530; else - if(m_adcr & 0x04) + if(m_adcr & 0x08) tm = m_adcsr & 0x08 ? 128 : 256; else tm = m_adcsr & 0x08 ? 64 : 512; return tm; } -void h8_adc_2320_device::mode_update() +void h8_adc_2319_device::mode_update() { m_trigger = 1 << ((m_adcr >> 6) & 3); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_adc.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_adc.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_adc.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_adc.h 2024-03-25 14:00:46.000000000 +0000 @@ -19,7 +19,11 @@ class h8_adc_device : public device_t { public: - template void set_info(T &&cpu, U &&intc, int vect) { m_cpu.set_tag(std::forward(cpu)), m_intc.set_tag(std::forward(intc)); m_intc_vector = vect; } + template void set_info(T &&cpu, U &&intc, int vect) { + m_cpu.set_tag(std::forward(cpu)); + m_intc.set_tag(std::forward(intc)); + m_intc_vector = vect; + } u8 addr8_r(offs_t offset); u16 addr16_r(offs_t offset); @@ -31,6 +35,7 @@ void set_suspend(bool suspend); u64 internal_update(u64 current_time); + void notify_standby(int state); protected: h8_adc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); @@ -131,11 +136,11 @@ virtual void mode_update() override; }; -class h8_adc_2320_device : public h8_adc_device { +class h8_adc_2319_device : public h8_adc_device { public: - h8_adc_2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - template h8_adc_2320_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu, U &&intc, int vect) - : h8_adc_2320_device(mconfig, tag, owner, 0) + h8_adc_2319_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + template h8_adc_2319_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu, U &&intc, int vect) + : h8_adc_2319_device(mconfig, tag, owner, 0) { set_info(cpu, intc, vect); } @@ -178,7 +183,7 @@ DECLARE_DEVICE_TYPE(H8_ADC_3337, h8_adc_3337_device) DECLARE_DEVICE_TYPE(H8_ADC_3006, h8_adc_3006_device) DECLARE_DEVICE_TYPE(H8_ADC_2245, h8_adc_2245_device) -DECLARE_DEVICE_TYPE(H8_ADC_2320, h8_adc_2320_device) +DECLARE_DEVICE_TYPE(H8_ADC_2319, h8_adc_2319_device) DECLARE_DEVICE_TYPE(H8_ADC_2357, h8_adc_2357_device) DECLARE_DEVICE_TYPE(H8_ADC_2655, h8_adc_2655_device) diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dma.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dma.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dma.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dma.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -87,10 +87,8 @@ - // DMA channel, common code - h8gen_dma_channel_device::h8gen_dma_channel_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, type, tag, owner, clock), m_cpu(*this, finder_base::DUMMY_TAG), @@ -105,9 +103,11 @@ save_item(STRUCT_MEMBER(m_state, m_incs)); save_item(STRUCT_MEMBER(m_state, m_incd)); save_item(STRUCT_MEMBER(m_state, m_count)); + save_item(STRUCT_MEMBER(m_state, m_bcount)); save_item(STRUCT_MEMBER(m_state, m_flags)); save_item(STRUCT_MEMBER(m_state, m_id)); save_item(STRUCT_MEMBER(m_state, m_trigger_vector)); + save_item(NAME(m_mar)); save_item(NAME(m_ioar)); save_item(NAME(m_etcr)); @@ -143,7 +143,6 @@ m_dreq = state; // Only subchannel B/1 can react to dreq. - if(m_dreq) { if(((m_state[1].m_flags & (h8_dma_state::ACTIVE|h8_dma_state::SUSPENDED)) == (h8_dma_state::ACTIVE|h8_dma_state::SUSPENDED)) && (m_state[1].m_trigger_vector == DREQ_LEVEL || m_state[1].m_trigger_vector == DREQ_EDGE)) { m_state[1].m_flags &= ~h8_dma_state::SUSPENDED; @@ -359,7 +358,7 @@ m_state[submodule].m_source = m_mar[0]; m_state[submodule].m_count = m_etcr[0] & 0xff00 ? m_etcr[0] >> 8 : 0x100; - m_state[submodule].m_bcount --; + m_state[submodule].m_bcount--; if(m_state[submodule].m_bcount == 1) m_state[submodule].m_flags &= ~h8_dma_state::BLOCK; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dma.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dma.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dma.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dma.h 2024-03-25 14:00:46.000000000 +0000 @@ -133,7 +133,6 @@ - class h8gen_dma_channel_device : public device_t { public: enum { diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dtc.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dtc.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_dtc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_dtc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,6 +39,19 @@ void h8_dtc_device::device_start() { // TODO, probably need to kill the vectors + save_item(STRUCT_MEMBER(m_states, m_base)); + save_item(STRUCT_MEMBER(m_states, m_sra)); + save_item(STRUCT_MEMBER(m_states, m_dar)); + save_item(STRUCT_MEMBER(m_states, m_cr)); + save_item(STRUCT_MEMBER(m_states, m_incs)); + save_item(STRUCT_MEMBER(m_states, m_incd)); + save_item(STRUCT_MEMBER(m_states, m_count)); + save_item(STRUCT_MEMBER(m_states, m_id)); + save_item(STRUCT_MEMBER(m_states, m_next)); + + save_item(NAME(m_dtcer)); + save_item(NAME(m_dtvecr)); + save_item(NAME(m_cur_active_vector)); } void h8_dtc_device::device_reset() diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_intc.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_intc.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_intc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_intc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -51,7 +51,7 @@ void h8_intc_device::device_reset() { - memset(m_irq_type, 0, sizeof(m_irq_type)); + memset(m_irq_type, 0, sizeof(m_irq_type)); // LEVEL_LOW m_nmi_type = EDGE_FALL; memset(m_pending_irqs, 0, sizeof(m_pending_irqs)); m_iscr = 0x0000; @@ -98,31 +98,33 @@ default: assert(0); break; } m_nmi_input = state == ASSERT_LINE; - if(set) { + if(set && machine().time() > attotime::zero) { m_pending_irqs[0] |= 1 << m_irq_vector_nmi; update_irq_state(); } } else { bool set = false; - bool cur = m_irq_input & (1 << inputnum); + u8 mask = 1 << inputnum; + u8 cur = m_irq_input & mask; switch(m_irq_type[inputnum]) { - case LEVEL_LOW: set = state == ASSERT_LINE; break; + case LEVEL_LOW: + set = state == ASSERT_LINE; + // on base H8, level-triggered IRQ is not latched + if(!set && !m_has_isr) + m_isr &= ~mask; + break; case EDGE_FALL: set = state == ASSERT_LINE && !cur; break; case EDGE_RISE: set = state == CLEAR_LINE && cur; break; case EDGE_DUAL: set = bool(state) != bool(cur); break; } if(state == ASSERT_LINE) - m_irq_input |= 1 << inputnum; + m_irq_input |= mask; else - m_irq_input &= ~(1 << inputnum); + m_irq_input &= ~mask; if(set) { - m_isr |= 1 << inputnum; + m_isr |= mask; update_irq_state(); } - if(!m_has_isr) { - m_isr = 0; - check_level_irqs(!set); - } } } @@ -148,7 +150,7 @@ void h8_intc_device::check_level_irqs(bool update) { bool set = false; - for(int i=0; i> i) & 1) { case 0: m_irq_type[i] = LEVEL_LOW; break; case 1: + if(!m_has_isr && m_irq_type[i] == LEVEL_LOW) + m_isr &= ~(1 << i); m_irq_type[i] = EDGE_FALL; break; } @@ -189,7 +193,7 @@ void h8_intc_device::update_irq_state() { if(m_irq_vector_count > 0) { - const unsigned mask = (1 << m_irq_vector_count) - 1; + const u32 mask = (1 << m_irq_vector_count) - 1; m_pending_irqs[0] &= ~(mask << m_irq_vector_base); m_pending_irqs[0] |= (m_isr & m_ier & mask) << m_irq_vector_base; @@ -198,10 +202,10 @@ int cur_vector = 0; int cur_level = -1; - for(int i=0; i(m_iscr >> i,0,4)) { case 0: case 1: m_irq_type[i] = LEVEL_LOW; @@ -249,6 +254,9 @@ m_irq_type[i] = EDGE_RISE; break; } + if(type == LEVEL_LOW && m_irq_type[i] != LEVEL_LOW) + m_isr &= ~(1 << i); + } check_level_irqs(true); } @@ -305,16 +313,6 @@ logerror("icr %d = %02x\n", offset, data); } -u8 h8h_intc_device::icrc_r() -{ - return icr_r(2); -} - -void h8h_intc_device::icrc_w(u8 data) -{ - icr_w(2, data); -} - const int h8h_intc_device::vector_to_slot[64] = { -1, -1, -1, -1, -1, -1, -1, -1, // NMI at 7 -1, -1, -1, -1, 0, 1, 2, 2, // IRQ 0-3 @@ -354,6 +352,12 @@ m_irq_vector_nmi = 7; } +void h8s_intc_device::device_start() +{ + h8h_intc_device::device_start(); + save_item(NAME(m_ipr)); +} + void h8s_intc_device::device_reset() { h8h_intc_device::device_reset(); @@ -371,16 +375,6 @@ logerror("ipr %d = %02x\n", offset, data); } -u8 h8s_intc_device::iprk_r() -{ - return ipr_r(10); -} - -void h8s_intc_device::iprk_w(u8 data) -{ - ipr_w(10, data); -} - u8 h8s_intc_device::iscrh_r() { return m_iscr >> 8; @@ -407,7 +401,7 @@ void h8s_intc_device::update_irq_types() { - for(int i=0; i> (2*i)) & 3) { case 0: m_irq_type[i] = LEVEL_LOW; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_intc.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_intc.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_intc.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_intc.h 2024-03-25 14:00:46.000000000 +0000 @@ -98,8 +98,6 @@ void isr_w(u8 data); u8 icr_r(offs_t offset); void icr_w(offs_t offset, u8 data); - u8 icrc_r(); - void icrc_w(u8 data); protected: static const int vector_to_slot[]; @@ -125,8 +123,6 @@ u8 ipr_r(offs_t offset); void ipr_w(offs_t offset, u8 data); - u8 iprk_r(); - void iprk_w(u8 data); u8 iscrh_r(); void iscrh_w(u8 data); u8 iscrl_r(); @@ -136,9 +132,11 @@ static const int vector_to_slot[]; u8 m_ipr[11]; + virtual void device_start() override; + virtual void device_reset() override; + virtual void get_priority(int vect, int &icr_pri, int &ipr_pri) const override; virtual void update_irq_types() override; - virtual void device_reset() override; }; class gt913_intc_device : public h8_intc_device { diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_port.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_port.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_port.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_port.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -26,7 +26,7 @@ void h8_port_device::ddr_w(u8 data) { - // logerror("ddr_w %02x\n", data); + //logerror("ddr_w %02x\n", data); m_ddr = data; update_output(); } @@ -38,14 +38,14 @@ void h8_port_device::dr_w(u8 data) { - // logerror("dr_w %02x\n", data); + //logerror("dr_w %02x\n", data); m_dr = data; update_output(); } u8 h8_port_device::dr_r() { - // logerror("dr_r %02x\n", (dr | mask) & 0xff); + //logerror("dr_r %02x\n", (dr | mask) & 0xff); return m_dr | m_mask; } @@ -55,7 +55,7 @@ if((m_ddr & ~m_mask) != u8(~m_mask)) res |= m_cpu->do_read_port(m_address) & ~m_ddr; - // logerror("port_r %02x (%02x %02x)\n", res, ddr & ~mask, u8(~mask)); + //logerror("port_r %02x (%02x %02x)\n", res, ddr & ~mask, u8(~mask)); return res; } @@ -85,7 +85,7 @@ void h8_port_device::update_output() { - u8 data = m_dr & m_ddr & ~m_mask; + u8 data = (m_dr | ~m_ddr) & ~m_mask; u8 ddr = m_ddr & ~m_mask; // 0-bits = hi-z u16 res = ddr << 8 | data; @@ -98,9 +98,9 @@ void h8_port_device::device_start() { save_item(NAME(m_ddr)); - save_item(NAME(m_dr)); save_item(NAME(m_pcr)); save_item(NAME(m_odr)); + save_item(NAME(m_dr)); save_item(NAME(m_last_output)); m_last_output = -1; @@ -117,26 +117,18 @@ bool h8_port_device::nvram_write(util::write_stream &file) { - size_t actual; - u8 buf[4]; - - buf[0] = m_ddr; - buf[1] = m_dr; - buf[2] = m_pcr; - buf[3] = m_odr; - - if(file.write(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) - return false; + u8 const buf[4]{ m_ddr, m_dr, m_pcr, m_odr }; - return true; + auto const [err, actual] = write(file, buf, sizeof(buf)); + return !err; } bool h8_port_device::nvram_read(util::read_stream &file) { - size_t actual; u8 buf[4]; - if(file.read(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + auto const [err, actual] = read(file, buf, sizeof(buf)); + if(err || (sizeof(buf) != actual)) return false; m_ddr = buf[0]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_sci.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_sci.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_sci.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_sci.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,16 +7,60 @@ #include "h8.h" #include "h8_intc.h" -// Verbosity level -// 0 = no messages -// 1 = transmitted/received bytes, reception errors and clock setup -// 2 = everything but status register reads -// 3 = everything -static constexpr int V = 0; +#define LOG_REGS (1 << 1U) // Register writes +#define LOG_RREGS (1 << 2U) // Register reads +#define LOG_RATE (1 << 3U) // Bitrate setting, beware that gk2000 changes it all the time ending up in a massive slowdown, don't leave it active +#define LOG_DATA (1 << 4U) // Bytes transmitted +#define LOG_CLOCK (1 << 5U) // Clock and transmission start/stop +#define LOG_STATE (1 << 6U) // State machine states +#define LOG_TICK (1 << 7U) // Clock ticks +#define VERBOSE (LOG_DATA) + +#include "logmacro.h" DEFINE_DEVICE_TYPE(H8_SCI, h8_sci_device, "h8_sci", "H8 Serial Communications Interface") + +// Clocking: +// Async mode: +// The circuit wants 16 events per bit. +// * Internal clocking: the cpu clock is divided by one of (1, 4, 16, 64) from the cks field of smr +// then by (brr+1) then by 2. +// * External clocking: the external clock is supposed to be 16*bitrate. +// Sync mode: +// The circuit wants 2 events per bit, a positive and a negative edge. +// * Internal clocking: the cpu clock is divided by one of (1, 4, 16, 64) from the cks field of smr +// then by (brr+1) then by 2. Events are then interpreted has been alternatively positive and +// negative (e.g. another divide-by-two, sync-wise). +// * External clocking: the external clock is supposed to be at bitrate, both edges are used. +// +// Synchronization: +// Async mode: +// Both modes use a 4-bits counter incremented on every event (16/bit). +// +// * Transmit sets the counter to 0 at transmit start. Output data line changes value +// on counter == 0. If the clock output is required, clk=1 outside of transmit, +// clk=0 on counter==0, clk=1 on counter==8. +// +// * Receive sets the counter to 0 when the data line initially goes down (start bit) +// Output line is read on counter==8. It is unknown whether the counter is reset +// on every data line level change. +// +// Sync mode: +// * Transmit changes the data line on negative edges, the clock line, following positive and +// negative edge definition, is output as long as transmit is active and is otherwise 1. +// +// * Receive reads the data line on positive edges. +// +// Framing: +// Async mode: 1 bit of start at 0, 7 or 8 bits of data, nothing or 1 bit of parity or 1 bit of multiprocessing, 1 or 2 bits of stop at 1. +// Sync mode: 8 bits of data. +// +// Multiprocessing bit is an extra bit which value can be set on transmit in bit zero of ssr. +// On receive when zero the byte is dropped. + + const char *const h8_sci_device::state_names[] = { "idle", "start", "bit", "parity", "stop", "last-tick" }; h8_sci_device::h8_sci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : @@ -24,8 +68,9 @@ m_cpu(*this, finder_base::DUMMY_TAG), m_intc(*this, finder_base::DUMMY_TAG), m_external_to_internal_ratio(0), m_internal_to_external_ratio(0), m_sync_timer(nullptr), m_id(0), m_eri_int(0), m_rxi_int(0), m_txi_int(0), m_tei_int(0), - m_tx_state(0), m_rx_state(0), m_tx_bit(0), m_rx_bit(0), m_clock_state(0), m_tx_parity(0), m_rx_parity(0), m_ext_clock_counter(0), m_clock_mode(clock_mode_t::INTERNAL_ASYNC), m_clock_value(false), m_ext_clock_value(false), m_rx_value(false), - m_rdr(0), m_tdr(0), m_smr(0), m_scr(0), m_ssr(0), m_brr(0), m_rsr(0), m_tsr(0), m_clock_base(0), m_divider(0) + m_tx_state(0), m_rx_state(0), m_tx_bit(0), m_rx_bit(0), m_clock_state(0), m_tx_parity(0), m_rx_parity(0), m_tx_clock_counter(0), m_rx_clock_counter(0), + m_clock_mode(INTERNAL_ASYNC), m_ext_clock_value(false), m_rx_value(true), + m_rdr(0), m_tdr(0), m_smr(0), m_scr(0), m_ssr(0), m_brr(0), m_rsr(0), m_tsr(0), m_clock_event(0), m_divider(0) { m_external_clock_period = attotime::never; } @@ -38,33 +83,35 @@ void h8_sci_device::smr_w(u8 data) { m_smr = data; - if(V>=2) logerror("smr_w %02x %s %c%c%c%s /%d (%06x)\n", data, - data & SMR_CA ? "sync" : "async", - data & SMR_CHR ? '7' : '8', - data & SMR_PE ? data & SMR_OE ? 'o' : 'e' : 'n', - data & SMR_STOP ? '2' : '1', - data & SMR_MP ? " mp" : "", - 1 << 2*(data & SMR_CKS), - m_cpu->pc()); + + LOGMASKED(LOG_REGS, "smr_w %02x %s %c%c%c%s /%d (%06x)\n", data, + data & SMR_CA ? "sync" : "async", + data & SMR_CHR ? '7' : '8', + data & SMR_PE ? data & SMR_OE ? 'o' : 'e' : 'n', + data & SMR_STOP ? '2' : '1', + data & SMR_MP ? " mp" : "", + 1 << 2*(data & SMR_CKS), + m_cpu->pc()); + clock_update(); } u8 h8_sci_device::smr_r() { - if(V>=2) logerror("smr_r %02x (%06x)\n", m_smr, m_cpu->pc()); + LOGMASKED(LOG_RREGS, "smr_r %02x (%06x)\n", m_smr, m_cpu->pc()); return m_smr; } void h8_sci_device::brr_w(u8 data) { m_brr = data; - if(V>=2) logerror("brr_w %02x (%06x)\n", data, m_cpu->pc()); + LOGMASKED(LOG_REGS, "brr_w %02x (%06x)\n", m_brr, m_cpu->pc()); clock_update(); } u8 h8_sci_device::brr_r() { - if(V>=2) logerror("brr_r %02x (%06x)\n", m_brr, m_cpu->pc()); + LOGMASKED(LOG_RREGS, "brr_r %02x (%06x)\n", m_brr, m_cpu->pc()); return m_brr; } @@ -80,15 +127,15 @@ void h8_sci_device::scr_w(u8 data) { - if(V>=2) logerror("scr_w %02x%s%s%s%s%s%s clk=%d (%06x)\n", data, - data & SCR_TIE ? " txi" : "", - data & SCR_RIE ? " rxi" : "", - data & SCR_TE ? " tx" : "", - data & SCR_RE ? " rx" : "", - data & SCR_MPIE ? " mpi" : "", - data & SCR_TEIE ? " tei" : "", - data & SCR_CKE, - m_cpu->pc()); + LOGMASKED(LOG_REGS, "scr_w %02x%s%s%s%s%s%s clk=%d (%06x)\n", data, + data & SCR_TIE ? " txi" : "", + data & SCR_RIE ? " rxi" : "", + data & SCR_TE ? " tx" : "", + data & SCR_RE ? " rx" : "", + data & SCR_MPIE ? " mpi" : "", + data & SCR_TEIE ? " tei" : "", + data & SCR_CKE, + m_cpu->pc()); u8 delta = m_scr ^ data; m_scr = data; @@ -113,13 +160,13 @@ u8 h8_sci_device::scr_r() { - if(V>=2) logerror("scr_r %02x (%06x)\n", m_scr, m_cpu->pc()); + LOGMASKED(LOG_RREGS, "scr_r %02x (%06x)\n", m_scr, m_cpu->pc()); return m_scr; } void h8_sci_device::tdr_w(u8 data) { - if(V>=2) logerror("tdr_w %02x (%06x)\n", data, m_cpu->pc()); + LOGMASKED(LOG_REGS, "tdr_w %02x (%06x)\n", data, m_cpu->pc()); m_tdr = data; if(m_cpu->access_is_dma()) { m_ssr &= ~SSR_TDRE; @@ -130,7 +177,7 @@ u8 h8_sci_device::tdr_r() { - if(V>=2) logerror("tdr_r %02x (%06x)\n", m_tdr, m_cpu->pc()); + LOGMASKED(LOG_RREGS, "tdr_r %02x (%06x)\n", m_tdr, m_cpu->pc()); return m_tdr; } @@ -143,7 +190,7 @@ if((m_ssr & SSR_TDRE) && !(data & SSR_TDRE)) m_ssr &= ~SSR_TEND; m_ssr = ((m_ssr & ~SSR_MPBT) | (data & SSR_MPBT)) & (data | (SSR_TEND|SSR_MPB|SSR_MPBT)); - if(V>=2) logerror("ssr_w %02x -> %02x (%06x)\n", data, m_ssr, m_cpu->pc()); + LOGMASKED(LOG_REGS, "ssr_w %02x -> %02x (%06x)\n", data, m_ssr, m_cpu->pc()); if(m_tx_state == ST_IDLE && !(m_ssr & SSR_TDRE)) tx_start(); @@ -154,83 +201,81 @@ u8 h8_sci_device::ssr_r() { - if(V>=3) logerror("ssr_r %02x (%06x)\n", m_ssr, m_cpu->pc()); + LOGMASKED(LOG_RREGS, "ssr_r %02x (%06x)\n", m_ssr, m_cpu->pc()); return m_ssr; } u8 h8_sci_device::rdr_r() { - if(V>=2) logerror("rdr_r %02x (%06x)\n", m_rdr, m_cpu->pc()); - if(m_cpu->access_is_dma()) + LOGMASKED(LOG_RREGS, "rdr_r %02x (%06x)\n", m_rdr, m_cpu->pc()); + + if(!machine().side_effects_disabled() && m_cpu->access_is_dma()) m_ssr &= ~SSR_RDRF; return m_rdr; } void h8_sci_device::scmr_w(u8 data) { - if(V>=2) logerror("scmr_w %02x (%06x)\n", data, m_cpu->pc()); + LOGMASKED(LOG_REGS, "scmr_w %02x (%06x)\n", data, m_cpu->pc()); } u8 h8_sci_device::scmr_r() { - if(V>=2) logerror("scmr_r (%06x)\n", m_cpu->pc()); + LOGMASKED(LOG_RREGS, "scmr_r (%06x)\n", m_cpu->pc()); return 0x00; } void h8_sci_device::clock_update() { - // Sync: Divider must be the time of a half-period (both edges are used, datarate*2) - // Async: Divider must be the time of one period (only rising edge used, datarate*16) - m_divider = 2 << (2*(m_smr & SMR_CKS)); m_divider *= m_brr+1; if(m_smr & SMR_CA) { if(m_scr & SCR_CKE1) - m_clock_mode = clock_mode_t::EXTERNAL_SYNC; + m_clock_mode = EXTERNAL_SYNC; else - m_clock_mode = clock_mode_t::INTERNAL_SYNC_OUT; + m_clock_mode = INTERNAL_SYNC_OUT; } else { if(m_scr & SCR_CKE1) - m_clock_mode = clock_mode_t::EXTERNAL_ASYNC; + m_clock_mode = EXTERNAL_ASYNC; else if(m_scr & SCR_CKE0) - m_clock_mode = clock_mode_t::INTERNAL_ASYNC_OUT; + m_clock_mode = INTERNAL_ASYNC_OUT; else - m_clock_mode = clock_mode_t::INTERNAL_ASYNC; + m_clock_mode = INTERNAL_ASYNC; } - if(m_clock_mode == clock_mode_t::EXTERNAL_ASYNC && !m_external_clock_period.is_never()) - m_clock_mode = clock_mode_t::EXTERNAL_RATE_ASYNC; - if(m_clock_mode == clock_mode_t::EXTERNAL_SYNC && !m_external_clock_period.is_never()) - m_clock_mode = clock_mode_t::EXTERNAL_RATE_SYNC; + if(m_clock_mode == EXTERNAL_ASYNC && !m_external_clock_period.is_never()) + m_clock_mode = EXTERNAL_RATE_ASYNC; + if(m_clock_mode == EXTERNAL_SYNC && !m_external_clock_period.is_never()) + m_clock_mode = EXTERNAL_RATE_SYNC; - if(V>=1) { + if(VERBOSE & LOG_RATE) { std::string new_message; switch(m_clock_mode) { - case clock_mode_t::INTERNAL_ASYNC: + case INTERNAL_ASYNC: new_message = util::string_format("clock internal at %d Hz, async, bitrate %d bps\n", int(m_cpu->clock() / m_divider), int(m_cpu->clock() / (m_divider*16))); break; - case clock_mode_t::INTERNAL_ASYNC_OUT: + case INTERNAL_ASYNC_OUT: new_message = util::string_format("clock internal at %d Hz, async, bitrate %d bps, output\n", int(m_cpu->clock() / m_divider), int(m_cpu->clock() / (m_divider*16))); break; - case clock_mode_t::EXTERNAL_ASYNC: + case EXTERNAL_ASYNC: new_message = "clock external, async\n"; break; - case clock_mode_t::EXTERNAL_RATE_ASYNC: + case EXTERNAL_RATE_ASYNC: new_message = util::string_format("clock external at %d Hz, async, bitrate %d bps\n", int(m_cpu->clock()*m_internal_to_external_ratio), int(m_cpu->clock()*m_internal_to_external_ratio/16)); break; - case clock_mode_t::INTERNAL_SYNC_OUT: + case INTERNAL_SYNC_OUT: new_message = util::string_format("clock internal at %d Hz, sync, output\n", int(m_cpu->clock() / (m_divider*2))); break; - case clock_mode_t::EXTERNAL_SYNC: + case EXTERNAL_SYNC: new_message = "clock external, sync\n"; break; - case clock_mode_t::EXTERNAL_RATE_SYNC: + case EXTERNAL_RATE_SYNC: new_message = util::string_format("clock external at %d Hz, sync\n", int(m_cpu->clock()*m_internal_to_external_ratio)); break; } if(new_message != m_last_clock_message) { - logerror(new_message); + (LOG_OUTPUT_FUNC)(new_message); m_last_clock_message = std::move(new_message); } } @@ -248,6 +293,18 @@ m_internal_to_external_ratio = 1/m_external_to_internal_ratio; } + save_item(NAME(m_tx_state)); + save_item(NAME(m_rx_state)); + save_item(NAME(m_tx_bit)); + save_item(NAME(m_rx_bit)); + save_item(NAME(m_clock_state)); + save_item(NAME(m_tx_parity)); + save_item(NAME(m_rx_parity)); + save_item(NAME(m_tx_clock_counter)); + save_item(NAME(m_rx_clock_counter)); + save_item(NAME(m_clock_mode)); + save_item(NAME(m_ext_clock_value)); + save_item(NAME(m_rx_value)); save_item(NAME(m_rdr)); save_item(NAME(m_tdr)); @@ -257,18 +314,9 @@ save_item(NAME(m_brr)); save_item(NAME(m_rsr)); save_item(NAME(m_tsr)); - save_item(NAME(m_rx_bit)); - save_item(NAME(m_tx_bit)); - save_item(NAME(m_rx_state)); - save_item(NAME(m_tx_state)); - save_item(NAME(m_tx_parity)); - save_item(NAME(m_clock_state)); - save_item(NAME(m_clock_value)); - save_item(NAME(m_clock_base)); + save_item(NAME(m_clock_event)); + save_item(NAME(m_clock_step)); save_item(NAME(m_divider)); - save_item(NAME(m_ext_clock_value)); - save_item(NAME(m_ext_clock_counter)); - save_item(NAME(m_cur_sync_time)); } void h8_sci_device::device_reset() @@ -286,22 +334,14 @@ m_tx_state = ST_IDLE; m_rx_state = ST_IDLE; m_clock_state = 0; - m_clock_mode = clock_mode_t::INTERNAL_ASYNC; - m_clock_base = 0; + m_clock_mode = INTERNAL_ASYNC; + m_clock_event = 0; clock_update(); - m_clock_value = true; m_ext_clock_value = true; - m_ext_clock_counter = 0; - m_rx_value = true; - m_cpu->do_sci_clk(m_id, m_clock_value); + m_tx_clock_counter = 0; + m_rx_clock_counter = 0; + m_cpu->do_sci_clk(m_id, 1); m_cpu->do_sci_tx(m_id, 1); - m_cur_sync_time = attotime::never; -} - -void h8_sci_device::device_post_load() -{ - // Set clock_mode correctly as it's not saved - clock_update(); } TIMER_CALLBACK_MEMBER(h8_sci_device::sync_tick) @@ -311,169 +351,85 @@ void h8_sci_device::do_rx_w(int state) { + if(m_cpu->standby()) { + m_rx_value = state; + return; + } + + if(state != m_rx_value && (m_clock_state & CLK_RX)) + if(m_rx_clock_counter == 1 || m_rx_clock_counter == 15) + m_rx_clock_counter = 0; + m_rx_value = state; - if(V>=2) logerror("rx=%d\n", state); - if(!m_rx_value && !(m_clock_state & CLK_RX) && m_rx_state != ST_IDLE && !m_cpu->standby()) + if(!m_rx_value && !(m_clock_state & CLK_RX) && m_rx_state != ST_IDLE) clock_start(CLK_RX); } void h8_sci_device::do_clk_w(int state) { - if(m_ext_clock_value != state) { - m_ext_clock_value = state; - if(m_clock_state && !m_cpu->standby()) { - switch(m_clock_mode) { - case clock_mode_t::EXTERNAL_ASYNC: - if(m_ext_clock_value) { - m_ext_clock_counter = (m_ext_clock_counter+1) & 15; - - if((m_clock_state & CLK_TX) && m_ext_clock_counter == 0) - tx_dropped_edge(); - if((m_clock_state & CLK_RX) && m_ext_clock_counter == 8) - rx_raised_edge(); - } - break; + if(m_ext_clock_value == state) + return; - case clock_mode_t::EXTERNAL_SYNC: - if((!m_ext_clock_value) && (m_clock_state & CLK_TX)) - tx_dropped_edge(); - - else if(m_ext_clock_value && (m_clock_state & CLK_RX)) - rx_raised_edge(); - break; - default: - // Do nothing - break; - } - } + m_ext_clock_value = state; + if(!m_clock_state || m_cpu->standby()) + return; + + if(m_clock_mode == EXTERNAL_ASYNC) { + if(m_clock_state & CLK_TX) + tx_async_tick(); + if(m_clock_state & CLK_RX) + rx_async_tick(); + } else if(m_clock_mode == EXTERNAL_SYNC) { + if(m_clock_state & CLK_TX) + tx_sync_tick(); + if(m_clock_state & CLK_RX) + rx_sync_tick(); } } u64 h8_sci_device::internal_update(u64 current_time) { - u64 event = 0; - switch(m_clock_mode) { - case clock_mode_t::INTERNAL_SYNC_OUT: - if(m_clock_state || !m_clock_value) { - u64 fp = m_divider*2; - if(current_time >= m_clock_base) { - u64 delta = current_time - m_clock_base; - if(delta >= fp) { - delta -= fp; - m_clock_base += fp; - } - assert(delta < fp); - - bool new_clock = delta >= m_divider; - if(new_clock != m_clock_value) { - machine().scheduler().synchronize(); - if((!new_clock) && (m_clock_state & CLK_TX)) - tx_dropped_edge(); - - else if(new_clock && (m_clock_state & CLK_RX)) - rx_raised_edge(); - - m_clock_value = new_clock; - if(m_clock_state || m_clock_value) - m_cpu->do_sci_clk(m_id, m_clock_value); - } - } - event = m_clock_base + (m_clock_value ? fp : m_divider); - } - break; - - case clock_mode_t::INTERNAL_ASYNC: - case clock_mode_t::INTERNAL_ASYNC_OUT: - if(m_clock_state || !m_clock_value) { - u64 fp = m_divider*16; - if(current_time >= m_clock_base) { - u64 delta = current_time - m_clock_base; - if(delta >= fp) { - delta -= fp; - m_clock_base += fp; - } - assert(delta < fp); - bool new_clock = delta >= m_divider*8; - if(new_clock != m_clock_value) { - machine().scheduler().synchronize(); - if((!new_clock) && (m_clock_state & CLK_TX)) - tx_dropped_edge(); - - else if(new_clock && (m_clock_state & CLK_RX)) - rx_raised_edge(); - - m_clock_value = new_clock; - if(m_clock_mode == clock_mode_t::INTERNAL_ASYNC_OUT && (m_clock_state || !m_clock_value)) - m_cpu->do_sci_clk(m_id, m_clock_value); - } - } - - event = m_clock_base + (m_clock_value ? fp : m_divider*8); - } - break; - - case clock_mode_t::EXTERNAL_RATE_SYNC: - if(m_clock_state || !m_clock_value) { - u64 ctime = u64(current_time*m_internal_to_external_ratio*2); - if(ctime >= m_clock_base) { - u64 delta = ctime - m_clock_base; - m_clock_base += delta & ~1; - delta &= 1; - bool new_clock = delta >= 1; - if(new_clock != m_clock_value) { - machine().scheduler().synchronize(); - if((!new_clock) && (m_clock_state & CLK_TX)) - tx_dropped_edge(); - - else if(new_clock && (m_clock_state & CLK_RX)) - rx_raised_edge(); + if(!m_clock_event || current_time < m_clock_event) + return m_clock_event; - m_clock_value = new_clock; - } - } - - event = u64((m_clock_base + (m_clock_value ? 2 : 1))*m_external_to_internal_ratio)+1; - } - break; - - case clock_mode_t::EXTERNAL_RATE_ASYNC: - if(m_clock_state || !m_clock_value) { - u64 ctime = u64(current_time*m_internal_to_external_ratio); - if(ctime >= m_clock_base) { - u64 delta = ctime - m_clock_base; - m_clock_base += delta & ~15; - delta &= 15; - bool new_clock = delta >= 8; - if(new_clock != m_clock_value) { - machine().scheduler().synchronize(); - if((!new_clock) && (m_clock_state & CLK_TX)) - tx_dropped_edge(); - - else if(new_clock && (m_clock_state & CLK_RX)) - rx_raised_edge(); - - m_clock_value = new_clock; - } - } + if(m_clock_mode == INTERNAL_ASYNC || m_clock_mode == INTERNAL_ASYNC_OUT || m_clock_mode == EXTERNAL_RATE_ASYNC) { + if(m_clock_state & CLK_TX) + tx_async_tick(); + if(m_clock_state & CLK_RX) + rx_async_tick(); + } else if(m_clock_mode == INTERNAL_SYNC_OUT || m_clock_mode == EXTERNAL_RATE_SYNC) { + if(m_clock_state & CLK_TX) + tx_sync_tick(); + if(m_clock_state & CLK_RX) + rx_sync_tick(); + } + + if(m_clock_state) { + if(m_clock_step) + m_clock_event += m_clock_step; + else if(m_clock_mode == EXTERNAL_RATE_ASYNC || m_clock_mode == EXTERNAL_RATE_SYNC) + m_clock_event = u64(u64(m_clock_event * m_internal_to_external_ratio + 1) * m_external_to_internal_ratio + 1); + else + m_clock_event = 0; - event = u64((m_clock_base + (m_clock_value ? 16 : 8))*m_external_to_internal_ratio)+1; + if(m_clock_event) { + m_sync_timer->adjust(attotime::from_ticks(m_clock_event - m_cpu->now_as_cycles(), m_cpu->clock())); + m_cpu->internal_update(); } - break; - case clock_mode_t::EXTERNAL_ASYNC: - case clock_mode_t::EXTERNAL_SYNC: - break; - } - if(event) { - attotime ctime = machine().time(); - attotime sync_time = attotime::from_ticks(event-10, m_cpu->clock()); - if(m_cur_sync_time != sync_time && sync_time > ctime) { - m_sync_timer->adjust(sync_time - ctime); - m_cur_sync_time = sync_time; - } + } else if(!m_clock_state) { + m_clock_event = 0; + if(m_clock_mode == INTERNAL_ASYNC_OUT || m_clock_mode == INTERNAL_SYNC_OUT) + m_cpu->do_sci_clk(m_id, 1); } - return event; + return m_clock_event; +} + +void h8_sci_device::notify_standby(int state) +{ + if(!state && m_clock_event) + m_clock_event += m_cpu->total_cycles() - m_cpu->standby_time(); } void h8_sci_device::clock_start(int mode) @@ -482,46 +438,55 @@ if(m_clock_state & mode) return; - if(!m_clock_state) { - machine().scheduler().synchronize(); - m_clock_state = mode; - switch(m_clock_mode) { - case clock_mode_t::INTERNAL_ASYNC: - case clock_mode_t::INTERNAL_ASYNC_OUT: - case clock_mode_t::INTERNAL_SYNC_OUT: - if(V>=2) logerror("Starting internal clock\n"); - m_clock_base = m_cpu->total_cycles(); - m_cpu->internal_update(); - break; + if(mode == CLK_TX) + m_tx_clock_counter = 15; + else + m_rx_clock_counter = 15; - case clock_mode_t::EXTERNAL_RATE_ASYNC: - if(V>=2) logerror("Simulating external clock async\n"); - m_clock_base = u64(m_cpu->total_cycles()*m_internal_to_external_ratio); - m_cpu->internal_update(); - break; + m_clock_state |= mode; + if(m_clock_state != mode) + return; - case clock_mode_t::EXTERNAL_RATE_SYNC: - if(V>=2) logerror("Simulating external clock sync\n"); - m_clock_base = u64(m_cpu->total_cycles()*2*m_internal_to_external_ratio); - m_cpu->internal_update(); - break; + m_clock_step = 0; - case clock_mode_t::EXTERNAL_ASYNC: - if(V>=2) logerror("Waiting for external clock async\n"); - m_ext_clock_counter = 15; - break; + switch(m_clock_mode) { + case INTERNAL_ASYNC: + case INTERNAL_ASYNC_OUT: + case INTERNAL_SYNC_OUT: { + LOGMASKED(LOG_CLOCK, "Starting internal clock\n"); + m_clock_step = m_divider; + u64 now = mode == CLK_TX ? m_cpu->total_cycles() : m_cpu->now_as_cycles(); + m_clock_event = (now / m_clock_step + 1) * m_clock_step; + m_sync_timer->adjust(attotime::from_ticks(m_clock_event - now, m_cpu->clock())); + m_cpu->internal_update(); + break; + } - case clock_mode_t::EXTERNAL_SYNC: - if(V>=2) logerror("Waiting for external clock sync\n"); - break; - } - } else - m_clock_state |= mode; + case EXTERNAL_RATE_ASYNC: + case EXTERNAL_RATE_SYNC: { + LOGMASKED(LOG_CLOCK, "Simulating external clock\n", m_clock_mode == EXTERNAL_RATE_ASYNC ? "async" : "sync"); + u64 now = mode == CLK_TX ? m_cpu->total_cycles() : m_cpu->now_as_cycles(); + m_clock_event = u64(u64(now * m_internal_to_external_ratio + 1) * m_external_to_internal_ratio + 1); + m_sync_timer->adjust(attotime::from_ticks(m_clock_event - now, m_cpu->clock())); + m_cpu->internal_update(); + break; + } + + case EXTERNAL_ASYNC: + case EXTERNAL_SYNC: + LOGMASKED(LOG_CLOCK, "Waiting for external clock\n"); + break; + } } void h8_sci_device::clock_stop(int mode) { m_clock_state &= ~mode; + if(!m_clock_state) { + m_clock_event = 0; + m_clock_step = 0; + LOGMASKED(LOG_CLOCK, "Stopping clocks\n"); + } m_cpu->internal_update(); } @@ -530,7 +495,7 @@ m_ssr |= SSR_TDRE; m_tsr = m_tdr; m_tx_parity = m_smr & SMR_OE ? 0 : 1; - if(V>=1) logerror("start transmit %02x '%c'\n", m_tsr, m_tsr >= 32 && m_tsr < 127 ? m_tsr : '.'); + LOGMASKED(LOG_DATA, "start transmit %02x '%c'\n", m_tsr, m_tsr >= 32 && m_tsr < 127 ? m_tsr : '.'); if(m_scr & SCR_TIE) m_intc->internal_interrupt(m_txi_int); if(m_smr & SMR_CA) { @@ -545,9 +510,23 @@ rx_start(); } -void h8_sci_device::tx_dropped_edge() +void h8_sci_device::tx_async_tick() { - if(V>=2) logerror("tx_dropped_edge state=%s bit=%d\n", state_names[m_tx_state], m_tx_bit); + m_tx_clock_counter = (m_tx_clock_counter + 1) & 15; + LOGMASKED(LOG_TICK, "tx_async_tick %x\n", m_tx_clock_counter); + if(m_tx_clock_counter == 0) { + tx_async_step(); + + if(m_clock_mode == INTERNAL_ASYNC_OUT) + m_cpu->do_sci_clk(m_id, 0); + + } else if(m_tx_clock_counter == 8 && m_clock_mode == INTERNAL_ASYNC_OUT) + m_cpu->do_sci_clk(m_id, 1); +} + +void h8_sci_device::tx_async_step() +{ + LOGMASKED(LOG_STATE, "tx_async_step state=%s bit=%d\n", state_names[m_tx_state], m_tx_bit); switch(m_tx_state) { case ST_START: m_cpu->do_sci_tx(m_id, false); @@ -591,7 +570,7 @@ m_tx_bit--; if(!m_tx_bit) { if(!(m_ssr & SSR_TDRE)) - tx_start(); + tx_start(); else { m_tx_state = ST_LAST_TICK; m_tx_bit = 0; @@ -616,14 +595,49 @@ default: abort(); } - if(V>=2) logerror(" -> state=%s bit=%d\n", state_names[m_tx_state], m_tx_bit); + LOGMASKED(LOG_STATE, " -> state=%s bit=%d\n", state_names[m_tx_state], m_tx_bit); +} + +void h8_sci_device::tx_sync_tick() +{ + m_tx_clock_counter = (m_tx_clock_counter + 1) & 1; + LOGMASKED(LOG_TICK, "tx_sync_tick %x\n", m_tx_clock_counter); + if(m_tx_clock_counter == 0) { + tx_sync_step(); + + if(m_clock_mode == INTERNAL_SYNC_OUT && m_tx_state != ST_IDLE) + m_cpu->do_sci_clk(m_id, 0); + + } else if(m_tx_clock_counter == 1 && m_clock_mode == INTERNAL_SYNC_OUT) + m_cpu->do_sci_clk(m_id, 1); +} + +void h8_sci_device::tx_sync_step() +{ + LOGMASKED(LOG_STATE, "tx_sync_step bit=%d\n", m_tx_bit); + if(!m_tx_bit) { + m_tx_state = ST_IDLE; + clock_stop(CLK_TX); + m_cpu->do_sci_tx(m_id, 1); + m_ssr |= SSR_TEND; + if(m_scr & SCR_TEIE) + m_intc->internal_interrupt(m_tei_int); + + // if there's more to send, start the transmitter + if((m_scr & SCR_TE) && !(m_ssr & SSR_TDRE)) + tx_start(); + } else { + m_cpu->do_sci_tx(m_id, m_tsr & 1); + m_tsr >>= 1; + m_tx_bit--; + } } void h8_sci_device::rx_start() { m_rx_parity = m_smr & SMR_OE ? 0 : 1; m_rsr = 0x00; - if(V>=2) logerror("start receive\n"); + LOGMASKED(LOG_STATE, "start receive\n"); if(m_smr & SMR_CA) { m_rx_state = ST_BIT; m_rx_bit = 8; @@ -641,13 +655,13 @@ if(!(m_ssr & SSR_FER)) { if((m_smr & SMR_PE) && m_rx_parity) { m_ssr |= SSR_PER; - if(V>=1) logerror("Receive parity error\n"); + LOGMASKED(LOG_DATA, "Receive parity error\n"); } else if(m_ssr & SSR_RDRF) { m_ssr |= SSR_ORER; - if(V>=1) logerror("Receive overrun\n"); + LOGMASKED(LOG_DATA, "Receive overrun\n"); } else { m_ssr |= SSR_RDRF; - if(V>=1) logerror("Received %02x '%c'\n", m_rsr, m_rsr >= 32 && m_rsr < 127 ? m_rsr : '.'); + LOGMASKED(LOG_DATA, "Received %02x '%c'\n", m_rsr, m_rsr >= 32 && m_rsr < 127 ? m_rsr : '.'); m_rdr = m_rsr; } } @@ -665,9 +679,17 @@ } } -void h8_sci_device::rx_raised_edge() +void h8_sci_device::rx_async_tick() +{ + m_rx_clock_counter = (m_rx_clock_counter + 1) & 15; + LOGMASKED(LOG_TICK, "rx_async_tick %x\n", m_rx_clock_counter); + if(m_rx_clock_counter == 8) + rx_async_step(); +} + +void h8_sci_device::rx_async_step() { - if(V>=2) logerror("rx_raised_edge state=%s bit=%d\n", state_names[m_rx_state], m_rx_bit); + LOGMASKED(LOG_STATE, "rx_async_step state=%s bit=%d\n", state_names[m_rx_state], m_rx_bit); switch(m_rx_state) { case ST_START: if(m_rx_value) { @@ -718,5 +740,33 @@ default: abort(); } - if(V>=2) logerror(" -> state=%s, bit=%d\n", state_names[m_rx_state], m_rx_bit); + LOGMASKED(LOG_STATE, " -> state=%s, bit=%d\n", state_names[m_rx_state], m_rx_bit); +} + +void h8_sci_device::rx_sync_tick() +{ + m_rx_clock_counter = (m_rx_clock_counter + 1) & 1; + LOGMASKED(LOG_TICK, "rx_sync_tick %x\n", m_rx_clock_counter); + + if(m_rx_clock_counter == 0 && m_clock_mode == INTERNAL_SYNC_OUT) + m_cpu->do_sci_clk(m_id, 0); + + else if(m_rx_clock_counter == 1) { + if(m_clock_mode == INTERNAL_SYNC_OUT) + m_cpu->do_sci_clk(m_id, 1); + + rx_sync_step(); + } +} + +void h8_sci_device::rx_sync_step() +{ + LOGMASKED(LOG_STATE, "rx_sync_step bit=%d\n", m_rx_value); + m_rsr >>= 1; + if(m_rx_value) + m_rsr |= 0x80; + m_rx_bit--; + + if(!m_rx_bit) + rx_done(); } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_sci.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_sci.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_sci.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_sci.h 2024-03-25 14:00:46.000000000 +0000 @@ -52,6 +52,7 @@ void do_clk_w(int state); u64 internal_update(u64 current_time); + void notify_standby(int state); protected: enum { @@ -65,7 +66,7 @@ CLK_RX = 2 }; - enum class clock_mode_t { + enum { INTERNAL_ASYNC, INTERNAL_ASYNC_OUT, EXTERNAL_ASYNC, @@ -106,35 +107,42 @@ required_device m_cpu; required_device m_intc; - attotime m_external_clock_period, m_cur_sync_time; + attotime m_external_clock_period; double m_external_to_internal_ratio, m_internal_to_external_ratio; emu_timer *m_sync_timer; int m_id, m_eri_int, m_rxi_int, m_txi_int, m_tei_int; - int m_tx_state, m_rx_state, m_tx_bit, m_rx_bit, m_clock_state, m_tx_parity, m_rx_parity, m_ext_clock_counter; - clock_mode_t m_clock_mode; - bool m_clock_value, m_ext_clock_value, m_rx_value; + int m_tx_state, m_rx_state, m_tx_bit, m_rx_bit, m_clock_state, m_tx_parity, m_rx_parity, m_tx_clock_counter, m_rx_clock_counter; + u32 m_clock_mode; + bool m_ext_clock_value, m_rx_value; u8 m_rdr, m_tdr, m_smr, m_scr, m_ssr, m_brr, m_rsr, m_tsr; - u64 m_clock_base, m_divider; + u64 m_clock_event, m_clock_step, m_divider; std::string m_last_clock_message; void device_start() override; void device_reset() override; - void device_post_load() override; TIMER_CALLBACK_MEMBER(sync_tick); void clock_start(int mode); void clock_stop(int mode); void clock_update(); + void tx_start(); - void tx_dropped_edge(); + void tx_async_tick(); + void tx_async_step(); + void tx_sync_tick(); + void tx_sync_step(); + void rx_start(); void rx_done(); - void rx_raised_edge(); + void rx_async_tick(); + void rx_async_step(); + void rx_sync_tick(); + void rx_sync_step(); bool is_sync_start() const; bool has_recv_error() const; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer16.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer16.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,12 +12,16 @@ Or if it's edge triggered, will it trigger an IRQ on rising edge of (irq_enable & flag)? Note that mu100 will lock up at boot if it's triggered at rising edge of (flag) or (irq_enable & flag). + - When writing 0 to the status register(s), the overflow/compare match + flags will only be cleared after a read access was done while they + were set? It's how the databook explains it, similar to HD6301. - H8/325 16-bit timer is shoehorned in and may have a bug lurking? It doesn't have TGR registers, but functionally equivalent OCR/ICR. - Make the base class more generic, and derive the devices from that, so they don't have to jumble so much with the IRQ/flag bits. The overflow IRQ/flag being hardcoded on bit 4 is also problematic. - Proper support for input capture registers. + - Add support for chained timers. ***************************************************************************/ @@ -122,7 +126,8 @@ u8 h8_timer16_channel_device::tsr_r() { - update_counter(); + if(!machine().side_effects_disabled()) + update_counter(); return isr_to_sr(); } @@ -136,7 +141,8 @@ u16 h8_timer16_channel_device::tcnt_r() { - update_counter(); + if(!machine().side_effects_disabled()) + update_counter(); return m_tcnt; } @@ -163,7 +169,7 @@ u16 h8_timer16_channel_device::tbr_r(offs_t offset) { - return m_tgr[offset+m_tgr_count]; + return m_tgr[offset + m_tgr_count]; } void h8_timer16_channel_device::tbr_w(offs_t offset, u16 data, u16 mem_mask) @@ -196,7 +202,7 @@ void h8_timer16_channel_device::device_reset() { - // Don't touch channel_active here, top level device handles it + // Don't touch channel_active here, top level device handles it. m_tcr = 0; m_tcnt = 0; memset(m_tgr, 0xff, sizeof(m_tgr)); @@ -215,14 +221,23 @@ u64 h8_timer16_channel_device::internal_update(u64 current_time) { - if(m_event_time && current_time >= m_event_time) { - update_counter(current_time); - recalc_event(current_time); + while(m_event_time && current_time >= m_event_time) { + update_counter(m_event_time); + recalc_event(m_event_time); } return m_event_time; } +void h8_timer16_channel_device::notify_standby(int state) +{ + if(!state && m_event_time) { + u64 delta = m_cpu->total_cycles() - m_cpu->standby_time(); + m_event_time += delta; + m_last_clock_update += delta; + } +} + void h8_timer16_channel_device::update_counter(u64 cur_time) { if(m_clock_type != DIV_1) @@ -237,29 +252,57 @@ } u64 base_time = m_last_clock_update; + m_last_clock_update = cur_time; u64 new_time = cur_time; if(m_clock_divider) { base_time = (base_time + m_phase) >> m_clock_divider; new_time = (new_time + m_phase) >> m_clock_divider; } + if(new_time == base_time) + return; + if(m_counter_incrementing) { - int tt = m_tcnt + new_time - base_time; - m_tcnt = tt % m_counter_cycle; + u16 prev = m_tcnt; + u64 delta = new_time - base_time; + u64 tt = m_tcnt + delta; + + if(prev >= m_counter_cycle) { + if(tt >= 0x10000) + m_tcnt = (tt - 0x10000) % m_counter_cycle; + else + m_tcnt = tt; + } else + m_tcnt = tt % m_counter_cycle; + + for(int i = 0; i < m_tgr_count; i++) { + u16 cmp = m_tgr[i] + 1; + bool match = m_tcnt == cmp || (tt == cmp && tt == m_counter_cycle); + if(!match) { + // Need to do additional checks here for software that polls the flags with interrupts disabled, since recalc_event only schedules IRQ events. + if(prev >= m_counter_cycle) + match = (cmp > prev && tt >= cmp) || (cmp <= m_counter_cycle && m_tcnt < m_counter_cycle && (delta - (0x10000 - prev)) >= cmp); + else if(cmp <= m_counter_cycle) + match = delta >= m_counter_cycle || (prev < cmp && tt >= cmp) || (m_tcnt <= prev && m_tcnt >= cmp); + + if(match && BIT(m_ier, i) && m_interrupt[i] != -1) + logerror("update_counter unexpected TGR %d IRQ\n, i"); + } - for(int i=0; iinternal_interrupt(m_interrupt[i]); } - if(tt >= 0x10000) { + } + if(tt >= 0x10000 && (m_counter_cycle == 0x10000 || prev >= m_counter_cycle)) { m_isr |= IRQ_V; - if (m_ier & IRQ_V && m_interrupt[4] != -1) + if(m_ier & IRQ_V && m_interrupt[4] != -1) m_intc->internal_interrupt(m_interrupt[4]); } - } else - m_tcnt = (((m_tcnt ^ 0xffff) + new_time - base_time) % m_counter_cycle) ^ 0xffff; - m_last_clock_update = cur_time; + } else { + logerror("decrementing counter\n"); + exit(1); + } } void h8_timer16_channel_device::recalc_event(u64 cur_time) @@ -285,27 +328,25 @@ if(m_counter_incrementing) { u32 event_delay = 0xffffffff; - if(m_tgr_clearing >= 0 && m_tgr[m_tgr_clearing]) - m_counter_cycle = m_tgr[m_tgr_clearing]; - else { + if(m_tgr_clearing >= 0) + m_counter_cycle = m_tgr[m_tgr_clearing] + 1; + else m_counter_cycle = 0x10000; - if(m_ier & IRQ_V) { - event_delay = m_counter_cycle - m_tcnt; - if(!event_delay) - event_delay = m_counter_cycle; - } - } - for(int i=0; i= m_counter_cycle)) + event_delay = 0x10000 - m_tcnt; + + for(int i = 0; i < m_tgr_count; i++) + if(BIT(m_ier, i) && m_interrupt[i] != -1) { u32 new_delay = 0xffffffff; - if(m_tgr[i] > m_tcnt) { - if(m_tcnt >= m_counter_cycle || m_tgr[i] <= m_counter_cycle) - new_delay = m_tgr[i] - m_tcnt; - } else if(m_tgr[i] <= m_counter_cycle) { + u16 cmp = m_tgr[i] + 1; + if(cmp > m_tcnt) { + if(m_tcnt >= m_counter_cycle || cmp <= m_counter_cycle) + new_delay = cmp - m_tcnt; + } else if(cmp <= m_counter_cycle) { if(m_tcnt < m_counter_cycle) - new_delay = (m_counter_cycle - m_tcnt) + m_tgr[i]; + new_delay = (m_counter_cycle - m_tcnt) + cmp; else - new_delay = (0x10000 - m_tcnt) + m_tgr[i]; + new_delay = (0x10000 - m_tcnt) + cmp; } if(event_delay > new_delay) @@ -316,7 +357,6 @@ m_event_time = ((((cur_time + (1ULL << m_clock_divider) - m_phase) >> m_clock_divider) + event_delay - 1) << m_clock_divider) + m_phase; else m_event_time = 0; - } else { logerror("decrementing counter\n"); exit(1); @@ -339,10 +379,10 @@ save_item(NAME(m_tstr)); } -void h8_timer16_device::device_reset() +void h8_timer16_device::device_reset_after_children() { m_tstr = m_default_tstr; - for(int i=0; iset_enable((m_tstr >> i) & 1); } @@ -356,7 +396,7 @@ { if(V>=1) logerror("tstr_w %02x\n", data); m_tstr = data; - for(int i=0; iset_enable((m_tstr >> i) & 1); } @@ -413,9 +453,9 @@ u8 h8_timer16_device::tisr_r(offs_t offset) { u8 r = 0; - for(int i=0; itisr_r(offset) << i; - for(int i=m_timer_count; i<4; i++) + for(int i = m_timer_count; i < 4; i++) r |= 0x11 <=1) logerror("tisr%c_r %02x\n", 'a'+offset, r); @@ -426,7 +466,7 @@ void h8_timer16_device::tisr_w(offs_t offset, u8 data) { if(V>=1) logerror("tisr%c_w %02x\n", 'a'+offset, data); - for(int i=0; itisr_w(offset, data >> i); } @@ -579,7 +619,7 @@ { m_tcsr = val; - if (val & 1) + if(val & 1) m_tgr_clearing = 0; else m_tgr_clearing = TGR_CLEAR_NONE; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer16.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer16.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer16.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer16.h 2024-03-25 14:00:46.000000000 +0000 @@ -91,6 +91,7 @@ void tbr_w(offs_t offset, u16 data, u16 mem_mask = ~0); u64 internal_update(u64 current_time); + void notify_standby(int state); void set_ier(u8 value); void set_enable(bool enable); void tisr_w(int offset, u8 data); @@ -271,7 +272,7 @@ u8 m_tstr; virtual void device_start() override; - virtual void device_reset() override; + virtual void device_reset_after_children() override; }; DECLARE_DEVICE_TYPE(H8_TIMER16, h8_timer16_device) diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer8.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer8.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,9 @@ while an overflow or compare match flag is 1, will it trigger an IRQ? Or if it's edge triggered, will it trigger an IRQ on rising edge of (irq_enable & flag)? + - When writing 0 to the status register(s), the overflow/compare match + flags will only be cleared after a read access was done while they + were set? It's how the databook explains it, similar to HD6301. ***************************************************************************/ @@ -128,12 +131,14 @@ break; } - if(V>=1) util::stream_format(message, ", irq=%c%c%c\n", - m_tcr & TCR_CMIEB ? 'b' : '-', - m_tcr & TCR_CMIEA ? 'a' : '-', - m_tcr & TCR_OVIE ? 'o' : '-'); + if(V>=1) { + util::stream_format(message, ", irq=%c%c%c\n", + m_tcr & TCR_CMIEB ? 'b' : '-', + m_tcr & TCR_CMIEA ? 'a' : '-', + m_tcr & TCR_OVIE ? 'o' : '-'); - logerror(std::move(message).str()); + logerror(std::move(message).str()); + } } u8 h8_timer8_channel_device::tcsr_r() @@ -169,8 +174,10 @@ u8 h8_timer8_channel_device::tcnt_r() { - update_counter(); - recalc_event(); + if(!machine().side_effects_disabled()) { + update_counter(); + recalc_event(); + } return m_tcnt; } @@ -184,6 +191,17 @@ void h8_timer8_channel_device::device_start() { + save_item(NAME(m_tcor)); + save_item(NAME(m_tcr)); + save_item(NAME(m_tcsr)); + save_item(NAME(m_tcnt)); + save_item(NAME(m_extra_clock_bit)); + save_item(NAME(m_clock_type)); + save_item(NAME(m_clock_divider)); + save_item(NAME(m_clear_type)); + save_item(NAME(m_counter_cycle)); + save_item(NAME(m_last_clock_update)); + save_item(NAME(m_event_time)); } void h8_timer8_channel_device::device_reset() @@ -204,32 +222,52 @@ u64 h8_timer8_channel_device::internal_update(u64 current_time) { - if(m_event_time && current_time >= m_event_time) { - update_counter(current_time); - recalc_event(current_time); + while(m_event_time && current_time >= m_event_time) { + update_counter(m_event_time); + recalc_event(m_event_time); } return m_event_time; } -void h8_timer8_channel_device::update_counter(u64 cur_time) +void h8_timer8_channel_device::notify_standby(int state) { - if(m_clock_type != DIV) - return; + if(!state && m_event_time) { + u64 delta = m_cpu->total_cycles() - m_cpu->standby_time(); + m_event_time += delta; + m_last_clock_update += delta; + } +} - if(!cur_time) - cur_time = m_cpu->total_cycles(); +void h8_timer8_channel_device::update_counter(u64 cur_time, u64 delta) +{ + if(m_clock_type == DIV) { + if(!cur_time) + cur_time = m_cpu->total_cycles(); - u64 base_time = (m_last_clock_update + m_clock_divider/2) / m_clock_divider; - u64 new_time = (cur_time + m_clock_divider/2) / m_clock_divider; + u64 base_time = (m_last_clock_update + m_clock_divider/2) / m_clock_divider; + m_last_clock_update = cur_time; + u64 new_time = (cur_time + m_clock_divider/2) / m_clock_divider; + delta = new_time - base_time; + } - int tt = m_tcnt + new_time - base_time; - m_tcnt = tt % m_counter_cycle; + if(!delta) + return; + + u8 prev = m_tcnt; + u64 tt = m_tcnt + delta; + + if(prev >= m_counter_cycle) { + if(tt >= 0x100) + m_tcnt = (tt - 0x100) % m_counter_cycle; + else + m_tcnt = tt; + } else + m_tcnt = tt % m_counter_cycle; - if(tt == m_tcor[0] || m_tcnt == m_tcor[0]) { + if(u8 cmp = m_tcor[0] + 1; m_tcnt == cmp || (tt == cmp && tt == m_counter_cycle)) { if(m_chained_timer) m_chained_timer->chained_timer_tcora(); - if(!(m_tcsr & TCSR_CMFA)) { m_tcsr |= TCSR_CMFA; if(m_tcr & TCR_CMIEA) @@ -237,13 +275,15 @@ } } - if(!(m_tcsr & TCSR_CMFB) && (tt == m_tcor[1] || m_tcnt == m_tcor[1])) { - m_tcsr |= TCSR_CMFB; - if(m_tcr & TCR_CMIEB) - m_intc->internal_interrupt(m_irq_cb); + if(u8 cmp = m_tcor[1] + 1; m_tcnt == cmp || (tt == cmp && tt == m_counter_cycle)) { + if(!(m_tcsr & TCSR_CMFB)) { + m_tcsr |= TCSR_CMFB; + if(m_tcr & TCR_CMIEB) + m_intc->internal_interrupt(m_irq_cb); + } } - if(tt >= 0x100) { + if(tt >= 0x100 && (m_counter_cycle == 0x100 || prev >= m_counter_cycle)) { if(m_chained_timer) m_chained_timer->chained_timer_overflow(); if(!(m_tcsr & TCSR_OVF)) { @@ -252,7 +292,6 @@ m_intc->internal_interrupt(m_irq_v); } } - m_last_clock_update = cur_time; } void h8_timer8_channel_device::recalc_event(u64 cur_time) @@ -271,25 +310,24 @@ cur_time = m_cpu->total_cycles(); u32 event_delay = 0xffffffff; - if((m_clear_type == CLEAR_A || m_clear_type == CLEAR_B) && m_tcor[m_clear_type - CLEAR_A]) - m_counter_cycle = m_tcor[m_clear_type - CLEAR_A]; - else { + if(m_clear_type == CLEAR_A || m_clear_type == CLEAR_B) + m_counter_cycle = m_tcor[m_clear_type - CLEAR_A] + 1; + else m_counter_cycle = 0x100; - event_delay = m_counter_cycle - m_tcnt; - if(!event_delay) - event_delay = m_counter_cycle; - } + if(m_counter_cycle == 0x100 || m_tcnt >= m_counter_cycle) + event_delay = 0x100 - m_tcnt; - for(auto &elem : m_tcor) { + for(auto &tcor : m_tcor) { u32 new_delay = 0xffffffff; - if(elem > m_tcnt) { - if(m_tcnt >= m_counter_cycle || elem <= m_counter_cycle) - new_delay = elem - m_tcnt; - } else if(elem <= m_counter_cycle) { + u8 cmp = tcor + 1; + if(cmp > m_tcnt) { + if(m_tcnt >= m_counter_cycle || cmp <= m_counter_cycle) + new_delay = cmp - m_tcnt; + } else if(cmp <= m_counter_cycle) { if(m_tcnt < m_counter_cycle) - new_delay = (m_counter_cycle - m_tcnt) + elem; + new_delay = (m_counter_cycle - m_tcnt) + cmp; else - new_delay = (0x100 - m_tcnt) + elem; + new_delay = (0x100 - m_tcnt) + cmp; } if(event_delay > new_delay) event_delay = new_delay; @@ -307,45 +345,13 @@ void h8_timer8_channel_device::chained_timer_overflow() { if(m_clock_type == CHAIN_OVERFLOW) - timer_tick(); + update_counter(0, 1); } void h8_timer8_channel_device::chained_timer_tcora() { if(m_clock_type == CHAIN_A) - timer_tick(); -} - -void h8_timer8_channel_device::timer_tick() -{ - m_tcnt++; - - if(m_tcnt == m_tcor[0]) { - if(m_chained_timer) - m_chained_timer->chained_timer_tcora(); - - if(!(m_tcsr & TCSR_CMFA)) { - m_tcsr |= TCSR_CMFA; - if(m_tcr & TCR_CMIEA) - m_intc->internal_interrupt(m_irq_ca); - } - } - - if(!(m_tcsr & TCSR_CMFB) && m_tcnt == m_tcor[1]) { - m_tcsr |= TCSR_CMFB; - if(m_tcr & TCR_CMIEB) - m_intc->internal_interrupt(m_irq_cb); - } - - if(m_tcnt == 0x00) { - if(m_chained_timer) - m_chained_timer->chained_timer_overflow(); - if(!(m_tcsr & TCSR_OVF)) { - m_tcsr |= TCSR_OVF; - if(m_tcr & TCR_OVIE) - m_intc->internal_interrupt(m_irq_v); - } - } + update_counter(0, 1); } h8h_timer8_channel_device::h8h_timer8_channel_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer8.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer8.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_timer8.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_timer8.h 2024-03-25 14:00:46.000000000 +0000 @@ -56,6 +56,7 @@ void tcnt_w(u8 data); u64 internal_update(u64 current_time); + void notify_standby(int state); void set_extra_clock_bit(bool bit); void chained_timer_overflow(); @@ -100,10 +101,9 @@ virtual void device_start() override; virtual void device_reset() override; - void update_counter(u64 cur_time = 0); + void update_counter(u64 cur_time = 0, u64 delta = 0); void recalc_event(u64 cur_time = 0); - void timer_tick(); void update_tcr(); }; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_watchdog.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8_watchdog.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_watchdog.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_watchdog.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,13 +1,25 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert +/*************************************************************************** + + h8_watchdog.cpp + + H8 watchdog/timer + + TODO: + - add RSTCSR for MCUs that have it (reset is only enabled when RSTI is 1) + - It will only clear the overflow flag when writing 0 after reading it + when it's set? It's how the databook explains it, similar to HD6301. + +***************************************************************************/ #include "emu.h" #include "h8_watchdog.h" DEFINE_DEVICE_TYPE(H8_WATCHDOG, h8_watchdog_device, "h8_watchdog", "H8 watchdog") -const int h8_watchdog_device::div_bh[8] = { 1, 6, 7, 9, 11, 13, 15, 17 }; -const int h8_watchdog_device::div_s [8] = { 1, 5, 6, 7, 8, 9, 11, 12 }; +const int h8_watchdog_device::div_bh[8] = { 1, 5, 6, 7, 8, 9, 11, 12 }; +const int h8_watchdog_device::div_s [8] = { 1, 6, 7, 9, 11, 13, 15, 17 }; h8_watchdog_device::h8_watchdog_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, H8_WATCHDOG, tag, owner, clock), @@ -24,11 +36,18 @@ int shift = (m_type == S ? div_s : div_bh)[m_tcsr & TCSR_CKS]; u64 spos = m_tcnt_cycle_base >> shift; return (spos + 0x100 - m_tcnt) << shift; - } else return 0; } +void h8_watchdog_device::notify_standby(int state) +{ + if(state) + tcnt_update(); + else + m_tcnt_cycle_base = m_cpu->total_cycles(); +} + void h8_watchdog_device::tcnt_update(u64 cur_time) { if(m_tcsr & TCSR_TME) { @@ -38,7 +57,7 @@ u64 spos = m_tcnt_cycle_base >> shift; u64 epos = cur_time >> shift; - int next_tcnt = m_tcnt + int(epos - spos); + u64 next_tcnt = m_tcnt + (epos - spos); m_tcnt = next_tcnt; m_tcnt_cycle_base = cur_time; //logerror("%10lld tcnt %02x -> %03x shift=%d\n", cur_time, m_tcnt, next_tcnt, shift); @@ -59,14 +78,15 @@ } } else m_tcnt = 0; - } u16 h8_watchdog_device::wd_r() { if(!machine().side_effects_disabled()) tcnt_update(); - return (m_tcsr << 8) | m_tcnt; + + u8 tcsr_mask = m_type == B ? 0x10 : 0x18; + return ((m_tcsr | tcsr_mask) << 8) | m_tcnt; } void h8_watchdog_device::wd_w(offs_t offset, u16 data, u16 mem_mask) @@ -78,8 +98,7 @@ tcnt_update(); if(!(m_tcsr & TCSR_TME) && (data & TCSR_TME)) m_tcnt_cycle_base = m_cpu->total_cycles(); - m_tcsr = data & 0xff; - m_tcsr |= m_type == B ? 0x10 : 0x18; + m_tcsr = (m_tcsr & data & TCSR_OVF) | (data & 0x7f); m_cpu->internal_update(); } @@ -97,11 +116,16 @@ { if(!machine().side_effects_disabled()) logerror("rst_r\n"); - return 0; + + u8 rst_mask = m_type == S ? 0x1f : 0x3f; + return m_rst | rst_mask; } -void h8_watchdog_device::rst_w(u16 data) +void h8_watchdog_device::rst_w(offs_t offset, u16 data, u16 mem_mask) { + if(mem_mask != 0xffff) + return; + if((data & 0xff00) == 0xa500) logerror("wowf_w %02x\n", data & 0xff); if((data & 0xff00) == 0x5a00) @@ -111,15 +135,15 @@ void h8_watchdog_device::device_start() { save_item(NAME(m_tcnt)); - save_item(NAME(m_tcnt_cycle_base)); save_item(NAME(m_tcsr)); save_item(NAME(m_rst)); + save_item(NAME(m_tcnt_cycle_base)); } void h8_watchdog_device::device_reset() { - m_tcnt = 0x00; m_tcnt_cycle_base = m_cpu->total_cycles(); - m_tcsr = m_type == B ? 0x10 : 0x18; - m_rst = m_type == S ? 0x1f : 0x3f; + m_tcnt = 0x00; + m_tcsr = 0x00; + m_rst = 0x00; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8_watchdog.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8_watchdog.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8_watchdog.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8_watchdog.h 2024-03-25 14:00:46.000000000 +0000 @@ -31,11 +31,12 @@ } u64 internal_update(u64 current_time); + void notify_standby(int state); u16 wd_r(); void wd_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 rst_r(); - void rst_w(u16 data); + void rst_w(offs_t offset, u16 data, u16 mem_mask = ~0); protected: virtual void device_start() override; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8d.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -148,7 +148,7 @@ break; case DASM_abs16: - if(slot == 3) + if(slot == 2) { if(m_advanced) util::stream_format(stream, "@h'%06x", s32(s16(opcodes.r16(epc-4))) & 0xffffff); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8h.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8h.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8h.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8h.h 2024-03-25 14:00:46.000000000 +0000 @@ -38,37 +38,37 @@ O(add_w_imm16_r16l); O(add_l_r32h_r32l); O(add_l_imm32_r32l); O(adds_l_four_r32l); O(adds_l_one_r32l); O(adds_l_two_r32l); O(and_w_imm16_r16l); O(and_l_r32h_r32l); O(and_l_imm32_r32l); O(and_w_r16h_r16l); - O(band_imm3_abs16); O(band_imm3_abs32); O(band_imm3_r32ihh); + O(band_imm3_r32ihh); O(bcc_rel16); - O(bclr_imm3_abs16); O(bclr_r8h_abs16); O(bclr_imm3_abs32); O(bclr_imm3_r32ihh); O(bclr_r8h_abs32); O(bclr_r8h_r32ihh); + O(bclr_imm3_r32ihh); O(bclr_r8h_r32ihh); O(bcs_rel16); O(beq_rel16); O(bf_rel16); O(bge_rel16); O(bgt_rel16); O(bhi_rel16); - O(biand_imm3_abs16); O(biand_imm3_abs32); O(biand_imm3_r32ihh); - O(bild_imm3_abs16); O(bild_imm3_abs32); O(bild_imm3_r32ihh); - O(bior_imm3_abs16); O(bior_imm3_abs32); O(bior_imm3_r32ihh); - O(bist_imm3_abs16); O(bist_imm3_abs32); O(bist_imm3_r32ihh); - O(bixor_imm3_abs16); O(bixor_imm3_abs32); O(bixor_imm3_r32ihh); - O(bld_imm3_abs16); O(bld_imm3_abs32); O(bld_imm3_r32ihh); + O(biand_imm3_r32ihh); + O(bild_imm3_r32ihh); + O(bior_imm3_r32ihh); + O(bist_imm3_r32ihh); + O(bixor_imm3_r32ihh); + O(bld_imm3_r32ihh); O(ble_rel16); O(bls_rel16); O(blt_rel16); O(bmi_rel16); O(bne_rel16); - O(bnot_imm3_abs16); O(bnot_r8h_abs16); O(bnot_imm3_abs32); O(bnot_imm3_r32ihh); O(bnot_r8h_abs32); O(bnot_r8h_r32ihh); - O(bor_imm3_abs16); O(bor_imm3_abs32); O(bor_imm3_r32ihh); + O(bnot_imm3_r32ihh); O(bnot_r8h_r32ihh); + O(bor_imm3_r32ihh); O(bpl_rel16); - O(bset_imm3_abs16); O(bset_r8h_abs16); O(bset_imm3_abs32); O(bset_imm3_r32ihh); O(bset_r8h_abs32); O(bset_r8h_r32ihh); + O(bset_imm3_r32ihh); O(bset_r8h_r32ihh); O(bsr_rel16); O(bsr_rel8); - O(bst_imm3_abs16); O(bst_imm3_abs32); O(bst_imm3_r32ihh); + O(bst_imm3_r32ihh); O(bt_rel16); - O(btst_imm3_abs16); O(btst_r8h_abs16); O(btst_imm3_abs32); O(btst_imm3_r32ihh); O(btst_r8h_abs32); O(btst_r8h_r32ihh); + O(btst_imm3_r32ihh); O(btst_r8h_r32ihh); O(bvc_rel16); O(bvs_rel16); - O(bxor_imm3_abs16); O(bxor_imm3_abs32); O(bxor_imm3_r32ihh); + O(bxor_imm3_r32ihh); O(cmp_w_imm16_r16l); O(cmp_l_r32h_r32l); O(cmp_l_imm32_r32l); O(dec_w_one_r16l); O(dec_w_two_r16l); O(dec_l_one_r32l); O(dec_l_two_r32l); O(divxs_b_r8h_r16l); O(divxs_w_r16h_r32l); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2000.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2000.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2000.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2000.h 2024-03-25 14:00:46.000000000 +0000 @@ -33,7 +33,22 @@ virtual void do_exec_partial() override; #define O(o) void o ## _full(); void o ## _partial() + O(andc_imm8_exr); + O(band_imm3_abs16); O(band_imm3_abs32); + O(bclr_imm3_abs16); O(bclr_r8h_abs16); O(bclr_imm3_abs32); O(bclr_r8h_abs32); + O(biand_imm3_abs16); O(biand_imm3_abs32); + O(bild_imm3_abs16); O(bild_imm3_abs32); + O(bior_imm3_abs16); O(bior_imm3_abs32); + O(bist_imm3_abs16); O(bist_imm3_abs32); + O(bixor_imm3_abs16); O(bixor_imm3_abs32); + O(bld_imm3_abs16); O(bld_imm3_abs32); + O(bnot_imm3_abs16); O(bnot_r8h_abs16); O(bnot_imm3_abs32); O(bnot_r8h_abs32); + O(bor_imm3_abs16); O(bor_imm3_abs32); + O(bset_imm3_abs16); O(bset_r8h_abs16); O(bset_imm3_abs32); O(bset_r8h_abs32); + O(bst_imm3_abs16); O(bst_imm3_abs32); + O(btst_imm3_abs16); O(btst_r8h_abs16); O(btst_imm3_abs32); O(btst_r8h_abs32); + O(bxor_imm3_abs16); O(bxor_imm3_abs32); O(ldc_imm8_exr); O(ldc_r8l_exr); O(ldc_w_abs16_exr); O(ldc_w_abs32_exr); O(ldc_w_r32d16h_exr); O(ldc_w_r32d32hh_exr); O(ldc_w_r32ih_exr); O(ldc_w_r32ph_exr); O(ldm_l_spp_r32n2l); O(ldm_l_spp_r32n3l); O(ldm_l_spp_r32n4l); O(orc_imm8_exr); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2245.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2245.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2245.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2245.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -73,8 +73,7 @@ map(0xfffebd, 0xfffebd).w(m_porte, FUNC(h8_port_device::ddr_w)); map(0xfffebe, 0xfffebe).w(m_portf, FUNC(h8_port_device::ddr_w)); map(0xfffebf, 0xfffebf).w(m_portg, FUNC(h8_port_device::ddr_w)); - map(0xfffec0, 0xfffec1).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); - map(0xfffec2, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icrc_r), FUNC(h8s_intc_device::icrc_w)); + map(0xfffec0, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); map(0xffff2c, 0xffff2c).rw(m_intc, FUNC(h8s_intc_device::iscrh_r), FUNC(h8s_intc_device::iscrh_w)); map(0xffff2d, 0xffff2d).rw(m_intc, FUNC(h8s_intc_device::iscrl_r), FUNC(h8s_intc_device::iscrl_w)); map(0xffff2e, 0xffff2e).rw(m_intc, FUNC(h8s_intc_device::ier_r), FUNC(h8s_intc_device::ier_w)); @@ -190,36 +189,36 @@ H8_PORT(config, m_porte, *this, h8_device::PORT_E, 0x00, 0x00); H8_PORT(config, m_portf, *this, h8_device::PORT_F, 0x00, 0x00); H8_PORT(config, m_portg, *this, h8_device::PORT_G, 0xe0, 0x00); - H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); - H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); + H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); + H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); H8_TIMER16(config, m_timer16, *this, 3, 0x00); H8S_TIMER16_CHANNEL(config, m_timer16_0, *this, 4, 0x60, m_intc, 32, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::INPUT_D); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::INPUT_D); H8S_TIMER16_CHANNEL(config, m_timer16_1, *this, 2, 0x4c, m_intc, 40, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); H8S_TIMER16_CHANNEL(config, m_timer16_2, *this, 2, 0x4c, m_intc, 44, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024); H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); @@ -300,6 +299,20 @@ recompute_bcount(event_time); } +void h8s2245_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_sci[2]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h8s2245_device::device_start() { h8s2000_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2245.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2245.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2245.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2245.h 2024-03-25 14:00:46.000000000 +0000 @@ -102,6 +102,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2319.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2319.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2319.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2319.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,473 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, hap +/*************************************************************************** + + h8s2319.cpp + + H8S-2319 family emulation + +***************************************************************************/ + +#include "emu.h" +#include "h8s2319.h" + +DEFINE_DEVICE_TYPE(H8S2310, h8s2310_device, "h8s2310", "Hitachi H8S/2310") +DEFINE_DEVICE_TYPE(H8S2311, h8s2311_device, "h8s2311", "Hitachi H8S/2311") +DEFINE_DEVICE_TYPE(H8S2312, h8s2312_device, "h8s2312", "Hitachi H8S/2312") +DEFINE_DEVICE_TYPE(H8S2313, h8s2313_device, "h8s2313", "Hitachi H8S/2313") +DEFINE_DEVICE_TYPE(H8S2315, h8s2315_device, "h8s2315", "Hitachi H8S/2315") +DEFINE_DEVICE_TYPE(H8S2316, h8s2316_device, "h8s2316", "Hitachi H8S/2316") +DEFINE_DEVICE_TYPE(H8S2317, h8s2317_device, "h8s2317", "Hitachi H8S/2317") +DEFINE_DEVICE_TYPE(H8S2318, h8s2318_device, "h8s2318", "Hitachi H8S/2318") +DEFINE_DEVICE_TYPE(H8S2319, h8s2319_device, "h8s2319", "Hitachi H8S/2319") + + +h8s2319_device::h8s2319_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map_delegate, u32 rom_size, u32 ram_size) : + h8s2000_device(mconfig, type, tag, owner, clock, map_delegate), + m_intc(*this, "intc"), + m_adc(*this, "adc"), + m_dtc(*this, "dtc"), + m_portn(*this, "port%u", 1), + m_porta(*this, "port%c", 'a'), + m_timer8(*this, "timer8_%u", 0), + m_timer16(*this, "timer16"), + m_timer16c(*this, "timer16:%u", 0), + m_watchdog(*this, "watchdog"), + m_ram_view(*this, "ram_view"), + m_rom_size(rom_size), + m_ram_size(ram_size), + m_md(rom_size ? 7 : 4) +{ +} + +h8s2319_device::h8s2319_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size) : + h8s2319_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(h8s2319_device::map), this), rom_size, ram_size) +{ +} + +h8s2319_device::h8s2319_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2319, tag, owner, clock, 0x80000, 0x2000) +{ +} + +h8s2310_device::h8s2310_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2310, tag, owner, clock, 0, 0x800) +{ +} + +h8s2311_device::h8s2311_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2311, tag, owner, clock, 0x8000, 0x800) +{ +} + +h8s2312_device::h8s2312_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2312, tag, owner, clock, 0, 0x2000) +{ +} + +h8s2313_device::h8s2313_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2313, tag, owner, clock, 0x10000, 0x800) +{ +} + +h8s2315_device::h8s2315_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2315, tag, owner, clock, 0x60000, 0x2000) +{ +} + +h8s2316_device::h8s2316_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2316, tag, owner, clock, 0x10000, 0x2000) +{ +} + +h8s2317_device::h8s2317_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2317, tag, owner, clock, 0x20000, 0x2000) +{ +} + +h8s2318_device::h8s2318_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2319_device(mconfig, H8S2318, tag, owner, clock, 0x40000, 0x2000) +{ +} + +void h8s2319_device::map(address_map &map) +{ + if(m_rom_size && m_md >= 6) + map(0x000000, m_rom_size - 1).rom(); + + map(0xfffc00 - m_ram_size, 0xfffbff).view(m_ram_view); + m_ram_view[0](0xfffc00 - m_ram_size, 0xfffbff).ram().share(m_internal_ram); + + map(0xfffe80, 0xfffe80).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xfffe81, 0xfffe81).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xfffe82, 0xfffe83).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xfffe84, 0xfffe84).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xfffe85, 0xfffe85).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xfffe86, 0xfffe87).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xfffe88, 0xfffe8f).rw(m_timer16c[3], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xfffe90, 0xfffe90).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xfffe91, 0xfffe91).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xfffe92, 0xfffe92).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xfffe94, 0xfffe94).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xfffe95, 0xfffe95).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xfffe96, 0xfffe97).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xfffe98, 0xfffe9b).rw(m_timer16c[4], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xfffea0, 0xfffea0).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xfffea1, 0xfffea1).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xfffea2, 0xfffea2).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xfffea4, 0xfffea4).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xfffea5, 0xfffea5).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xfffea6, 0xfffea7).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xfffea8, 0xfffeab).rw(m_timer16c[5], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + + map(0xfffeb0, 0xfffeb0).w(m_portn[0], FUNC(h8_port_device::ddr_w)); + map(0xfffeb1, 0xfffeb1).w(m_portn[1], FUNC(h8_port_device::ddr_w)); + map(0xfffeb2, 0xfffeb2).w(m_portn[2], FUNC(h8_port_device::ddr_w)); + map(0xfffeb9, 0xfffeb9).w(m_porta[0], FUNC(h8_port_device::ddr_w)); + map(0xfffeba, 0xfffeba).w(m_porta[1], FUNC(h8_port_device::ddr_w)); + map(0xfffebb, 0xfffebb).w(m_porta[2], FUNC(h8_port_device::ddr_w)); + map(0xfffebc, 0xfffebc).w(m_porta[3], FUNC(h8_port_device::ddr_w)); + map(0xfffebd, 0xfffebd).w(m_porta[4], FUNC(h8_port_device::ddr_w)); + map(0xfffebe, 0xfffebe).w(m_porta[5], FUNC(h8_port_device::ddr_w)); + map(0xfffebf, 0xfffebf).w(m_porta[6], FUNC(h8_port_device::ddr_w)); + + map(0xfffec4, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); + map(0xffff2c, 0xffff2c).rw(m_intc, FUNC(h8s_intc_device::iscrh_r), FUNC(h8s_intc_device::iscrh_w)); + map(0xffff2d, 0xffff2d).rw(m_intc, FUNC(h8s_intc_device::iscrl_r), FUNC(h8s_intc_device::iscrl_w)); + map(0xffff2e, 0xffff2e).rw(m_intc, FUNC(h8s_intc_device::ier_r), FUNC(h8s_intc_device::ier_w)); + map(0xffff2f, 0xffff2f).rw(m_intc, FUNC(h8s_intc_device::isr_r), FUNC(h8s_intc_device::isr_w)); + map(0xffff30, 0xffff34).rw(m_dtc, FUNC(h8_dtc_device::dtcer_r), FUNC(h8_dtc_device::dtcer_w)); + map(0xffff37, 0xffff37).rw(m_dtc, FUNC(h8_dtc_device::dtvecr_r), FUNC(h8_dtc_device::dtvecr_w)); + map(0xffff38, 0xffff38).rw(FUNC(h8s2319_device::sbycr_r), FUNC(h8s2319_device::sbycr_w)); + map(0xffff39, 0xffff39).rw(FUNC(h8s2319_device::syscr_r), FUNC(h8s2319_device::syscr_w)); + map(0xffff3b, 0xffff3b).r(FUNC(h8s2319_device::mdcr_r)); + + map(0xffff50, 0xffff50).r(m_portn[0], FUNC(h8_port_device::port_r)); + map(0xffff51, 0xffff51).r(m_portn[1], FUNC(h8_port_device::port_r)); + map(0xffff52, 0xffff52).r(m_portn[2], FUNC(h8_port_device::port_r)); + map(0xffff53, 0xffff53).r(m_portn[3], FUNC(h8_port_device::port_r)); + map(0xffff59, 0xffff59).r(m_porta[0], FUNC(h8_port_device::port_r)); + map(0xffff5a, 0xffff5a).r(m_porta[1], FUNC(h8_port_device::port_r)); + map(0xffff5b, 0xffff5b).r(m_porta[2], FUNC(h8_port_device::port_r)); + map(0xffff5c, 0xffff5c).r(m_porta[3], FUNC(h8_port_device::port_r)); + map(0xffff5d, 0xffff5d).r(m_porta[4], FUNC(h8_port_device::port_r)); + map(0xffff5e, 0xffff5e).r(m_porta[5], FUNC(h8_port_device::port_r)); + map(0xffff5f, 0xffff5f).r(m_porta[6], FUNC(h8_port_device::port_r)); + map(0xffff60, 0xffff60).rw(m_portn[0], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff61, 0xffff61).rw(m_portn[1], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff62, 0xffff62).rw(m_portn[2], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff69, 0xffff69).rw(m_porta[0], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6a, 0xffff6a).rw(m_porta[1], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6b, 0xffff6b).rw(m_porta[2], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6c, 0xffff6c).rw(m_porta[3], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6d, 0xffff6d).rw(m_porta[4], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6e, 0xffff6e).rw(m_porta[5], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff6f, 0xffff6f).rw(m_porta[6], FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff70, 0xffff70).rw(m_porta[0], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffff71, 0xffff71).rw(m_porta[1], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffff72, 0xffff72).rw(m_porta[2], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffff73, 0xffff73).rw(m_porta[3], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffff74, 0xffff74).rw(m_porta[4], FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); + map(0xffff76, 0xffff76).rw(m_portn[2], FUNC(h8_port_device::odr_r), FUNC(h8_port_device::odr_w)); + map(0xffff77, 0xffff77).rw(m_porta[0], FUNC(h8_port_device::odr_r), FUNC(h8_port_device::odr_w)); + + map(0xffff78, 0xffff78).rw(m_sci[0], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffff79, 0xffff79).rw(m_sci[0], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffff7a, 0xffff7a).rw(m_sci[0], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffff7b, 0xffff7b).rw(m_sci[0], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffff7c, 0xffff7c).rw(m_sci[0], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffff7d, 0xffff7d).r(m_sci[0], FUNC(h8_sci_device::rdr_r)); + map(0xffff7e, 0xffff7e).rw(m_sci[0], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); + map(0xffff80, 0xffff80).rw(m_sci[1], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffff81, 0xffff81).rw(m_sci[1], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffff82, 0xffff82).rw(m_sci[1], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffff83, 0xffff83).rw(m_sci[1], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffff84, 0xffff84).rw(m_sci[1], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffff85, 0xffff85).r(m_sci[1], FUNC(h8_sci_device::rdr_r)); + map(0xffff86, 0xffff86).rw(m_sci[1], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); + + map(0xffff90, 0xffff97).r(m_adc, FUNC(h8_adc_device::addr8_r)); + map(0xffff98, 0xffff98).rw(m_adc, FUNC(h8_adc_device::adcsr_r), FUNC(h8_adc_device::adcsr_w)); + map(0xffff99, 0xffff99).rw(m_adc, FUNC(h8_adc_device::adcr_r), FUNC(h8_adc_device::adcr_w)); + + map(0xffffb0, 0xffffb0).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); + map(0xffffb1, 0xffffb1).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); + map(0xffffb2, 0xffffb2).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); + map(0xffffb3, 0xffffb3).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); + map(0xffffb4, 0xffffb7).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)).umask16(0xff00); + map(0xffffb4, 0xffffb7).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)).umask16(0x00ff); + map(0xffffb8, 0xffffb8).rw(m_timer8[0], FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); + map(0xffffb9, 0xffffb9).rw(m_timer8[1], FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); + + map(0xffffbc, 0xffffbd).rw(m_watchdog, FUNC(h8_watchdog_device::wd_r), FUNC(h8_watchdog_device::wd_w)); + map(0xffffbe, 0xffffbf).rw(m_watchdog, FUNC(h8_watchdog_device::rst_r), FUNC(h8_watchdog_device::rst_w)); + map(0xffffc0, 0xffffc0).rw(m_timer16, FUNC(h8_timer16_device::tstr_r), FUNC(h8_timer16_device::tstr_w)); + map(0xffffc1, 0xffffc1).rw(m_timer16, FUNC(h8_timer16_device::tsyr_r), FUNC(h8_timer16_device::tsyr_w)); + + map(0xffffd0, 0xffffd0).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffffd1, 0xffffd1).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xffffd2, 0xffffd3).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffffd4, 0xffffd4).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffffd5, 0xffffd5).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffffd6, 0xffffd7).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffffd8, 0xffffdf).rw(m_timer16c[0], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xffffe0, 0xffffe0).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xffffe1, 0xffffe1).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xffffe2, 0xffffe2).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xffffe4, 0xffffe4).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xffffe5, 0xffffe5).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xffffe6, 0xffffe7).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xffffe8, 0xffffeb).rw(m_timer16c[1], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); + map(0xfffff0, 0xfffff0).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); + map(0xfffff1, 0xfffff1).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); + map(0xfffff2, 0xfffff2).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); + map(0xfffff4, 0xfffff4).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); + map(0xfffff5, 0xfffff5).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); + map(0xfffff6, 0xfffff7).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); + map(0xfffff8, 0xfffffb).rw(m_timer16c[2], FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); +} + +void h8s2319_device::device_add_mconfig(machine_config &config) +{ + H8S_INTC(config, m_intc, *this); + H8_ADC_2319(config, m_adc, *this, m_intc, 28); + H8_DTC(config, m_dtc, *this, m_intc, 24); + H8_PORT(config, m_portn[0], *this, h8_device::PORT_1, 0x00, 0x00); + H8_PORT(config, m_portn[1], *this, h8_device::PORT_2, 0x00, 0x00); + H8_PORT(config, m_portn[2], *this, h8_device::PORT_3, 0x00, 0xc0); + H8_PORT(config, m_portn[3], *this, h8_device::PORT_4, 0x00, 0x00); + H8_PORT(config, m_porta[0], *this, h8_device::PORT_A, 0x00, 0xf0); + H8_PORT(config, m_porta[1], *this, h8_device::PORT_B, 0x00, 0x00); + H8_PORT(config, m_porta[2], *this, h8_device::PORT_C, 0x00, 0x00); + H8_PORT(config, m_porta[3], *this, h8_device::PORT_D, 0x00, 0x00); + H8_PORT(config, m_porta[4], *this, h8_device::PORT_E, 0x00, 0x00); + H8_PORT(config, m_porta[5], *this, h8_device::PORT_F, 0x00, 0x00); + H8_PORT(config, m_porta[6], *this, h8_device::PORT_G, 0x00, 0xe0); + H8H_TIMER8_CHANNEL(config, m_timer8[0], *this, m_intc, 64, 65, 66, m_timer8[1], h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); + H8H_TIMER8_CHANNEL(config, m_timer8[1], *this, m_intc, 68, 69, 70, m_timer8[0], h8_timer8_channel_device::CHAIN_A, false, false); + H8_TIMER16(config, m_timer16, *this, 6, 0x00); + H8S_TIMER16_CHANNEL(config, m_timer16c[0], *this, 4, 0x60, m_intc, 32, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::INPUT_D); + H8S_TIMER16_CHANNEL(config, m_timer16c[1], *this, 2, 0x4c, m_intc, 40, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16c[2]); + H8S_TIMER16_CHANNEL(config, m_timer16c[2], *this, 2, 0x4c, m_intc, 44, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024); + H8S_TIMER16_CHANNEL(config, m_timer16c[3], *this, 4, 0x60, m_intc, 48, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::DIV_4096); + H8S_TIMER16_CHANNEL(config, m_timer16c[4], *this, 2, 0x4c, m_intc, 56, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16c[5]); + H8S_TIMER16_CHANNEL(config, m_timer16c[5], *this, 2, 0x4c, m_intc, 60, + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::INPUT_D); + H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); + H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); + H8_WATCHDOG(config, m_watchdog, *this, m_intc, 25, h8_watchdog_device::S); +} + +void h8s2319_device::execute_set_input(int inputnum, int state) +{ + m_intc->set_input(inputnum, state); +} + +bool h8s2319_device::exr_in_stack() const +{ + return m_syscr & 0x20; +} + +int h8s2319_device::trace_setup() +{ + m_CCR |= F_I; + m_EXR &= ~EXR_T; + return 5; +} + +int h8s2319_device::trapa_setup() +{ + m_CCR |= F_I; + if(m_syscr & 0x20) + m_EXR &= ~EXR_T; + return 8; +} + +void h8s2319_device::irq_setup() +{ + switch(m_syscr & 0x30) { + case 0x00: + m_CCR |= F_I; + break; + case 0x20: + m_EXR = m_EXR & (EXR_NC); + if(m_taken_irq_level == 8) + m_EXR |= 7; + else + m_EXR |= m_taken_irq_level; + break; + } +} + +void h8s2319_device::update_irq_filter() +{ + switch(m_syscr & 0x30) { + case 0x00: + if(m_CCR & F_I) + m_intc->set_filter(2, -1); + else + m_intc->set_filter(0, -1); + break; + case 0x20: + m_intc->set_filter(0, m_EXR & 7); + break; + } +} + +void h8s2319_device::interrupt_taken() +{ + standard_irq_callback(m_intc->interrupt_taken(m_taken_irq_vector), m_NPC); +} + +void h8s2319_device::internal_update(u64 current_time) +{ + u64 event_time = 0; + + add_event(event_time, m_adc->internal_update(current_time)); + add_event(event_time, m_sci[0]->internal_update(current_time)); + add_event(event_time, m_sci[1]->internal_update(current_time)); + + // SCI2 used by H8S-2329 + if(m_sci[2]) + add_event(event_time, m_sci[2]->internal_update(current_time)); + + add_event(event_time, m_timer8[0]->internal_update(current_time)); + add_event(event_time, m_timer8[1]->internal_update(current_time)); + add_event(event_time, m_timer16c[0]->internal_update(current_time)); + add_event(event_time, m_timer16c[1]->internal_update(current_time)); + add_event(event_time, m_timer16c[2]->internal_update(current_time)); + add_event(event_time, m_timer16c[3]->internal_update(current_time)); + add_event(event_time, m_timer16c[4]->internal_update(current_time)); + add_event(event_time, m_timer16c[5]->internal_update(current_time)); + add_event(event_time, m_watchdog->internal_update(current_time)); + + recompute_bcount(event_time); +} + +void h8s2319_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_timer8[0]->notify_standby(state); + m_timer8[1]->notify_standby(state); + + for (auto & timer16c : m_timer16c) + timer16c->notify_standby(state); + + m_watchdog->notify_standby(state); +} + +void h8s2319_device::device_start() +{ + h8s2000_device::device_start(); + m_dtc_device = m_dtc; + + m_sbycr = 0; + m_syscr = 0; + + save_item(NAME(m_md)); + save_item(NAME(m_sbycr)); + save_item(NAME(m_syscr)); +} + +void h8s2319_device::device_reset() +{ + h8s2000_device::device_reset(); + + m_sbycr = 0x08; + m_syscr = 0x01; + m_ram_view.select(0); +} + +u8 h8s2319_device::sbycr_r() +{ + return m_sbycr; +} + +void h8s2319_device::sbycr_w(u8 data) +{ + logerror("sbycr = %02x\n", data); + + // SSBY + m_standby_pending = bool(data & 0x80); + + m_sbycr = data & 0xf9; +} + +u8 h8s2319_device::syscr_r() +{ + return m_syscr; +} + +void h8s2319_device::syscr_w(u8 data) +{ + logerror("syscr = %02x\n", data); + + // RAME + if(data & 1) + m_ram_view.select(0); + else + m_ram_view.disable(); + + // NMIEG + m_intc->set_nmi_edge(BIT(data, 3)); + + // INTM0/1 + m_syscr = data; + update_irq_filter(); +} + +u8 h8s2319_device::mdcr_r() +{ + if(!machine().side_effects_disabled()) + logerror("mdcr_r\n"); + return (m_md & 0x07) | 0x80; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2319.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2319.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2319.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2319.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,164 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, hap +/*************************************************************************** + + h8s2319.h + + H8S-2319 family emulation + + H8S/2000-based mcus. + + Variant ROM RAM + H8S/2310 - 2K + H8S/2311 32K 2K + H8S/2312 - 8K + H8S/2313 64K 2K + H8S/2315 384K 8K + H8S/2316 64K 8K + H8S/2317 128K 8K + H8S/2318 256K 8K + H8S/2319 512K 8K + +***************************************************************************/ + +#ifndef MAME_CPU_H8_H8S2319_H +#define MAME_CPU_H8_H8S2319_H + +#pragma once + +#include "h8s2000.h" +#include "h8_intc.h" +#include "h8_adc.h" +#include "h8_dtc.h" +#include "h8_port.h" +#include "h8_timer8.h" +#include "h8_timer16.h" +#include "h8_sci.h" +#include "h8_watchdog.h" + +class h8s2319_device : public h8s2000_device { +public: + h8s2319_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // I/O ports + auto read_port1() { return m_read_port [PORT_1].bind(); } + auto write_port1() { return m_write_port[PORT_1].bind(); } + auto read_port2() { return m_read_port [PORT_2].bind(); } + auto write_port2() { return m_write_port[PORT_2].bind(); } + auto read_port3() { return m_read_port [PORT_3].bind(); } + auto write_port3() { return m_write_port[PORT_3].bind(); } + auto read_port4() { return m_read_port [PORT_4].bind(); } + + auto read_porta() { return m_read_port [PORT_A].bind(); } + auto write_porta() { return m_write_port[PORT_A].bind(); } + auto read_portb() { return m_read_port [PORT_B].bind(); } + auto write_portb() { return m_write_port[PORT_B].bind(); } + auto read_portc() { return m_read_port [PORT_C].bind(); } + auto write_portc() { return m_write_port[PORT_C].bind(); } + auto read_portd() { return m_read_port [PORT_D].bind(); } + auto write_portd() { return m_write_port[PORT_D].bind(); } + auto read_porte() { return m_read_port [PORT_E].bind(); } + auto write_porte() { return m_write_port[PORT_E].bind(); } + auto read_portf() { return m_read_port [PORT_F].bind(); } + auto write_portf() { return m_write_port[PORT_F].bind(); } + auto read_portg() { return m_read_port [PORT_G].bind(); } + auto write_portg() { return m_write_port[PORT_G].bind(); } + + // MD pins, default mode 7 (single chip), or mode 4 (ROMless) + void set_mode(u8 mode) { m_md = mode & 7; } + + u8 sbycr_r(); + void sbycr_w(u8 data); + u8 syscr_r(); + void syscr_w(u8 data); + u8 mdcr_r(); + +protected: + required_device m_intc; + required_device m_adc; + required_device m_dtc; + required_device_array m_portn; + required_device_array m_porta; + required_device_array m_timer8; + required_device m_timer16; + required_device_array m_timer16c; + required_device m_watchdog; + + memory_view m_ram_view; + + u32 m_rom_size; + u32 m_ram_size; + u8 m_md; + u8 m_sbycr; + u8 m_syscr; + + h8s2319_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map_delegate, u32 rom_size, u32 ram_size); + h8s2319_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size); + + virtual bool exr_in_stack() const override; + virtual void update_irq_filter() override; + virtual void interrupt_taken() override; + virtual int trace_setup() override; + virtual int trapa_setup() override; + virtual void irq_setup() override; + virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; + virtual void device_add_mconfig(machine_config &config) override; + void map(address_map &map); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void execute_set_input(int inputnum, int state) override; +}; + +class h8s2310_device : public h8s2319_device { +public: + h8s2310_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2311_device : public h8s2319_device { +public: + h8s2311_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2312_device : public h8s2319_device { +public: + h8s2312_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2313_device : public h8s2319_device { +public: + h8s2313_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2315_device : public h8s2319_device { +public: + h8s2315_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2316_device : public h8s2319_device { +public: + h8s2316_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2317_device : public h8s2319_device { +public: + h8s2317_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2318_device : public h8s2319_device { +public: + h8s2318_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +DECLARE_DEVICE_TYPE(H8S2310, h8s2310_device) +DECLARE_DEVICE_TYPE(H8S2311, h8s2311_device) +DECLARE_DEVICE_TYPE(H8S2312, h8s2312_device) +DECLARE_DEVICE_TYPE(H8S2313, h8s2313_device) +DECLARE_DEVICE_TYPE(H8S2315, h8s2315_device) +DECLARE_DEVICE_TYPE(H8S2316, h8s2316_device) +DECLARE_DEVICE_TYPE(H8S2317, h8s2317_device) +DECLARE_DEVICE_TYPE(H8S2318, h8s2318_device) +DECLARE_DEVICE_TYPE(H8S2319, h8s2319_device) + +#endif // MAME_CPU_H8_H8S2319_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2320.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2320.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2320.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2320.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,464 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert -#include "emu.h" -#include "h8s2320.h" - -DEFINE_DEVICE_TYPE(H8S2320, h8s2320_device, "h8s2320", "Hitachi H8S/2320") -DEFINE_DEVICE_TYPE(H8S2321, h8s2321_device, "h8s2321", "Hitachi H8S/2321") -DEFINE_DEVICE_TYPE(H8S2322, h8s2322_device, "h8s2322", "Hitachi H8S/2322") -DEFINE_DEVICE_TYPE(H8S2323, h8s2323_device, "h8s2323", "Hitachi H8S/2323") -DEFINE_DEVICE_TYPE(H8S2324, h8s2324_device, "h8s2324", "Hitachi H8S/2324") -DEFINE_DEVICE_TYPE(H8S2326, h8s2326_device, "h8s2326", "Hitachi H8S/2326") -DEFINE_DEVICE_TYPE(H8S2327, h8s2327_device, "h8s2327", "Hitachi H8S/2327") -DEFINE_DEVICE_TYPE(H8S2328, h8s2328_device, "h8s2328", "Hitachi H8S/2328") -DEFINE_DEVICE_TYPE(H8S2329, h8s2329_device, "h8s2329", "Hitachi H8S/2329") - - -h8s2320_device::h8s2320_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 start) : - h8s2000_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(h8s2320_device::map), this)), - m_intc(*this, "intc"), - m_adc(*this, "adc"), - m_dma(*this, "dma"), - m_dma0(*this, "dma:0"), - m_dma1(*this, "dma:1"), - m_dtc(*this, "dtc"), - m_port1(*this, "port1"), - m_port2(*this, "port2"), - m_port3(*this, "port3"), - m_port4(*this, "port4"), - m_port5(*this, "port5"), - m_port6(*this, "port6"), - m_porta(*this, "porta"), - m_portb(*this, "portb"), - m_portc(*this, "portc"), - m_portd(*this, "portd"), - m_porte(*this, "porte"), - m_portf(*this, "portf"), - m_portg(*this, "portg"), - m_timer8_0(*this, "timer8_0"), - m_timer8_1(*this, "timer8_1"), - m_timer16(*this, "timer16"), - m_timer16_0(*this, "timer16:0"), - m_timer16_1(*this, "timer16:1"), - m_timer16_2(*this, "timer16:2"), - m_timer16_3(*this, "timer16:3"), - m_timer16_4(*this, "timer16:4"), - m_timer16_5(*this, "timer16:5"), - m_watchdog(*this, "watchdog"), - m_tend_cb(*this), - m_ram_start(start), - m_syscr(0) -{ -} - -h8s2320_device::h8s2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2320, tag, owner, clock, 0xffec00) -{ -} - -h8s2321_device::h8s2321_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2321, tag, owner, clock, 0xffec00) -{ -} - -h8s2322_device::h8s2322_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2322, tag, owner, clock, 0xffdc00) -{ -} - -h8s2323_device::h8s2323_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2323, tag, owner, clock, 0xffdc00) -{ -} - -h8s2324_device::h8s2324_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2324, tag, owner, clock, 0xff7c00) -{ -} - -h8s2326_device::h8s2326_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2326, tag, owner, clock, 0xffdc00) -{ -} - -h8s2327_device::h8s2327_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2327, tag, owner, clock, 0xffdc00) -{ -} - -h8s2328_device::h8s2328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2328, tag, owner, clock, 0xffdc00) -{ -} - -h8s2329_device::h8s2329_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - h8s2320_device(mconfig, H8S2329, tag, owner, clock, 0xff7c00) -{ -} - -void h8s2320_device::map(address_map &map) -{ - map(m_ram_start, 0xfffbff).ram(); - - map(0xfffe80, 0xfffe80).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xfffe81, 0xfffe81).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xfffe82, 0xfffe83).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xfffe84, 0xfffe84).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xfffe85, 0xfffe85).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xfffe86, 0xfffe87).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xfffe88, 0xfffe8f).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); - map(0xfffe90, 0xfffe90).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xfffe91, 0xfffe91).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xfffe92, 0xfffe92).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xfffe94, 0xfffe94).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xfffe95, 0xfffe95).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xfffe96, 0xfffe97).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xfffe98, 0xfffe9b).rw(m_timer16_4, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); - map(0xfffea0, 0xfffea0).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xfffea1, 0xfffea1).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xfffea2, 0xfffea2).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xfffea4, 0xfffea4).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xfffea5, 0xfffea5).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xfffea6, 0xfffea7).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xfffea8, 0xfffeab).rw(m_timer16_5, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); - map(0xfffeb0, 0xfffeb0).w(m_port1, FUNC(h8_port_device::ddr_w)); - map(0xfffeb1, 0xfffeb1).w(m_port2, FUNC(h8_port_device::ddr_w)); - map(0xfffeb2, 0xfffeb2).w(m_port3, FUNC(h8_port_device::ddr_w)); - map(0xfffeb4, 0xfffeb4).w(m_port5, FUNC(h8_port_device::ddr_w)); - map(0xfffeb5, 0xfffeb5).w(m_port6, FUNC(h8_port_device::ddr_w)); - map(0xfffeb9, 0xfffeb9).w(m_porta, FUNC(h8_port_device::ddr_w)); - map(0xfffeba, 0xfffeba).w(m_portb, FUNC(h8_port_device::ddr_w)); - map(0xfffebb, 0xfffebb).w(m_portc, FUNC(h8_port_device::ddr_w)); - map(0xfffebc, 0xfffebc).w(m_portd, FUNC(h8_port_device::ddr_w)); - map(0xfffebd, 0xfffebd).w(m_porte, FUNC(h8_port_device::ddr_w)); - map(0xfffebe, 0xfffebe).w(m_portf, FUNC(h8_port_device::ddr_w)); - map(0xfffebf, 0xfffebf).w(m_portg, FUNC(h8_port_device::ddr_w)); - map(0xfffec0, 0xfffec1).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); - map(0xfffec2, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icrc_r), FUNC(h8s_intc_device::icrc_w)); - map(0xfffec4, 0xfffecd).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); - map(0xfffece, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::iprk_r), FUNC(h8s_intc_device::iprk_w)); - - if(type() != H8S2321) { - map(0xfffee0, 0xfffee1).rw(m_dma0, FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); - map(0xfffee2, 0xfffee3).rw(m_dma0, FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); - map(0xfffee4, 0xfffee5).rw(m_dma0, FUNC(h8s_dma_channel_device::ioara_r), FUNC(h8s_dma_channel_device::ioara_w)); - map(0xfffee6, 0xfffee7).rw(m_dma0, FUNC(h8s_dma_channel_device::etcra_r), FUNC(h8s_dma_channel_device::etcra_w)); - map(0xfffee8, 0xfffee9).rw(m_dma0, FUNC(h8s_dma_channel_device::marbh_r), FUNC(h8s_dma_channel_device::marbh_w)); - map(0xfffeea, 0xfffeeb).rw(m_dma0, FUNC(h8s_dma_channel_device::marbl_r), FUNC(h8s_dma_channel_device::marbl_w)); - map(0xfffeec, 0xfffeed).rw(m_dma0, FUNC(h8s_dma_channel_device::ioarb_r), FUNC(h8s_dma_channel_device::ioarb_w)); - map(0xfffeee, 0xfffeef).rw(m_dma0, FUNC(h8s_dma_channel_device::etcrb_r), FUNC(h8s_dma_channel_device::etcrb_w)); - map(0xfffef0, 0xfffef1).rw(m_dma1, FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); - map(0xfffef2, 0xfffef3).rw(m_dma1, FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); - map(0xfffef4, 0xfffef5).rw(m_dma1, FUNC(h8s_dma_channel_device::ioara_r), FUNC(h8s_dma_channel_device::ioara_w)); - map(0xfffef6, 0xfffef7).rw(m_dma1, FUNC(h8s_dma_channel_device::etcra_r), FUNC(h8s_dma_channel_device::etcra_w)); - map(0xfffef8, 0xfffef9).rw(m_dma1, FUNC(h8s_dma_channel_device::marbh_r), FUNC(h8s_dma_channel_device::marbh_w)); - map(0xfffefa, 0xfffefb).rw(m_dma1, FUNC(h8s_dma_channel_device::marbl_r), FUNC(h8s_dma_channel_device::marbl_w)); - map(0xfffefc, 0xfffefd).rw(m_dma1, FUNC(h8s_dma_channel_device::ioarb_r), FUNC(h8s_dma_channel_device::ioarb_w)); - map(0xfffefe, 0xfffeff).rw(m_dma1, FUNC(h8s_dma_channel_device::etcrb_r), FUNC(h8s_dma_channel_device::etcrb_w)); - map(0xffff00, 0xffff00).rw(m_dma, FUNC(h8s_dma_device::dmawer_r), FUNC(h8s_dma_device::dmawer_w)); - map(0xffff01, 0xffff01).rw(m_dma, FUNC(h8s_dma_device::dmatcr_r), FUNC(h8s_dma_device::dmatcr_w)); - map(0xffff02, 0xffff03).rw(m_dma0, FUNC(h8s_dma_channel_device::dmacr_r), FUNC(h8s_dma_channel_device::dmacr_w)); - map(0xffff04, 0xffff05).rw(m_dma1, FUNC(h8s_dma_channel_device::dmacr_r), FUNC(h8s_dma_channel_device::dmacr_w)); - map(0xffff06, 0xffff07).rw(m_dma, FUNC(h8s_dma_device::dmabcr_r), FUNC(h8s_dma_device::dmabcr_w)); - } - map(0xffff2c, 0xffff2c).rw(m_intc, FUNC(h8s_intc_device::iscrh_r), FUNC(h8s_intc_device::iscrh_w)); - map(0xffff2d, 0xffff2d).rw(m_intc, FUNC(h8s_intc_device::iscrl_r), FUNC(h8s_intc_device::iscrl_w)); - map(0xffff2e, 0xffff2e).rw(m_intc, FUNC(h8s_intc_device::ier_r), FUNC(h8s_intc_device::ier_w)); - map(0xffff2f, 0xffff2f).rw(m_intc, FUNC(h8s_intc_device::isr_r), FUNC(h8s_intc_device::isr_w)); - map(0xffff30, 0xffff35).rw(m_dtc, FUNC(h8_dtc_device::dtcer_r), FUNC(h8_dtc_device::dtcer_w)); - map(0xffff37, 0xffff37).rw(m_dtc, FUNC(h8_dtc_device::dtvecr_r), FUNC(h8_dtc_device::dtvecr_w)); - map(0xffff39, 0xffff39).rw(FUNC(h8s2320_device::syscr_r), FUNC(h8s2320_device::syscr_w)); - - map(0xffff50, 0xffff50).r(m_port1, FUNC(h8_port_device::port_r)); - map(0xffff51, 0xffff51).r(m_port2, FUNC(h8_port_device::port_r)); - map(0xffff52, 0xffff52).r(m_port3, FUNC(h8_port_device::port_r)); - map(0xffff53, 0xffff53).r(m_port4, FUNC(h8_port_device::port_r)); - map(0xffff54, 0xffff54).r(m_port5, FUNC(h8_port_device::port_r)); - map(0xffff55, 0xffff55).r(m_port6, FUNC(h8_port_device::port_r)); - map(0xffff59, 0xffff59).r(m_porta, FUNC(h8_port_device::port_r)); - map(0xffff5a, 0xffff5a).r(m_portb, FUNC(h8_port_device::port_r)); - map(0xffff5b, 0xffff5b).r(m_portc, FUNC(h8_port_device::port_r)); - map(0xffff5c, 0xffff5c).r(m_portd, FUNC(h8_port_device::port_r)); - map(0xffff5d, 0xffff5d).r(m_porte, FUNC(h8_port_device::port_r)); - map(0xffff5e, 0xffff5e).r(m_portf, FUNC(h8_port_device::port_r)); - map(0xffff5f, 0xffff5f).r(m_portg, FUNC(h8_port_device::port_r)); - map(0xffff60, 0xffff60).rw(m_port1, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff61, 0xffff61).rw(m_port2, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff62, 0xffff62).rw(m_port3, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff64, 0xffff64).rw(m_port5, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff65, 0xffff65).rw(m_port6, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff69, 0xffff69).rw(m_porta, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6a, 0xffff6a).rw(m_portb, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6b, 0xffff6b).rw(m_portc, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6c, 0xffff6c).rw(m_portd, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6d, 0xffff6d).rw(m_porte, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6e, 0xffff6e).rw(m_portf, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff6f, 0xffff6f).rw(m_portg, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); - map(0xffff70, 0xffff70).rw(m_porta, FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); - map(0xffff71, 0xffff71).rw(m_portb, FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); - map(0xffff72, 0xffff72).rw(m_portc, FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); - map(0xffff73, 0xffff73).rw(m_portd, FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); - map(0xffff74, 0xffff74).rw(m_porte, FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w)); - map(0xffff76, 0xffff76).rw(m_port3, FUNC(h8_port_device::odr_r), FUNC(h8_port_device::odr_w)); - map(0xffff77, 0xffff77).rw(m_porta, FUNC(h8_port_device::odr_r), FUNC(h8_port_device::odr_w)); - map(0xffff78, 0xffff78).rw(m_sci[0], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); - map(0xffff79, 0xffff79).rw(m_sci[0], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); - map(0xffff7a, 0xffff7a).rw(m_sci[0], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); - map(0xffff7b, 0xffff7b).rw(m_sci[0], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); - map(0xffff7c, 0xffff7c).rw(m_sci[0], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); - map(0xffff7d, 0xffff7d).r(m_sci[0], FUNC(h8_sci_device::rdr_r)); - map(0xffff7e, 0xffff7e).rw(m_sci[0], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); - map(0xffff80, 0xffff80).rw(m_sci[1], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); - map(0xffff81, 0xffff81).rw(m_sci[1], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); - map(0xffff82, 0xffff82).rw(m_sci[1], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); - map(0xffff83, 0xffff83).rw(m_sci[1], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); - map(0xffff84, 0xffff84).rw(m_sci[1], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); - map(0xffff85, 0xffff85).r(m_sci[1], FUNC(h8_sci_device::rdr_r)); - map(0xffff86, 0xffff86).rw(m_sci[1], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); - map(0xffff88, 0xffff88).rw(m_sci[2], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); - map(0xffff89, 0xffff89).rw(m_sci[2], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); - map(0xffff8a, 0xffff8a).rw(m_sci[2], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); - map(0xffff8b, 0xffff8b).rw(m_sci[2], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); - map(0xffff8c, 0xffff8c).rw(m_sci[2], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); - map(0xffff8d, 0xffff8d).r(m_sci[2], FUNC(h8_sci_device::rdr_r)); - map(0xffff8e, 0xffff8e).rw(m_sci[2], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); - map(0xffff90, 0xffff97).r(m_adc, FUNC(h8_adc_device::addr8_r)); - map(0xffff98, 0xffff98).rw(m_adc, FUNC(h8_adc_device::adcsr_r), FUNC(h8_adc_device::adcsr_w)); - map(0xffff99, 0xffff99).rw(m_adc, FUNC(h8_adc_device::adcr_r), FUNC(h8_adc_device::adcr_w)); - - map(0xffffb0, 0xffffb0).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); - map(0xffffb1, 0xffffb1).rw(m_timer8_1, FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); - map(0xffffb2, 0xffffb2).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); - map(0xffffb3, 0xffffb3).rw(m_timer8_1, FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); - map(0xffffb4, 0xffffb7).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)).umask16(0xff00); - map(0xffffb4, 0xffffb7).rw(m_timer8_1, FUNC(h8_timer8_channel_device::tcor_r), FUNC(h8_timer8_channel_device::tcor_w)).umask16(0x00ff); - map(0xffffb8, 0xffffb8).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); - map(0xffffb9, 0xffffb9).rw(m_timer8_1, FUNC(h8_timer8_channel_device::tcnt_r), FUNC(h8_timer8_channel_device::tcnt_w)); - map(0xffffbc, 0xffffbd).rw(m_watchdog, FUNC(h8_watchdog_device::wd_r), FUNC(h8_watchdog_device::wd_w)); - map(0xffffbe, 0xffffbf).rw(m_watchdog, FUNC(h8_watchdog_device::rst_r), FUNC(h8_watchdog_device::rst_w)); - map(0xffffc0, 0xffffc0).rw(m_timer16, FUNC(h8_timer16_device::tstr_r), FUNC(h8_timer16_device::tstr_w)); - map(0xffffc1, 0xffffc1).rw(m_timer16, FUNC(h8_timer16_device::tsyr_r), FUNC(h8_timer16_device::tsyr_w)); - - map(0xffffd0, 0xffffd0).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xffffd1, 0xffffd1).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xffffd2, 0xffffd3).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xffffd4, 0xffffd4).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xffffd5, 0xffffd5).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xffffd6, 0xffffd7).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xffffd8, 0xffffdf).rw(m_timer16_0, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); - map(0xffffe0, 0xffffe0).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xffffe1, 0xffffe1).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xffffe2, 0xffffe2).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xffffe4, 0xffffe4).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xffffe5, 0xffffe5).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xffffe6, 0xffffe7).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xffffe8, 0xffffeb).rw(m_timer16_1, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); - map(0xfffff0, 0xfffff0).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); - map(0xfffff1, 0xfffff1).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); - map(0xfffff2, 0xfffff2).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); - map(0xfffff4, 0xfffff4).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tier_r), FUNC(h8_timer16_channel_device::tier_w)); - map(0xfffff5, 0xfffff5).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); - map(0xfffff6, 0xfffff7).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); - map(0xfffff8, 0xfffffb).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); -} - -void h8s2320_device::device_add_mconfig(machine_config &config) -{ - H8S_INTC(config, m_intc, *this); - H8_ADC_2320(config, m_adc, *this, m_intc, 28); - if(type() != H8S2321) { - H8S_DMA(config, m_dma, *this); - H8S_DMA_CHANNEL(config, m_dma0, *this, m_dma, m_intc); - H8S_DMA_CHANNEL(config, m_dma1, *this, m_dma, m_intc); - } - H8_DTC(config, m_dtc, *this, m_intc, 24); - H8_PORT(config, m_port1, *this, h8_device::PORT_1, 0x00, 0x00); - H8_PORT(config, m_port2, *this, h8_device::PORT_2, 0x00, 0x00); - H8_PORT(config, m_port3, *this, h8_device::PORT_3, 0xc0, 0xc0); - H8_PORT(config, m_port4, *this, h8_device::PORT_4, 0x00, 0x00); - H8_PORT(config, m_port5, *this, h8_device::PORT_5, 0xf0, 0xf0); - H8_PORT(config, m_port6, *this, h8_device::PORT_6, 0x00, 0x00); - H8_PORT(config, m_porta, *this, h8_device::PORT_A, 0x00, 0x00); - H8_PORT(config, m_portb, *this, h8_device::PORT_B, 0x00, 0x00); - H8_PORT(config, m_portc, *this, h8_device::PORT_C, 0x00, 0x00); - H8_PORT(config, m_portd, *this, h8_device::PORT_D, 0x00, 0x00); - H8_PORT(config, m_porte, *this, h8_device::PORT_E, 0x00, 0x00); - H8_PORT(config, m_portf, *this, h8_device::PORT_F, 0x00, 0x00); - H8_PORT(config, m_portg, *this, h8_device::PORT_G, 0xe0, 0xe0); - H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); - H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); - H8_TIMER16(config, m_timer16, *this, 6, 0x00); - H8S_TIMER16_CHANNEL(config, m_timer16_0, *this, 4, 0x60, m_intc, 32, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::INPUT_D); - H8S_TIMER16_CHANNEL(config, m_timer16_1, *this, 2, 0x4c, m_intc, 40, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); - H8S_TIMER16_CHANNEL(config, m_timer16_2, *this, 2, 0x4c, m_intc, 44, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024); - H8S_TIMER16_CHANNEL(config, m_timer16_3, *this, 4, 0x60, m_intc, 48, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::DIV_4096); - H8S_TIMER16_CHANNEL(config, m_timer16_4, *this, 2, 0x4c, m_intc, 56, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_5); - H8S_TIMER16_CHANNEL(config, m_timer16_5, *this, 2, 0x4c, m_intc, 60, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::INPUT_D); - H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); - H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); - H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); - H8_WATCHDOG(config, m_watchdog, *this, m_intc, 25, h8_watchdog_device::H); -} - -void h8s2320_device::execute_set_input(int inputnum, int state) -{ - if(inputnum == H8_INPUT_LINE_TEND0 || inputnum == H8_INPUT_LINE_TEND1) - m_tend_cb[inputnum - H8_INPUT_LINE_TEND0](state); - else if(inputnum == H8_INPUT_LINE_DREQ0 || inputnum == H8_INPUT_LINE_DREQ1) - m_dma->set_input(inputnum, state); - else - m_intc->set_input(inputnum, state); -} - -bool h8s2320_device::exr_in_stack() const -{ - return m_syscr & 0x20; -} - -int h8s2320_device::trace_setup() -{ - m_CCR |= F_I; - m_EXR &= ~EXR_T; - return 5; -} - -int h8s2320_device::trapa_setup() -{ - m_CCR |= F_I; - if(m_syscr & 0x20) - m_EXR &= ~EXR_T; - return 8; -} - -void h8s2320_device::irq_setup() -{ - switch(m_syscr & 0x30) { - case 0x00: - m_CCR |= F_I; - break; - case 0x20: - m_EXR = m_EXR & (EXR_NC); - if(m_taken_irq_level == 8) - m_EXR |= 7; - else - m_EXR |= m_taken_irq_level; - break; - } -} - -void h8s2320_device::update_irq_filter() -{ - switch(m_syscr & 0x30) { - case 0x00: - if(m_CCR & F_I) - m_intc->set_filter(2, -1); - else - m_intc->set_filter(0, -1); - break; - case 0x20: - m_intc->set_filter(0, m_EXR & 7); - break; - } -} - -void h8s2320_device::interrupt_taken() -{ - standard_irq_callback(m_intc->interrupt_taken(m_taken_irq_vector), m_NPC); -} - -void h8s2320_device::internal_update(u64 current_time) -{ - u64 event_time = 0; - - add_event(event_time, m_adc->internal_update(current_time)); - add_event(event_time, m_sci[0]->internal_update(current_time)); - add_event(event_time, m_sci[1]->internal_update(current_time)); - add_event(event_time, m_sci[2]->internal_update(current_time)); - add_event(event_time, m_timer8_0->internal_update(current_time)); - add_event(event_time, m_timer8_1->internal_update(current_time)); - add_event(event_time, m_timer16_0->internal_update(current_time)); - add_event(event_time, m_timer16_1->internal_update(current_time)); - add_event(event_time, m_timer16_2->internal_update(current_time)); - add_event(event_time, m_timer16_3->internal_update(current_time)); - add_event(event_time, m_timer16_4->internal_update(current_time)); - add_event(event_time, m_timer16_5->internal_update(current_time)); - add_event(event_time, m_watchdog->internal_update(current_time)); - - recompute_bcount(event_time); -} - -void h8s2320_device::device_start() -{ - h8s2000_device::device_start(); - m_dma_device = m_dma; - m_dtc_device = m_dtc; - - save_item(NAME(m_syscr)); -} - -void h8s2320_device::device_reset() -{ - h8s2000_device::device_reset(); - m_syscr = 0x01; -} - -u8 h8s2320_device::syscr_r() -{ - return m_syscr; -} - -void h8s2320_device::syscr_w(u8 data) -{ - m_syscr = data; - m_mac_saturating = m_syscr & 0x80; - update_irq_filter(); - logerror("syscr = %02x\n", data); -} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2320.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2320.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2320.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2320.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,181 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Olivier Galibert -/*************************************************************************** - - h8s2320.h - - H8S-2320 family emulation - - H8S/2600-based mcus. - - Variant ROM RAM - H8S/2320 - 4K - H8S/2321 - 4K - H8S/2322 - 8K - H8S/2323 32K 8K - H8S/2324 - 32K - H8S/2326 512K 8K - H8S/2327 128K 8K - H8S/2328 256K 8K - H8S/2329 384K 32K - - - -***************************************************************************/ - -#ifndef MAME_CPU_H8_H8S2320_H -#define MAME_CPU_H8_H8S2320_H - -#pragma once - -#include "h8s2000.h" -#include "h8_intc.h" -#include "h8_adc.h" -#include "h8_dma.h" -#include "h8_dtc.h" -#include "h8_port.h" -#include "h8_timer8.h" -#include "h8_timer16.h" -#include "h8_sci.h" -#include "h8_watchdog.h" - -class h8s2320_device : public h8s2000_device { -public: - h8s2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - auto read_port1() { return m_read_port [PORT_1].bind(); } - auto write_port1() { return m_write_port[PORT_1].bind(); } - auto read_port2() { return m_read_port [PORT_2].bind(); } - auto write_port2() { return m_write_port[PORT_2].bind(); } - auto read_port3() { return m_read_port [PORT_3].bind(); } - auto write_port3() { return m_write_port[PORT_3].bind(); } - auto read_port4() { return m_read_port [PORT_4].bind(); } - auto read_port5() { return m_read_port [PORT_5].bind(); } - auto write_port5() { return m_write_port[PORT_5].bind(); } - auto read_port6() { return m_read_port [PORT_6].bind(); } - auto write_port6() { return m_write_port[PORT_6].bind(); } - auto read_porta() { return m_read_port [PORT_A].bind(); } - auto write_porta() { return m_write_port[PORT_A].bind(); } - auto read_portb() { return m_read_port [PORT_B].bind(); } - auto write_portb() { return m_write_port[PORT_B].bind(); } - auto read_portc() { return m_read_port [PORT_C].bind(); } - auto write_portc() { return m_write_port[PORT_C].bind(); } - auto read_portd() { return m_read_port [PORT_D].bind(); } - auto write_portd() { return m_write_port[PORT_D].bind(); } - auto read_porte() { return m_read_port [PORT_E].bind(); } - auto write_porte() { return m_write_port[PORT_E].bind(); } - auto read_portf() { return m_read_port [PORT_F].bind(); } - auto write_portf() { return m_write_port[PORT_F].bind(); } - auto read_portg() { return m_read_port [PORT_G].bind(); } - auto write_portg() { return m_write_port[PORT_G].bind(); } - - auto tend0_cb() { return m_tend_cb[0].bind(); } - auto tend1_cb() { return m_tend_cb[1].bind(); } - - u8 syscr_r(); - void syscr_w(u8 data); - -protected: - required_device m_intc; - required_device m_adc; - optional_device m_dma; - optional_device m_dma0; - optional_device m_dma1; - required_device m_dtc; - required_device m_port1; - required_device m_port2; - required_device m_port3; - required_device m_port4; - required_device m_port5; - required_device m_port6; - required_device m_porta; - required_device m_portb; - required_device m_portc; - required_device m_portd; - required_device m_porte; - required_device m_portf; - required_device m_portg; - required_device m_timer8_0; - required_device m_timer8_1; - required_device m_timer16; - required_device m_timer16_0; - required_device m_timer16_1; - required_device m_timer16_2; - required_device m_timer16_3; - required_device m_timer16_4; - required_device m_timer16_5; - required_device m_watchdog; - - devcb_write_line::array<2> m_tend_cb; - - u32 m_ram_start; - u8 m_syscr; - - h8s2320_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 start); - - virtual bool exr_in_stack() const override; - virtual void update_irq_filter() override; - virtual void interrupt_taken() override; - virtual int trace_setup() override; - virtual int trapa_setup() override; - virtual void irq_setup() override; - virtual void internal_update(u64 current_time) override; - virtual void device_add_mconfig(machine_config &config) override; - void map(address_map &map); - - virtual void device_start() override; - virtual void device_reset() override; - virtual void execute_set_input(int inputnum, int state) override; -}; - -class h8s2321_device : public h8s2320_device { -public: - h8s2321_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2322_device : public h8s2320_device { -public: - h8s2322_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2323_device : public h8s2320_device { -public: - h8s2323_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2324_device : public h8s2320_device { -public: - h8s2324_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2326_device : public h8s2320_device { -public: - h8s2326_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2327_device : public h8s2320_device { -public: - h8s2327_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2328_device : public h8s2320_device { -public: - h8s2328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -class h8s2329_device : public h8s2320_device { -public: - h8s2329_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -}; - -DECLARE_DEVICE_TYPE(H8S2320, h8s2320_device) -DECLARE_DEVICE_TYPE(H8S2321, h8s2321_device) -DECLARE_DEVICE_TYPE(H8S2322, h8s2322_device) -DECLARE_DEVICE_TYPE(H8S2323, h8s2323_device) -DECLARE_DEVICE_TYPE(H8S2324, h8s2324_device) -DECLARE_DEVICE_TYPE(H8S2326, h8s2326_device) -DECLARE_DEVICE_TYPE(H8S2327, h8s2327_device) -DECLARE_DEVICE_TYPE(H8S2328, h8s2328_device) -DECLARE_DEVICE_TYPE(H8S2329, h8s2329_device) - -#endif // MAME_CPU_H8_H8S2320_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2329.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2329.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2329.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2329.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,179 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + h8s2329.cpp + + H8S-2329 family emulation + Subdevice of h8s2319.cpp + +***************************************************************************/ + +#include "emu.h" +#include "h8s2329.h" + +DEFINE_DEVICE_TYPE(H8S2320, h8s2320_device, "h8s2320", "Hitachi H8S/2320") +DEFINE_DEVICE_TYPE(H8S2321, h8s2321_device, "h8s2321", "Hitachi H8S/2321") +DEFINE_DEVICE_TYPE(H8S2322, h8s2322_device, "h8s2322", "Hitachi H8S/2322") +DEFINE_DEVICE_TYPE(H8S2323, h8s2323_device, "h8s2323", "Hitachi H8S/2323") +DEFINE_DEVICE_TYPE(H8S2324, h8s2324_device, "h8s2324", "Hitachi H8S/2324") +DEFINE_DEVICE_TYPE(H8S2326, h8s2326_device, "h8s2326", "Hitachi H8S/2326") +DEFINE_DEVICE_TYPE(H8S2327, h8s2327_device, "h8s2327", "Hitachi H8S/2327") +DEFINE_DEVICE_TYPE(H8S2328, h8s2328_device, "h8s2328", "Hitachi H8S/2328") +DEFINE_DEVICE_TYPE(H8S2329, h8s2329_device, "h8s2329", "Hitachi H8S/2329") + + +h8s2321_device::h8s2321_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map_delegate, u32 rom_size, u32 ram_size) : + h8s2319_device(mconfig, type, tag, owner, clock, map_delegate, rom_size, ram_size), + m_port5(*this, "port5"), + m_port6(*this, "port6") +{ +} + +h8s2321_device::h8s2321_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2321_device(mconfig, H8S2321, tag, owner, clock, address_map_constructor(FUNC(h8s2321_device::map_2321), this), 0, 0x1000) +{ +} + + +h8s2320_device::h8s2320_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size) : + h8s2321_device(mconfig, type, tag, owner, clock, address_map_constructor(FUNC(h8s2320_device::map_2320), this), rom_size, ram_size), + m_dma(*this, "dma"), + m_dmac(*this, "dma:%u", 0), + m_tend_cb(*this) +{ +} + +h8s2320_device::h8s2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2320, tag, owner, clock, 0, 0x1000) +{ +} + + +h8s2322_device::h8s2322_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2322, tag, owner, clock, 0, 0x2000) +{ +} + +h8s2323_device::h8s2323_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2323, tag, owner, clock, 0x8000, 0x2000) +{ +} + +h8s2324_device::h8s2324_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2324, tag, owner, clock, 0, 0x8000) +{ +} + +h8s2326_device::h8s2326_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2326, tag, owner, clock, 0x80000, 0x2000) +{ +} + +h8s2327_device::h8s2327_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2327, tag, owner, clock, 0x20000, 0x2000) +{ +} + +h8s2328_device::h8s2328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2328, tag, owner, clock, 0x40000, 0x2000) +{ +} + +h8s2329_device::h8s2329_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + h8s2320_device(mconfig, H8S2329, tag, owner, clock, 0x60000, 0x8000) +{ +} + +void h8s2321_device::map_2321(address_map &map) +{ + h8s2319_device::map(map); + + map(0xfffeb4, 0xfffeb4).w(m_port5, FUNC(h8_port_device::ddr_w)); + map(0xfffeb5, 0xfffeb5).w(m_port6, FUNC(h8_port_device::ddr_w)); + + map(0xffff30, 0xffff35).rw(m_dtc, FUNC(h8_dtc_device::dtcer_r), FUNC(h8_dtc_device::dtcer_w)); + + map(0xffff54, 0xffff54).r(m_port5, FUNC(h8_port_device::port_r)); + map(0xffff55, 0xffff55).r(m_port6, FUNC(h8_port_device::port_r)); + map(0xffff64, 0xffff64).rw(m_port5, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + map(0xffff65, 0xffff65).rw(m_port6, FUNC(h8_port_device::dr_r), FUNC(h8_port_device::dr_w)); + + map(0xffff88, 0xffff88).rw(m_sci[2], FUNC(h8_sci_device::smr_r), FUNC(h8_sci_device::smr_w)); + map(0xffff89, 0xffff89).rw(m_sci[2], FUNC(h8_sci_device::brr_r), FUNC(h8_sci_device::brr_w)); + map(0xffff8a, 0xffff8a).rw(m_sci[2], FUNC(h8_sci_device::scr_r), FUNC(h8_sci_device::scr_w)); + map(0xffff8b, 0xffff8b).rw(m_sci[2], FUNC(h8_sci_device::tdr_r), FUNC(h8_sci_device::tdr_w)); + map(0xffff8c, 0xffff8c).rw(m_sci[2], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); + map(0xffff8d, 0xffff8d).r(m_sci[2], FUNC(h8_sci_device::rdr_r)); + map(0xffff8e, 0xffff8e).rw(m_sci[2], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); +} + +void h8s2320_device::map_2320(address_map &map) +{ + map_2321(map); + + map(0xfffee0, 0xfffee1).rw(m_dmac[0], FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); + map(0xfffee2, 0xfffee3).rw(m_dmac[0], FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); + map(0xfffee4, 0xfffee5).rw(m_dmac[0], FUNC(h8s_dma_channel_device::ioara_r), FUNC(h8s_dma_channel_device::ioara_w)); + map(0xfffee6, 0xfffee7).rw(m_dmac[0], FUNC(h8s_dma_channel_device::etcra_r), FUNC(h8s_dma_channel_device::etcra_w)); + map(0xfffee8, 0xfffee9).rw(m_dmac[0], FUNC(h8s_dma_channel_device::marbh_r), FUNC(h8s_dma_channel_device::marbh_w)); + map(0xfffeea, 0xfffeeb).rw(m_dmac[0], FUNC(h8s_dma_channel_device::marbl_r), FUNC(h8s_dma_channel_device::marbl_w)); + map(0xfffeec, 0xfffeed).rw(m_dmac[0], FUNC(h8s_dma_channel_device::ioarb_r), FUNC(h8s_dma_channel_device::ioarb_w)); + map(0xfffeee, 0xfffeef).rw(m_dmac[0], FUNC(h8s_dma_channel_device::etcrb_r), FUNC(h8s_dma_channel_device::etcrb_w)); + map(0xfffef0, 0xfffef1).rw(m_dmac[1], FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); + map(0xfffef2, 0xfffef3).rw(m_dmac[1], FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); + map(0xfffef4, 0xfffef5).rw(m_dmac[1], FUNC(h8s_dma_channel_device::ioara_r), FUNC(h8s_dma_channel_device::ioara_w)); + map(0xfffef6, 0xfffef7).rw(m_dmac[1], FUNC(h8s_dma_channel_device::etcra_r), FUNC(h8s_dma_channel_device::etcra_w)); + map(0xfffef8, 0xfffef9).rw(m_dmac[1], FUNC(h8s_dma_channel_device::marbh_r), FUNC(h8s_dma_channel_device::marbh_w)); + map(0xfffefa, 0xfffefb).rw(m_dmac[1], FUNC(h8s_dma_channel_device::marbl_r), FUNC(h8s_dma_channel_device::marbl_w)); + map(0xfffefc, 0xfffefd).rw(m_dmac[1], FUNC(h8s_dma_channel_device::ioarb_r), FUNC(h8s_dma_channel_device::ioarb_w)); + map(0xfffefe, 0xfffeff).rw(m_dmac[1], FUNC(h8s_dma_channel_device::etcrb_r), FUNC(h8s_dma_channel_device::etcrb_w)); + map(0xffff00, 0xffff00).rw(m_dma, FUNC(h8s_dma_device::dmawer_r), FUNC(h8s_dma_device::dmawer_w)); + map(0xffff01, 0xffff01).rw(m_dma, FUNC(h8s_dma_device::dmatcr_r), FUNC(h8s_dma_device::dmatcr_w)); + map(0xffff02, 0xffff03).rw(m_dmac[0], FUNC(h8s_dma_channel_device::dmacr_r), FUNC(h8s_dma_channel_device::dmacr_w)); + map(0xffff04, 0xffff05).rw(m_dmac[1], FUNC(h8s_dma_channel_device::dmacr_r), FUNC(h8s_dma_channel_device::dmacr_w)); + map(0xffff06, 0xffff07).rw(m_dma, FUNC(h8s_dma_device::dmabcr_r), FUNC(h8s_dma_device::dmabcr_w)); +} + +void h8s2321_device::notify_standby(int state) +{ + h8s2319_device::notify_standby(state); + m_sci[2]->notify_standby(state); +} + +void h8s2321_device::device_add_mconfig(machine_config &config) +{ + h8s2319_device::device_add_mconfig(config); + + H8_PORT(config, m_port5, *this, h8_device::PORT_5, 0x00, 0xf0); + H8_PORT(config, m_port6, *this, h8_device::PORT_6, 0x00, 0x00); + H8_PORT(config.replace(), m_porta[0], *this, h8_device::PORT_A, 0x00, 0x00); + + H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); +} + +void h8s2320_device::device_add_mconfig(machine_config &config) +{ + h8s2321_device::device_add_mconfig(config); + + H8S_DMA(config, m_dma, *this); + H8S_DMA_CHANNEL(config, m_dmac[0], *this, m_dma, m_intc); + H8S_DMA_CHANNEL(config, m_dmac[1], *this, m_dma, m_intc); +} + +void h8s2320_device::execute_set_input(int inputnum, int state) +{ + // TEND and DREQ pins are not supported on H8S/2321 + if(inputnum == H8_INPUT_LINE_TEND0 || inputnum == H8_INPUT_LINE_TEND1) + m_tend_cb[inputnum - H8_INPUT_LINE_TEND0](state); + else if(inputnum == H8_INPUT_LINE_DREQ0 || inputnum == H8_INPUT_LINE_DREQ1) + m_dma->set_input(inputnum, state); + else + h8s2319_device::execute_set_input(inputnum, state); +} + +void h8s2320_device::device_start() +{ + h8s2321_device::device_start(); + m_dma_device = m_dma; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2329.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2329.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2329.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2329.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,121 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + h8s2329.h + + H8S-2329 family emulation + (compared to H8S-2319 family: adds DMA, 1 more SCI) + + H8S/2000-based mcus. + + Variant ROM RAM note + H8S/2320 - 4K + H8S/2321 - 4K no DMA + H8S/2322 - 8K + H8S/2323 32K 8K + H8S/2324 - 32K + H8S/2326 512K 8K + H8S/2327 128K 8K + H8S/2328 256K 8K + H8S/2329 384K 32K + +***************************************************************************/ + +#ifndef MAME_CPU_H8_H8S2329_H +#define MAME_CPU_H8_H8S2329_H + +#pragma once + +#include "h8s2319.h" +#include "h8_dma.h" + +class h8s2321_device : public h8s2319_device { +public: + h8s2321_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // see h8s2319.h for more + auto read_port5() { return m_read_port [PORT_5].bind(); } + auto write_port5() { return m_write_port[PORT_5].bind(); } + auto read_port6() { return m_read_port [PORT_6].bind(); } + auto write_port6() { return m_write_port[PORT_6].bind(); } + +protected: + h8s2321_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map_delegate, u32 rom_size, u32 ram_size); + + required_device m_port5; + required_device m_port6; + + virtual void notify_standby(int state) override; + virtual void device_add_mconfig(machine_config &config) override; + void map_2321(address_map &map); +}; + +class h8s2320_device : public h8s2321_device { +public: + h8s2320_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + auto tend0_cb() { return m_tend_cb[0].bind(); } + auto tend1_cb() { return m_tend_cb[1].bind(); } + +protected: + required_device m_dma; + required_device_array m_dmac; + + devcb_write_line::array<2> m_tend_cb; + + h8s2320_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 rom_size, u32 ram_size); + + virtual void device_add_mconfig(machine_config &config) override; + void map_2320(address_map &map); + + virtual void device_start() override; + virtual void execute_set_input(int inputnum, int state) override; +}; + +class h8s2322_device : public h8s2320_device { +public: + h8s2322_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2323_device : public h8s2320_device { +public: + h8s2323_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2324_device : public h8s2320_device { +public: + h8s2324_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2326_device : public h8s2320_device { +public: + h8s2326_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2327_device : public h8s2320_device { +public: + h8s2327_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2328_device : public h8s2320_device { +public: + h8s2328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +class h8s2329_device : public h8s2320_device { +public: + h8s2329_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +DECLARE_DEVICE_TYPE(H8S2320, h8s2320_device) +DECLARE_DEVICE_TYPE(H8S2321, h8s2321_device) +DECLARE_DEVICE_TYPE(H8S2322, h8s2322_device) +DECLARE_DEVICE_TYPE(H8S2323, h8s2323_device) +DECLARE_DEVICE_TYPE(H8S2324, h8s2324_device) +DECLARE_DEVICE_TYPE(H8S2326, h8s2326_device) +DECLARE_DEVICE_TYPE(H8S2327, h8s2327_device) +DECLARE_DEVICE_TYPE(H8S2328, h8s2328_device) +DECLARE_DEVICE_TYPE(H8S2329, h8s2329_device) + +#endif // MAME_CPU_H8_H8S2329_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2357.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2357.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2357.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2357.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,7 @@ map(0xfffebd, 0xfffebd).w(m_porte, FUNC(h8_port_device::ddr_w)); map(0xfffebe, 0xfffebe).w(m_portf, FUNC(h8_port_device::ddr_w)); map(0xfffebf, 0xfffebf).w(m_portg, FUNC(h8_port_device::ddr_w)); - map(0xfffec4, 0xfffecd).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); - map(0xfffece, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::iprk_r), FUNC(h8s_intc_device::iprk_w)); + map(0xfffec4, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); map(0xfffee0, 0xfffee1).rw(m_dma0, FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); map(0xfffee2, 0xfffee3).rw(m_dma0, FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); map(0xfffee4, 0xfffee5).rw(m_dma0, FUNC(h8s_dma_channel_device::ioara_r), FUNC(h8s_dma_channel_device::ioara_w)); @@ -250,63 +249,63 @@ H8_PORT(config, m_porte, *this, h8_device::PORT_E, 0x00, 0x00); H8_PORT(config, m_portf, *this, h8_device::PORT_F, 0x00, 0x00); H8_PORT(config, m_portg, *this, h8_device::PORT_G, 0xe0, 0xe0); - H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); - H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); + H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); + H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); H8_TIMER16(config, m_timer16, *this, 6, 0x00); H8S_TIMER16_CHANNEL(config, m_timer16_0, *this, 4, 0x60, m_intc, 32, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::INPUT_D); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::INPUT_D); H8S_TIMER16_CHANNEL(config, m_timer16_1, *this, 2, 0x4c, m_intc, 40, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); H8S_TIMER16_CHANNEL(config, m_timer16_2, *this, 2, 0x4c, m_intc, 44, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024); H8S_TIMER16_CHANNEL(config, m_timer16_3, *this, 4, 0x60, m_intc, 48, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::DIV_4096); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::DIV_4096); H8S_TIMER16_CHANNEL(config, m_timer16_4, *this, 2, 0x4c, m_intc, 56, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_5); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16_5); H8S_TIMER16_CHANNEL(config, m_timer16_5, *this, 2, 0x4c, m_intc, 60, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::INPUT_D); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::INPUT_D); H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); @@ -395,6 +394,23 @@ recompute_bcount(event_time); } +void h8s2357_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_sci[2]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_timer16_5->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h8s2357_device::device_start() { h8s2000_device::device_start(); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2357.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2357.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2357.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2357.h 2024-03-25 14:00:46.000000000 +0000 @@ -110,6 +110,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2600.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2600.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2600.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2600.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -5,7 +5,8 @@ #include "h8s2600d.h" h8s2600_device::h8s2600_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map_delegate) : - h8s2000_device(mconfig, type, tag, owner, clock, map_delegate) + h8s2000_device(mconfig, type, tag, owner, clock, map_delegate), + m_mac_saturating(false) { m_has_mac = true; } @@ -15,4 +16,16 @@ return std::make_unique(); } +void h8s2600_device::device_start() +{ + h8s2000_device::device_start(); + save_item(NAME(m_mac_saturating)); +} + +void h8s2600_device::device_reset() +{ + h8s2000_device::device_reset(); + m_mac_saturating = false; +} + #include "cpu/h8/h8s2600.hxx" diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2600.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2600.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2600.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2600.h 2024-03-25 14:00:46.000000000 +0000 @@ -24,9 +24,14 @@ virtual std::unique_ptr create_disassembler() override; + virtual void device_start() override; + virtual void device_reset() override; + virtual void do_exec_full() override; virtual void do_exec_partial() override; + bool m_mac_saturating; + #define O(o) void o ## _full(); void o ## _partial() O(clrmac); O(ldmac_r32l_mach); O(ldmac_r32l_macl); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2655.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2655.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2655.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2655.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -88,10 +88,8 @@ map(0xfffebd, 0xfffebd).w(m_porte, FUNC(h8_port_device::ddr_w)); map(0xfffebe, 0xfffebe).w(m_portf, FUNC(h8_port_device::ddr_w)); map(0xfffebf, 0xfffebf).w(m_portg, FUNC(h8_port_device::ddr_w)); - map(0xfffec0, 0xfffec1).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); - map(0xfffec2, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icrc_r), FUNC(h8s_intc_device::icrc_w)); - map(0xfffec4, 0xfffecd).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); - map(0xfffece, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::iprk_r), FUNC(h8s_intc_device::iprk_w)); + map(0xfffec0, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); + map(0xfffec4, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); map(0xfffee0, 0xfffee1).rw(m_dma0, FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); map(0xfffee2, 0xfffee3).rw(m_dma0, FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); @@ -230,63 +228,63 @@ H8_PORT(config, m_porte, *this, h8_device::PORT_E, 0x00, 0x00); H8_PORT(config, m_portf, *this, h8_device::PORT_F, 0x00, 0x00); H8_PORT(config, m_portg, *this, h8_device::PORT_G, 0xe0, 0xe0); - H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); - H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); + H8H_TIMER8_CHANNEL(config, m_timer8_0, *this, m_intc, 64, 65, 66, m_timer8_1, h8_timer8_channel_device::CHAIN_OVERFLOW, true, false); + H8H_TIMER8_CHANNEL(config, m_timer8_1, *this, m_intc, 68, 69, 70, m_timer8_0, h8_timer8_channel_device::CHAIN_A, false, false); H8_TIMER16(config, m_timer16, *this, 6, 0x00); H8S_TIMER16_CHANNEL(config, m_timer16_0, *this, 4, 0x60, m_intc, 32, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::INPUT_D); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::INPUT_D); H8S_TIMER16_CHANNEL(config, m_timer16_1, *this, 2, 0x4c, m_intc, 40, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16_2); H8S_TIMER16_CHANNEL(config, m_timer16_2, *this, 2, 0x4c, m_intc, 44, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_B, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_B, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024); H8S_TIMER16_CHANNEL(config, m_timer16_3, *this, 4, 0x60, m_intc, 48, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::DIV_4096); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::DIV_4096); H8S_TIMER16_CHANNEL(config, m_timer16_4, *this, 2, 0x4c, m_intc, 56, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_1024, - h8_timer16_channel_device::CHAIN).set_chain(m_timer16_5); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_1024, + h8_timer16_channel_device::CHAIN).set_chain(m_timer16_5); H8S_TIMER16_CHANNEL(config, m_timer16_5, *this, 2, 0x4c, m_intc, 60, - h8_timer16_channel_device::DIV_1, - h8_timer16_channel_device::DIV_4, - h8_timer16_channel_device::DIV_16, - h8_timer16_channel_device::DIV_64, - h8_timer16_channel_device::INPUT_A, - h8_timer16_channel_device::INPUT_C, - h8_timer16_channel_device::DIV_256, - h8_timer16_channel_device::INPUT_D); + h8_timer16_channel_device::DIV_1, + h8_timer16_channel_device::DIV_4, + h8_timer16_channel_device::DIV_16, + h8_timer16_channel_device::DIV_64, + h8_timer16_channel_device::INPUT_A, + h8_timer16_channel_device::INPUT_C, + h8_timer16_channel_device::DIV_256, + h8_timer16_channel_device::INPUT_D); H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); @@ -408,6 +406,23 @@ recompute_bcount(event_time); } +void h8s2655_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_sci[2]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_timer16_5->notify_standby(state); + m_watchdog->notify_standby(state); +} + void h8s2655_device::device_start() { h8s2600_device::device_start(); @@ -427,7 +442,15 @@ void h8s2655_device::syscr_w(u8 data) { + logerror("syscr = %02x\n", data); + + // NMIEG + m_intc->set_nmi_edge(BIT(data, 3)); + + // MACS + m_mac_saturating = bool(data & 0x80); + + // INTM0/1 m_syscr = data; update_irq_filter(); - logerror("syscr = %02x\n", data); } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2655.h mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2655.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/h8s2655.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/h8s2655.h 2024-03-25 14:00:46.000000000 +0000 @@ -101,6 +101,7 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; void map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/swx00.cpp mame-0.264+dfsg.1/src/devices/cpu/h8/swx00.cpp --- mame-0.263+dfsg.1/src/devices/cpu/h8/swx00.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/swx00.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,8 +7,8 @@ swx00_device::swx00_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, u8 mode) : h8s2000_device(mconfig, SWX00, tag, owner, clock, address_map_constructor(FUNC(swx00_device::map), this)), + device_mixer_interface(mconfig, *this, 2), m_intc(*this, "intc"), -#if 0 m_adc(*this, "adc"), m_dma(*this, "dma"), m_dma0(*this, "dma:0"), @@ -36,18 +36,48 @@ m_timer16_4(*this, "timer16:4"), m_timer16_5(*this, "timer16:5"), m_watchdog(*this, "watchdog"), -#endif - m_data_config(mode & MODE_DUAL ? "s" : "c", ENDIANNESS_BIG, 16, mode & MODE_DUAL ? 24 : 22), + m_swx00(*this, "swx00"), + m_read_pdt(*this, 0xffff), + m_write_pdt(*this), + m_read_pad(*this, 0xff), + m_write_pad(*this), + m_write_cmah(*this), + m_write_txd(*this), + m_s_config("s", ENDIANNESS_BIG, 16, 24, -1), m_mode(mode), m_syscr(0) { m_has_trace = true; + m_program_config.m_name = "c"; + + m_read_pdt.bind().set(*this, FUNC(swx00_device::pdt_default_r)); + m_write_pdt.bind().set(*this, FUNC(swx00_device::pdt_default_w)); + m_read_pad.bind().set(*this, FUNC(swx00_device::pad_default_r)); + m_write_pad.bind().set(*this, FUNC(swx00_device::pad_default_w)); + m_write_cmah.bind().set(*this, FUNC(swx00_device::cmah_default_w)); + m_write_txd.bind().set(*this, FUNC(swx00_device::txd_default_w)); +} + +u16 swx00_device::s_r(offs_t offset) +{ + return m_s.read_word(offset); } void swx00_device::map(address_map &map) { - map(0xffec00, 0xfffbff).ram(); -#if 0 + if(!(m_mode & MODE_DUAL)) + map(0x000000, 0x1fffff).r(FUNC(swx00_device::s_r)); + + map(0xffe000, 0xffefff).m(m_swx00, FUNC(swx00_sound_device::map)); + + map(0xffe027, 0xffe027).r(FUNC(swx00_device::pad_r)); + map(0xffe028, 0xffe029).w(FUNC(swx00_device::pdt_ddr_w)); + map(0xffe02a, 0xffe02b).rw(FUNC(swx00_device::pdt_r), FUNC(swx00_device::pdt_w)); + map(0xffe02d, 0xffe02d).w(FUNC(swx00_device::cmah_w)); + map(0xffe02e, 0xffe02e).w(FUNC(swx00_device::txd_w)); + map(0xffe02f, 0xffe02f).lr8(NAME([]() -> uint8_t { return 0xff; })); + + map(0xfff000, 0xfffbff).ram(); map(0xfffe80, 0xfffe80).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tcr_r), FUNC(h8_timer16_channel_device::tcr_w)); map(0xfffe81, 0xfffe81).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tmdr_r), FUNC(h8_timer16_channel_device::tmdr_w)); map(0xfffe82, 0xfffe83).rw(m_timer16_3, FUNC(h8_timer16_channel_device::tior_r), FUNC(h8_timer16_channel_device::tior_w)); @@ -81,10 +111,8 @@ map(0xfffebd, 0xfffebd).w(m_porte, FUNC(h8_port_device::ddr_w)); map(0xfffebe, 0xfffebe).w(m_portf, FUNC(h8_port_device::ddr_w)); map(0xfffebf, 0xfffebf).w(m_portg, FUNC(h8_port_device::ddr_w)); - map(0xfffec0, 0xfffec1).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); - map(0xfffec2, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icrc_r), FUNC(h8s_intc_device::icrc_w)); - map(0xfffec4, 0xfffecd).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); - map(0xfffece, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::iprk_r), FUNC(h8s_intc_device::iprk_w)); + map(0xfffec0, 0xfffec2).rw(m_intc, FUNC(h8s_intc_device::icr_r), FUNC(h8s_intc_device::icr_w)); + map(0xfffec4, 0xfffece).rw(m_intc, FUNC(h8s_intc_device::ipr_r), FUNC(h8s_intc_device::ipr_w)); map(0xfffee0, 0xfffee1).rw(m_dma0, FUNC(h8s_dma_channel_device::marah_r), FUNC(h8s_dma_channel_device::marah_w)); map(0xfffee2, 0xfffee3).rw(m_dma0, FUNC(h8s_dma_channel_device::maral_r), FUNC(h8s_dma_channel_device::maral_w)); @@ -165,9 +193,9 @@ map(0xffff8c, 0xffff8c).rw(m_sci[2], FUNC(h8_sci_device::ssr_r), FUNC(h8_sci_device::ssr_w)); map(0xffff8d, 0xffff8d).r(m_sci[2], FUNC(h8_sci_device::rdr_r)); map(0xffff8e, 0xffff8e).rw(m_sci[2], FUNC(h8_sci_device::scmr_r), FUNC(h8_sci_device::scmr_w)); - map(0xffff90, 0xffff9f).r(m_adc, FUNC(h8_adc_device::addr16_r)); - map(0xffffa0, 0xffffa0).rw(m_adc, FUNC(h8_adc_device::adcsr_r), FUNC(h8_adc_device::adcsr_w)); - map(0xffffa1, 0xffffa1).rw(m_adc, FUNC(h8_adc_device::adcr_r), FUNC(h8_adc_device::adcr_w)); + map(0xffff90, 0xffff97).r(m_adc, FUNC(h8_adc_device::addr8_r)); + map(0xffff98, 0xffff98).rw(m_adc, FUNC(h8_adc_device::adcsr_r), FUNC(h8_adc_device::adcsr_w)); + map(0xffff99, 0xffff99).rw(m_adc, FUNC(h8_adc_device::adcr_r), FUNC(h8_adc_device::adcr_w)); map(0xffffb0, 0xffffb0).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); map(0xffffb1, 0xffffb1).rw(m_timer8_1, FUNC(h8_timer8_channel_device::tcr_r), FUNC(h8_timer8_channel_device::tcr_w)); map(0xffffb2, 0xffffb2).rw(m_timer8_0, FUNC(h8_timer8_channel_device::tcsr_r), FUNC(h8_timer8_channel_device::tcsr_w)); @@ -201,14 +229,12 @@ map(0xfffff5, 0xfffff5).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tsr_r), FUNC(h8_timer16_channel_device::tsr_w)); map(0xfffff6, 0xfffff7).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tcnt_r), FUNC(h8_timer16_channel_device::tcnt_w)); map(0xfffff8, 0xfffffb).rw(m_timer16_2, FUNC(h8_timer16_channel_device::tgr_r), FUNC(h8_timer16_channel_device::tgr_w)); -#endif } void swx00_device::device_add_mconfig(machine_config &config) { H8S_INTC(config, m_intc, *this); -#if 0 - H8_ADC_2655(config, m_adc, *this, m_intc, 28); + H8_ADC_2357(config, m_adc, *this, m_intc, 28); H8S_DMA(config, m_dma, *this); H8S_DMA_CHANNEL(config, m_dma0, *this, m_dma, m_intc); H8S_DMA_CHANNEL(config, m_dma1, *this, m_dma, m_intc); @@ -282,18 +308,23 @@ h8_timer16_channel_device::INPUT_C, h8_timer16_channel_device::DIV_256, h8_timer16_channel_device::INPUT_D); - H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); + H8_WATCHDOG(config, m_watchdog, *this, m_intc, 25, h8_watchdog_device::S); -#endif H8_SCI(config, m_sci[0], 0, *this, m_intc, 80, 81, 82, 83); H8_SCI(config, m_sci[1], 1, *this, m_intc, 84, 85, 86, 87); + H8_SCI(config, m_sci[2], 2, *this, m_intc, 88, 89, 90, 91); + + SWX00_SOUND(config, m_swx00); + m_swx00->set_space(DEVICE_SELF, AS_S); + m_swx00->add_route(0, DEVICE_SELF, 1.0, AUTO_ALLOC_INPUT, 0); + m_swx00->add_route(1, DEVICE_SELF, 1.0, AUTO_ALLOC_INPUT, 1); } device_memory_interface::space_config_vector swx00_device::memory_space_config() const { return space_config_vector { - std::make_pair(AS_PROGRAM, &m_program_config), - std::make_pair(AS_DATA, &m_data_config) + std::make_pair(AS_C, &m_program_config), + std::make_pair(AS_S, &m_s_config) }; } @@ -395,7 +426,6 @@ void swx00_device::internal_update(u64 current_time) { u64 event_time = 0; -#if 0 add_event(event_time, m_adc->internal_update(current_time)); add_event(event_time, m_sci[0]->internal_update(current_time)); add_event(event_time, m_sci[1]->internal_update(current_time)); @@ -409,21 +439,46 @@ add_event(event_time, m_timer16_4->internal_update(current_time)); add_event(event_time, m_timer16_5->internal_update(current_time)); add_event(event_time, m_watchdog->internal_update(current_time)); -#endif recompute_bcount(event_time); } +void swx00_device::notify_standby(int state) +{ + m_adc->notify_standby(state); + m_sci[0]->notify_standby(state); + m_sci[1]->notify_standby(state); + m_sci[2]->notify_standby(state); + m_timer8_0->notify_standby(state); + m_timer8_1->notify_standby(state); + m_timer16_0->notify_standby(state); + m_timer16_1->notify_standby(state); + m_timer16_2->notify_standby(state); + m_timer16_3->notify_standby(state); + m_timer16_4->notify_standby(state); + m_timer16_5->notify_standby(state); + m_watchdog->notify_standby(state); +} + void swx00_device::device_start() { h8s2000_device::device_start(); save_item(NAME(m_syscr)); + save_item(NAME(m_pdt)); + save_item(NAME(m_pdt_ddr)); + save_item(NAME(m_pad)); + + space(AS_S).specific(m_s); + } void swx00_device::device_reset() { h8s2000_device::device_reset(); m_syscr = 0x01; + m_pdt = 0xffff; + m_pdt_ddr = 0x0000; + m_pad = 0xff; } u8 swx00_device::syscr_r() @@ -437,3 +492,74 @@ update_irq_filter(); logerror("syscr = %02x\n", data); } + +u16 swx00_device::pdt_default_r() +{ + if(!machine().side_effects_disabled()) + logerror("read of un-hooked port pad (PC=%X)\n", m_PPC); + return 0xffff; +} + +void swx00_device::pdt_default_w(u16 data) +{ + logerror("write of un-hooked port pdt %04x\n", data); +} + +u8 swx00_device::pad_default_r() +{ + if(!machine().side_effects_disabled()) + logerror("read of un-hooked port pad (PC=%X)\n", m_PPC); + return 0xff; +} + +void swx00_device::pad_default_w(u8 data) +{ + logerror("write of un-hooked port pad %02x\n", data); +} + +void swx00_device::cmah_default_w(u8 data) +{ + logerror("write of un-hooked port cmah %02x\n", data); +} + +void swx00_device::txd_default_w(u8 data) +{ + logerror("write of un-hooked port txd %02x\n", data); +} + +void swx00_device::pdt_ddr_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_pdt_ddr); +} + +u16 swx00_device::pdt_r() +{ + return (m_pdt & m_pdt_ddr) | (m_read_pdt() & ~m_pdt_ddr); +} + +void swx00_device::pdt_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_pdt); + m_write_pdt(m_pdt | ~m_pdt_ddr); +} + +u8 swx00_device::pad_r() +{ + return m_read_pad(); +} + +void swx00_device::pad_w(u8 data) +{ + m_write_pad(data); +} + +void swx00_device::cmah_w(u8 data) +{ + m_write_cmah(data); +} + +void swx00_device::txd_w(u8 data) +{ + m_write_txd(data); +} + diff -Nru mame-0.263+dfsg.1/src/devices/cpu/h8/swx00.h mame-0.264+dfsg.1/src/devices/cpu/h8/swx00.h --- mame-0.263+dfsg.1/src/devices/cpu/h8/swx00.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/h8/swx00.h 2024-03-25 14:00:46.000000000 +0000 @@ -37,53 +37,34 @@ #include "h8_timer16.h" #include "h8_sci.h" #include "h8_watchdog.h" +#include "sound/swx00.h" -class swx00_device : public h8s2000_device { +class swx00_device : public h8s2000_device, public device_mixer_interface { public: enum { + AS_C = AS_PROGRAM, + AS_S = AS_DATA + }; + + enum { MODE_DUAL = 1, MODE_SEPARATE = 2 }; swx00_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, u8 mode = 0); - int s_bus_id() const { return m_mode & MODE_DUAL ? AS_DATA : AS_PROGRAM; } - int c_bus_id() const { return m_mode & MODE_DUAL ? AS_PROGRAM : AS_DATA; } - -#if 0 - auto read_port1() { return m_read_port [PORT_1].bind(); } - auto write_port1() { return m_write_port[PORT_1].bind(); } - auto read_port2() { return m_read_port [PORT_2].bind(); } - auto write_port2() { return m_write_port[PORT_2].bind(); } - auto read_port3() { return m_read_port [PORT_3].bind(); } - auto write_port3() { return m_write_port[PORT_3].bind(); } - auto read_port4() { return m_read_port [PORT_4].bind(); } - auto read_port5() { return m_read_port [PORT_5].bind(); } - auto write_port5() { return m_write_port[PORT_5].bind(); } - auto read_port6() { return m_read_port [PORT_6].bind(); } - auto write_port6() { return m_write_port[PORT_6].bind(); } - auto read_porta() { return m_read_port [PORT_A].bind(); } - auto write_porta() { return m_write_port[PORT_A].bind(); } - auto read_portb() { return m_read_port [PORT_B].bind(); } - auto write_portb() { return m_write_port[PORT_B].bind(); } - auto read_portc() { return m_read_port [PORT_C].bind(); } - auto write_portc() { return m_write_port[PORT_C].bind(); } - auto read_portd() { return m_read_port [PORT_D].bind(); } - auto write_portd() { return m_write_port[PORT_D].bind(); } - auto read_porte() { return m_read_port [PORT_E].bind(); } - auto write_porte() { return m_write_port[PORT_E].bind(); } - auto read_portf() { return m_read_port [PORT_F].bind(); } - auto write_portf() { return m_write_port[PORT_F].bind(); } - auto read_portg() { return m_read_port [PORT_G].bind(); } - auto write_portg() { return m_write_port[PORT_G].bind(); } -#endif + auto read_pdt() { return m_read_pdt.bind(); } + auto write_pdt() { return m_write_pdt.bind(); } + auto read_pad() { return m_read_pad.bind(); } + auto write_pad() { return m_write_pad.bind(); } + auto write_cmah() { return m_write_cmah.bind(); } + auto write_txd() { return m_write_txd.bind(); } u8 syscr_r(); void syscr_w(u8 data); protected: required_device m_intc; -#if 0 required_device m_adc; required_device m_dma; required_device m_dma0; @@ -111,9 +92,22 @@ required_device m_timer16_4; required_device m_timer16_5; required_device m_watchdog; -#endif - address_space_config m_data_config; + required_device m_swx00; + + devcb_read16 m_read_pdt; + devcb_write16 m_write_pdt; + devcb_read8 m_read_pad; + devcb_write8 m_write_pad; + devcb_write8 m_write_cmah; + devcb_write8 m_write_txd; + + address_space_config m_s_config; + + memory_access<24, 1, -1, ENDIANNESS_BIG>::specific m_s; + + u16 m_pdt, m_pdt_ddr; + u8 m_pad; u8 m_mode; u8 m_syscr; @@ -125,9 +119,27 @@ virtual int trapa_setup() override; virtual void irq_setup() override; virtual void internal_update(u64 current_time) override; + virtual void notify_standby(int state) override; virtual void device_add_mconfig(machine_config &config) override; virtual space_config_vector memory_space_config() const override; + u16 s_r(offs_t offset); + + void pdt_ddr_w(offs_t, u16 data, u16 mem_mask); + u16 pdt_r(); + void pdt_w(offs_t, u16 data, u16 mem_mask); + u8 pad_r(); + void pad_w(u8 data); + void cmah_w(u8 data); + void txd_w(u8 data); + + u16 pdt_default_r(); + void pdt_default_w(u16 data); + u8 pad_default_r(); + void pad_default_w(u8 data); + void cmah_default_w(u8 data); + void txd_default_w(u8 data); + void map(address_map &map); virtual void device_start() override; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121.cpp mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121.cpp --- mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,8 +21,11 @@ #include "emu.h" #include "hcd62121.h" + #include "hcd62121d.h" +#include "multibyte.h" + enum { @@ -39,7 +42,7 @@ HCD62121_R70, HCD62121_R74, HCD62121_R78, HCD62121_R7C }; - +// TODO - Max value stored with "movb reg,f" is 0x3f, is bit 5 set in other instructions? constexpr u8 FLAG_CL = 0x10; constexpr u8 FLAG_Z = 0x08; constexpr u8 FLAG_C = 0x04; @@ -61,6 +64,11 @@ , m_dseg(0) , m_sseg(0) , m_f(0) + , m_time(0) + , m_time_op(0) + , m_cycles_until_timeout(0) + , m_is_timer_started(false) + , m_is_infinite_timeout(false) , m_lar(0) , m_opt(0) , m_port(0) @@ -82,6 +90,15 @@ }; } +TIMER_CALLBACK_MEMBER(hcd62121_cpu_device::timer_tick) +{ + // TODO - Only stores seconds? How can it stop/reset? + if (m_is_timer_started) + { + m_time = (m_time + 1) % 60; + } +} + u8 hcd62121_cpu_device::read_op() { u8 d = m_program->read_byte( ( m_cseg << 16 ) | m_ip ); @@ -136,6 +153,33 @@ } } + +void hcd62121_cpu_device::read_ireg(int size, u8 op1) +{ + u16 ad = m_reg[(0x40 | op1) & 0x7f ] | (m_reg[(0x40 | (op1 + 1)) & 0x7f] << 8); + + for (int i = 0; i < size; i++) + { + m_temp1[i] = m_program->read_byte((m_dseg << 16) | ad); + ad += (op1 & 0x40) ? -1 : 1; + } + m_lar = ad; +} + + +void hcd62121_cpu_device::write_ireg(int size, u8 op1) +{ + u16 ad = m_reg[(0x40 | op1) & 0x7f] | (m_reg[(0x40 | (op1 + 1)) & 0x7f] << 8); + + for (int i = 0; i < size; i++) + { + m_program->write_byte((m_dseg << 16) | ad, m_temp1[i]); + ad += (op1 & 0x40) ? -1 : 1; + } + m_lar = ad; +} + + void hcd62121_cpu_device::read_regreg(int size, u8 op1, u8 op2, bool copy_extend_immediate) { for (int i = 0; i < size; i++) @@ -306,6 +350,9 @@ { m_program = &space(AS_PROGRAM); + m_timer = timer_alloc(FUNC(hcd62121_cpu_device::timer_tick), this); + m_timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1)); + save_item(NAME(m_prev_pc)); save_item(NAME(m_sp)); save_item(NAME(m_ip)); @@ -314,6 +361,10 @@ save_item(NAME(m_dseg)); save_item(NAME(m_sseg)); save_item(NAME(m_f)); + save_item(NAME(m_time)); + save_item(NAME(m_time_op)); + save_item(NAME(m_is_timer_started)); + save_item(NAME(m_is_infinite_timeout)); save_item(NAME(m_lar)); save_item(NAME(m_reg)); save_item(NAME(m_temp1)); @@ -335,51 +386,67 @@ state_add(HCD62121_DSIZE, "DSIZE", m_dsize).callimport().callexport().formatstr("%02X"); state_add(HCD62121_F, "F", m_f ).callimport().callexport().formatstr("%02X"); - state_add(HCD62121_R00, "R00", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R04, "R04", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R08, "R08", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R0C, "R0C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R10, "R10", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R14, "R14", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R18, "R18", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R1C, "R1C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R20, "R20", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R24, "R24", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R28, "R28", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R2C, "R2C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R30, "R30", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R34, "R34", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R38, "R38", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R3C, "R3C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R40, "R40", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R44, "R44", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R48, "R48", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R4C, "R4C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R50, "R50", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R54, "R54", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R58, "R58", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R5C, "R5C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R60, "R60", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R64, "R64", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R68, "R68", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R6C, "R6C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R70, "R70", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R74, "R74", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R78, "R78", m_reg[0x00]).callimport().callexport().formatstr("%8s"); - state_add(HCD62121_R7C, "R7C", m_reg[0x00]).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R00, "R00", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R04, "R04", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R08, "R08", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R0C, "R0C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R10, "R10", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R14, "R14", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R18, "R18", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R1C, "R1C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R20, "R20", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R24, "R24", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R28, "R28", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R2C, "R2C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R30, "R30", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R34, "R34", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R38, "R38", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R3C, "R3C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R40, "R40", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R44, "R44", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R48, "R48", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R4C, "R4C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R50, "R50", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R54, "R54", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R58, "R58", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R5C, "R5C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R60, "R60", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R64, "R64", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R68, "R68", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R6C, "R6C", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R70, "R70", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R74, "R74", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R78, "R78", m_debugger_temp).callimport().callexport().formatstr("%8s"); + state_add(HCD62121_R7C, "R7C", m_debugger_temp).callimport().callexport().formatstr("%8s"); set_icountptr(m_icount); } +void hcd62121_cpu_device::state_import(const device_state_entry &entry) +{ + if ((entry.index() >= HCD62121_R00) && (entry.index() <= HCD62121_R7C)) + { + put_u32be(&m_reg[(entry.index() - HCD62121_R00) * 4], m_debugger_temp); + } +} + + void hcd62121_cpu_device::state_export(const device_state_entry &entry) { - switch (entry.index()) + if ((entry.index() >= HCD62121_R00) && (entry.index() <= HCD62121_R7C)) { - case STATE_GENPC: - case STATE_GENPCBASE: - m_rtemp = (m_cseg << 16) | m_ip; - break; + m_debugger_temp = get_u32be(&m_reg[(entry.index() - HCD62121_R00) * 4]); + } + else + { + switch (entry.index()) + { + case STATE_GENPC: + case STATE_GENPCBASE: + m_rtemp = (m_cseg << 16) | m_ip; + break; + } } } @@ -399,9 +466,7 @@ m_f & FLAG_CL ? "CL":"__", m_f & FLAG_ZL ? "ZL":"__", m_f & FLAG_C ? 'C':'_', - m_f & FLAG_Z ? 'Z':'_' - ); - + m_f & FLAG_Z ? 'Z':'_'); break; case HCD62121_R00: @@ -513,6 +578,11 @@ m_sseg = 0; m_lar = 0; m_f = 0; + m_time = 0; + m_time_op = 0; + m_cycles_until_timeout = 0; + m_is_timer_started = false; + m_is_infinite_timeout = false; m_dsize = 0; m_opt = 0; m_port = 0; @@ -665,7 +735,8 @@ for (int i = 0; i < size; i++) { - if (i == size - 1) { + if (i == size - 1) + { set_cl_flag((m_temp1[i] & 0x0f) + (m_temp2[i] & 0x0f) + carry > 0x0f); } @@ -695,7 +766,8 @@ for (int i = 0; i < size; i++) { - if (i == size - 1) { + if (i == size - 1) + { set_cl_flag((m_temp1[i] & 0x0f) + (m_temp2[i] & 0x0f) + carry > 9); } @@ -730,7 +802,8 @@ for (int i = 0; i < size; i++) { - if (i == size - 1) { + if (i == size - 1) + { set_cl_flag((m_temp1[i] & 0x0f) - (m_temp2[i] & 0x0f) - carry < 0); } @@ -764,7 +837,8 @@ for (int i = 0; i < size; i++) { - if (i == size - 1) { + if (i == size - 1) + { set_cl_flag((m_temp1[i] & 0x0f) - (m_temp2[i] & 0x0f) - carry < 0); } @@ -809,6 +883,26 @@ { do { + if (m_ki_cb() != 0) + { + m_cycles_until_timeout = 0; + m_is_infinite_timeout = false; + } + else if (m_is_infinite_timeout) + { + m_icount = 0; + } + else if (m_cycles_until_timeout > 0) + { + int cycles_to_consume = std::min(m_cycles_until_timeout, m_icount); + m_cycles_until_timeout -= cycles_to_consume; + m_icount -= cycles_to_consume; + } + if (m_icount <= 0) + { + break; + } + offs_t pc = (m_cseg << 16) | m_ip; debugger_instruction_hook(pc); @@ -829,9 +923,11 @@ u8 reg1 = read_op(); // TODO - read_reg should support reading this - if (reg1 & 0x80) { + if (reg1 & 0x80) + { read_reg(size, (reg1 & 0x7f) - size + 1); - for (int i=0; i < size - 1; i++) { + for (int i=0; i < size - 1; i++) + { m_temp1[i] = m_temp1[i + 1]; } m_temp1[size-1] = 0; @@ -840,7 +936,8 @@ else { read_reg(size, reg1); - for (int i = size-1; i > 0; i--) { + for (int i = size-1; i > 0; i--) + { m_temp1[i] = m_temp1[i - 1]; } m_temp1[0] = 0; @@ -1151,6 +1248,90 @@ } break; + case 0x40: /* shrb/shlb ir1,8 */ + case 0x41: /* shrw/shlw ir1,8 */ + case 0x42: /* shrq/shlq ir1,8 */ + case 0x43: /* shrt/shlt ir1,8 */ + { + int size = datasize(op); + u8 reg1 = read_op(); + + // TODO - read_ireg should support reading this + if (reg1 & 0x80) + { + read_ireg(size, (reg1 & 0x7f) - size + 1); + for (int i=0; i < size - 1; i++) + { + m_temp1[i] = m_temp1[i + 1]; + } + m_temp1[size-1] = 0; + write_ireg(size, (reg1 & 0x7f) - size + 1); + } + else + { + read_ireg(size, reg1); + for (int i = size-1; i > 0; i--) + { + m_temp1[i] = m_temp1[i - 1]; + } + m_temp1[0] = 0; + write_ireg(size, reg1); + } + } + break; + + case 0x44: /* mskb ir1,r2 */ + case 0x45: /* mskw ir1,r2 */ + case 0x46: /* mskq ir1,r2 */ + case 0x47: /* mskt ir1,r2 */ + { + int size = datasize(op); + u8 reg1 = read_op(); + u8 reg2 = read_op(); + + read_iregreg(size, reg1, reg2, true); + + op_msk(size); + } + break; + + case 0x48: /* shrb/shlb ir1,4 */ + case 0x49: /* shrw/shlw ir1,4 */ + case 0x4A: /* shrq/shlq ir1,4 */ + case 0x4B: /* shrt/shlt ir1,4 */ + /* Nibble shift */ + { + int size = datasize(op); + u8 reg1 = read_op(); + u8 d1 = 0, d2 = 0; + + read_ireg(size, reg1); + + if (reg1 & 0x80) + { + // shift right + for (int i = 0; i < size; i++) + { + d1 = (m_temp1[i] & 0x0f) << 4; + m_temp1[i] = (m_temp1[i] >> 4) | d2; + d2 = d1; + } + } + else + { + // shift left + for (int i = 0; i < size; i++) + { + d1 = (m_temp1[i] & 0xf0) >> 4; + m_temp1[i] = (m_temp1[i] << 4) | d2; + d2 = d1; + } + } + + write_ireg(size, reg1); + } + break; + case 0x4C: /* testb ir1,r2 */ case 0x4D: /* testw ir1,r2 */ case 0x4E: /* testq ir1,r2 */ @@ -1231,6 +1412,41 @@ } break; + case 0x60: /* shrb ir1,1 */ + case 0x61: /* shrw ir1,1 */ + case 0x62: /* shrq ir1,1 */ + case 0x63: /* shrt ir1,1 */ + { + int size = datasize(op); + u8 reg1 = read_op(); + u8 d1 = 0, d2 = 0; + bool zero_high = true; + bool zero_low = true; + + read_ireg(size, reg1); + + d2 = 0; + set_cl_flag ((m_temp1[0] & (1U<<4)) != 0U); + for (int i = 0; i < size; i++) + { + d1 = (m_temp1[i] & 0x01) << 7; + m_temp1[i] = (m_temp1[i] >> 1) | d2; + d2 = d1; + if (m_temp1[i] & 0xf0) + zero_high = false; + if (m_temp1[i] & 0x0f) + zero_low = false; + } + + write_ireg(size, reg1); + + set_zero_flag(zero_high && zero_low); + set_zh_flag(zero_high); + set_zl_flag(zero_low); + set_carry_flag (d2 != 0); + } + break; + case 0x64: /* orb ir1,r2 */ case 0x65: /* orb ir1,r2 */ case 0x66: /* orb ir1,r2 */ @@ -1248,6 +1464,40 @@ } break; + case 0x68: /* shlb ir1,1 */ + case 0x69: /* shlw ir1,1 */ + case 0x6A: /* shlq ir1,1 */ + case 0x6B: /* shlt ir1,1 */ + { + int size = datasize(op); + u8 reg1 = read_op(); + u8 d1 = 0, d2 = 0; + bool zero_high = true; + bool zero_low = true; + + read_ireg(size, reg1); + + set_cl_flag ((m_temp1[0] & (1U<<3)) != 0U); + for (int i = 0; i < size; i++) + { + d1 = (m_temp1[i] & 0x80) >> 7; + m_temp1[i] = (m_temp1[i] << 1) | d2; + d2 = d1; + + if (m_temp1[i] & 0xf0) + zero_high = false; + if (m_temp1[i] & 0x0f) + zero_low = false; + } + + write_ireg(size, reg1); + set_zero_flag(zero_high && zero_low); + set_zh_flag(zero_high); + set_zl_flag(zero_low); + set_carry_flag (d2 != 0); + } + break; + case 0x6C: /* andb ir1,r2 */ case 0x6D: /* andw ir1,r2 */ case 0x6E: /* andq ir1,r2 */ @@ -1265,6 +1515,23 @@ } break; + case 0x70: /* subbb ir1,r2 */ + case 0x71: /* subbw ir1,r2 */ + case 0x72: /* subbq ir1,r2 */ + case 0x73: /* subbt ir1,r2 */ + { + int size = datasize(op); + u8 reg1 = read_op(); + u8 reg2 = read_op(); + + read_iregreg(size, reg1, reg2, false); + + op_subb(size); + + write_iregreg(size, reg1, reg2); + } + break; + case 0x74: /* subb ir1,r2 */ case 0x75: /* subw ir1,r2 */ case 0x76: /* subq ir1,r2 */ @@ -1349,7 +1616,8 @@ case 0x8C: /* bstack_to_dmem */ { int size = m_dsize + 1; - for (int i=0; i < size; i++) { + for (int i=0; i < size; i++) + { u8 byte = m_program->read_byte((m_sseg << 16) | m_sp); m_program->write_byte((m_dseg << 16) | m_lar, byte); m_sp--; @@ -1361,7 +1629,8 @@ case 0x8D: /* fstack_to_dmem */ { int size = m_dsize + 1; - for (int i=0; i < size; i++) { + for (int i=0; i < size; i++) + { u8 byte = m_program->read_byte((m_sseg << 16) | m_sp); m_program->write_byte((m_dseg << 16) | m_lar, byte); m_sp++; @@ -1442,12 +1711,22 @@ } break; + case 0xB0: /* unk_B0 reg/i8 */ case 0xB1: /* unk_B1 reg/i8 - PORTx control/direction? */ - case 0xB3: /* unk_B3 reg/i8 - timer/irq related? */ + case 0xB2: /* unk_B2 reg/i8 */ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); read_op(); break; + case 0xB3: /* timer_set i8 */ + { + u8 arg = read_op(); + + m_time_op = arg; + m_is_timer_started = true; + } + break; + case 0xB4: /* out koh,reg */ m_koh_cb(m_reg[read_op() & 0x7f]); break; @@ -1470,7 +1749,6 @@ break; case 0xBB: /* jmpcl a16 */ - logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); { u8 a1 = read_op(); u8 a2 = read_op(); @@ -1481,7 +1759,6 @@ break; case 0xBF: /* jmpncl a16 */ - logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); { u8 a1 = read_op(); u8 a2 = read_op(); @@ -1491,10 +1768,17 @@ } break; - //case 0xC0: /* movb reg,i8 */ // TODO - test + /* + These instructions do not modify any general purpose registers or memory, + but might be implemented on other CPUs with the same instruction set. + */ + case 0xC0: /* nop reg,i8 */ + case 0xC2: /* nop reg,i8 */ + case 0xC3: /* nop reg,i8 */ + logerror("%02x:%04x: nop instruction %02x %02x,%02x\n", m_cseg, m_ip-1, op, read_op(), read_op()); + break; + case 0xC1: /* movw reg,i16 */ - //case 0xC2: /* movw reg,i64 */ // TODO - test - //case 0xC3: /* movw reg,i80 */ // TODO - test { int size = datasize(op); u8 reg = read_op(); @@ -1546,7 +1830,8 @@ for (int i = 0; i < size; i++) { m_lar += pre_inc; - if (arg1 & 0x80) { + if (arg1 & 0x80) + { m_program->write_byte((m_dseg << 16) | m_lar, arg2); } else @@ -1572,13 +1857,14 @@ case 0xCC: /* swapb ir1,r2 */ case 0xCD: /* swapw ir1,r2 */ case 0xCE: /* swapq ir1,r2 */ - case 0xCF: /* swapt ir1,r2? */ + case 0xCF: /* swapt ir1,r2 */ { int size = datasize(op); u8 reg1 = read_op(); u8 reg2 = read_op(); - if (reg1 & 0x80) { + if (reg1 & 0x80) + { fatalerror("%02x:%04x: unimplemented swap with immediate encountered\n", m_cseg, m_ip-1); } @@ -1593,7 +1879,8 @@ write_iregreg(size, reg1, reg2); write_iregreg2(size, reg1, reg2); - // TODO - are flags affected? + + m_f = 0; } break; @@ -1697,6 +1984,10 @@ } break; + case 0xE5: /* movb reg,TIME */ + m_reg[read_op() & 0x7f] = m_time; + break; + case 0xE6: /* movb reg,PORT */ m_reg[read_op() & 0x7f] = m_port; break; @@ -1710,6 +2001,15 @@ } break; + case 0xEA: /* movw reg,pc */ + { + u8 reg1 = read_op(); + + m_reg[reg1 & 0x7f] = m_ip & 0xff; + m_reg[(reg1 + 1) & 0x7f] = m_ip >> 8; + } + break; + case 0xEB: /* movw reg,sp */ { u8 reg1 = read_op(); @@ -1719,6 +2019,14 @@ } break; + case 0xED: /* movb reg,ds */ + m_reg[read_op() & 0x7f] = m_dseg; + break; + + case 0xEE: /* movb reg,cs */ + m_reg[read_op() & 0x7f] = m_cseg; + break; + case 0xEF: /* movb reg,ss */ m_reg[read_op() & 0x7f] = m_sseg; break; @@ -1736,20 +2044,172 @@ case 0xF1: /* unk_F1 reg/i8 (out?) */ case 0xF3: /* unk_F3 reg/i8 (out?) */ case 0xF5: /* unk_F5 reg/i8 (out?) */ - case 0xF7: /* unk_F7 reg/i8 (out?) */ + case 0xF6: /* unk_F6 reg/i8 (out?) */ + case 0xF7: /* timer_ctrl i8 */ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); read_op(); break; case 0xFC: /* unk_FC - disable interrupts/stop timer?? */ - case 0xFD: /* unk_FD */ - case 0xFE: /* unk_FE - wait for/start timer */ - if (op == 0xFE) - m_icount -= 75000; // TODO: temporary value that makes emulation speed acceptable - logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); break; + case 0xFD: /* timer_wait_low (no X1 clock, address or data bus activity) */ + case 0xFE: /* timer_wait */ + if (m_time_op & 0x01) + { + /* + When timer control is set with operand 0xC0, the CPU periodically reads + from external RAM (address range 0x7c00..0x7fff) at an interval of + 832 clock cycles, with the reads themselves taking another 64 clock cycles. + This needs to be explicitly setup, involving writes to unknown segments + 0x11 and 0xE1 (see cfx9850.bin @ 00:00fe), otherwise there's only activity + on address lines without any reads. + + The total sum of these state reads can be approximated to the closest + power of two to define timeout values. Multiple samples were averaged, + as the state read interval can start at a distinct point in time from + the timer wait execution. + */ + const u64 TIMER_STATE_READ_CYCLES = 832 + 64; + switch (m_time_op) + { + case 0x01: + case 0x03: + // Likely only timeouts on KO enabled input. + m_is_infinite_timeout = true; + break; + case 0x11: + case 0x13: + case 0x15: + case 0x17: + case 0x19: + case 0x1b: + case 0x1d: + case 0x1f: + case 0x31: + case 0x33: + case 0x35: + case 0x37: + case 0x39: + case 0x3b: + case 0x3d: + case 0x3f: + case 0x51: + case 0x53: + case 0x55: + case 0x57: + case 0x59: + case 0x5b: + case 0x5d: + case 0x5f: + case 0x71: + case 0x73: + case 0x75: + case 0x77: + case 0x79: + case 0x7b: + case 0x7d: + case 0x7f: + case 0x91: + case 0x93: + case 0x95: + case 0x97: + case 0x99: + case 0x9b: + case 0x9d: + case 0x9f: + case 0xb1: + case 0xb3: + case 0xb5: + case 0xb7: + case 0xb9: + case 0xbb: + case 0xbd: + case 0xbf: + case 0xd1: + case 0xd3: + case 0xd5: + case 0xd7: + case 0xd9: + case 0xdb: + case 0xdd: + case 0xdf: + // Approximately 814.32us + m_cycles_until_timeout = 0x4 * TIMER_STATE_READ_CYCLES; + break; + case 0x21: + case 0x23: + case 0x25: + case 0x27: + case 0x29: + case 0x2b: + case 0x2d: + case 0x2f: + case 0x61: + case 0x63: + case 0x65: + case 0x67: + case 0x69: + case 0x6b: + case 0x6d: + case 0x6f: + case 0xa1: + case 0xa3: + case 0xa5: + case 0xa7: + case 0xa9: + case 0xab: + case 0xad: + case 0xaf: + // Approximately 1.63ms + m_cycles_until_timeout = 0x8 * TIMER_STATE_READ_CYCLES; + break; + case 0x05: + case 0x07: + case 0x0d: + case 0x0f: + case 0x45: + case 0x47: + case 0x4d: + case 0x4f: + case 0xc5: + case 0xc7: + case 0xcd: + case 0xcf: + // Approximately 209.34ms + m_cycles_until_timeout = 0x400 * TIMER_STATE_READ_CYCLES; + break; + case 0x49: + case 0x4b: + case 0xc9: + case 0xcb: + // Approximately 837.61ms + m_cycles_until_timeout = 0x1000 * TIMER_STATE_READ_CYCLES; + break; + case 0x41: + case 0x43: + case 0xc1: + case 0xc3: + // Approximately 1.68s + m_cycles_until_timeout = 0x2000 * TIMER_STATE_READ_CYCLES; + break; + case 0x81: + case 0x83: + // Approximately 100.58s + m_cycles_until_timeout = 0x7a800 * TIMER_STATE_READ_CYCLES; + break; + default: + logerror("%02x:%04x: unimplemented timer value %02x encountered\n", m_cseg, m_ip-1, m_time_op); + break; + } + } + else + { + logerror("%02x:%04x: wait for disabled timer? value %02x\n", m_cseg, m_ip-1, m_time_op); + } + break; + case 0xFF: /* nop */ break; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121.h mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121.h --- mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121.h 2024-03-25 14:00:46.000000000 +0000 @@ -48,6 +48,7 @@ virtual space_config_vector memory_space_config() const override; // device_state_interface overrides + virtual void state_import(const device_state_entry &entry) override; virtual void state_export(const device_state_entry &entry) override; virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; @@ -55,10 +56,13 @@ virtual std::unique_ptr create_disassembler() override; private: + TIMER_CALLBACK_MEMBER(timer_tick); u8 read_op(); u8 datasize(u8 op); void read_reg(int size, u8 op1); void write_reg(int size, u8 op1); + void read_ireg(int size, u8 op1); + void write_ireg(int size, u8 op1); void read_regreg(int size, u8 op1, u8 op2, bool copy_extend_immediate); void write_regreg(int size, u8 op1, u8 op2); void read_iregreg(int size, u8 op1, u8 op2, bool copy_extend_immediate); @@ -91,6 +95,12 @@ u8 m_dseg; u8 m_sseg; u8 m_f; + u8 m_time; + u8 m_time_op; + s32 m_cycles_until_timeout; + bool m_is_timer_started; + bool m_is_infinite_timeout; + emu_timer *m_timer; u16 m_lar; u8 m_reg[0x80]; @@ -104,6 +114,8 @@ u8 m_temp2[0x10]; u32 m_rtemp; + u32 m_debugger_temp; + address_space *m_program; int m_icount; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.cpp mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -117,18 +117,18 @@ { "callnc", ARG_A16, ARG_NONE }, { "callnz", ARG_A16, ARG_NONE }, /* 0xb0 */ - { "unB0?", ARG_NONE, ARG_NONE }, { "unB1?", ARG_I8, ARG_NONE }, - { "unB2?", ARG_NONE, ARG_NONE }, { "unB3?", ARG_I8, ARG_NONE }, - { "out", ARG_KHI, ARG_REG }, { "out", ARG_KHI, ARG_I8 }, - { "out", ARG_KLO, ARG_REG }, { "out", ARG_KLO, ARG_I8 }, - { "unB8?", ARG_NONE, ARG_NONE }, { "unB9?", ARG_I8, ARG_NONE }, - { "unBA?", ARG_NONE, ARG_NONE }, { "jmpcl", ARG_A16, ARG_NONE }, - { "unBC?", ARG_I8, ARG_NONE }, { "unBD?", ARG_NONE, ARG_NONE }, - { "unBE?", ARG_NONE, ARG_NONE }, { "jmpncl", ARG_A16, ARG_NONE }, + { "unB0?", ARG_I8, ARG_NONE }, { "unB1?", ARG_I8, ARG_NONE }, + { "unB2?", ARG_I8, ARG_NONE }, { "timer_set", ARG_I8, ARG_NONE }, + { "out", ARG_KHI, ARG_REG }, { "out", ARG_KHI, ARG_I8 }, + { "out", ARG_KLO, ARG_REG }, { "out", ARG_KLO, ARG_I8 }, + { "unB8?", ARG_NONE, ARG_NONE }, { "unB9?", ARG_I8, ARG_NONE }, + { "unBA?", ARG_NONE, ARG_NONE }, { "jmpcl", ARG_A16, ARG_NONE }, + { "unBC?", ARG_I8, ARG_NONE }, { "unBD?", ARG_NONE, ARG_NONE }, + { "unBE?", ARG_NONE, ARG_NONE }, { "jmpncl", ARG_A16, ARG_NONE }, /* 0xc0 */ { "movb", ARG_REG, ARG_I8 }, { "movw", ARG_REG, ARG_I16 }, - { "movq", ARG_REG, ARG_I64 }, { "movt", ARG_REG, ARG_I80 }, + { "movq", ARG_REG, ARG_I8 }, { "movt", ARG_REG, ARG_I8 }, { "movb", ARG_ILR, ARG_ILR }, { "movw", ARG_ILR, ARG_ILR }, { "movq", ARG_ILR, ARG_ILR }, { "movt", ARG_ILR, ARG_ILR }, { "unC8?", ARG_NONE, ARG_NONE }, { "unC9?", ARG_NONE, ARG_NONE }, @@ -149,7 +149,7 @@ /* 0xe0 */ { "in0", ARG_REG, ARG_NONE }, { "movb", ARG_REG, ARG_OPT }, { "in", ARG_REG, ARG_KI }, { "movb", ARG_REG, ARG_DSZ }, - { "movb", ARG_REG, ARG_F }, { "unE5?", ARG_I8, ARG_NONE }, + { "movb", ARG_REG, ARG_F }, { "movb", ARG_REG, ARG_TIME }, { "movb", ARG_REG, ARG_PORT }, { "unE7?", ARG_I8, ARG_NONE }, { "movw", ARG_REG, ARG_LAR }, { "movw?", ARG_REG, ARG_LAR }, { "movw", ARG_REG, ARG_PC }, { "movw", ARG_REG, ARG_SP }, @@ -157,14 +157,14 @@ { "movb", ARG_REG, ARG_CS }, { "movb", ARG_REG, ARG_SS }, /* 0xf0 */ - { "movb", ARG_OPT, ARG_REG }, { "unF1?", ARG_I8, ARG_NONE }, - { "movb", ARG_PORT, ARG_REG }, { "unF3?", ARG_I8, ARG_NONE }, - { "unF4?", ARG_I8, ARG_NONE }, { "unF5?", ARG_I8, ARG_NONE }, - { "unF6?", ARG_I8, ARG_NONE }, { "unF7?", ARG_I8, ARG_NONE }, - { "unF8?", ARG_NONE, ARG_NONE }, { "unF9?", ARG_NONE, ARG_NONE }, - { "unFA?", ARG_NONE, ARG_NONE }, { "unFb?", ARG_NONE, ARG_NONE }, - { "unFC?", ARG_NONE, ARG_NONE }, { "unFD?", ARG_NONE, ARG_NONE }, - { "unFE?", ARG_NONE, ARG_NONE }, { "nop", ARG_NONE, ARG_NONE } + { "movb", ARG_OPT, ARG_REG }, { "unF1?", ARG_I8, ARG_NONE }, + { "movb", ARG_PORT, ARG_REG }, { "unF3?", ARG_I8, ARG_NONE }, + { "unF4?", ARG_I8, ARG_NONE }, { "unF5?", ARG_I8, ARG_NONE }, + { "unF6?", ARG_I8, ARG_NONE }, { "timer_ctrl", ARG_I8, ARG_NONE }, + { "unF8?", ARG_NONE, ARG_NONE }, { "unF9?", ARG_NONE, ARG_NONE }, + { "unFA?", ARG_NONE, ARG_NONE }, { "unFb?", ARG_NONE, ARG_NONE }, + { "unFC?", ARG_NONE, ARG_NONE }, { "timer_wait_low", ARG_NONE, ARG_NONE }, + { "timer_wait", ARG_NONE, ARG_NONE }, { "nop", ARG_NONE, ARG_NONE } }; u32 hcd62121_disassembler::opcode_alignment() const @@ -186,9 +186,9 @@ /* Special cases for shift and rotate instructions */ if (inst->arg2 == ARG_S4 || inst->arg2 == ARG_S8) - util::stream_format(stream, "%c%c%c%c ", inst->str[0], inst->str[1], (opcodes.r8(pc) & 0x80) ? 'r' : 'l', inst->str[3]); + util::stream_format(stream, "%c%c%c%c ", inst->str[0], inst->str[1], (opcodes.r8(pc) & 0x80) ? 'r' : 'l', inst->str[3]); else - util::stream_format(stream, "%-8s", inst->str); + util::stream_format(stream, "%-12s", inst->str); switch(inst->arg1) { @@ -318,8 +318,8 @@ case ARG_PORT: util::stream_format(stream, "PORT"); break; - case ARG_TIM: - util::stream_format(stream, "TIM?"); + case ARG_TIME: + util::stream_format(stream, "TIME"); break; case ARG_KLO: util::stream_format(stream, "KOL"); @@ -408,8 +408,8 @@ case ARG_PORT: util::stream_format(stream, ",PORT"); break; - case ARG_TIM: - util::stream_format(stream, ",TIM?"); + case ARG_TIME: + util::stream_format(stream, ",TIME"); break; case ARG_KI: util::stream_format(stream, ",KI"); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.h mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.h --- mame-0.263+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hcd62121/hcd62121d.h 2024-03-25 14:00:46.000000000 +0000 @@ -47,7 +47,7 @@ ARG_DSZ, /* dsize register? */ ARG_OPT, /* OPTx (output) pins */ ARG_PORT, /* PORTx (output) pins */ - ARG_TIM, /* timing related register? */ + ARG_TIME, /* timing related register */ ARG_KLO, /* KO1 - KO8 output lines */ ARG_KHI, /* KO9 - KO14(?) output lines */ ARG_KI, /* K input lines */ diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.cpp mame-0.264+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -38,6 +38,22 @@ // common lookup tables +enum hmcs40_disassembler::e_mnemonics : unsigned +{ + mILL, + mLAB, mLBA, mLAY, mLASPX, mLASPY, mXAMR, + mLXA, mLYA, mLXI, mLYI, mIY, mDY, mAYY, mSYY, mXSP, + mLAM, mLBM, mXMA, mXMB, mLMAIY, mLMADY, + mLMIIY, mLAI, mLBI, + mAI, mIB, mDB, mAMC, mSMC, mAM, mDAA, mDAS, mNEGA, mCOMB, mSEC, mREC, mTC, mROTL, mROTR, mOR, + mMNEI, mYNEI, mANEM, mBNEM, mALEI, mALEM, mBLEM, + mSEM, mREM, mTM, + mBR, mCAL, mLPU, mTBR, mRTN, + mSEIE, mSEIF0, mSEIF1, mSETF, mSECF, mREIE, mREIF0, mREIF1, mRETF, mRECF, mTI0, mTI1, mTIF0, mTIF1, mTTF, mLTI, mLTA, mLAT, mRTNI, + mSED, mRED, mTD, mSEDD, mREDD, mLAR, mLBR, mLRA, mLRB, mP, + mNOP +}; + const char *const hmcs40_disassembler::s_mnemonics[] = { "?", diff -Nru mame-0.263+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.h mame-0.264+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.h --- mame-0.263+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/hmcs40/hmcs40d.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,22 +25,7 @@ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum e_mnemonics - { - mILL, - mLAB, mLBA, mLAY, mLASPX, mLASPY, mXAMR, - mLXA, mLYA, mLXI, mLYI, mIY, mDY, mAYY, mSYY, mXSP, - mLAM, mLBM, mXMA, mXMB, mLMAIY, mLMADY, - mLMIIY, mLAI, mLBI, - mAI, mIB, mDB, mAMC, mSMC, mAM, mDAA, mDAS, mNEGA, mCOMB, mSEC, mREC, mTC, mROTL, mROTR, mOR, - mMNEI, mYNEI, mANEM, mBNEM, mALEI, mALEM, mBLEM, - mSEM, mREM, mTM, - mBR, mCAL, mLPU, mTBR, mRTN, - mSEIE, mSEIF0, mSEIF1, mSETF, mSECF, mREIE, mREIF0, mREIF1, mRETF, mRECF, mTI0, mTI1, mTIF0, mTIF1, mTTF, mLTI, mLTA, mLAT, mRTNI, - mSED, mRED, mTD, mSEDD, mREDD, mLAR, mLBR, mLRA, mLRB, mP, - mNOP - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonics[]; static const s8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/i386/i386segs.hxx mame-0.264+dfsg.1/src/devices/cpu/i386/i386segs.hxx --- mame-0.263+dfsg.1/src/devices/cpu/i386/i386segs.hxx 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/i386/i386segs.hxx 2024-03-25 14:00:46.000000000 +0000 @@ -436,18 +436,6 @@ type = (v2>>8) & 0x1F; flags = (v2>>8) & 0xf0ff; - if(trap_level == 2) - { - LOGMASKED(LOG_PM_FAULT_DF, "IRQ: Double fault.\n"); - FAULT_EXP(FAULT_DF,0); - } - if(trap_level >= 3) - { - LOGMASKED(LOG_PM_EVENTS, "IRQ: Triple fault. CPU reset.\n"); - pulse_input_line(INPUT_LINE_RESET, attotime::zero); - return; - } - /* segment privilege checks */ if(entry >= m_idtr.limit) { @@ -778,30 +766,50 @@ void i386_device::i386_trap_with_error(int irq, int irq_gate, int trap_level, uint32_t error) { - i386_trap(irq,irq_gate,trap_level); - if(irq == 8 || irq == 10 || irq == 11 || irq == 12 || irq == 13 || irq == 14) + try { - // for these exceptions, an error code is pushed onto the stack by the processor. - // no error code is pushed for software interrupts, either. - if(PROTECTED_MODE) - { - uint32_t entry = irq * 8; - uint32_t v2,type; - v2 = READ32PL(m_idtr.base + entry + 4, 0); - type = (v2>>8) & 0x1F; - if(type == 5) - { - v2 = READ32PL(m_idtr.base + entry, 0); - v2 = READ32PL(m_gdtr.base + ((v2 >> 16) & 0xfff8) + 4, 0); + i386_trap(irq,irq_gate,trap_level); + if(irq == 8 || irq == 10 || irq == 11 || irq == 12 || irq == 13 || irq == 14) + { + // for these exceptions, an error code is pushed onto the stack by the processor. + // no error code is pushed for software interrupts, either. + if(PROTECTED_MODE) + { + uint32_t entry = irq * 8; + uint32_t v2,type; + v2 = READ32PL(m_idtr.base + entry + 4, 0); type = (v2>>8) & 0x1F; + if(type == 5) + { + v2 = READ32PL(m_idtr.base + entry, 0); + v2 = READ32PL(m_gdtr.base + ((v2 >> 16) & 0xfff8) + 4, 0); + type = (v2>>8) & 0x1F; + } + if(type >= 9) + PUSH32(error); + else + PUSH16(error); } - if(type >= 9) - PUSH32(error); else PUSH16(error); } - else - PUSH16(error); + } + catch(uint64_t e) + { + trap_level++; + if(trap_level == 1) + { + m_ext = 1; + LOGMASKED(LOG_PM_FAULT_DF, "IRQ: Double fault.\n"); + i386_trap_with_error(FAULT_DF,0,trap_level,0); + return; + } + if(trap_level >= 2) + { + LOGMASKED(LOG_PM_EVENTS, "IRQ: Triple fault. CPU reset.\n"); + pulse_input_line(INPUT_LINE_RESET, attotime::zero); + return; + } } } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/m6502/m37640.cpp mame-0.264+dfsg.1/src/devices/cpu/m6502/m37640.cpp --- mame-0.263+dfsg.1/src/devices/cpu/m6502/m37640.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/m6502/m37640.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,31 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// Mitsubishi M37640 8-bit microcontroller with usb support + +#include "emu.h" +#include "m37640.h" + +DEFINE_DEVICE_TYPE(M37640, m37640_device, "m37640", "Mitsubishi M37640") + +m37640_device::m37640_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, u32 mode) : + m740_device(mconfig, M37640, tag, owner, clock), + m_mode(mode) +{ + program_config.m_internal_map = address_map_constructor(FUNC(m37640_device::map), this); +} + +void m37640_device::device_start() +{ + m740_device::device_start(); +} + +void m37640_device::device_reset() +{ + m740_device::device_start(); +} + +void m37640_device::map(address_map &map) +{ + (void)m_mode; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/m6502/m37640.h mame-0.264+dfsg.1/src/devices/cpu/m6502/m37640.h --- mame-0.263+dfsg.1/src/devices/cpu/m6502/m37640.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/m6502/m37640.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,38 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +#ifndef MAME_CPU_M6502_M37640_H +#define MAME_CPU_M6502_M37640_H + +#pragma once + +#include "m740.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> m37640_device + +class m37640_device : public m740_device +{ +public: + enum { + INT1_LINE = INPUT_LINE_IRQ0, + INT2_LINE, + }; + + m37640_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, u32 mode = 2); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + +private: + u32 m_mode; + + void map(address_map &map); +}; + +DECLARE_DEVICE_TYPE(M37640, m37640_device) + +#endif // MAME_CPU_M6502_M37640_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/m6800/m6801.cpp mame-0.264+dfsg.1/src/devices/cpu/m6800/m6801.cpp --- mame-0.263+dfsg.1/src/devices/cpu/m6800/m6801.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/m6800/m6801.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -24,6 +24,8 @@ #include "m6801.h" #include "6800dasm.h" +#include + #define LOG_TX (1U << 1) #define LOG_TXTICK (1U << 2) #define LOG_RX (1U << 3) @@ -994,7 +996,7 @@ } } -int m6801_cpu_device::m6800_rx() +int m6801_cpu_device::m6801_rx() { return (m_in_port_func[1]() & M6801_PORT2_IO3) >> 3; } @@ -1095,7 +1097,7 @@ if (m_trcsr & M6801_TRCSR_WU) { // wait for 10 bits of '1' - if (m6800_rx() == 1) + if (m6801_rx() == 1) { m_rxbits++; @@ -1122,7 +1124,7 @@ switch (m_rxbits) { case M6801_SERIAL_START: - if (m6800_rx() == 0) + if (m6801_rx() == 0) { // start bit found m_rxbits++; @@ -1132,7 +1134,7 @@ break; case M6801_SERIAL_STOP: - if (m6800_rx() == 1) + if (m6801_rx() == 1) { LOGRX("SCI Received STOP bit\n"); @@ -1186,7 +1188,7 @@ m_rsr >>= 1; // receive bit into register - m_rsr |= (m6800_rx() << 7); + m_rsr |= (m6801_rx() << 7); LOGRX("SCI RX sampled DATA bit %u: %u\n", m_rxbits, BIT(m_rsr, 7)); @@ -1519,14 +1521,17 @@ if (!m_nvram_battery) return true; + std::error_condition err; size_t actual; - if (file.write(&m_internal_ram[0], m_nvram_bytes, actual) || m_nvram_bytes != actual) + std::tie(err, actual) = write(file, &m_internal_ram[0], m_nvram_bytes); + if (err) return false; // upper bits of RAM control register u8 ram_ctrl = m_ram_ctrl & 0xc0; - if (file.write(&ram_ctrl, 1, actual) || actual != 1) + std::tie(err, actual) = write(file, &ram_ctrl, 1); + if (err) return false; return true; @@ -1534,14 +1539,17 @@ bool m6801_cpu_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - if (file.read(&m_internal_ram[0], m_nvram_bytes, actual) || m_nvram_bytes != actual) + std::tie(err, actual) = read(file, &m_internal_ram[0], m_nvram_bytes); + if (err || (m_nvram_bytes != actual)) return false; // upper bits of RAM control register u8 ram_ctrl = 0; - if (file.read(&ram_ctrl, 1, actual) || actual != 1) + std::tie(err, actual) = read(file, &ram_ctrl, 1); + if (err || (1 != actual)) return false; m_ram_ctrl |= ram_ctrl & 0xc0; @@ -1581,7 +1589,6 @@ if (!m6801_cpu_device::nvram_write(file)) return false; - size_t actual; std::vector buf(7); // misc registers @@ -1596,10 +1603,8 @@ // port output latches buf.insert(buf.end(), m_port_data, m_port_data + sizeof(m_port_data)); - if (file.write(buf.data(), buf.size(), actual) || (buf.size() != actual)) - return false; - - return true; + auto const [err, actual] = write(file, buf.data(), buf.size()); + return !err; } bool hd6301x_cpu_device::nvram_write(util::write_stream &file) @@ -1611,16 +1616,13 @@ if (!hd6301_cpu_device::nvram_write(file)) return false; - size_t actual; std::vector buf; // port output latches buf.insert(buf.begin(), m_portx_data, m_portx_data + sizeof(m_portx_data)); - if (file.write(buf.data(), buf.size(), actual) || (buf.size() != actual)) - return false; - - return true; + auto const [err, actual] = write(file, buf.data(), buf.size()); + return !err; } bool hd6301_cpu_device::nvram_read(util::read_stream &file) @@ -1628,11 +1630,13 @@ if (!m6801_cpu_device::nvram_read(file)) return false; + std::error_condition err; size_t actual; u8 buf[7]; // misc registers - if (file.read(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + std::tie(err, actual) = read(file, &buf, sizeof(buf)); + if (err || (sizeof(buf) != actual)) return false; m_s.b.h = buf[0]; @@ -1644,7 +1648,8 @@ m_tdr = buf[6]; // port output latches - if (file.read(&m_port_data[0], sizeof(m_port_data), actual) || sizeof(m_port_data) != actual) + std::tie(err, actual) = read(file, &m_port_data[0], sizeof(m_port_data)); + if (err || (sizeof(m_port_data) != actual)) return false; return true; @@ -1655,13 +1660,9 @@ if (!hd6301_cpu_device::nvram_read(file)) return false; - size_t actual; - // port output latches - if (file.read(&m_portx_data[0], sizeof(m_portx_data), actual) || sizeof(m_portx_data) != actual) - return false; - - return true; + auto const [err, actual] = read(file, &m_portx_data[0], sizeof(m_portx_data)); + return !err && (sizeof(m_portx_data) == actual); } @@ -2546,7 +2547,7 @@ } -void m6801_cpu_device::m6801_clock_serial() +void m6801_cpu_device::clock_serial() { if (m_use_ext_serclock) { diff -Nru mame-0.263+dfsg.1/src/devices/cpu/m6800/m6801.h mame-0.264+dfsg.1/src/devices/cpu/m6800/m6801.h --- mame-0.263+dfsg.1/src/devices/cpu/m6800/m6801.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/m6800/m6801.h 2024-03-25 14:00:46.000000000 +0000 @@ -66,7 +66,7 @@ auto standby_cb() { return m_standby_func.bind(); } // notifier (not an output pin) int standby() { return suspended(SUSPEND_REASON_CLOCK) ? 1 : 0; } - void m6801_clock_serial(); + void clock_serial(); protected: m6801_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, const m6800_cpu_device::op_func *insn, const u8 *cycles, address_map_constructor internal, int nvram_bytes); @@ -194,7 +194,7 @@ virtual void check_timer_event(); virtual void set_rmcr(u8 data); virtual void write_port2(); - int m6800_rx(); + int m6801_rx(); void serial_transmit(); void serial_receive(); TIMER_CALLBACK_MEMBER(sci_tick); diff -Nru mame-0.263+dfsg.1/src/devices/cpu/m6805/m68705.cpp mame-0.264+dfsg.1/src/devices/cpu/m6805/m68705.cpp --- mame-0.263+dfsg.1/src/devices/cpu/m6805/m68705.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/m6805/m68705.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -552,14 +552,14 @@ bool m68705_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_user_rom[0], m_user_rom.bytes(), actual) && actual == m_user_rom.bytes(); + auto const [err, actual] = read(file, &m_user_rom[0], m_user_rom.bytes()); + return !err && (actual == m_user_rom.bytes()); } bool m68705_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_user_rom[0], m_user_rom.bytes(), actual) && actual == m_user_rom.bytes(); + auto const [err, actual] = write(file, &m_user_rom[0], m_user_rom.bytes()); + return !err; } void m6805_hmos_device::interrupt() diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.cpp mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.cpp --- mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2,7 +2,7 @@ // copyright-holders:Ernesto Corvi /******************************************************************************* - mb88dasm.c + mb88dasm.cpp Core implementation for the portable Fujitsu MB88xx series MCU disassembler. Written by Ernesto Corvi @@ -12,216 +12,126 @@ #include "emu.h" #include "mb88dasm.h" -u32 mb88_disassembler::opcode_alignment() const -{ - return 1; -} - offs_t mb88_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - unsigned startpc = pc; - uint8_t op = opcodes.r8(pc++); - uint8_t arg = opcodes.r8(pc); + offs_t startpc = pc; + u8 op = opcodes.r8(pc++); + u8 arg = opcodes.r8(pc); - switch( op ) + switch (op) { - case 0x00: util::stream_format( stream, "NOP" ); break; - case 0x01: util::stream_format( stream, "OUTO" ); break; - case 0x02: util::stream_format( stream, "OUTP" ); break; - case 0x03: util::stream_format( stream, "OUT" ); break; - case 0x04: util::stream_format( stream, "TAY" ); break; - case 0x05: util::stream_format( stream, "TATH" ); break; - case 0x06: util::stream_format( stream, "TATL" ); break; - case 0x07: util::stream_format( stream, "TAS" ); break; - case 0x08: util::stream_format( stream, "ICY" ); break; - case 0x09: util::stream_format( stream, "ICM" ); break; - case 0x0A: util::stream_format( stream, "STIC" ); break; - case 0x0B: util::stream_format( stream, "X" ); break; - case 0x0C: util::stream_format( stream, "ROL" ); break; - case 0x0D: util::stream_format( stream, "L" ); break; - case 0x0E: util::stream_format( stream, "ADC" ); break; - case 0x0F: util::stream_format( stream, "AND" ); break; - case 0x10: util::stream_format( stream, "DAA" ); break; - case 0x11: util::stream_format( stream, "DAS" ); break; - case 0x12: util::stream_format( stream, "INK" ); break; - case 0x13: util::stream_format( stream, "IN" ); break; - case 0x14: util::stream_format( stream, "TYA" ); break; - case 0x15: util::stream_format( stream, "TTHA" ); break; - case 0x16: util::stream_format( stream, "TTLA" ); break; - case 0x17: util::stream_format( stream, "TSA" ); break; - case 0x18: util::stream_format( stream, "DCY" ); break; - case 0x19: util::stream_format( stream, "DCM" ); break; - case 0x1A: util::stream_format( stream, "STDC" ); break; - case 0x1B: util::stream_format( stream, "XX" ); break; - case 0x1C: util::stream_format( stream, "ROR" ); break; - case 0x1D: util::stream_format( stream, "ST" ); break; - case 0x1E: util::stream_format( stream, "SBC" ); break; - case 0x1F: util::stream_format( stream, "OR" ); break; - case 0x20: util::stream_format( stream, "SETR" ); break; - case 0x21: util::stream_format( stream, "SETC" ); break; - case 0x22: util::stream_format( stream, "RSTR" ); break; - case 0x23: util::stream_format( stream, "RSTC" ); break; - case 0x24: util::stream_format( stream, "TSTR" ); break; - case 0x25: util::stream_format( stream, "TSTI" ); break; - case 0x26: util::stream_format( stream, "TSTV" ); break; - case 0x27: util::stream_format( stream, "TSTS" ); break; - case 0x28: util::stream_format( stream, "TSTC" ); break; - case 0x29: util::stream_format( stream, "TSTZ" ); break; - case 0x2A: util::stream_format( stream, "STS" ); break; - case 0x2B: util::stream_format( stream, "LS" ); break; - case 0x2C: util::stream_format( stream, "RTS" ); break; - case 0x2D: util::stream_format( stream, "NEG" ); break; - case 0x2E: util::stream_format( stream, "C" ); break; - case 0x2F: util::stream_format( stream, "EOR" ); break; - case 0x30: - case 0x31: - case 0x32: - case 0x33: util::stream_format( stream, "SBIT %d", op&3 ); break; - case 0x34: - case 0x35: - case 0x36: - case 0x37: util::stream_format( stream, "RBIT %d", op&3 ); break; - case 0x38: - case 0x39: - case 0x3A: - case 0x3B: util::stream_format( stream, "TBIT %d", op&3 ); break; - case 0x3C: util::stream_format( stream, "RTI" ); break; - case 0x3D: util::stream_format( stream, "JPA #$%02X", arg ); pc++; break; - case 0x3E: util::stream_format( stream, "EN #$%02X", arg ); pc++; break; - case 0x3F: util::stream_format( stream, "DIS #$%02X", arg ); pc++; break; - case 0x40: - case 0x41: - case 0x42: - case 0x43: util::stream_format( stream, "SETD %d", op&3 ); break; - case 0x44: - case 0x45: - case 0x46: - case 0x47: util::stream_format( stream, "RSTD %d", op&3 ); break; - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: util::stream_format( stream, "TSTD %d", (op&3)+8 ); break; - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: util::stream_format( stream, "TBA %d", op&3 ); break; - case 0x50: - case 0x51: - case 0x52: - case 0x53: util::stream_format( stream, "XD %d", op&3 ); break; - case 0x54: - case 0x55: - case 0x56: - case 0x57: util::stream_format( stream, "XYD %d", (op&3)+4 ); break; - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5C: - case 0x5D: - case 0x5E: - case 0x5F: util::stream_format( stream, "LXI #$%1X", op&7 ); break; - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: util::stream_format( stream, "CALL $%02X%02X", op&7, arg ); pc++; break; - case 0x68: - case 0x69: - case 0x6A: - case 0x6B: - case 0x6C: - case 0x6D: - case 0x6E: - case 0x6F: util::stream_format( stream, "JPL $%02X%02X", op&7, arg ); pc++; break; - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - case 0x78: - case 0x79: - case 0x7A: - case 0x7B: - case 0x7C: - case 0x7D: - case 0x7E: - case 0x7F: util::stream_format( stream, "AI #$%1X", op&0xf ); break; - case 0x80: - case 0x81: - case 0x82: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - case 0x88: - case 0x89: - case 0x8A: - case 0x8B: - case 0x8C: - case 0x8D: - case 0x8E: - case 0x8F: util::stream_format( stream, "LYI #$%1X", op&0xf ); break; - case 0x90: - case 0x91: - case 0x92: - case 0x93: - case 0x94: - case 0x95: - case 0x96: - case 0x97: - case 0x98: - case 0x99: - case 0x9A: - case 0x9B: - case 0x9C: - case 0x9D: - case 0x9E: - case 0x9F: util::stream_format( stream, "LI #$%1X", op&0xf ); break; - case 0xA0: - case 0xA1: - case 0xA2: - case 0xA3: - case 0xA4: - case 0xA5: - case 0xA6: - case 0xA7: - case 0xA8: - case 0xA9: - case 0xAA: - case 0xAB: - case 0xAC: - case 0xAD: - case 0xAE: - case 0xAF: util::stream_format( stream, "CYI #$%1X", op&0xf ); break; - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - case 0xB8: - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: util::stream_format( stream, "CI #$%1X", op&0xf ); break; - - default: - /* C0-FF */ - util::stream_format( stream, "JMP $%04X", (pc&(~0x3f))+ op-0xC0 ); - break; + case 0x00: util::stream_format(stream, "NOP"); break; + case 0x01: util::stream_format(stream, "OUTO"); break; + case 0x02: util::stream_format(stream, "OUTP"); break; + case 0x03: util::stream_format(stream, "OUT"); break; + case 0x04: util::stream_format(stream, "TAY"); break; + case 0x05: util::stream_format(stream, "TATH"); break; + case 0x06: util::stream_format(stream, "TATL"); break; + case 0x07: util::stream_format(stream, "TAS"); break; + case 0x08: util::stream_format(stream, "ICY"); break; + case 0x09: util::stream_format(stream, "ICM"); break; + case 0x0a: util::stream_format(stream, "STIC"); break; + case 0x0b: util::stream_format(stream, "X"); break; + case 0x0c: util::stream_format(stream, "ROL"); break; + case 0x0d: util::stream_format(stream, "L"); break; + case 0x0e: util::stream_format(stream, "ADC"); break; + case 0x0f: util::stream_format(stream, "AND"); break; + case 0x10: util::stream_format(stream, "DAA"); break; + case 0x11: util::stream_format(stream, "DAS"); break; + case 0x12: util::stream_format(stream, "INK"); break; + case 0x13: util::stream_format(stream, "IN"); break; + case 0x14: util::stream_format(stream, "TYA"); break; + case 0x15: util::stream_format(stream, "TTHA"); break; + case 0x16: util::stream_format(stream, "TTLA"); break; + case 0x17: util::stream_format(stream, "TSA"); break; + case 0x18: util::stream_format(stream, "DCY"); break; + case 0x19: util::stream_format(stream, "DCM"); break; + case 0x1a: util::stream_format(stream, "STDC"); break; + case 0x1b: util::stream_format(stream, "XX"); break; + case 0x1c: util::stream_format(stream, "ROR"); break; + case 0x1d: util::stream_format(stream, "ST"); break; + case 0x1e: util::stream_format(stream, "SBC"); break; + case 0x1f: util::stream_format(stream, "OR"); break; + case 0x20: util::stream_format(stream, "SETR"); break; + case 0x21: util::stream_format(stream, "SETC"); break; + case 0x22: util::stream_format(stream, "RSTR"); break; + case 0x23: util::stream_format(stream, "RSTC"); break; + case 0x24: util::stream_format(stream, "TSTR"); break; + case 0x25: util::stream_format(stream, "TSTI"); break; + case 0x26: util::stream_format(stream, "TSTV"); break; + case 0x27: util::stream_format(stream, "TSTS"); break; + case 0x28: util::stream_format(stream, "TSTC"); break; + case 0x29: util::stream_format(stream, "TSTZ"); break; + case 0x2a: util::stream_format(stream, "STS"); break; + case 0x2b: util::stream_format(stream, "LS"); break; + case 0x2c: util::stream_format(stream, "RTS"); break; + case 0x2d: util::stream_format(stream, "NEG"); break; + case 0x2e: util::stream_format(stream, "C"); break; + case 0x2f: util::stream_format(stream, "EOR"); break; + + case 0x30: case 0x31: case 0x32: case 0x33: + util::stream_format(stream, "SBIT %d", op & 3); break; + case 0x34: case 0x35: case 0x36: case 0x37: + util::stream_format(stream, "RBIT %d", op & 3); break; + case 0x38: case 0x39: case 0x3a: case 0x3b: + util::stream_format(stream, "TBIT %d", op & 3); break; + + case 0x3c: util::stream_format(stream, "RTI"); break; + case 0x3d: util::stream_format(stream, "JPA #$%02X", arg); pc++; break; + case 0x3e: util::stream_format(stream, "EN #$%02X", arg); pc++; break; + case 0x3f: util::stream_format(stream, "DIS #$%02X", arg); pc++; break; + + case 0x40: case 0x41: case 0x42: case 0x43: + util::stream_format(stream, "SETD %d", op & 3); break; + case 0x44: case 0x45: case 0x46: case 0x47: + util::stream_format(stream, "RSTD %d", op & 3); break; + case 0x48: case 0x49: case 0x4a: case 0x4b: + util::stream_format(stream, "TSTD %d", (op & 3) + 8); break; + case 0x4c: case 0x4d: case 0x4e: case 0x4f: + util::stream_format(stream, "TBA %d", op & 3); break; + case 0x50: case 0x51: case 0x52: case 0x53: + util::stream_format(stream, "XD %d", op & 3); break; + case 0x54: case 0x55: case 0x56: case 0x57: + util::stream_format(stream, "XYD %d", (op & 3) + 4); break; + + case 0x58: case 0x59: case 0x5a: case 0x5b: + case 0x5c: case 0x5d: case 0x5e: case 0x5f: + util::stream_format(stream, "LXI #$%1X", op & 7); break; + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: + util::stream_format(stream, "CALL $%02X%02X", op & 7, arg); pc++; break; + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + util::stream_format(stream, "JPL $%02X%02X", op & 7, arg); pc++; break; + + case 0x70: case 0x71: case 0x72: case 0x73: + case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7a: case 0x7b: + case 0x7c: case 0x7d: case 0x7e: case 0x7f: + util::stream_format(stream, "AI #$%1X", op & 0xf); break; + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8a: case 0x8b: + case 0x8c: case 0x8d: case 0x8e: case 0x8f: + util::stream_format(stream, "LYI #$%1X", op & 0xf); break; + case 0x90: case 0x91: case 0x92: case 0x93: + case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9a: case 0x9b: + case 0x9c: case 0x9d: case 0x9e: case 0x9f: + util::stream_format(stream, "LI #$%1X", op & 0xf); break; + case 0xa0: case 0xa1: case 0xa2: case 0xa3: + case 0xa4: case 0xa5: case 0xa6: case 0xa7: + case 0xa8: case 0xa9: case 0xaa: case 0xab: + case 0xac: case 0xad: case 0xae: case 0xaf: + util::stream_format(stream, "CYI #$%1X", op & 0xf); break; + case 0xb0: case 0xb1: case 0xb2: case 0xb3: + case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xb8: case 0xb9: case 0xba: case 0xbb: + case 0xbc: case 0xbd: case 0xbe: case 0xbf: + util::stream_format(stream, "CI #$%1X", op & 0xf); break; + + default: // C0-FF + util::stream_format(stream, "JMP $%04X", (pc & ~0x3f) + op - 0xc0); break; } return (pc - startpc) | SUPPORTED; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.h mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.h --- mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88dasm.h 2024-03-25 14:00:46.000000000 +0000 @@ -2,7 +2,7 @@ // copyright-holders:Ernesto Corvi /******************************************************************************* - mb88dasm.c + mb88dasm.h Core implementation for the portable Fujitsu MB88xx series MCU disassembler. Written by Ernesto Corvi @@ -21,8 +21,8 @@ mb88_disassembler() = default; virtual ~mb88_disassembler() = default; - virtual u32 opcode_alignment() const override; + virtual u32 opcode_alignment() const override { return 1; } virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; }; -#endif +#endif // MAME_CPU_MB88XX_MB88DASM_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88xx.cpp mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88xx.cpp --- mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88xx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88xx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,7 +7,6 @@ Written by Ernesto Corvi - TODO: - Add support for the timer - Add support for the serial interface @@ -58,18 +57,18 @@ #define TEST_SF() (m_sf & 1) #define TEST_IF() (m_if & 1) -#define UPDATE_ST_C(v) m_st=(v&0x10) ? 0 : 1 -#define UPDATE_ST_Z(v) m_st=(v==0) ? 0 : 1 +#define UPDATE_ST_C(v) m_st = (v & 0x10) ? 0 : 1 +#define UPDATE_ST_Z(v) m_st = (v == 0) ? 0 : 1 -#define UPDATE_CF(v) m_cf=((v&0x10)==0) ? 0 : 1 -#define UPDATE_ZF(v) m_zf=(v!=0) ? 0 : 1 +#define UPDATE_CF(v) m_cf = ((v & 0x10) == 0) ? 0 : 1 +#define UPDATE_ZF(v) m_zf = (v != 0) ? 0 : 1 #define CYCLES(x) do { m_icount -= (x); } while (0) -#define GETPC() (((int)m_PA << 6)+m_PC) -#define GETEA() ((m_X << 4)+m_Y) +#define GETPC() (((int)m_PA << 6) + m_PC) +#define GETEA() ((m_X << 4) + m_Y) -#define INCPC() do { m_PC++; if ( m_PC >= 0x40 ) { m_PC = 0; m_PA++; } } while (0) +#define INCPC() do { m_PC++; if (m_PC >= 0x40) { m_PC = 0; m_PA++; } } while (0) /*************************************************************************** @@ -112,10 +111,17 @@ } -mb88_cpu_device::mb88_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width) +mb88_cpu_device::mb88_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int program_width, int data_width) : cpu_device(mconfig, type, tag, owner, clock) - , m_program_config("program", ENDIANNESS_BIG, 8, program_width, 0, (program_width == 9) ? address_map_constructor(FUNC(mb88_cpu_device::program_9bit), this) : (program_width == 10) ? address_map_constructor(FUNC(mb88_cpu_device::program_10bit), this) : address_map_constructor(FUNC(mb88_cpu_device::program_11bit), this)) - , m_data_config("data", ENDIANNESS_BIG, 8, data_width, 0, (data_width == 4) ? address_map_constructor(FUNC(mb88_cpu_device::data_4bit), this) : (data_width == 5) ? address_map_constructor(FUNC(mb88_cpu_device::data_5bit), this) : (data_width == 6) ? address_map_constructor(FUNC(mb88_cpu_device::data_6bit), this) : address_map_constructor(FUNC(mb88_cpu_device::data_7bit), this)) + , m_program_config("program", ENDIANNESS_BIG, 8, program_width, 0, + (program_width == 9) ? address_map_constructor(FUNC(mb88_cpu_device::program_9bit), this) : + (program_width == 10) ? address_map_constructor(FUNC(mb88_cpu_device::program_10bit), this) : + address_map_constructor(FUNC(mb88_cpu_device::program_11bit), this)) + , m_data_config("data", ENDIANNESS_BIG, 8, data_width, 0, + (data_width == 4) ? address_map_constructor(FUNC(mb88_cpu_device::data_4bit), this) : + (data_width == 5) ? address_map_constructor(FUNC(mb88_cpu_device::data_5bit), this) : + (data_width == 6) ? address_map_constructor(FUNC(mb88_cpu_device::data_6bit), this) : + address_map_constructor(FUNC(mb88_cpu_device::data_7bit), this)) , m_PLA(nullptr) , m_read_k(*this, 0) , m_write_o(*this) @@ -127,36 +133,36 @@ { } -mb88201_cpu_device::mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb88201_cpu_device::mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB88201, tag, owner, clock, 9, 4) { } -mb88202_cpu_device::mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb88202_cpu_device::mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB88202, tag, owner, clock, 10, 5) { } -mb8841_cpu_device::mb8841_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb8841_cpu_device::mb8841_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB8841, tag, owner, clock, 11, 7) { } -mb8842_cpu_device::mb8842_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb8842_cpu_device::mb8842_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB8842, tag, owner, clock, 11, 7) { } -mb8843_cpu_device::mb8843_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb8843_cpu_device::mb8843_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB8843, tag, owner, clock, 10, 6) { } -mb8844_cpu_device::mb8844_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +mb8844_cpu_device::mb8844_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : mb88_cpu_device(mconfig, MB8844, tag, owner, clock, 10, 6) { } @@ -212,20 +218,20 @@ save_item(NAME(m_pending_interrupt)); save_item(NAME(m_in_irq)); - state_add( MB88_PC, "PC", m_PC).formatstr("%02X"); - state_add( MB88_PA, "PA", m_PA).formatstr("%02X"); - state_add( MB88_SI, "SI", m_SI).formatstr("%01X"); - state_add( MB88_A, "A", m_A).formatstr("%01X"); - state_add( MB88_X, "X", m_X).formatstr("%01X"); - state_add( MB88_Y, "Y", m_Y).formatstr("%01X"); - state_add( MB88_PIO, "PIO", m_pio).formatstr("%02X"); - state_add( MB88_TH, "TH", m_TH).formatstr("%01X"); - state_add( MB88_TL, "TL", m_TL).formatstr("%01X"); - state_add( MB88_SB, "SB", m_SB).formatstr("%01X"); - - state_add( STATE_GENPC, "GENPC", m_debugger_pc ).callimport().callexport().noshow(); - state_add( STATE_GENPCBASE, "CURPC", m_debugger_pc ).callimport().callexport().noshow(); - state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_flags ).callimport().callexport().formatstr("%6s").noshow(); + state_add(MB88_PC, "PC", m_PC).formatstr("%02X"); + state_add(MB88_PA, "PA", m_PA).formatstr("%02X"); + state_add(MB88_SI, "SI", m_SI).formatstr("%01X"); + state_add(MB88_A, "A", m_A).formatstr("%01X"); + state_add(MB88_X, "X", m_X).formatstr("%01X"); + state_add(MB88_Y, "Y", m_Y).formatstr("%01X"); + state_add(MB88_PIO, "PIO", m_pio).formatstr("%02X"); + state_add(MB88_TH, "TH", m_TH).formatstr("%01X"); + state_add(MB88_TL, "TL", m_TL).formatstr("%01X"); + state_add(MB88_SB, "SB", m_SB).formatstr("%01X"); + + state_add(STATE_GENPC, "GENPC", m_debugger_pc).callimport().callexport().noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_debugger_pc).callimport().callexport().noshow(); + state_add(STATE_GENFLAGS, "GENFLAGS", m_debugger_flags).callimport().callexport().formatstr("%6s").noshow(); set_icountptr(m_icount); } @@ -246,7 +252,7 @@ case STATE_GENPC: case STATE_GENPCBASE: m_PC = m_debugger_pc & 0x3f; - m_PA = ( m_debugger_pc >> 6 ) & 0x1f; + m_PA = (m_debugger_pc >> 6) & 0x1f; break; } } @@ -294,7 +300,7 @@ void mb88_cpu_device::device_reset() { - /* zero registers and flags */ + // zero registers and flags m_PC = 0; m_PA = 0; m_SP[0] = m_SP[1] = m_SP[2] = m_SP[3] = 0; @@ -302,7 +308,7 @@ m_A = 0; m_X = 0; m_Y = 0; - m_st = 1; /* start off with st=1 */ + m_st = 1; // start off with st=1 m_zf = 0; m_cf = 0; m_vf = 0; @@ -322,17 +328,16 @@ CORE EXECUTION LOOP ***************************************************************************/ -TIMER_CALLBACK_MEMBER( mb88_cpu_device::serial_timer ) +TIMER_CALLBACK_MEMBER(mb88_cpu_device::serial_timer) { m_SBcount++; - /* if we get too many interrupts with no servicing, disable the timer - until somebody does something */ + // if we get too many interrupts with no servicing, disable the timer until somebody does something if (m_SBcount >= SERIAL_DISABLE_THRESH) m_serial->adjust(attotime::never); - /* only read if not full; this is needed by the Namco 52xx to ensure that - the program can write to S and recover the value even if serial is enabled */ + // only read if not full; this is needed by the Namco 52xx to ensure that + // the program can write to S and recover the value even if serial is enabled if (!m_sf) { m_SB = (m_SB >> 1) | (m_read_si() ? 8 : 0); @@ -346,11 +351,11 @@ } -int mb88_cpu_device::pla( int inA, int inB ) +int mb88_cpu_device::pla(int inA, int inB) { - int index = ((inB&1) << 4) | (inA&0x0f); + int index = ((inB & 1) << 4) | (inA & 0x0f); - if ( m_PLA ) + if (m_PLA) return m_PLA[index]; return index; @@ -358,10 +363,9 @@ void mb88_cpu_device::execute_set_input(int inputnum, int state) { - /* On rising edge trigger interrupt. - * Note this is a logical level, the actual pin is high-to-low voltage - * triggered. */ - if ( (m_pio & INT_CAUSE_EXTERNAL) && !m_if && state != CLEAR_LINE ) + // On rising edge trigger interrupt. + // Note this is a logical level, the actual pin is high-to-low voltage triggered. + if ((m_pio & INT_CAUSE_EXTERNAL) && !m_if && state != CLEAR_LINE) { m_pending_interrupt |= INT_CAUSE_EXTERNAL; } @@ -369,9 +373,9 @@ m_if = state != CLEAR_LINE; } -void mb88_cpu_device::update_pio_enable( uint8_t newpio ) +void mb88_cpu_device::update_pio_enable(u8 newpio) { - /* if the serial state has changed, configure the timer */ + // if the serial state has changed, configure the timer if ((m_pio ^ newpio) & 0x30) { if ((newpio & 0x30) == 0) @@ -399,12 +403,12 @@ } } -void mb88_cpu_device::update_pio( int cycles ) +void mb88_cpu_device::update_pio(int cycles) { - /* TODO: improve/validate serial and timer support */ + // TODO: improve/validate serial and timer support - /* internal clock enable */ - if ( m_pio & 0x80 ) + // internal clock enable + if (m_pio & 0x80) { m_TP += cycles; while (m_TP >= TIMER_PRESCALE) @@ -414,34 +418,33 @@ } } - /* process pending interrupts */ + // process pending interrupts if (!m_in_irq && m_pending_interrupt & m_pio) { m_in_irq = true; - uint16_t intpc = GETPC(); + u16 intpc = GETPC(); m_SP[m_SI] = intpc; m_SP[m_SI] |= TEST_CF() << 15; m_SP[m_SI] |= TEST_ZF() << 14; m_SP[m_SI] |= TEST_ST() << 13; - m_SI = ( m_SI + 1 ) & 3; + m_SI = (m_SI + 1) & 3; - /* the datasheet doesn't mention interrupt vectors but - the Arabian MCU program expects the following */ + // the datasheet doesn't mention interrupt vectors but the Arabian MCU program expects the following if (m_pending_interrupt & m_pio & INT_CAUSE_EXTERNAL) { - /* if we have a live external source, call the irqcallback */ - standard_irq_callback( 0, intpc ); + // if we have a live external source, call the irqcallback + standard_irq_callback(0, intpc); m_PC = 0x02; } else if (m_pending_interrupt & m_pio & INT_CAUSE_TIMER) { - standard_irq_callback( 1, intpc ); + standard_irq_callback(1, intpc); m_PC = 0x04; } else if (m_pending_interrupt & m_pio & INT_CAUSE_SERIAL) { - standard_irq_callback( 2, intpc ); + standard_irq_callback(2, intpc); m_PC = 0x06; } @@ -449,7 +452,7 @@ m_st = 1; m_pending_interrupt = 0; - CYCLES(3); /* ? */ + CYCLES(3); // ? } } @@ -459,7 +462,7 @@ { m_ctr = state; - /* on a falling clock, increment the timer, but only if enabled */ + // on a falling clock, increment the timer, but only if enabled if (m_ctr == 0 && (m_pio & 0x40)) increment_timer(); } @@ -470,93 +473,93 @@ { while (m_icount > 0) { - uint8_t opcode, arg, oc; + u8 opcode, arg, oc; - /* fetch the opcode */ + // fetch the opcode debugger_instruction_hook(GETPC()); opcode = READOP(GETPC()); - /* increment the PC */ + // increment the PC INCPC(); - /* start with instruction doing 1 cycle */ + // start with instruction doing 1 cycle oc = 1; switch (opcode) { - case 0x00: /* nop ZCS:...*/ + case 0x00: // nop ZCS:... m_st = 1; break; - case 0x01: /* outO ZCS:...*/ + case 0x01: // outO ZCS:... m_write_o(pla(m_A, TEST_CF())); m_st = 1; break; - case 0x02: /* outP ZCS:... */ + case 0x02: // outP ZCS:... m_write_p(m_A); m_st = 1; break; - case 0x03: /* outR ZCS:... */ + case 0x03: // outR ZCS:... arg = m_Y; m_write_r[arg & 3](m_A); m_st = 1; break; - case 0x04: /* tay ZCS:... */ + case 0x04: // tay ZCS:... m_Y = m_A; m_st = 1; break; - case 0x05: /* tath ZCS:... */ + case 0x05: // tath ZCS:... m_TH = m_A; m_st = 1; break; - case 0x06: /* tatl ZCS:... */ + case 0x06: // tatl ZCS:... m_TL = m_A; m_st = 1; break; - case 0x07: /* tas ZCS:... */ + case 0x07: // tas ZCS:... m_SB = m_A; m_st = 1; break; - case 0x08: /* icy ZCS:x.x */ + case 0x08: // icy ZCS:x.x m_Y++; UPDATE_ST_C(m_Y); m_Y &= 0x0f; UPDATE_ZF(m_Y); break; - case 0x09: /* icm ZCS:x.x */ - arg=RDMEM(GETEA()); + case 0x09: // icm ZCS:x.x + arg = RDMEM(GETEA()); arg++; UPDATE_ST_C(arg); arg &= 0x0f; UPDATE_ZF(arg); - WRMEM(GETEA(),arg); + WRMEM(GETEA(), arg); break; - case 0x0a: /* stic ZCS:x.x */ - WRMEM(GETEA(),m_A); + case 0x0a: // stic ZCS:x.x + WRMEM(GETEA(), m_A); m_Y++; UPDATE_ST_C(m_Y); m_Y &= 0x0f; UPDATE_ZF(m_Y); break; - case 0x0b: /* x ZCS:x.. */ + case 0x0b: // x ZCS:x.. arg = RDMEM(GETEA()); - WRMEM(GETEA(),m_A); + WRMEM(GETEA(), m_A); m_A = arg; UPDATE_ZF(m_A); m_st = 1; break; - case 0x0c: /* rol ZCS:xxx */ + case 0x0c: // rol ZCS:xxx m_A <<= 1; m_A |= TEST_CF(); UPDATE_ST_C(m_A); @@ -565,13 +568,13 @@ UPDATE_ZF(m_A); break; - case 0x0d: /* l ZCS:x.. */ + case 0x0d: // l ZCS:x.. m_A = RDMEM(GETEA()); UPDATE_ZF(m_A); m_st = 1; break; - case 0x0e: /* adc ZCS:xxx */ + case 0x0e: // adc ZCS:xxx arg = RDMEM(GETEA()); arg += m_A; arg += TEST_CF(); @@ -581,87 +584,87 @@ UPDATE_ZF(m_A); break; - case 0x0f: /* and ZCS:x.x */ + case 0x0f: // and ZCS:x.x m_A &= RDMEM(GETEA()); UPDATE_ZF(m_A); m_st = m_zf ^ 1; break; - case 0x10: /* daa ZCS:.xx */ - if ( TEST_CF() || m_A > 9 ) m_A += 6; + case 0x10: // daa ZCS:.xx + if (TEST_CF() || m_A > 9) m_A += 6; UPDATE_ST_C(m_A); m_cf = m_st ^ 1; m_A &= 0x0f; break; - case 0x11: /* das ZCS:.xx */ - if ( TEST_CF() || m_A > 9 ) m_A += 10; + case 0x11: // das ZCS:.xx + if (TEST_CF() || m_A > 9) m_A += 10; UPDATE_ST_C(m_A); m_cf = m_st ^ 1; m_A &= 0x0f; break; - case 0x12: /* inK ZCS:x.. */ + case 0x12: // inK ZCS:x.. m_A = m_read_k() & 0x0f; UPDATE_ZF(m_A); m_st = 1; break; - case 0x13: /* inR ZCS:x.. */ + case 0x13: // inR ZCS:x.. arg = m_Y; m_A = m_read_r[arg & 3]() & 0x0f; UPDATE_ZF(m_A); m_st = 1; break; - case 0x14: /* tya ZCS:x.. */ + case 0x14: // tya ZCS:x.. m_A = m_Y; UPDATE_ZF(m_A); m_st = 1; break; - case 0x15: /* ttha ZCS:x.. */ + case 0x15: // ttha ZCS:x.. m_A = m_TH; UPDATE_ZF(m_A); m_st = 1; break; - case 0x16: /* ttla ZCS:x.. */ + case 0x16: // ttla ZCS:x.. m_A = m_TL; UPDATE_ZF(m_A); m_st = 1; break; - case 0x17: /* tsa ZCS:x.. */ + case 0x17: // tsa ZCS:x.. m_A = m_SB; UPDATE_ZF(m_A); m_st = 1; break; - case 0x18: /* dcy ZCS:..x */ + case 0x18: // dcy ZCS:..x m_Y--; UPDATE_ST_C(m_Y); m_Y &= 0x0f; break; - case 0x19: /* dcm ZCS:x.x */ - arg=RDMEM(GETEA()); + case 0x19: // dcm ZCS:x.x + arg = RDMEM(GETEA()); arg--; UPDATE_ST_C(arg); arg &= 0x0f; UPDATE_ZF(arg); - WRMEM(GETEA(),arg); + WRMEM(GETEA(), arg); break; - case 0x1a: /* stdc ZCS:x.x */ - WRMEM(GETEA(),m_A); + case 0x1a: // stdc ZCS:x.x + WRMEM(GETEA(), m_A); m_Y--; UPDATE_ST_C(m_Y); m_Y &= 0x0f; UPDATE_ZF(m_Y); break; - case 0x1b: /* xx ZCS:x.. */ + case 0x1b: // xx ZCS:x.. arg = m_X; m_X = m_A; m_A = arg; @@ -669,7 +672,7 @@ m_st = 1; break; - case 0x1c: /* ror ZCS:xxx */ + case 0x1c: // ror ZCS:xxx m_A |= TEST_CF() << 4; UPDATE_ST_C(m_A << 4); m_cf = m_st ^ 1; @@ -678,12 +681,12 @@ UPDATE_ZF(m_A); break; - case 0x1d: /* st ZCS:x.. */ - WRMEM(GETEA(),m_A); + case 0x1d: // st ZCS:x.. + WRMEM(GETEA(), m_A); m_st = 1; break; - case 0x1e: /* sbc ZCS:xxx */ + case 0x1e: // sbc ZCS:xxx arg = RDMEM(GETEA()); arg -= m_A; arg -= TEST_CF(); @@ -693,53 +696,53 @@ UPDATE_ZF(m_A); break; - case 0x1f: /* or ZCS:x.x */ + case 0x1f: // or ZCS:x.x m_A |= RDMEM(GETEA()); UPDATE_ZF(m_A); m_st = m_zf ^ 1; break; - case 0x20: /* setR ZCS:... */ - arg = m_read_r[m_Y/4]() & 0x0f; - m_write_r[m_Y/4](arg | (1 << (m_Y%4))); + case 0x20: // setR ZCS:... + arg = m_read_r[m_Y >> 2]() & 0x0f; + m_write_r[m_Y >> 2](arg | (1 << (m_Y & 3))); m_st = 1; break; - case 0x21: /* setc ZCS:.xx */ + case 0x21: // setc ZCS:.xx m_cf = 1; m_st = 1; break; - case 0x22: /* rstR ZCS:... */ - arg = m_read_r[m_Y/4]() & 0x0f; - m_write_r[m_Y/4](arg & ~(1 << (m_Y%4))); + case 0x22: // rstR ZCS:... + arg = m_read_r[m_Y >> 2]() & 0x0f; + m_write_r[m_Y >> 2](arg & ~(1 << (m_Y & 3))); m_st = 1; break; - case 0x23: /* rstc ZCS:.xx */ + case 0x23: // rstc ZCS:.xx m_cf = 0; m_st = 1; break; - case 0x24: /* tstr ZCS:..x */ - arg = m_read_r[m_Y/4]() & 0x0f; - m_st = ( arg & ( 1 << (m_Y%4) ) ) ? 0 : 1; + case 0x24: // tstr ZCS:..x + arg = m_read_r[m_Y >> 2]() & 0x0f; + m_st = (arg & (1 << (m_Y & 3))) ? 0 : 1; break; - case 0x25: /* tsti ZCS:..x */ + case 0x25: // tsti ZCS:..x m_st = m_if ^ 1; break; - case 0x26: /* tstv ZCS:..x */ + case 0x26: // tstv ZCS:..x m_st = m_vf ^ 1; m_vf = 0; break; - case 0x27: /* tsts ZCS:..x */ + case 0x27: // tsts ZCS:..x m_st = m_sf ^ 1; if (m_sf) { - /* re-enable the timer if we disabled it previously */ + // re-enable the timer if we disabled it previously if (m_SBcount >= SERIAL_DISABLE_THRESH) m_serial->adjust(attotime::from_hz(clock() / SERIAL_PRESCALE), 0, attotime::from_hz(clock() / SERIAL_PRESCALE)); m_SBcount = 0; @@ -747,40 +750,40 @@ m_sf = 0; break; - case 0x28: /* tstc ZCS:..x */ + case 0x28: // tstc ZCS:..x m_st = m_cf ^ 1; break; - case 0x29: /* tstz ZCS:..x */ + case 0x29: // tstz ZCS:..x m_st = m_zf ^ 1; break; - case 0x2a: /* sts ZCS:x.. */ - WRMEM(GETEA(),m_SB); + case 0x2a: // sts ZCS:x.. + WRMEM(GETEA(), m_SB); UPDATE_ZF(m_SB); m_st = 1; break; - case 0x2b: /* ls ZCS:x.. */ + case 0x2b: // ls ZCS:x.. m_SB = RDMEM(GETEA()); UPDATE_ZF(m_SB); m_st = 1; break; - case 0x2c: /* rts ZCS:... */ - m_SI = ( m_SI - 1 ) & 3; + case 0x2c: // rts ZCS:... + m_SI = (m_SI - 1) & 3; m_PC = m_SP[m_SI] & 0x3f; m_PA = (m_SP[m_SI] >> 6) & 0x1f; m_st = 1; break; - case 0x2d: /* neg ZCS: ..x */ - m_A = (~m_A)+1; + case 0x2d: // neg ZCS: ..x + m_A = (~m_A) + 1; m_A &= 0x0f; UPDATE_ST_Z(m_A); break; - case 0x2e: /* c ZCS:xxx */ + case 0x2e: // c ZCS:xxx arg = RDMEM(GETEA()); arg -= m_A; UPDATE_CF(arg); @@ -789,139 +792,139 @@ m_zf = m_st ^ 1; break; - case 0x2f: /* eor ZCS:x.x */ + case 0x2f: // eor ZCS:x.x m_A ^= RDMEM(GETEA()); UPDATE_ST_Z(m_A); m_zf = m_st ^ 1; break; - case 0x30: case 0x31: case 0x32: case 0x33: /* sbit ZCS:... */ + case 0x30: case 0x31: case 0x32: case 0x33: // sbit ZCS:... arg = RDMEM(GETEA()); - WRMEM(GETEA(), arg | (1 << (opcode&3))); + WRMEM(GETEA(), arg | (1 << (opcode & 3))); m_st = 1; break; - case 0x34: case 0x35: case 0x36: case 0x37: /* rbit ZCS:... */ + case 0x34: case 0x35: case 0x36: case 0x37: // rbit ZCS:... arg = RDMEM(GETEA()); - WRMEM(GETEA(), arg & ~(1 << (opcode&3))); + WRMEM(GETEA(), arg & ~(1 << (opcode & 3))); m_st = 1; break; - case 0x38: case 0x39: case 0x3a: case 0x3b: /* tbit ZCS:... */ + case 0x38: case 0x39: case 0x3a: case 0x3b: // tbit ZCS:... arg = RDMEM(GETEA()); - m_st = ( arg & (1 << (opcode&3) ) ) ? 0 : 1; + m_st = (arg & (1 << (opcode & 3))) ? 0 : 1; break; - case 0x3c: /* rti ZCS:... */ - /* restore address and saved state flags on the top bits of the stack */ + case 0x3c: // rti ZCS:... + // restore address and saved state flags on the top bits of the stack m_in_irq = false; - m_SI = ( m_SI - 1 ) & 3; + m_SI = (m_SI - 1) & 3; m_PC = m_SP[m_SI] & 0x3f; m_PA = (m_SP[m_SI] >> 6) & 0x1f; - m_st = (m_SP[m_SI] >> 13)&1; - m_zf = (m_SP[m_SI] >> 14)&1; - m_cf = (m_SP[m_SI] >> 15)&1; + m_st = (m_SP[m_SI] >> 13) & 1; + m_zf = (m_SP[m_SI] >> 14) & 1; + m_cf = (m_SP[m_SI] >> 15) & 1; break; - case 0x3d: /* jpa imm ZCS:..x */ + case 0x3d: // jpa imm ZCS:..x m_PA = READOP(GETPC()) & 0x1f; m_PC = m_A * 4; oc = 2; m_st = 1; break; - case 0x3e: /* en imm ZCS:... */ + case 0x3e: // en imm ZCS:... update_pio_enable(m_pio | READOP(GETPC())); INCPC(); oc = 2; m_st = 1; break; - case 0x3f: /* dis imm ZCS:... */ + case 0x3f: // dis imm ZCS:... update_pio_enable(m_pio & ~(READOP(GETPC()))); INCPC(); oc = 2; m_st = 1; break; - case 0x40: case 0x41: case 0x42: case 0x43: /* setD ZCS:... */ + case 0x40: case 0x41: case 0x42: case 0x43: // setD ZCS:... arg = m_read_r[0]() & 0x0f; - arg |= (1 << (opcode&3)); + arg |= (1 << (opcode & 3)); m_write_r[0](arg); m_st = 1; break; - case 0x44: case 0x45: case 0x46: case 0x47: /* rstD ZCS:... */ + case 0x44: case 0x45: case 0x46: case 0x47: // rstD ZCS:... arg = m_read_r[0]() & 0x0f; - arg &= ~(1 << (opcode&3)); + arg &= ~(1 << (opcode & 3)); m_write_r[0](arg); m_st = 1; break; - case 0x48: case 0x49: case 0x4a: case 0x4b: /* tstD ZCS:..x */ + case 0x48: case 0x49: case 0x4a: case 0x4b: // tstD ZCS:..x arg = m_read_r[2]() & 0x0f; - m_st = (arg & (1 << (opcode&3))) ? 0 : 1; + m_st = (arg & (1 << (opcode & 3))) ? 0 : 1; break; - case 0x4c: case 0x4d: case 0x4e: case 0x4f: /* tba ZCS:..x */ - m_st = (m_A & (1 << (opcode&3))) ? 0 : 1; + case 0x4c: case 0x4d: case 0x4e: case 0x4f: // tba ZCS:..x + m_st = (m_A & (1 << (opcode & 3))) ? 0 : 1; break; - case 0x50: case 0x51: case 0x52: case 0x53: /* xd ZCS:x.. */ + case 0x50: case 0x51: case 0x52: case 0x53: // xd ZCS:x.. arg = RDMEM(opcode&3); - WRMEM((opcode&3),m_A); + WRMEM((opcode & 3), m_A); m_A = arg; UPDATE_ZF(m_A); m_st = 1; break; - case 0x54: case 0x55: case 0x56: case 0x57: /* xyd ZCS:x.. */ - arg = RDMEM((opcode&3)+4); - WRMEM((opcode&3)+4,m_Y); + case 0x54: case 0x55: case 0x56: case 0x57: // xyd ZCS:x.. + arg = RDMEM((opcode & 3) + 4); + WRMEM((opcode & 3) + 4, m_Y); m_Y = arg; UPDATE_ZF(m_Y); m_st = 1; break; - case 0x58: case 0x59: case 0x5a: case 0x5b: - case 0x5c: case 0x5d: case 0x5e: case 0x5f: /* lxi ZCS:x.. */ + case 0x58: case 0x59: case 0x5a: case 0x5b: + case 0x5c: case 0x5d: case 0x5e: case 0x5f: // lxi ZCS:x.. m_X = opcode & 7; UPDATE_ZF(m_X); m_st = 1; break; - case 0x60: case 0x61: case 0x62: case 0x63: - case 0x64: case 0x65: case 0x66: case 0x67: /* call imm ZCS:..x */ + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: // call imm ZCS:..x arg = READOP(GETPC()); INCPC(); oc = 2; - if ( TEST_ST() ) + if (TEST_ST()) { m_SP[m_SI] = GETPC(); - m_SI = ( m_SI + 1 ) & 3; + m_SI = (m_SI + 1) & 3; m_PC = arg & 0x3f; - m_PA = ( ( opcode & 7 ) << 2 ) | ( arg >> 6 ); + m_PA = ((opcode & 7) << 2) | (arg >> 6); } m_st = 1; break; - case 0x68: case 0x69: case 0x6a: case 0x6b: - case 0x6c: case 0x6d: case 0x6e: case 0x6f: /* jpl imm ZCS:..x */ + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: // jpl imm ZCS:..x arg = READOP(GETPC()); INCPC(); oc = 2; - if ( TEST_ST() ) + if (TEST_ST()) { m_PC = arg & 0x3f; - m_PA = ( ( opcode & 7 ) << 2 ) | ( arg >> 6 ); + m_PA = ((opcode & 7) << 2) | (arg >> 6); } m_st = 1; break; - case 0x70: case 0x71: case 0x72: case 0x73: - case 0x74: case 0x75: case 0x76: case 0x77: - case 0x78: case 0x79: case 0x7a: case 0x7b: - case 0x7c: case 0x7d: case 0x7e: case 0x7f: /* ai ZCS:xxx */ + case 0x70: case 0x71: case 0x72: case 0x73: + case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7a: case 0x7b: + case 0x7c: case 0x7d: case 0x7e: case 0x7f: // ai ZCS:xxx arg = opcode & 0x0f; arg += m_A; UPDATE_ST_C(arg); @@ -930,28 +933,28 @@ UPDATE_ZF(m_A); break; - case 0x80: case 0x81: case 0x82: case 0x83: - case 0x84: case 0x85: case 0x86: case 0x87: - case 0x88: case 0x89: case 0x8a: case 0x8b: - case 0x8c: case 0x8d: case 0x8e: case 0x8f: /* lxi ZCS:x.. */ + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8a: case 0x8b: + case 0x8c: case 0x8d: case 0x8e: case 0x8f: // lxi ZCS:x.. m_Y = opcode & 0x0f; UPDATE_ZF(m_Y); m_st = 1; break; - case 0x90: case 0x91: case 0x92: case 0x93: - case 0x94: case 0x95: case 0x96: case 0x97: - case 0x98: case 0x99: case 0x9a: case 0x9b: - case 0x9c: case 0x9d: case 0x9e: case 0x9f: /* li ZCS:x.. */ + case 0x90: case 0x91: case 0x92: case 0x93: + case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9a: case 0x9b: + case 0x9c: case 0x9d: case 0x9e: case 0x9f: // li ZCS:x.. m_A = opcode & 0x0f; UPDATE_ZF(m_A); m_st = 1; break; - case 0xa0: case 0xa1: case 0xa2: case 0xa3: - case 0xa4: case 0xa5: case 0xa6: case 0xa7: - case 0xa8: case 0xa9: case 0xaa: case 0xab: - case 0xac: case 0xad: case 0xae: case 0xaf: /* cyi ZCS:xxx */ + case 0xa0: case 0xa1: case 0xa2: case 0xa3: + case 0xa4: case 0xa5: case 0xa6: case 0xa7: + case 0xa8: case 0xa9: case 0xaa: case 0xab: + case 0xac: case 0xad: case 0xae: case 0xaf: // cyi ZCS:xxx arg = (opcode & 0x0f) - m_Y; UPDATE_CF(arg); arg &= 0x0f; @@ -959,10 +962,10 @@ m_zf = m_st ^ 1; break; - case 0xb0: case 0xb1: case 0xb2: case 0xb3: - case 0xb4: case 0xb5: case 0xb6: case 0xb7: - case 0xb8: case 0xb9: case 0xba: case 0xbb: - case 0xbc: case 0xbd: case 0xbe: case 0xbf: /* ci ZCS:xxx */ + case 0xb0: case 0xb1: case 0xb2: case 0xb3: + case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xb8: case 0xb9: case 0xba: case 0xbb: + case 0xbc: case 0xbd: case 0xbe: case 0xbf: // ci ZCS:xxx arg = (opcode & 0x0f) - m_A; UPDATE_CF(arg); arg &= 0x0f; @@ -970,19 +973,17 @@ m_zf = m_st ^ 1; break; - default: /* jmp ZCS:..x */ - if ( TEST_ST() ) - { + default: // jmp ZCS:..x + if (TEST_ST()) m_PC = opcode & 0x3f; - } m_st = 1; break; } - /* update cycle counts */ - CYCLES( oc ); + // update cycle counts + CYCLES(oc); - /* update interrupts, serial and timer flags */ + // update interrupts, serial and timer flags update_pio(oc); } } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88xx.h mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88xx.h --- mame-0.263+dfsg.1/src/devices/cpu/mb88xx/mb88xx.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mb88xx/mb88xx.h 2024-03-25 14:00:46.000000000 +0000 @@ -54,7 +54,7 @@ enum { - MB88_PC=1, + MB88_PC = 1, MB88_PA, MB88_FLAGS, MB88_SI, @@ -94,7 +94,7 @@ // SO: serial output auto write_so() { return m_write_so.bind(); } - void set_pla(uint8_t *pla) { m_PLA = pla; } + void set_pla(u8 *pla) { m_PLA = pla; } void clock_w(int state); @@ -105,21 +105,22 @@ void program_10bit(address_map &map); void program_11bit(address_map &map); void program_9bit(address_map &map); + protected: - mb88_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width); + mb88_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int program_width, int data_width); // device-level overrides virtual void device_start() override; virtual void device_reset() override; // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const noexcept override { return 1; } - virtual uint32_t execute_max_cycles() const noexcept override { return 3; } - virtual uint32_t execute_input_lines() const noexcept override { return 1; } + virtual u32 execute_min_cycles() const noexcept override { return 1; } + virtual u32 execute_max_cycles() const noexcept override { return 3; } + virtual u32 execute_input_lines() const noexcept override { return 1; } virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; - virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 6 - 1) / 6; } - virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 6); } + virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 6 - 1) / 6; } + virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 6); } // device_memory_interface overrides virtual space_config_vector memory_space_config() const override; @@ -136,36 +137,36 @@ address_space_config m_program_config; address_space_config m_data_config; - uint8_t m_PC; /* Program Counter: 6 bits */ - uint8_t m_PA; /* Page Address: 4 bits */ - uint16_t m_SP[4]; /* Stack is 4*10 bit addresses deep, but we also use 3 top bits per address to store flags during irq */ - uint8_t m_SI; /* Stack index: 2 bits */ - uint8_t m_A; /* Accumulator: 4 bits */ - uint8_t m_X; /* Index X: 4 bits */ - uint8_t m_Y; /* Index Y: 4 bits */ - uint8_t m_st; /* State flag: 1 bit */ - uint8_t m_zf; /* Zero flag: 1 bit */ - uint8_t m_cf; /* Carry flag: 1 bit */ - uint8_t m_vf; /* Timer overflow flag: 1 bit */ - uint8_t m_sf; /* Serial Full/Empty flag: 1 bit */ - uint8_t m_if; /* Interrupt flag: 1 bit */ - - /* Peripheral Control */ - uint8_t m_pio; /* Peripheral enable bits: 8 bits */ - - /* Timer registers */ - uint8_t m_TH; /* Timer High: 4 bits */ - uint8_t m_TL; /* Timer Low: 4 bits */ - uint8_t m_TP; /* Timer Prescale: 6 bits? */ - uint8_t m_ctr; /* current external counter value */ - - /* Serial registers */ - uint8_t m_SB; /* Serial buffer: 4 bits */ - uint16_t m_SBcount; /* number of bits received */ + u8 m_PC; // Program Counter: 6 bits + u8 m_PA; // Page Address: 4 bits + u16 m_SP[4]; // Stack is 4*10 bit addresses deep, but we also use 3 top bits per address to store flags during irq + u8 m_SI; // Stack index: 2 bits + u8 m_A; // Accumulator: 4 bits + u8 m_X; // Index X: 4 bits + u8 m_Y; // Index Y: 4 bits + u8 m_st; // State flag: 1 bit + u8 m_zf; // Zero flag: 1 bit + u8 m_cf; // Carry flag: 1 bit + u8 m_vf; // Timer overflow flag: 1 bit + u8 m_sf; // Serial Full/Empty flag: 1 bit + u8 m_if; // Interrupt flag: 1 bit + + // Peripheral Control + u8 m_pio; // Peripheral enable bits: 8 bits + + // Timer registers + u8 m_TH; // Timer High: 4 bits + u8 m_TL; // Timer Low: 4 bits + u8 m_TP; // Timer Prescale: 6 bits? + u8 m_ctr; // current external counter value + + // Serial registers + u8 m_SB; // Serial buffer: 4 bits + u16 m_SBcount;// number of bits received emu_timer *m_serial; - /* PLA configuration and port callbacks */ - uint8_t * m_PLA; + // PLA configuration and port callbacks + u8 *m_PLA; devcb_read8 m_read_k; devcb_write8 m_write_o; devcb_write8 m_write_p; @@ -174,9 +175,9 @@ devcb_read_line m_read_si; devcb_write_line m_write_so; - /* IRQ handling */ - uint8_t m_pending_interrupt; - bool m_in_irq; + // IRQ handling + u8 m_pending_interrupt; + bool m_in_irq; memory_access<11, 0, 0, ENDIANNESS_BIG>::cache m_cache; memory_access<11, 0, 0, ENDIANNESS_BIG>::specific m_program; @@ -185,62 +186,56 @@ int m_icount; // For the debugger - uint16_t m_debugger_pc; - uint8_t m_debugger_flags; + u16 m_debugger_pc; + u8 m_debugger_flags; - TIMER_CALLBACK_MEMBER( serial_timer ); - int pla( int inA, int inB ); - void update_pio_enable( uint8_t newpio ); + TIMER_CALLBACK_MEMBER(serial_timer); + int pla(int inA, int inB); + void update_pio_enable(u8 newpio); void increment_timer(); - void update_pio( int cycles ); + void update_pio(int cycles); }; class mb88201_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb88201_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; class mb88202_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb88202_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; class mb8841_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb8841_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8841_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; class mb8842_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb8842_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8842_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; class mb8843_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb8843_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8843_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; class mb8844_cpu_device : public mb88_cpu_device { public: - // construction/destruction - mb8844_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + mb8844_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mc68hc11/mc68hc11.cpp mame-0.264+dfsg.1/src/devices/cpu/mc68hc11/mc68hc11.cpp --- mame-0.263+dfsg.1/src/devices/cpu/mc68hc11/mc68hc11.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mc68hc11/mc68hc11.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,6 +16,8 @@ #include "mc68hc11.h" #include "hc11dasm.h" +#include + #define LOG_IRQ (1U << 1) #define VERBOSE (0) @@ -163,12 +165,15 @@ bool mc68hc11_cpu_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - if (file.read(&m_eeprom_data[0], m_internal_eeprom_size, actual) || actual != m_internal_eeprom_size) + std::tie(err, actual) = read(file, &m_eeprom_data[0], m_internal_eeprom_size); + if (err || (actual != m_internal_eeprom_size)) return false; - if (file.read(&m_config, 1, actual) || actual != 1) + std::tie(err, actual) = read(file, &m_config, 1); + if (err || (actual != 1)) return false; return true; @@ -176,12 +181,15 @@ bool mc68hc11_cpu_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - if (file.write(&m_eeprom_data[0], m_internal_eeprom_size, actual) || actual != m_internal_eeprom_size) + std::tie(err, actual) = write(file, &m_eeprom_data[0], m_internal_eeprom_size); + if (err) return false; - if (file.write(&m_config, 1, actual) || actual != 1) + std::tie(err, actual) = write(file, &m_config, 1); + if (err) return false; return true; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mcs51/mcs51.cpp mame-0.264+dfsg.1/src/devices/cpu/mcs51/mcs51.cpp --- mame-0.263+dfsg.1/src/devices/cpu/mcs51/mcs51.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mcs51/mcs51.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -134,6 +134,8 @@ #include "mcs51.h" #include "mcs51dasm.h" +#include + #define LOG_RX (1U << 1) #define LOG_TX (1U << 2) @@ -2696,22 +2698,28 @@ } } -bool ds5002fp_device::nvram_read( util::read_stream &file ) +bool ds5002fp_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - if (file.read( m_scratchpad, 0x80, actual ) || actual != 0x80) + std::tie(err, actual) = read(file, m_scratchpad, 0x80); + if (err || (actual != 0x80)) return false; - if (file.read( m_sfr_ram, 0x80, actual ) || actual != 0x80) + std::tie(err, actual) = read(file, m_sfr_ram, 0x80); + if (err || (actual != 0x80)) return false; return true; } -bool ds5002fp_device::nvram_write( util::write_stream &file ) +bool ds5002fp_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - if (file.write( m_scratchpad, 0x80, actual ) || actual != 0x80) + std::tie(err, actual) = write(file, m_scratchpad, 0x80); + if (err || (actual != 0x80)) return false; - if (file.write( m_sfr_ram, 0x80, actual ) || actual != 0x80) + std::tie(err, actual) = write(file, m_sfr_ram, 0x80); + if (err || (actual != 0x80)) return false; return true; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/melps4/melps4d.cpp mame-0.264+dfsg.1/src/devices/cpu/melps4/melps4d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/melps4/melps4d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/melps4/melps4d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,6 +12,24 @@ #include "emu.h" #include "melps4d.h" + +// common lookup tables + +enum melps4_disassembler::e_mnemonics : unsigned +{ + mILL, + mTAB, mTBA, mTAY, mTYA, mTEAB, mTABE, mTEPA, mTXA, mTAX, + mLXY, mLZ, mINY, mDEY, mLCPS, mSADR, + mTAM, mXAM, mXAMD, mXAMI, + mLA, mAM, mAMC, mAMCS, mA, mSC, mRC, mSZC, mCMA, mRL, mRR, + mSB, mRB, mSZB, mSEAM, mSEY, + mTLA, mTHA, mTAJ, mXAL, mXAH, mLC7, mDEC, mSHL, mRHL, mCPA, mCPAS, mCPAE, mSZJ, + mT1AB, mTRAB, mT2AB, mTAB1, mTABR, mTAB2, mTVA, mTWA, mSNZ1, mSNZ2, + mBA, mSP, mB, mBM, mRT, mRTS, mRTI, + mCLD, mCLS, mCLDS, mSD, mRD, mSZD, mOSAB, mOSPA, mOSE, mIAS, mOFA, mIAF, mOGA, mIAK, mSZK, mSU, mRU, + mEI, mDI, mINTH, mINTL, mNOP +}; + const char *const melps4_disassembler::s_name[] = { "?", @@ -124,18 +142,3 @@ return 1 | flags | SUPPORTED; } - -u32 melps4_disassembler::opcode_alignment() const -{ - return 1; -} - -u32 melps4_disassembler::interface_flags() const -{ - return PAGED; -} - -u32 melps4_disassembler::page_address_bits() const -{ - return 7; -} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/melps4/melps4d.h mame-0.264+dfsg.1/src/devices/cpu/melps4/melps4d.h --- mame-0.263+dfsg.1/src/devices/cpu/melps4/melps4d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/melps4/melps4d.h 2024-03-25 14:00:46.000000000 +0000 @@ -17,28 +17,13 @@ melps4_disassembler() = default; virtual ~melps4_disassembler() = default; - virtual u32 opcode_alignment() const override; - virtual u32 interface_flags() const override; - virtual u32 page_address_bits() const override; + virtual u32 opcode_alignment() const override { return 1; } + virtual u32 interface_flags() const override { return PAGED; } + virtual u32 page_address_bits() const override { return 7; } virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - // opcode mnemonics - enum e_mnemonics - { - mILL, - mTAB, mTBA, mTAY, mTYA, mTEAB, mTABE, mTEPA, mTXA, mTAX, - mLXY, mLZ, mINY, mDEY, mLCPS, mSADR, - mTAM, mXAM, mXAMD, mXAMI, - mLA, mAM, mAMC, mAMCS, mA, mSC, mRC, mSZC, mCMA, mRL, mRR, - mSB, mRB, mSZB, mSEAM, mSEY, - mTLA, mTHA, mTAJ, mXAL, mXAH, mLC7, mDEC, mSHL, mRHL, mCPA, mCPAS, mCPAE, mSZJ, - mT1AB, mTRAB, mT2AB, mTAB1, mTABR, mTAB2, mTVA, mTWA, mSNZ1, mSNZ2, - mBA, mSP, mB, mBM, mRT, mRTS, mRTI, - mCLD, mCLS, mCLDS, mSD, mRD, mSZD, mOSAB, mOSPA, mOSE, mIAS, mOFA, mIAF, mOGA, mIAK, mSZK, mSU, mRU, - mEI, mDI, mINTH, mINTL, mNOP - }; - + enum e_mnemonics : unsigned; static const char *const s_name[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mn1400/mn1400d.cpp mame-0.264+dfsg.1/src/devices/cpu/mn1400/mn1400d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/mn1400/mn1400d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mn1400/mn1400d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,24 @@ #include "emu.h" #include "mn1400d.h" + +// common lookup tables + +enum mn1400_disassembler::e_mnemonics : unsigned +{ + mILL, mILL2, + mL, mLD, mLI, mLIC, mLDC, mST, mSTD, mSTIC, mSTDC, + mLX, mLY, mTAX, mTAY, mTYA, mTACU, mTACL, mTCAU, mTCAL, + mNOP, mAND, mANDI, mOR, mXOR, mA, mAI, mCPL, mC, mCI, mCY, + mSL, mICY, mDCY, mICM, mDCM, mSM, mRM, mTB, + mINA, mINB, mOTD, mOTMD, mOTE, mOTIE, mRCO, mSCO, mCCO, + mRC, mRP, mSC, mSP, + mBS0, mBS1, mBS01, mBSN0, mBSN1, mBSN01, + mBP, mBC, mBZ, mBPC, mBPZ, mBCZ, mBPCZ, + mBNP, mBNC, mBNZ, mBNPC, mBNPZ, mBNCZ, mBNPCZ, + mJMP, mCAL, mRET, mEC, mDC +}; + const char *const mn1400_disassembler::s_mnemonics[] = { "?", "?", @@ -81,6 +99,8 @@ }; +// disasm + offs_t mn1400_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { offs_t pos = pc; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/mn1400/mn1400d.h mame-0.264+dfsg.1/src/devices/cpu/mn1400/mn1400d.h --- mame-0.263+dfsg.1/src/devices/cpu/mn1400/mn1400d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/mn1400/mn1400d.h 2024-03-25 14:00:46.000000000 +0000 @@ -23,21 +23,7 @@ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum e_mnemonics - { - mILL, mILL2, - mL, mLD, mLI, mLIC, mLDC, mST, mSTD, mSTIC, mSTDC, - mLX, mLY, mTAX, mTAY, mTYA, mTACU, mTACL, mTCAU, mTCAL, - mNOP, mAND, mANDI, mOR, mXOR, mA, mAI, mCPL, mC, mCI, mCY, - mSL, mICY, mDCY, mICM, mDCM, mSM, mRM, mTB, - mINA, mINB, mOTD, mOTMD, mOTE, mOTIE, mRCO, mSCO, mCCO, - mRC, mRP, mSC, mSP, - mBS0, mBS1, mBS01, mBSN0, mBSN1, mBSN01, - mBP, mBC, mBZ, mBPC, mBPZ, mBCZ, mBPCZ, - mBNP, mBNC, mBNZ, mBNPC, mBNPZ, mBNCZ, mBNPCZ, - mJMP, mCAL, mRET, mEC, mDC - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonics[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/ns32000/common.h mame-0.264+dfsg.1/src/devices/cpu/ns32000/common.h --- mame-0.263+dfsg.1/src/devices/cpu/ns32000/common.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/ns32000/common.h 2024-03-25 14:00:46.000000000 +0000 @@ -32,38 +32,6 @@ }; } -class ns32000_state_interface -{ -public: - virtual void state_add(device_state_interface &parent, int &index) = 0; -}; - -class ns32000_fpu_interface - : public device_interface - , public ns32000_state_interface -{ -protected: - ns32000_fpu_interface(machine_config const &mconfig, device_t &device) - : device_interface(device, "ns32000_fpu") - { - } -}; - -class ns32000_mmu_interface - : public device_interface - , public ns32000_state_interface -{ -public: - enum translate_result : unsigned { COMPLETE, CANCEL, ABORT }; - virtual translate_result translate(address_space &space, unsigned st, u32 &address, bool user, bool write, bool flag = false, bool suppress = false) = 0; - -protected: - ns32000_mmu_interface(machine_config const &mconfig, device_t &device) - : device_interface(device, "ns32000_mmu") - { - } -}; - class ns32000_slave_interface : public device_interface { public: @@ -75,6 +43,14 @@ { } + enum slave_idbyte : u8 + { + FORMAT_9 = 0x3e, // fpu + FORMAT_11 = 0xbe, // fpu + FORMAT_12 = 0xfe, // fpu + FORMAT_14 = 0x1e, // mmu + }; + enum slave_status : u16 { SLAVE_Q = 0x0001, // quit (1=error) @@ -87,6 +63,8 @@ SLAVE_OK = 0, }; + virtual void state_add(device_state_interface &parent, int &index) = 0; + protected: ns32000_slave_interface(machine_config const &mconfig, device_t &device, char const *type) : device_interface(device, type) @@ -97,31 +75,52 @@ devcb_write_line m_out_scb; }; -class ns32000_slow_slave_interface : public ns32000_slave_interface +class ns32000_fpu_interface : public ns32000_slave_interface +{ +protected: + ns32000_fpu_interface(machine_config const &mconfig, device_t &device) + : ns32000_slave_interface(mconfig, device) + { + } +}; + +class ns32000_mmu_interface : public ns32000_slave_interface { public: - virtual void write_id(u16 data) = 0; - virtual void write_op(u16 data) = 0; - virtual u16 read_st(int *icount = nullptr) = 0; - virtual u16 read_op() = 0; + enum translate_result : unsigned { COMPLETE, CANCEL, ABORT }; + virtual translate_result translate(address_space &space, unsigned st, u32 &address, bool user, bool write, bool flag = false, bool suppress = false) = 0; protected: - ns32000_slow_slave_interface(machine_config const &mconfig, device_t &device) + ns32000_mmu_interface(machine_config const &mconfig, device_t &device) : ns32000_slave_interface(mconfig, device) { } }; -class ns32000_fast_slave_interface : public ns32000_slave_interface +class ns32000_slow_slave_interface : public device_interface +{ +public: + virtual u16 slow_status(int *icount = nullptr) = 0; + virtual u16 slow_read() = 0; + virtual void slow_write(u16 data) = 0; + +protected: + ns32000_slow_slave_interface(machine_config const &mconfig, device_t &device) + : device_interface(device, "ns32000_slave_slow") + { + } +}; + +class ns32000_fast_slave_interface : public device_interface { public: - virtual u32 read_st32(int *icount = nullptr) = 0; - virtual u32 read() = 0; - virtual void write(u32 data) = 0; + virtual u32 fast_status(int *icount = nullptr) = 0; + virtual u32 fast_read() = 0; + virtual void fast_write(u32 data) = 0; protected: ns32000_fast_slave_interface(machine_config const &mconfig, device_t &device) - : ns32000_slave_interface(mconfig, device) + : device_interface(device, "ns32000_slave_fast") { } }; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/ns32000/ns32000.cpp mame-0.264+dfsg.1/src/devices/cpu/ns32000/ns32000.cpp --- mame-0.263+dfsg.1/src/devices/cpu/ns32000/ns32000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/ns32000/ns32000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -812,6 +812,9 @@ template void ns32000_device::interrupt(unsigned const trap) { + if (machine().debug_enabled() && (trap > ABT)) + debug()->exception_hook(trap); + unsigned offset = trap * 4; switch (trap) @@ -901,9 +904,6 @@ m_sequential = false; m_icount -= top(SIZE_W, m_sp0) * 2 + top(SIZE_W, m_intbase + offset) + top(SIZE_D, m_sp0) + top(SIZE_D, m_mod); - - if (machine().debug_enabled() && (trap > ABT)) - debug()->exception_hook(trap); } template void ns32000_device::lpr(unsigned reg, addr_mode const mode, bool user, unsigned &tex) @@ -3128,14 +3128,14 @@ } } break; - case 0x3e: + case ns32000_slave_interface::FORMAT_9: // format 9: xxxx xyyy yyoo ofii 0011 1110 if (m_cfg & CFG_F) { u16 const opword = fetch(bytes); addr_mode mode[] = { addr_mode(BIT(opword, 11, 5)), addr_mode(BIT(opword, 6, 5)) }; - size_code const size_f = BIT(opword, 0) ? SIZE_D : SIZE_Q; + size_code const size_f = BIT(opword, 2) ? SIZE_D : SIZE_Q; size_code const size = size_code(opword & 3); switch (BIT(opword, 3, 3)) @@ -3234,7 +3234,7 @@ case 0x7e: // format 10 interrupt(UND); break; - case 0xbe: + case ns32000_slave_interface::FORMAT_11: // format 11: xxxx xyyy yyoo oo0f 1011 1110 if (m_cfg & CFG_F) { @@ -3366,7 +3366,7 @@ else interrupt(UND); break; - case 0xfe: + case ns32000_slave_interface::FORMAT_12: // format 12: xxxx xyyy yyoo oo0f 1111 1110 if ((m_cfg & CFG_F) && type() == NS32332) { @@ -3459,7 +3459,7 @@ case 0x9e: // format 13 interrupt(UND); break; - case 0x1e: + case ns32000_slave_interface::FORMAT_14: // format 14: xxxx xsss s0oo ooii 0001 1110 if (!(m_psr & PSR_U)) { @@ -3615,7 +3615,18 @@ } catch (ns32000_abort const &) { - interrupt(ABT); + try + { + interrupt(ABT); + } + catch (ns32000_abort const &) + { + // this shouldn't happen; probably indicates supervisor stack overflow (stuck interrupt?) + if (machine().debug_enabled()) + machine().debug_break(); + else + fatalerror("abort during abort entry 0x%08x\n", m_pc); + } } } } @@ -3671,7 +3682,7 @@ { switch (opbyte) { - case 0x1e: + case ns32000_slave_interface::FORMAT_14: if (!m_mmu) fatalerror("slave mmu coprocessor not configured (%s)\n", machine().describe_context()); @@ -3681,9 +3692,9 @@ return slave_slow(dynamic_cast(*m_mmu), opbyte, opword, op1, op2); break; - case 0x3e: - case 0xbe: - case 0xfe: + case ns32000_slave_interface::FORMAT_9: + case ns32000_slave_interface::FORMAT_11: + case ns32000_slave_interface::FORMAT_12: if (!m_fpu) fatalerror("slave fpu coprocessor not configured (%s)\n", machine().describe_context()); @@ -3701,8 +3712,8 @@ template u16 ns32000_device::slave_slow(ns32000_slow_slave_interface &slave, u8 opbyte, u16 opword, addr_mode op1, addr_mode op2) { - slave.write_id(opbyte); - slave.write_op(swapendian_int16(opword)); + slave.slow_write(opbyte); + slave.slow_write(swapendian_int16(opword)); if ((op1.access == READ || op1.access == RMW) && !(op1.type == REG && op1.slave)) { @@ -3711,20 +3722,20 @@ switch (op1.size) { case SIZE_B: - slave.write_op(u8(data)); + slave.slow_write(u8(data)); break; case SIZE_W: - slave.write_op(u16(data)); + slave.slow_write(u16(data)); break; case SIZE_D: - slave.write_op(u16(data >> 0)); - slave.write_op(u16(data >> 16)); + slave.slow_write(u16(data >> 0)); + slave.slow_write(u16(data >> 16)); break; case SIZE_Q: - slave.write_op(u16(data >> 0)); - slave.write_op(u16(data >> 16)); - slave.write_op(u16(data >> 32)); - slave.write_op(u16(data >> 48)); + slave.slow_write(u16(data >> 0)); + slave.slow_write(u16(data >> 16)); + slave.slow_write(u16(data >> 32)); + slave.slow_write(u16(data >> 48)); break; } } @@ -3732,8 +3743,8 @@ { u32 const data = ea(op1); - slave.write_op(u16(data >> 0)); - slave.write_op(u16(data >> 16)); + slave.slow_write(u16(data >> 0)); + slave.slow_write(u16(data >> 16)); // single-byte memory read cycle mem_read(ns32000::ST_ODT, data, true); @@ -3746,41 +3757,41 @@ switch (op2.size) { case SIZE_B: - slave.write_op(u8(data)); + slave.slow_write(u8(data)); break; case SIZE_W: - slave.write_op(u16(data)); + slave.slow_write(u16(data)); break; case SIZE_D: - slave.write_op(u16(data >> 0)); - slave.write_op(u16(data >> 16)); + slave.slow_write(u16(data >> 0)); + slave.slow_write(u16(data >> 16)); break; case SIZE_Q: - slave.write_op(u16(data >> 0)); - slave.write_op(u16(data >> 16)); - slave.write_op(u16(data >> 32)); - slave.write_op(u16(data >> 48)); + slave.slow_write(u16(data >> 0)); + slave.slow_write(u16(data >> 16)); + slave.slow_write(u16(data >> 32)); + slave.slow_write(u16(data >> 48)); break; } } - u16 const status = slave.read_st(&m_icount); + u16 const status = slave.slow_status(&m_icount); if (!(status & ns32000_slave_interface::SLAVE_Q)) { if ((op2.access == WRITE || op2.access == RMW) && !(op2.type == REG && op2.slave)) { - u64 data = slave.read_op(); + u64 data = slave.slow_read(); switch (op2.size) { case SIZE_D: - data |= u64(slave.read_op()) << 16; + data |= u64(slave.slow_read()) << 16; break; case SIZE_Q: - data |= u64(slave.read_op()) << 16; - data |= u64(slave.read_op()) << 32; - data |= u64(slave.read_op()) << 48; + data |= u64(slave.slow_read()) << 16; + data |= u64(slave.slow_read()) << 32; + data |= u64(slave.slow_read()) << 48; break; default: break; @@ -3795,7 +3806,7 @@ template u16 ns32000_device::slave_fast(ns32000_fast_slave_interface &slave, u8 opbyte, u16 opword, addr_mode op1, addr_mode op2) { - slave.write(u32(opbyte) << 24 | u32(swapendian_int16(opword)) << 8); + slave.fast_write(u32(opbyte) << 24 | u32(swapendian_int16(opword)) << 8); if ((op1.access == READ || op1.access == RMW) && !(op1.type == REG && op1.slave)) { @@ -3804,17 +3815,17 @@ switch (op1.size) { case SIZE_B: - slave.write(u8(data)); + slave.fast_write(u8(data)); break; case SIZE_W: - slave.write(u16(data)); + slave.fast_write(u16(data)); break; case SIZE_D: - slave.write(u32(data)); + slave.fast_write(u32(data)); break; case SIZE_Q: - slave.write(u32(data >> 0)); - slave.write(u32(data >> 32)); + slave.fast_write(u32(data >> 0)); + slave.fast_write(u32(data >> 32)); break; } } @@ -3822,7 +3833,7 @@ { u32 const data = ea(op1); - slave.write(u32(data)); + slave.fast_write(u32(data)); // single-byte memory read cycle mem_read(ns32000::ST_ODT, data, true); @@ -3835,32 +3846,32 @@ switch (op2.size) { case SIZE_B: - slave.write(u8(data)); + slave.fast_write(u8(data)); break; case SIZE_W: - slave.write(u16(data)); + slave.fast_write(u16(data)); break; case SIZE_D: - slave.write(u32(data)); + slave.fast_write(u32(data)); break; case SIZE_Q: - slave.write(u32(data >> 0)); - slave.write(u32(data >> 32)); + slave.fast_write(u32(data >> 0)); + slave.fast_write(u32(data >> 32)); break; } } // TODO: status is optional in fast protocol - u32 const status = slave.read_st32(&m_icount); + u32 const status = slave.fast_status(&m_icount); if (!(status & ns32000_slave_interface::SLAVE_Q)) { if ((op2.access == WRITE || op2.access == RMW) && !(op2.type == REG && op2.slave)) { - u64 data = slave.read(); + u64 data = slave.fast_read(); if (op2.size == SIZE_Q) - data |= u64(slave.read()) << 32; + data |= u64(slave.fast_read()) << 32; gen_write(op2, data); } @@ -4162,7 +4173,7 @@ u16 ns32532_device::slave(u8 opbyte, u16 opword, addr_mode op1, addr_mode op2) { - if (opbyte == 0x1e) + if (opbyte == FORMAT_14) { switch (BIT(opword, 2, 4)) { diff -Nru mame-0.263+dfsg.1/src/devices/cpu/ns32000/ns32000d.cpp mame-0.264+dfsg.1/src/devices/cpu/ns32000/ns32000d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/ns32000/ns32000d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/ns32000/ns32000d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -461,7 +461,7 @@ u16 const opword = opcodes.r16(pc + bytes); bytes += 2; addr_mode mode[] = { addr_mode(BIT(opword, 11, 5)), addr_mode(BIT(opword, 6, 5)) }; - size_code const size_f = BIT(opword, 0) ? SIZE_D : SIZE_Q; + size_code const size_f = BIT(opword, 2) ? SIZE_D : SIZE_Q; size_code const size = size_code(opword & 3); switch (BIT(opword, 3, 3)) @@ -473,7 +473,7 @@ mode[0].size_i(size); mode[1].size_f(size_f); decode(mode, pc, opcodes, bytes); - util::stream_format(stream, "MOV%c%c %s, %s", size_char[size], BIT(opword, 0) ? 'F' : 'L', mode[0].mode, mode[1].mode); + util::stream_format(stream, "MOV%c%c %s, %s", size_char[size], BIT(opword, 2) ? 'F' : 'L', mode[0].mode, mode[1].mode); break; case 1: // LFSR src @@ -508,7 +508,7 @@ mode[0].size_f(size_f); mode[1].size_i(size); decode(mode, pc, opcodes, bytes); - util::stream_format(stream, "ROUND%c%c %s, %s", BIT(opword, 0) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); + util::stream_format(stream, "ROUND%c%c %s, %s", BIT(opword, 2) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); break; case 5: // TRUNCfi src,dst @@ -517,7 +517,7 @@ mode[0].size_f(size_f); mode[1].size_i(size); decode(mode, pc, opcodes, bytes); - util::stream_format(stream, "TRUNC%c%c %s, %s", BIT(opword, 0) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); + util::stream_format(stream, "TRUNC%c%c %s, %s", BIT(opword, 2) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); break; case 6: // SFSR dst @@ -534,7 +534,7 @@ mode[0].size_f(size_f); mode[1].size_i(size); decode(mode, pc, opcodes, bytes); - util::stream_format(stream, "FLOOR%c%c %s, %s", BIT(opword, 0) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); + util::stream_format(stream, "FLOOR%c%c %s, %s", BIT(opword, 2) ? 'F' : 'L', size_char[size], mode[0].mode, mode[1].mode); break; } } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/pps41/pps41d.cpp mame-0.264+dfsg.1/src/devices/cpu/pps41/pps41d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/pps41/pps41d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/pps41/pps41d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -32,6 +32,25 @@ // common lookup tables +enum pps41_common_disassembler::e_mnemonics : unsigned +{ + // MM76/shared + mILL /* 0! */, + mXAB, mLBA, mLB, mEOB2, + mSB, mRB, mSKBF, + mXAS, mLSA, + mL, mX, mXDSK, mXNSK, + mA, mAC, mACSK, mASK, mCOM, mRC, mSC, mSKNC, mLAI, mAISK, + mRT, mRTSK, mT, mNOP, mTL, mTM, mTML, mTR, + mSKMEA, mSKBEI, mSKAEI, + mSOS, mROS, mSKISL, mIBM, mOB, mIAM, mOA, mIOS, mI1, mI2C, mINT1H, mDIN1, mINT0L, mDIN0, mSEG1, mSEG2, + + // MM78 differences + mINT0H, mINT1L, mSAG, mEOB3, mTAB, + mI1SK, mIX, mOX, mLXA, mXAX, mIOA, + mTLB, mTMLB +}; + const char *const pps41_common_disassembler::s_name[] = { // MM76 diff -Nru mame-0.263+dfsg.1/src/devices/cpu/pps41/pps41d.h mame-0.264+dfsg.1/src/devices/cpu/pps41/pps41d.h --- mame-0.263+dfsg.1/src/devices/cpu/pps41/pps41d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/pps41/pps41d.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,26 +25,7 @@ virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x3f) | m_r2l[pc & 0x3f]; } protected: - // opcode mnemonics - enum e_mnemonics - { - // MM76/shared - mILL /* 0! */, - mXAB, mLBA, mLB, mEOB2, - mSB, mRB, mSKBF, - mXAS, mLSA, - mL, mX, mXDSK, mXNSK, - mA, mAC, mACSK, mASK, mCOM, mRC, mSC, mSKNC, mLAI, mAISK, - mRT, mRTSK, mT, mNOP, mTL, mTM, mTML, mTR, - mSKMEA, mSKBEI, mSKAEI, - mSOS, mROS, mSKISL, mIBM, mOB, mIAM, mOA, mIOS, mI1, mI2C, mINT1H, mDIN1, mINT0L, mDIN0, mSEG1, mSEG2, - - // MM78 differences - mINT0H, mINT1L, mSAG, mEOB3, mTAB, - mI1SK, mIX, mOX, mLXA, mXAX, mIOA, - mTLB, mTMLB - }; - + enum e_mnemonics : unsigned; static const char *const s_name[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/rw5000/rw5000d.cpp mame-0.264+dfsg.1/src/devices/cpu/rw5000/rw5000d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/rw5000/rw5000d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/rw5000/rw5000d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -32,6 +32,18 @@ // common lookup tables +enum rw5000_common_disassembler::e_mnemonics : unsigned +{ + mILL, + mNOP, mRSC, mSC, mTC, mTAM, + mLAX, mADX, mCOMP, mATB, mATBZ, + mLDA, mEXC0, mEXCP, mEXCM, mADD, + mLB0, mLB7, mLB8, mLB9, mLB10, mLB11, + mRSM, mSM, mTM, + mTL, mTRA0, mTRA1, mRET, + mTKB, mTKBS, mTDIN, mREAD, mKSEG, mMTD +}; + const char *const rw5000_common_disassembler::s_name[] = { "?", diff -Nru mame-0.263+dfsg.1/src/devices/cpu/rw5000/rw5000d.h mame-0.264+dfsg.1/src/devices/cpu/rw5000/rw5000d.h --- mame-0.263+dfsg.1/src/devices/cpu/rw5000/rw5000d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/rw5000/rw5000d.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,19 +25,7 @@ virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x3f) | m_r2l[pc & 0x3f]; } protected: - // opcode mnemonics - enum e_mnemonics - { - mILL, - mNOP, mRSC, mSC, mTC, mTAM, - mLAX, mADX, mCOMP, mATB, mATBZ, - mLDA, mEXC0, mEXCP, mEXCM, mADD, - mLB0, mLB7, mLB8, mLB9, mLB10, mLB11, - mRSM, mSM, mTM, - mTL, mTRA0, mTRA1, mRET, - mTKB, mTKBS, mTDIN, mREAD, mKSEG, mMTD - }; - + enum e_mnemonics : unsigned; static const char *const s_name[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh7042.cpp mame-0.264+dfsg.1/src/devices/cpu/sh/sh7042.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh7042.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh7042.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,13 +21,61 @@ sh7042_device::sh7042_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : sh2_device(mconfig, type, tag, owner, clock, CPU_TYPE_SH2, address_map_constructor(FUNC(sh7042_device::map), this), 32, 0xffffffff), + m_intc(*this, "intc"), + m_adc(*this, "adc"), + m_cmt(*this, "cmt"), + m_porta(*this, "porta"), + m_portb(*this, "portb"), + m_portc(*this, "portc"), + m_portd(*this, "portd"), + m_porte(*this, "porte"), + m_portf(*this, "portf"), m_read_adc(*this, 0), - m_sci_tx(*this) + m_sci_tx(*this), + m_read_port16(*this, 0xffff), + m_write_port16(*this), + m_read_port32(*this, 0xffffffff), + m_write_port32(*this) { + m_port16_names = "bcef"; + m_port32_names = "ad"; for(unsigned int i=0; i != m_read_adc.size(); i++) m_read_adc[i].bind().set([this, i]() { return adc_default(i); }); + for(unsigned int i=0; i != m_read_port16.size(); i++) { + m_read_port16[i].bind().set([this, i]() { return port16_default_r(i); }); + m_write_port16[i].bind().set([this, i](u16 data) { port16_default_w(i, data); }); + } + for(unsigned int i=0; i != m_read_port32.size(); i++) { + m_read_port32[i].bind().set([this, i]() { return port32_default_r(i); }); + m_write_port32[i].bind().set([this, i](u32 data) { port32_default_w(i, data); }); + } } +u16 sh7042_device::port16_default_r(int port) +{ + if(!machine().side_effects_disabled()) + logerror("read of un-hooked port %c\n", m_port16_names[port]); + return 0xffff; +} + +void sh7042_device::port16_default_w(int port, u16 data) +{ + logerror("write of un-hooked port %c %04x\n", m_port16_names[port], data); +} + +u32 sh7042_device::port32_default_r(int port) +{ + if(!machine().side_effects_disabled()) + logerror("read of un-hooked port %c\n", m_port32_names[port]); + return 0xffff; +} + +void sh7042_device::port32_default_w(int port, u32 data) +{ + logerror("write of un-hooked port %c %04x\n", m_port32_names[port], data); +} + + u16 sh7042_device::adc_default(int adc) { logerror("read of un-hooked adc %d\n", adc); @@ -38,70 +86,221 @@ { sh2_device::device_start(); - save_item(NAME(m_addr)); - save_item(NAME(m_adcsr)); - save_item(NAME(m_adcr)); + m_event_timer = timer_alloc(FUNC(sh7042_device::event_timer_tick), this); + + save_item(NAME(m_pcf_ah)); + save_item(NAME(m_pcf_al)); + save_item(NAME(m_pcf_b)); + save_item(NAME(m_pcf_c)); + save_item(NAME(m_pcf_dh)); + save_item(NAME(m_pcf_dl)); + save_item(NAME(m_pcf_e)); + save_item(NAME(m_pcf_if)); + + m_pcf_ah = 0; + m_pcf_al = 0; + m_pcf_b = 0; + m_pcf_c = 0; + m_pcf_dh = 0; + m_pcf_dl = 0; + m_pcf_e = 0; + m_pcf_if = 0; } void sh7042_device::device_reset() { sh2_device::device_reset(); - - memset(m_addr, 0, sizeof(m_addr)); - m_adcsr = m_adcr = 0; } + void sh7042_device::map(address_map &map) { - map(0xffff83e0, 0xffff83e0).rw(FUNC(sh7042_device::adcsr_r), FUNC(sh7042_device::adcsr_w)); - map(0xffff83e1, 0xffff83e1).rw(FUNC(sh7042_device::adcr_r), FUNC(sh7042_device::adcr_w)); - map(0xffff83f0, 0xffff83ff).r(FUNC(sh7042_device::addr_r)); + map(0xffff8348, 0xffff8357).rw(m_intc, FUNC(sh_intc_device::ipr_r), FUNC(sh_intc_device::ipr_w)); + map(0xffff8358, 0xffff8359).rw(m_intc, FUNC(sh_intc_device::icr_r), FUNC(sh_intc_device::icr_w)); + map(0xffff835a, 0xffff835b).rw(m_intc, FUNC(sh_intc_device::isr_r), FUNC(sh_intc_device::isr_w)); + + map(0xffff8380, 0xffff8383).rw(m_porta, FUNC(sh_port32_device::dr_r), FUNC(sh_port32_device::dr_w)); + map(0xffff8384, 0xffff8387).rw(m_porta, FUNC(sh_port32_device::io_r), FUNC(sh_port32_device::io_w)); + map(0xffff8388, 0xffff8389).rw(FUNC(sh7042_device::pcf_ah_r), FUNC(sh7042_device::pcf_ah_w)); + map(0xffff838c, 0xffff838f).rw(FUNC(sh7042_device::pcf_al_r), FUNC(sh7042_device::pcf_al_w)); + map(0xffff8390, 0xffff8391).rw(m_portb, FUNC(sh_port16_device::dr_r), FUNC(sh_port16_device::dr_w)); + map(0xffff8392, 0xffff8393).rw(m_portc, FUNC(sh_port16_device::dr_r), FUNC(sh_port16_device::dr_w)); + map(0xffff8394, 0xffff8395).rw(m_portb, FUNC(sh_port16_device::io_r), FUNC(sh_port16_device::io_w)); + map(0xffff8396, 0xffff8397).rw(m_portc, FUNC(sh_port16_device::io_r), FUNC(sh_port16_device::io_w)); + map(0xffff8398, 0xffff839b).rw(FUNC(sh7042_device::pcf_b_r), FUNC(sh7042_device::pcf_b_w)); + map(0xffff839c, 0xffff839d).rw(FUNC(sh7042_device::pcf_c_r), FUNC(sh7042_device::pcf_c_w)); + map(0xffff83a0, 0xffff83a3).rw(m_portd, FUNC(sh_port32_device::dr_r), FUNC(sh_port32_device::dr_w)); + map(0xffff83a4, 0xffff83a7).rw(m_portd, FUNC(sh_port32_device::io_r), FUNC(sh_port32_device::io_w)); + map(0xffff83a8, 0xffff83ab).rw(FUNC(sh7042_device::pcf_dh_r), FUNC(sh7042_device::pcf_dh_w)); + map(0xffff83ac, 0xffff83ad).rw(FUNC(sh7042_device::pcf_dl_r), FUNC(sh7042_device::pcf_dl_w)); + map(0xffff83b0, 0xffff83b1).rw(m_porte, FUNC(sh_port16_device::dr_r), FUNC(sh_port16_device::dr_w)); + map(0xffff83b2, 0xffff83b3).r (m_portf, FUNC(sh_port16_device::dr_r)); + map(0xffff83b4, 0xffff83b5).rw(m_porte, FUNC(sh_port16_device::io_r), FUNC(sh_port16_device::io_w)); + map(0xffff83b8, 0xffff83bb).rw(FUNC(sh7042_device::pcf_e_r), FUNC(sh7042_device::pcf_e_w)); + map(0xffff83c8, 0xffff83c9).rw(FUNC(sh7042_device::pcf_if_r), FUNC(sh7042_device::pcf_if_w)); + + map(0xffff83d0, 0xffff83d1).rw(m_cmt, FUNC(sh_cmt_device::cmstr_r), FUNC(sh_cmt_device::cmstr_w)); + map(0xffff83d2, 0xffff83d3).rw(m_cmt, FUNC(sh_cmt_device::cmcsr0_r), FUNC(sh_cmt_device::cmcsr0_w)); + map(0xffff83d4, 0xffff83d5).rw(m_cmt, FUNC(sh_cmt_device::cmcnt0_r), FUNC(sh_cmt_device::cmcnt0_w)); + map(0xffff83d6, 0xffff83d7).rw(m_cmt, FUNC(sh_cmt_device::cmcor0_r), FUNC(sh_cmt_device::cmcor0_w)); + map(0xffff83d8, 0xffff83d9).rw(m_cmt, FUNC(sh_cmt_device::cmcsr1_r), FUNC(sh_cmt_device::cmcsr1_w)); + map(0xffff83da, 0xffff83db).rw(m_cmt, FUNC(sh_cmt_device::cmcnt1_r), FUNC(sh_cmt_device::cmcnt1_w)); + map(0xffff83dc, 0xffff83dd).rw(m_cmt, FUNC(sh_cmt_device::cmcor1_r), FUNC(sh_cmt_device::cmcor1_w)); + + map(0xffff83e0, 0xffff83e0).rw(m_adc, FUNC(sh_adc_device::adcsr_r), FUNC(sh_adc_device::adcsr_w)); + map(0xffff83e1, 0xffff83e1).rw(m_adc, FUNC(sh_adc_device::adcr_r), FUNC(sh_adc_device::adcr_w)); + map(0xffff83f0, 0xffff83ff).r(m_adc, FUNC(sh_adc_device::addr_r)); map(0xfffff000, 0xffffffff).ram(); } +void sh7042_device::device_add_mconfig(machine_config &config) +{ + SH_INTC(config, m_intc, *this); + SH_ADC(config, m_adc, *this, m_intc, 136); + SH_CMT(config, m_cmt, *this, m_intc, 144, 148); + SH_PORT32(config, m_porta, *this, 0, 0x00000000, 0xff000000); + SH_PORT16(config, m_portb, *this, 0, 0x0000, 0xfc00); + SH_PORT16(config, m_portc, *this, 1, 0x0000, 0x0000); + SH_PORT32(config, m_portd, *this, 1, 0x0000, 0x0000); + SH_PORT16(config, m_porte, *this, 2, 0x0000, 0x0000); + SH_PORT16(config, m_portf, *this, 3, 0x0000, 0xff00); +} + +void sh7042_device::do_sci_w(int sci, int state) +{ + logerror("sci %d %d\n", sci, state); +} -// ADC section +void sh7042_device::internal_update() +{ + internal_update(current_cycles()); +} -u16 sh7042_device::addr_r(offs_t offset) +void sh7042_device::add_event(u64 &event_time, u64 new_event) { - logerror("addr16_r %d %03x\n", offset, m_addr[offset]); - return m_addr[offset]; + if(!new_event) + return; + if(!event_time || event_time > new_event) + event_time = new_event; } -u8 sh7042_device::adcsr_r() +void sh7042_device::recompute_timer(u64 event_time) { - logerror("adcsr_r %02x\n", m_adcsr); - return m_adcsr; + if(!event_time) { + m_event_timer->adjust(attotime::never); + return; + } + + m_event_timer->adjust(attotime::from_ticks(2*event_time + 1, 2*clock()) - machine().time()); } -u8 sh7042_device::adcr_r() +TIMER_CALLBACK_MEMBER(sh7042_device::event_timer_tick) { - logerror("adcr_r %02x\n", m_adcr); - return m_adcr; + internal_update(); } -void sh7042_device::adcsr_w(u8 data) +void sh7042_device::internal_update(u64 current_time) { - logerror("adcsr_w %02x\n", data); - // u8 prev = m_adcsr; - m_adcsr = (data & 0x7f) | (m_adcsr & data & CSR_ADF); + u64 event_time = 0; + + add_event(event_time, m_adc->internal_update(current_time)); + add_event(event_time, m_cmt->internal_update(current_time)); + + recompute_timer(event_time); } -void sh7042_device::adcr_w(u8 data) +u16 sh7042_device::pcf_ah_r() { - static const char *const tg_modes[4] = { "soft", "mtu", "?", "external" }; - static const char *const buf_modes[4] = { "normal", "a->b", "a,b->c,d", "a->b->c->d" }; - logerror("adcr_w speed=%d trigger=%s mode=%s sampling=%s buffering=%s\n", - BIT(data, 6) ? "high" : "low", - tg_modes[(data >> 4) & 3], - BIT(data, 3) ? "scan" : "single", - BIT(data, 2) ? "simultaneous" : "normal", - buf_modes[data & 3]); - m_adcr = data; + return m_pcf_ah; } -void sh7042_device::do_sci_w(int sci, int state) +void sh7042_device::pcf_ah_w(offs_t, u16 data, u16 mem_mask) { - logerror("sci %d %d\n", sci, state); + COMBINE_DATA(&m_pcf_ah); + logerror("pcf ah = %04x\n", m_pcf_ah); +} + +u32 sh7042_device::pcf_al_r() +{ + return m_pcf_al; +} + +void sh7042_device::pcf_al_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_pcf_al); + logerror("pcf al = %08x\n", m_pcf_al); +} + +u32 sh7042_device::pcf_b_r() +{ + return m_pcf_b; +} + +void sh7042_device::pcf_b_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_pcf_b); + logerror("pcf b = %08x\n", m_pcf_b); +} + +u16 sh7042_device::pcf_c_r() +{ + return m_pcf_c; +} + +void sh7042_device::pcf_c_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_pcf_c); + logerror("pcf c = %04x\n", m_pcf_c); +} + +u32 sh7042_device::pcf_dh_r() +{ + return m_pcf_dh; +} + +void sh7042_device::pcf_dh_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_pcf_dh); + logerror("pcf dh = %08x\n", m_pcf_dh); +} + +u16 sh7042_device::pcf_dl_r() +{ + return m_pcf_dl; +} + +void sh7042_device::pcf_dl_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_pcf_dl); + logerror("pcf dl = %04x\n", m_pcf_dl); +} + +u32 sh7042_device::pcf_e_r() +{ + return m_pcf_e; +} + +void sh7042_device::pcf_e_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_pcf_e); + logerror("pcf e = %08x\n", m_pcf_e); +} + +u16 sh7042_device::pcf_if_r() +{ + return m_pcf_if; +} + +void sh7042_device::pcf_if_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_pcf_if); + logerror("pcf if = %04x\n", m_pcf_if); +} + +void sh7042_device::set_internal_interrupt(int level, u32 vector) +{ + m_sh2_state->internal_irq_level = level; + m_internal_irq_vector = vector; + m_test_irq = 1; } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh7042.h mame-0.264+dfsg.1/src/devices/cpu/sh/sh7042.h --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh7042.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh7042.h 2024-03-25 14:00:46.000000000 +0000 @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -// SH7042, sh2 variant +// SH704x, sh2 variant #ifndef MAME_CPU_SH_SH7042_H #define MAME_CPU_SH_SH7042_H @@ -9,6 +9,10 @@ #pragma once #include "sh2.h" +#include "sh_intc.h" +#include "sh_adc.h" +#include "sh_cmt.h" +#include "sh_port.h" class sh7042_device : public sh2_device { @@ -19,8 +23,32 @@ template void sci_rx_w(int state) { do_sci_w(Sci, state); } template auto write_sci_tx() { return m_sci_tx[Sci].bind(); } + auto read_porta() { return m_read_port32 [0].bind(); } + auto write_porta() { return m_write_port32[0].bind(); } + auto read_portb() { return m_read_port16 [0].bind(); } + auto write_portb() { return m_write_port16[0].bind(); } + auto read_portc() { return m_read_port16 [1].bind(); } + auto write_portc() { return m_write_port16[1].bind(); } + auto read_portd() { return m_read_port32 [1].bind(); } + auto write_portd() { return m_write_port32[1].bind(); } + auto read_porte() { return m_read_port16 [2].bind(); } + auto write_porte() { return m_write_port16[2].bind(); } + auto read_portf() { return m_read_port16 [3].bind(); } + + void internal_update(); + u16 do_read_adc(int port) { return m_read_adc[port](); } + u16 do_read_port16(int port) { return m_read_port16[port](); } + void do_write_port16(int port, u16 data, u16 ddr) { m_write_port16[port](0, data, ddr); } + u32 do_read_port32(int port) { return m_read_port32[port](); } + void do_write_port32(int port, u32 data, u32 ddr) { m_write_port32[port](0, data, ddr); } + + u64 current_cycles() { return machine().time().as_ticks(clock()); } + + void set_internal_interrupt(int level, u32 vector); protected: + const char *m_port16_names; + const char *m_port32_names; enum { CSR_ADF = 0x80, CSR_ADIE = 0x40, @@ -42,25 +70,68 @@ virtual void device_start() override; virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; private: + required_device m_intc; + required_device m_adc; + required_device m_cmt; + required_device m_porta; + required_device m_portb; + required_device m_portc; + required_device m_portd; + required_device m_porte; + required_device m_portf; + devcb_read16::array<8> m_read_adc; devcb_write_line::array<2> m_sci_tx; + devcb_read16::array<4> m_read_port16; + devcb_write16::array<4> m_write_port16; + devcb_read32::array<2> m_read_port32; + devcb_write32::array<2> m_write_port32; + + emu_timer *m_event_timer; + + u16 m_pcf_ah; + u32 m_pcf_al; + u32 m_pcf_b; + u16 m_pcf_c; + u32 m_pcf_dh; + u16 m_pcf_dl; + u32 m_pcf_e; + u16 m_pcf_if; void map(address_map &map); - // ADC section - uint16_t m_addr[8]; - uint8_t m_adcsr, m_adcr; - u16 adc_default(int adc); - u16 addr_r(offs_t offset); - u8 adcsr_r(); - u8 adcr_r(); - void adcsr_w(u8 data); - void adcr_w(u8 data); + u16 port16_default_r(int port); + void port16_default_w(int port, u16 data); + u32 port32_default_r(int port); + void port32_default_w(int port, u32 data); + + void add_event(u64 &event_time, u64 new_event); + void recompute_timer(u64 event_time); + TIMER_CALLBACK_MEMBER(event_timer_tick); + void internal_update(u64 current_time); void do_sci_w(int sci, int state); + + u16 pcf_ah_r(); + void pcf_ah_w(offs_t, u16 data, u16 mem_mask); + u32 pcf_al_r(); + void pcf_al_w(offs_t, u32 data, u32 mem_mask); + u32 pcf_b_r(); + void pcf_b_w(offs_t, u32 data, u32 mem_mask); + u16 pcf_c_r(); + void pcf_c_w(offs_t, u16 data, u16 mem_mask); + u32 pcf_dh_r(); + void pcf_dh_w(offs_t, u32 data, u32 mem_mask); + u16 pcf_dl_r(); + void pcf_dl_w(offs_t, u16 data, u16 mem_mask); + u32 pcf_e_r(); + void pcf_e_w(offs_t, u32 data, u32 mem_mask); + u16 pcf_if_r(); + void pcf_if_w(offs_t, u16 data, u16 mem_mask); }; class sh7043_device : public sh7042_device diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_adc.cpp mame-0.264+dfsg.1/src/devices/cpu/sh/sh_adc.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_adc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_adc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,315 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +#include "emu.h" +#include "sh_adc.h" +#include "sh7042.h" +#include "sh_intc.h" + +// Verbosity level +// 0 = no messages +// 1 = everything +static constexpr int V = 0; + +DEFINE_DEVICE_TYPE(SH_ADC, sh_adc_device, "sh_adc", "SH2/704x ADC") + +sh_adc_device::sh_adc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, SH_ADC, tag, owner, clock), + m_cpu(*this, finder_base::DUMMY_TAG), + m_intc(*this, finder_base::DUMMY_TAG), + m_intc_vector(0), m_adcsr(0), m_adcr(0), m_register_mask(0), m_trigger(0), m_start_mode(0), m_start_channel(0), + m_end_channel(0), m_start_count(0), m_mode(0), m_channel(0), m_count(0), m_analog_powered(false), m_adtrg(false), m_next_event(0) +{ + m_suspend_on_interrupt = true; + m_register_mask = 7; + m_analog_power_control = false; +} + +u16 sh_adc_device::addr_r(offs_t offset) +{ + if(V>=1) logerror("addr_r %d %03x\n", offset, m_addr[offset]); + return m_addr[offset]; +} + +u8 sh_adc_device::adcsr_r() +{ + if(V>=1) logerror("adcsr_r %02x\n", m_adcsr); + return m_adcsr; +} + +u8 sh_adc_device::adcr_r() +{ + if(V>=1) logerror("adcr_r %02x\n", m_adcr); + return m_adcr; +} + +void sh_adc_device::adcsr_w(u8 data) +{ + if(V>=1) logerror("adcsr_w %02x\n", data); + u8 prev = m_adcsr; + m_adcsr = (data & 0x7f) | (m_adcsr & data & F_ADF); + mode_update(); + if((prev & F_ADF) && !(m_adcsr & F_ADF)) { + if(m_mode & HALTED) { + m_mode &= ~HALTED; + if(!(m_adcsr & F_ADST)) { + sampling(); + conversion_wait(false, false); + } else + done(); + } + } + + if(!(prev & F_ADST) && (m_adcsr & F_ADST)) + start_conversion(); +} + +void sh_adc_device::adcr_w(u8 data) +{ + if(V>=1) logerror("adcr_w %02x\n", data); + m_adcr = data; + mode_update(); +} + +void sh_adc_device::adtrg_w(int state) +{ + if(state != m_adtrg) { + m_adtrg = state; + if(!m_adtrg && (m_trigger & T_EXT) && !(m_adcsr & F_ADST)) { + m_adcsr |= F_ADST; + start_conversion(); + } + } +} + +void sh_adc_device::set_suspend(bool suspend) +{ +} + +void sh_adc_device::device_start() +{ + save_item(NAME(m_addr)); + save_item(NAME(m_buf)); + save_item(NAME(m_adcsr)); + save_item(NAME(m_adcr)); + save_item(NAME(m_trigger)); + save_item(NAME(m_start_mode)); + save_item(NAME(m_start_channel)); + save_item(NAME(m_end_channel)); + save_item(NAME(m_start_count)); + save_item(NAME(m_suspend_on_interrupt)); + save_item(NAME(m_analog_power_control)); + save_item(NAME(m_mode)); + save_item(NAME(m_channel)); + save_item(NAME(m_count)); + save_item(NAME(m_analog_powered)); + save_item(NAME(m_next_event)); + save_item(NAME(m_adtrg)); +} + +void sh_adc_device::device_reset() +{ + memset(m_addr, 0, sizeof(m_addr)); + memset(m_buf, 0, sizeof(m_buf)); + m_adcsr = m_adcr = 0; + m_trigger = T_SOFT; + m_start_mode = IDLE; + m_start_channel = m_end_channel = 0; + m_start_count = 1; + m_mode = IDLE; + m_channel = 0; + m_count = 0; + m_next_event = 0; + mode_update(); + m_analog_powered = !m_analog_power_control; + m_adtrg = true; +} + +void sh_adc_device::done() +{ + m_mode = IDLE; + m_adcsr &= ~F_ADST; + if(m_analog_power_control) + m_analog_powered = false; +} + +u64 sh_adc_device::internal_update(u64 current_time) +{ + if(m_next_event && m_next_event <= current_time) { + m_next_event = 0; + timeout(current_time); + } + return m_next_event; +} + +void sh_adc_device::conversion_wait(bool first, bool poweron, u64 current_time) +{ + if(current_time) + m_next_event = current_time + conversion_time(first, poweron); + else { + m_next_event = m_cpu->total_cycles() + conversion_time(first, poweron); + m_cpu->internal_update(); + } +} + +void sh_adc_device::buffer_value(int port, int buffer) +{ + m_buf[buffer] = m_cpu->do_read_adc(port); + if(V>=1) logerror("adc buffer %d -> %d:%03x\n", port, buffer, m_buf[buffer]); +} + +void sh_adc_device::commit_value(int reg, int buffer) +{ + reg &= m_register_mask; + if(V>=1) logerror("adc commit %d -> %d:%03x\n", buffer, reg, m_buf[buffer]); + m_addr[reg] = m_buf[buffer]; +} + +void sh_adc_device::sampling() +{ + if(m_mode & COUNTED) + m_channel = get_channel_index(m_start_count - m_count); + if(m_mode & DUAL) { + buffer_value(m_channel, 0); + buffer_value(m_channel+1, 1); + } else + buffer_value(m_channel); +} + +void sh_adc_device::start_conversion() +{ + m_mode = m_start_mode; + m_channel = m_start_channel; + m_count = m_start_count; + sampling(); + conversion_wait(true, !m_analog_powered); + m_analog_powered = true; +} + +void sh_adc_device::timeout(u64 current_time) +{ + if(m_mode & BUFFER) { + do_buffering((m_mode & DUAL) && (m_channel & 1)); + if((m_mode & DUAL) && !(m_channel & 1)) { + m_channel++; + conversion_wait(false, false, current_time); + return; + } + } else { + if(m_mode & DUAL) { + if(m_channel & 1) + commit_value(m_channel, 1); + else { + commit_value(m_channel, 0); + m_channel++; + conversion_wait(false, false, current_time); + return; + } + } else + commit_value(m_channel); + } + + if(m_mode & ROTATE) { + if(m_channel != m_end_channel) { + m_channel++; + sampling(); + conversion_wait(false, false, current_time); + return; + } + m_channel = m_start_channel; + } + + if(m_mode & COUNTED) { + m_count--; + if(m_count) { + sampling(); + conversion_wait(false, false, current_time); + return; + } + } + + m_adcsr |= F_ADF; + if(m_adcsr & F_ADIE) + m_intc->internal_interrupt(m_intc_vector); + + if(m_mode & REPEAT) { + if(m_suspend_on_interrupt && (m_adcsr & F_ADIE)) { + m_mode |= HALTED; + return; + } + m_channel = m_start_channel; + m_count = m_start_count; + sampling(); + conversion_wait(false, false, current_time); + return; + } + + done(); +} + +int sh_adc_device::conversion_time(bool first, bool poweron) +{ + int tm = m_adcsr & 0x10 ? 44 : 24; + if(first) + tm += m_adcsr & 0x10 ? 20 : 10; + if(poweron) + tm += 200; + return tm; +} + +void sh_adc_device::mode_update() +{ + m_trigger = 1 << ((m_adcr >> 4) & 3); + m_analog_power_control = !(m_adcr & 0x40); + + m_mode = ACTIVE | (m_adcr & 0x08 ? REPEAT : 0); + + if(m_adcsr & 0x03) { + m_mode |= BUFFER; + + } + + if(m_adcsr & 0x08) { + m_mode |= ROTATE; + m_start_channel = 0; + if(m_adcr & 0x04) { + m_mode |= DUAL; + m_end_channel = (m_adcsr & 6)+1; + } else + m_end_channel = m_adcsr & 7; + } else + m_start_channel = m_end_channel = m_adcsr & 7; + +} + +void sh_adc_device::do_buffering(int buffer) +{ + if((m_mode & COUNTED) && m_channel >= 2) { + commit_value(m_channel, buffer); + return; + } + switch(m_adcsr & 3) { + case 0: + commit_value(m_channel, buffer); + break; + case 1: + m_addr[1] = m_addr[0]; + commit_value(0, buffer); + break; + case 2: + m_addr[2+buffer] = m_addr[buffer]; + commit_value(buffer, buffer); + break; + case 3: + m_addr[3] = m_addr[2]; + m_addr[2] = m_addr[1]; + m_addr[1] = m_addr[0]; + commit_value(0, buffer); + break; + } +} + +int sh_adc_device::get_channel_index(int count) +{ + abort(); +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_adc.h mame-0.264+dfsg.1/src/devices/cpu/sh/sh_adc.h --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_adc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_adc.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_adc.h + + SH Analog to Digital Converter subsystem + + +***************************************************************************/ + +#ifndef MAME_CPU_SH_SH_ADC_H +#define MAME_CPU_SH_SH_ADC_H + +#pragma once + +class sh7042_device; +class sh_intc_device; + +class sh_adc_device : public device_t { +public: + sh_adc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + + template sh_adc_device(const machine_config &mconfig, const char *tag, device_t *owner, + T &&cpu, U &&intc, int vect) : + sh_adc_device(mconfig, tag, owner) + { + m_cpu.set_tag(std::forward(cpu)); + m_intc.set_tag(std::forward(intc)); + m_intc_vector = vect; + } + + u16 addr_r(offs_t offset); + u8 adcsr_r(); + u8 adcr_r(); + void adcsr_w(u8 data); + void adcr_w(u8 data); + void adtrg_w(int state); + + void set_suspend(bool suspend); + u64 internal_update(u64 current_time); + +protected: + required_device m_cpu; + required_device m_intc; + int m_intc_vector; + + enum { + T_SOFT = 1<<0, + T_TPU = 1<<1, + T_TIMER = 1<<2, + T_EXT = 1<<3 + }; + + enum { + F_ADF = 0x80, + F_ADIE = 0x40, + F_ADST = 0x20 + }; + + enum { + IDLE = 0, + ACTIVE = 1, + HALTED = 2, + REPEAT = 4, + ROTATE = 8, + DUAL = 16, + BUFFER = 32, + COUNTED = 64 + }; + + u16 m_addr[8], m_buf[2]; + u8 m_adcsr, m_adcr; + int m_register_mask; + int m_trigger, m_start_mode, m_start_channel, m_end_channel, m_start_count; + bool m_suspend_on_interrupt, m_analog_power_control; + int m_mode, m_channel, m_count; + bool m_analog_powered, m_adtrg; + u64 m_next_event; + + virtual void device_start() override; + virtual void device_reset() override; + + void sampling(); + void start_conversion(); + void conversion_wait(bool first, bool poweron, u64 current_time = 0); + void buffer_value(int port, int buffer = 0); + void commit_value(int reg, int buffer = 0); + void timeout(u64 current_time); + void done(); + + int conversion_time(bool first, bool poweron); + void mode_update(); + void do_buffering(int buffer); + int get_channel_index(int count); +}; + +DECLARE_DEVICE_TYPE(SH_ADC, sh_adc_device) + +#endif // MAME_CPU_SH_SH_ADC_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_cmt.cpp mame-0.264+dfsg.1/src/devices/cpu/sh/sh_cmt.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_cmt.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_cmt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,197 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_cmt.h + + SH Compare/Match timer subsystem + + +***************************************************************************/ + +#include "emu.h" +#include "sh7042.h" +#include "sh_intc.h" + +DEFINE_DEVICE_TYPE(SH_CMT, sh_cmt_device, "sh_cmt", "SH2/704x CMT") + +sh_cmt_device::sh_cmt_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, SH_CMT, tag, owner, clock), + m_cpu(*this, finder_base::DUMMY_TAG), + m_intc(*this, finder_base::DUMMY_TAG), + m_intc_vector{0, 0}, + m_str(0), + m_csr{ 0, 0 }, + m_cnt{ 0, 0 }, + m_cor{ 0xffff, 0xffff } +{ +} + +void sh_cmt_device::device_start() +{ +} + +void sh_cmt_device::device_reset() +{ +} + +u64 sh_cmt_device::internal_update(u64 current_time) +{ + u64 next = 0; + for(int i = 0; i != 2; i++) { + if(m_next_event[i] && current_time >= m_next_event[i]) { + m_csr[i] |= 0x80; + if(BIT(m_csr[i], 6)) + m_intc->internal_interrupt(m_intc_vector[i]); + cnt_update(i, current_time); + } + if(!next || (m_next_event[i] && m_next_event[i] < next)) + next = m_next_event[i]; + } + return next; +} + + +u16 sh_cmt_device::cmstr_r() +{ + return m_str; +} + +u16 sh_cmt_device::cmcsr0_r() +{ + return m_csr[0]; +} + +u16 sh_cmt_device::cmcnt0_r() +{ + cnt_update(0, m_cpu->current_cycles()); + return m_cnt[0]; +} + +u16 sh_cmt_device::cmcor0_r() +{ + return m_cor[0]; +} + +u16 sh_cmt_device::cmcsr1_r() +{ + return m_csr[1]; +} + +u16 sh_cmt_device::cmcnt1_r() +{ + cnt_update(1, m_cpu->current_cycles()); + return m_cnt[1]; +} + +u16 sh_cmt_device::cmcor1_r() +{ + return m_cor[1]; +} + +void sh_cmt_device::cmcsr0_w(offs_t, u16 data, u16 mem_mask) +{ + csr_w(0, data, mem_mask); +} + +void sh_cmt_device::cmcsr1_w(offs_t, u16 data, u16 mem_mask) +{ + csr_w(1, data, mem_mask); +} + +void sh_cmt_device::cmcnt0_w(offs_t, u16 data, u16 mem_mask) +{ + cnt_w(0, data, mem_mask); +} + +void sh_cmt_device::cmcnt1_w(offs_t, u16 data, u16 mem_mask) +{ + cnt_w(1, data, mem_mask); +} + +void sh_cmt_device::cmcor0_w(offs_t, u16 data, u16 mem_mask) +{ + cor_w(0, data, mem_mask); +} + +void sh_cmt_device::cmcor1_w(offs_t, u16 data, u16 mem_mask) +{ + cor_w(1, data, mem_mask); +} + +void sh_cmt_device::cmstr_w(offs_t, u16 data, u16 mem_mask) +{ + cnt_update(0, m_cpu->current_cycles()); + cnt_update(1, m_cpu->current_cycles()); + u16 old = m_str; + COMBINE_DATA(&m_str); + logerror("active %c %c\n", m_str & 1 ? '0' : '-', m_str & 2 ? '1' : '-'); + for(int i=0; i != 2; i++) + if(!BIT(old, i) && BIT(m_str, i)) + clock_start(i); + else if(!BIT(m_str, i)) + m_next_event[i] = 0; + m_cpu->internal_update(); +} + +void sh_cmt_device::csr_w(int reg, u16 data, u16 mem_mask) +{ + cnt_update(reg, m_cpu->current_cycles()); + u16 old = m_csr[reg]; + COMBINE_DATA(&m_csr[reg]); + if(!(old & 0x80)) + m_csr[reg] &= ~0x80; + if((old ^ m_csr[reg]) & 0x7f) + logerror("csr_w %d f=%d ie=%d div=%d\n", reg, BIT(m_csr[reg], 7), BIT(m_csr[reg], 6), 8 << (2*BIT(m_csr[reg], 0, 2))); +} + +void sh_cmt_device::cnt_w(int reg, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_cnt[reg]); + logerror("cnt_w %d, %04x\n", reg, m_cnt[reg]); + if((m_str >> reg) & 1) { + compute_next_event(reg); + m_cpu->internal_update(); + } +} + +void sh_cmt_device::cor_w(int reg, u16 data, u16 mem_mask) +{ + cnt_update(reg, m_cpu->current_cycles()); + COMBINE_DATA(&m_cor[reg]); + logerror("cor_w %d, %04x\n", reg, m_cor[reg]); + if((m_str >> reg) & 1) { + compute_next_event(reg); + m_cpu->internal_update(); + } +} + +void sh_cmt_device::clock_start(int clk) +{ + logerror("start clock %d %dHz\n", clk, (m_cpu->clock() >> (3 + 2*BIT(m_csr[clk], 0, 2))) / (m_cor[clk] + 1)); + compute_next_event(clk); +} + +void sh_cmt_device::compute_next_event(int clk) +{ + u64 step1 = 1 << (3 + 2*BIT(m_csr[clk], 0, 2)); + u64 time = m_cpu->current_cycles(); + if(time & (step1 - 1)) + time = (time | (step1 - 1)) + 1; + s32 counts = m_cor[clk] + 1 - m_cnt[clk]; + if(counts < 0) + counts += 0x10000; + time += step1 * counts; + m_next_event[clk] = time; +} + +void sh_cmt_device::cnt_update(int clk, u64 current_time) +{ + if(!((m_str >> clk) & 1)) + return; + u64 step = (m_cor[clk] + 1) << (3 + 2*BIT(m_csr[clk], 0, 2)); + while(current_time >= m_next_event[clk]) + m_next_event[clk] += step; + u64 delta = m_next_event[clk] - current_time; + m_cnt[clk] = m_cor[clk] - ((delta - 1) >> (3 + 2*BIT(m_csr[clk], 0, 2))); +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_cmt.h mame-0.264+dfsg.1/src/devices/cpu/sh/sh_cmt.h --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_cmt.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_cmt.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,75 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_cmt.h + + SH Compare/Match timer subsystem + + +***************************************************************************/ + +#ifndef MAME_CPU_SH_SH_CMT_H +#define MAME_CPU_SH_SH_CMT_H + +#pragma once + +class sh7042_device; +class sh_intc_device; + +class sh_cmt_device : public device_t { +public: + sh_cmt_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + + template sh_cmt_device(const machine_config &mconfig, const char *tag, device_t *owner, + T &&cpu, U &&intc, int vect0, int vect1) : + sh_cmt_device(mconfig, tag, owner) + { + m_cpu.set_tag(std::forward(cpu)); + m_intc.set_tag(std::forward(intc)); + m_intc_vector[0] = vect0; + m_intc_vector[1] = vect1; + } + + u64 internal_update(u64 current_time); + + u16 cmstr_r(); + void cmstr_w(offs_t, u16 data, u16 mem_mask); + u16 cmcsr0_r(); + void cmcsr0_w(offs_t, u16 data, u16 mem_mask); + u16 cmcnt0_r(); + void cmcnt0_w(offs_t, u16 data, u16 mem_mask); + u16 cmcor0_r(); + void cmcor0_w(offs_t, u16 data, u16 mem_mask); + u16 cmcsr1_r(); + void cmcsr1_w(offs_t, u16 data, u16 mem_mask); + u16 cmcnt1_r(); + void cmcnt1_w(offs_t, u16 data, u16 mem_mask); + u16 cmcor1_r(); + void cmcor1_w(offs_t, u16 data, u16 mem_mask); + +protected: + required_device m_cpu; + required_device m_intc; + std::array m_next_event; + std::array m_intc_vector; + u16 m_str; + std::array m_csr; + std::array m_cnt; + std::array m_cor; + + virtual void device_start() override; + virtual void device_reset() override; + + void csr_w(int reg, u16 data, u16 mem_mask); + void cnt_w(int reg, u16 data, u16 mem_mask); + void cor_w(int reg, u16 data, u16 mem_mask); + + void clock_start(int clk); + void compute_next_event(int clk); + void cnt_update(int clk, u64 current_time); +}; + +DECLARE_DEVICE_TYPE(SH_CMT, sh_cmt_device) + +#endif // MAME_CPU_SH_SH_CMT_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_intc.cpp mame-0.264+dfsg.1/src/devices/cpu/sh/sh_intc.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_intc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_intc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,108 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_intc.cpp + + SH interrupt controllers family + +***************************************************************************/ + +#include "emu.h" +#include "sh_intc.h" + +#include "sh7042.h" + +DEFINE_DEVICE_TYPE(SH_INTC, sh_intc_device, "sh_intc", "SH interrupt controller") + +const u8 sh_intc_device::pribit[0x100] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, + 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, + 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, + 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +}; + +sh_intc_device::sh_intc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, SH_INTC, tag, owner, clock), + m_cpu(*this, finder_base::DUMMY_TAG) +{ +} + +void sh_intc_device::device_start() +{ + save_item(NAME(m_ipr)); + save_item(NAME(m_icr)); + save_item(NAME(m_isr)); + + std::fill(m_ipr.begin(), m_ipr.end(), 0); + m_isr = 0; + m_icr = 0; +} + +void sh_intc_device::device_reset() +{ +} + +int sh_intc_device::interrupt_taken(int vector) +{ + return 0; +} + +void sh_intc_device::internal_interrupt(int vector) +{ + u32 slot = pribit[vector]; + u32 shift = 12-4*(slot & 3); + u32 level = (m_ipr[slot >> 2] >> shift) & 15; + logerror("Internal interrupt %d / %d (ipr%c %d-%d)\n", vector, level, 'a' + (slot >> 2), shift + 3, shift); + m_cpu->set_internal_interrupt(level, vector); +} + +void sh_intc_device::set_input(int inputnum, int state) +{ +} + +u16 sh_intc_device::icr_r() +{ + return m_icr; +} + +void sh_intc_device::icr_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_icr); + logerror("icr_w %04x @ %04x\n", data, mem_mask); +} + +u16 sh_intc_device::isr_r() +{ + return m_isr; +} + +void sh_intc_device::isr_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_isr); + logerror("isr_w %04x @ %04x\n", data, mem_mask); +} + +u16 sh_intc_device::ipr_r(offs_t offset) +{ + return m_ipr[offset]; +} + +void sh_intc_device::ipr_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_ipr[offset]); + logerror("ipr_w %x, %04x @ %04x\n", offset, data, mem_mask); +} + diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_intc.h mame-0.264+dfsg.1/src/devices/cpu/sh/sh_intc.h --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_intc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_intc.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,53 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_intc.h + + SH interrupt controllers family + +***************************************************************************/ + +#ifndef MAME_CPU_SH_SH_INTC_H +#define MAME_CPU_SH_SH_INTC_H + +#pragma once + +class sh7042_device; + +class sh_intc_device : public device_t { +public: + sh_intc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + template sh_intc_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu) : + sh_intc_device(mconfig, tag, owner) + { + m_cpu.set_tag(std::forward(cpu)); + } + + int interrupt_taken(int vector); + void internal_interrupt(int vector); + void set_input(int inputnum, int state); + + u16 icr_r(); + void icr_w(offs_t, u16 data, u16 mem_mask); + u16 isr_r(); + void isr_w(offs_t, u16 data, u16 mem_mask); + u16 ipr_r(offs_t offset); + void ipr_w(offs_t offset, u16 data, u16 mem_mask); + +protected: + static const u8 pribit[256]; + + std::array m_ipr; + + u16 m_isr, m_icr; + + required_device m_cpu; + + virtual void device_start() override; + virtual void device_reset() override; +}; + +DECLARE_DEVICE_TYPE(SH_INTC, sh_intc_device) + +#endif // MAME_CPU_SH_SH_INTC_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_port.cpp mame-0.264+dfsg.1/src/devices/cpu/sh/sh_port.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_port.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_port.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,109 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_port.h + + SH i/o ports + +***************************************************************************/ + +#include "emu.h" +#include "sh_intc.h" + +#include "sh7042.h" + +DEFINE_DEVICE_TYPE(SH_PORT16, sh_port16_device, "sh_port16", "SH 16-bits port") +DEFINE_DEVICE_TYPE(SH_PORT32, sh_port32_device, "sh_port32", "SH 32-bits port") + +sh_port16_device::sh_port16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, SH_PORT16, tag, owner, clock), + m_cpu(*this, finder_base::DUMMY_TAG) +{ +} + +void sh_port16_device::device_start() +{ + m_io = m_default_io; + save_item(NAME(m_dr)); + save_item(NAME(m_io)); +} + +void sh_port16_device::device_reset() +{ +} + +u16 sh_port16_device::dr_r() +{ + if(~m_io & ~m_mask) + return (m_dr & m_io) | (m_cpu->do_read_port16(m_index) & ~m_io); + return m_dr; +} + +void sh_port16_device::dr_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_dr); + m_dr &= ~m_mask; + if(m_io) + m_cpu->do_write_port16(m_index, m_dr & m_io, m_io); +} + +u16 sh_port16_device::io_r() +{ + return m_io; +} + +void sh_port16_device::io_w(offs_t, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_io); + m_io &= ~m_mask; + if(m_io) + m_cpu->do_write_port16(m_index, m_dr & m_io, m_io); +} + + +sh_port32_device::sh_port32_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, SH_PORT32, tag, owner, clock), + m_cpu(*this, finder_base::DUMMY_TAG) +{ +} + +void sh_port32_device::device_start() +{ + m_io = m_default_io; + save_item(NAME(m_dr)); + save_item(NAME(m_io)); +} + +void sh_port32_device::device_reset() +{ +} + +u32 sh_port32_device::dr_r() +{ + if((~m_io) & (~m_mask)) + return (m_dr & m_io) | (m_cpu->do_read_port32(m_index) & ~m_io); + return m_dr; +} + +void sh_port32_device::dr_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_dr); + m_dr &= ~m_mask; + if(m_io) + m_cpu->do_write_port32(m_index, m_dr & m_io, m_io); +} + +u32 sh_port32_device::io_r() +{ + return m_io; +} + +void sh_port32_device::io_w(offs_t, u32 data, u32 mem_mask) +{ + COMBINE_DATA(&m_io); + m_io &= ~m_mask; + if(m_io) + m_cpu->do_write_port32(m_index, m_dr & m_io, m_io); +} + diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sh/sh_port.h mame-0.264+dfsg.1/src/devices/cpu/sh/sh_port.h --- mame-0.263+dfsg.1/src/devices/cpu/sh/sh_port.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sh/sh_port.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,75 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + sh_port.h + + SH i/o ports + +***************************************************************************/ + +#ifndef MAME_CPU_SH_SH_PORT_H +#define MAME_CPU_SH_SH_PORT_H + +#pragma once + +class sh7042_device; + +class sh_port16_device : public device_t { +public: + sh_port16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + template sh_port16_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu, int index, u16 default_io, u16 mask) : + sh_port16_device(mconfig, tag, owner) + { + m_index = index; + m_default_io = default_io; + m_mask = mask; + m_cpu.set_tag(std::forward(cpu)); + } + + u16 dr_r(); + void dr_w(offs_t, u16 data, u16 mem_mask); + u16 io_r(); + void io_w(offs_t, u16 data, u16 mem_mask); + +protected: + required_device m_cpu; + int m_index; + u16 m_default_io, m_mask; + u16 m_dr, m_io; + + virtual void device_start() override; + virtual void device_reset() override; +}; + +class sh_port32_device : public device_t { +public: + sh_port32_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + template sh_port32_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu, int index, u32 default_io, u32 mask) : + sh_port32_device(mconfig, tag, owner) + { + m_index = index; + m_default_io = default_io; + m_mask = mask; + m_cpu.set_tag(std::forward(cpu)); + } + + u32 dr_r(); + void dr_w(offs_t, u32 data, u32 mem_mask); + u32 io_r(); + void io_w(offs_t, u32 data, u32 mem_mask); + +protected: + required_device m_cpu; + int m_index; + u32 m_default_io, m_mask; + u32 m_dr, m_io; + + virtual void device_start() override; + virtual void device_reset() override; +}; + +DECLARE_DEVICE_TYPE(SH_PORT16, sh_port16_device) +DECLARE_DEVICE_TYPE(SH_PORT32, sh_port32_device) + +#endif // MAME_CPU_SH_SH_PORT_H diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sm510/sm510d.cpp mame-0.264+dfsg.1/src/devices/cpu/sm510/sm510d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/sm510/sm510d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sm510/sm510d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -46,6 +46,38 @@ // common lookup tables +enum sm510_common_disassembler::e_mnemonics : unsigned +{ + // SM510 common + mILL /* 0! */, mEXT, + mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB, + mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT, + mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mPTW, mWR, mWS, + mKTA, mATBP, mATX, mATL, mATFC, mATR, + mADD, mADD11, mADX, mCOMA, mROT, mRC, mSC, + mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4, + mRM, mSM, + mPRE, mSME, mRME, mTMEL, + mSKIP, mCEND, mIDIV, mDR, mDTA, mCLKLO, mCLKHI, + + // SM500 common + mCOMCB, mRTN, mRTNS, mSSR, mTR, mTRS, mRBM, + mADDC, mPDTW, mTW, mDTW, + mATS, mEXKSA, mEXKFA, + mRMF, mSMF, mCOMCN, + mTA, mTM2, mTG, + + // SM530 common + mSABM, mSABL, mEXBL, + mTG2, mTBA, + mKETA, mATF, mSDS, mRDS, + mINIS, + + // SM590 common + mTAX, mLBLX, mMTR, mSTR, mINBM, mDEBM, mRTA, mBLTA, mEXAX, mTBA2, mADS, mADC, mLBMX, mTLS, + mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7 // aliases +}; + const char *const sm510_common_disassembler::s_mnemonics[] = { // SM510 diff -Nru mame-0.263+dfsg.1/src/devices/cpu/sm510/sm510d.h mame-0.264+dfsg.1/src/devices/cpu/sm510/sm510d.h --- mame-0.263+dfsg.1/src/devices/cpu/sm510/sm510d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/sm510/sm510d.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,38 +25,7 @@ virtual offs_t pc_real_to_linear(offs_t pc) const override { return (pc & ~0x3f) | m_r2l6[pc & 0x3f]; } protected: - enum e_mnemonics - { - // SM510 common - mILL /* 0! */, mEXT, - mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB, - mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT, - mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mPTW, mWR, mWS, - mKTA, mATBP, mATX, mATL, mATFC, mATR, - mADD, mADD11, mADX, mCOMA, mROT, mRC, mSC, - mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4, - mRM, mSM, - mPRE, mSME, mRME, mTMEL, - mSKIP, mCEND, mIDIV, mDR, mDTA, mCLKLO, mCLKHI, - - // SM500 common - mCOMCB, mRTN, mRTNS, mSSR, mTR, mTRS, mRBM, - mADDC, mPDTW, mTW, mDTW, - mATS, mEXKSA, mEXKFA, - mRMF, mSMF, mCOMCN, - mTA, mTM2, mTG, - - // SM530 common - mSABM, mSABL, mEXBL, - mTG2, mTBA, - mKETA, mATF, mSDS, mRDS, - mINIS, - - // SM590 common - mTAX, mLBLX, mMTR, mSTR, mINBM, mDEBM, mRTA, mBLTA, mEXAX, mTBA2, mADS, mADC, mLBMX, mTLS, - mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7 // aliases - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonics[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/t11/t11.cpp mame-0.264+dfsg.1/src/devices/cpu/t11/t11.cpp --- mame-0.263+dfsg.1/src/devices/cpu/t11/t11.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/t11/t11.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -163,6 +163,8 @@ #define GET_V (PSW & VFLAG) #define GET_Z (PSW & ZFLAG) #define GET_N (PSW & NFLAG) +#define GET_T (PSW & (1 << 4)) +#define GET_I (PSW & (1 << 7)) /* clears flags */ #define CLR_C (PSW &= ~CFLAG) @@ -210,6 +212,122 @@ { 7<<5, 0140 } }; +// PSW7 masks external interrupts (except IRQ1) -- IRQ2, IRQ3, VIRQ +// PSW11 also masks IRQ1. PSW10 also masks ACLO. +void k1801vm1_device::t11_check_irqs() +{ + // 2. bus error on vector fetch; nm, vec 160012 + // 3. double bus error; nm, vec 160006 + // 4. bus error; PSW11, PSW10 + if (m_bus_error) + { + m_bus_error = false; + m_mcir = MCIR_IRQ; + m_vsel = T11_TIMEOUT; + } + // 5. illegal insn; nm + else if (m_mcir == MCIR_ILL) + { + WWORD(VM1_SEL1, RWORD(VM1_SEL1) & ~SEL1_HALT); + PUSH(PSW); + PUSH(PC); + PC = RWORD(m_vsel); + PSW = RWORD(m_vsel + 2); + } + // 6. trace trap; WCPU + else if (m_trace_trap && m_mcir == MCIR_NONE) // allow trap_to() to execute first + { + if (GET_T) + { + m_mcir = MCIR_IRQ; + m_vsel = T11_BPT; + } + else + m_trace_trap = false; + } + else if (GET_T) + { + m_trace_trap = true; + } + // 7. power fail (ACLO pin); PSW10 + else if (m_power_fail) + { + m_mcir = MCIR_IRQ; + m_vsel = T11_PWRFAIL; + } + // 8. external HALT (nIRQ1 pin); PSW11, PSW10 + else if (m_hlt_active) + { + m_mcir = MCIR_HALT; + m_vsel = VM1_HALT; + } + // 9. internal timer, vector 0270; PSW7, PSW10 + // 10. line clock (nIRQ2 pin); PSW7, PSW10 + else if (BIT(m_cp_state, 2) && !GET_I) + { + m_mcir = MCIR_IRQ; + m_vsel = VM1_EVNT; + } + // 11. nIRQ3 pin; PSW7, PSW10 + else if (BIT(m_cp_state, 3) && !GET_I) + { + m_mcir = MCIR_IRQ; + m_vsel = VM1_IRQ3; + } + // 12. nVIRQ pin; PSW7, PSW10 + else if (m_vec_active && !GET_I) + { + int vec = m_in_iack_func(0); + if (vec == -1 || vec == 0) + { + m_vec_active = 0; + return; + } + m_mcir = MCIR_IRQ; + m_vsel = vec; + } + + switch (m_mcir) + { + case MCIR_SET: + if (m_vsel >= 0160000) // FIXME + WWORD(VM1_SEL1, RWORD(VM1_SEL1) | SEL1_HALT); + else + WWORD(VM1_SEL1, RWORD(VM1_SEL1) & ~SEL1_HALT); + PUSH(PSW); + PUSH(PC); + PC = RWORD(m_vsel); + PSW = RWORD(m_vsel + 2); + break; + + case MCIR_IRQ: + take_interrupt(m_vsel); + break; + + case MCIR_HALT: + take_interrupt_halt(m_vsel); + break; + } + + m_mcir = MCIR_NONE; +} + +void k1801vm1_device::take_interrupt_halt(uint16_t vector) +{ + // enter HALT mode + WWORD(VM1_SEL1, RWORD(VM1_SEL1) | SEL1_HALT); + + // push the old state, set the new one + WWORD(VM1_STACK, PC); + WWORD(VM1_STACK + 2, PSW); + PCD = RWORD(vector); + PSW = RWORD(vector + 2); + + // count cycles and clear the WAIT flag + m_icount -= 114; + m_wait_state = 0; +} + void t11_device::t11_check_irqs() { // HLT is nonmaskable @@ -337,6 +455,10 @@ save_item(NAME(m_hlt_active)); save_item(NAME(m_power_fail)); save_item(NAME(m_ext_halt)); + save_item(NAME(m_trace_trap)); + save_item(NAME(m_check_irqs)); + save_item(NAME(m_mcir)); + save_item(NAME(m_vsel)); // Register debugger state state_add( T11_PC, "PC", m_reg[7].w.l).formatstr("%06O"); @@ -436,6 +558,8 @@ m_power_fail = false; m_bus_error = false; m_ext_halt = false; + m_trace_trap = false; + m_check_irqs = false; } void k1801vm1_device::device_reset() @@ -444,6 +568,9 @@ PC = RWORD(VM1_SEL1) & 0177400; WWORD(VM1_SEL1, RWORD(VM1_SEL1) | SEL1_HALT); + + m_mcir = MCIR_NONE; + m_vsel = 0; } void k1801vm2_device::device_reset() @@ -528,6 +655,12 @@ op = ROPCODE(); (this->*s_opcode_table[op >> 3])(op); + + if (m_check_irqs || m_trace_trap || GET_T) + { + m_check_irqs = false; + t11_check_irqs(); + } } } diff -Nru mame-0.263+dfsg.1/src/devices/cpu/t11/t11.h mame-0.264+dfsg.1/src/devices/cpu/t11/t11.h --- mame-0.263+dfsg.1/src/devices/cpu/t11/t11.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/t11/t11.h 2024-03-25 14:00:46.000000000 +0000 @@ -51,14 +51,25 @@ T11_IOT = 020, // IOT instruction vector T11_PWRFAIL = 024, // Power fail vector T11_EMT = 030, // EMT instruction vector - T11_TRAP = 034 // TRAP instruction vector + T11_TRAP = 034, // TRAP instruction vector + // K1801 vectors + VM1_EVNT = 0100, // EVNT pin vector + VM1_IRQ3 = 0270, // IRQ3 pin vector + VM1_HALT = 0160002, // HALT instruction vector + VM2_HALT = 0170 // HALT instruction vector }; // K1801 microcode constants enum { VM1_STACK = 0177674, // start of HALT mode save area VM1_SEL1 = 0177716, // DIP switch register (read) and HALT mode selector (write) - SEL1_HALT = 010 + SEL1_HALT = 010, + MCIR_ILL = -2, + MCIR_SET = -1, + MCIR_WAIT = 0, + MCIR_NONE = 1, + MCIR_HALT = 2, + MCIR_IRQ = 3 }; enum { @@ -106,6 +117,8 @@ PAIR m_psw; uint16_t m_initial_pc; uint8_t m_wait_state; + int8_t m_mcir; + uint16_t m_vsel; uint8_t m_cp_state; bool m_vec_active; bool m_pf_active; @@ -114,6 +127,8 @@ bool m_power_fail; bool m_bus_error; bool m_ext_halt; + bool m_check_irqs; + bool m_trace_trap; int m_icount; memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache; memory_access<16, 1, 0, ENDIANNESS_LITTLE>::specific m_program; @@ -128,7 +143,8 @@ inline void WWORD(int addr, int data); inline void PUSH(int val); inline int POP(); - void t11_check_irqs(); + + virtual void t11_check_irqs(); void take_interrupt(uint8_t vector); void trap_to(uint16_t vector); @@ -1190,6 +1206,9 @@ // device_state_interface overrides virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; + + virtual void t11_check_irqs() override; + void take_interrupt_halt(uint16_t vector); }; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/t11/t11ops.hxx mame-0.264+dfsg.1/src/devices/cpu/t11/t11ops.hxx --- mame-0.263+dfsg.1/src/devices/cpu/t11/t11ops.hxx 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/t11/t11ops.hxx 2024-03-25 14:00:46.000000000 +0000 @@ -224,8 +224,8 @@ #define MOVB_X(s,d) int sreg, dreg, source, result, ea; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; PUT_DW_##d((signed char)result) #define MOVB_M(s,d) int sreg, dreg, source, result, ea; GET_SB_##s; CLR_NZV; result = source; SETB_NZ; PUT_DBT_##d(result) /* MTPS: flags = src */ -#define MTPS_R(d) int dreg, dest; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); t11_check_irqs() -#define MTPS_M(d) int dreg, dest, ea; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); t11_check_irqs() +#define MTPS_R(d) int dreg, dest; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); m_check_irqs = true +#define MTPS_M(d) int dreg, dest, ea; GET_DB_##d; PSW = (PSW & ~0xef) | (dest & 0xef); m_check_irqs = true /* NEG: dst = -dst */ #define NEG_R(d) int dreg, dest, result; GET_DW_##d; CLR_NZVC; result = -dest; SETW_NZ; if (dest == 0x8000) SET_V; if (result) SET_C; PUT_DW_DREG(result) #define NEG_M(d) int dreg, dest, result, ea; GET_DW_##d; CLR_NZVC; result = -dest; SETW_NZ; if (dest == 0x8000) SET_V; if (result) SET_C; PUT_DW_EA(result) @@ -273,11 +273,22 @@ void t11_device::trap_to(uint16_t vector) { - PUSH(PSW); - PUSH(PC); - PC = RWORD(vector); - PSW = RWORD(vector + 2); - t11_check_irqs(); + if (c_insn_set & IS_VM1) + { + m_vsel = vector; + if (vector == T11_ILLINST || vector == T11_TIMEOUT) + m_mcir = MCIR_ILL; + else + m_mcir = MCIR_SET; + } + else + { + PUSH(PSW); + PUSH(PC); + PC = RWORD(vector); + PSW = RWORD(vector + 2); + } + m_check_irqs = true; } void t11_device::op_0000(uint16_t op) @@ -286,11 +297,11 @@ { case 0x00: /* HALT */ halt(op); break; case 0x01: /* WAIT */ m_icount = 0; m_wait_state = 1; break; - case 0x02: /* RTI */ m_icount -= 24; PC = POP(); PSW = POP(); t11_check_irqs(); break; - case 0x03: /* BPT */ m_icount -= 48; trap_to(0x0c); break; - case 0x04: /* IOT */ m_icount -= 48; trap_to(0x10); break; + case 0x02: /* RTI */ m_icount -= 24; PC = POP(); PSW = POP(); if (GET_T) m_trace_trap = true; m_check_irqs = true; break; + case 0x03: /* BPT */ m_icount -= 48; trap_to(T11_BPT); break; + case 0x04: /* IOT */ m_icount -= 48; trap_to(T11_IOT); break; case 0x05: /* RESET */ m_out_reset_func(ASSERT_LINE); m_out_reset_func(CLEAR_LINE); m_icount -= 110; break; - case 0x06: /* RTT */ if (c_insn_set & IS_LEIS) { m_icount -= 33; PC = POP(); PSW = POP(); t11_check_irqs(); } else illegal(op); break; + case 0x06: /* RTT */ if (c_insn_set & IS_LEIS) { m_icount -= 33; PC = POP(); PSW = POP(); m_check_irqs = true; } else illegal(op); break; case 0x07: /* MFPT */ if (c_insn_set & IS_MFPT) REGB(0) = 4; else illegal(op); break; default: illegal(op); break; @@ -324,11 +335,18 @@ void t11_device::halt(uint16_t op) { m_icount -= 48; - PUSH(PSW); - PUSH(PC); - PC = m_initial_pc + 4; - PSW = 0340; - t11_check_irqs(); + if (c_insn_set & IS_VM1) + { + trap_to(VM1_HALT); + } + else + { + PUSH(PSW); + PUSH(PC); + PC = m_initial_pc + 4; + PSW = 0340; + } + m_check_irqs = true; } void t11_device::illegal(uint16_t op) diff -Nru mame-0.263+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.cpp mame-0.264+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.cpp --- mame-0.263+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -84,6 +84,22 @@ // common lookup tables +enum tms1000_base_disassembler::e_mnemonics : unsigned +{ + mILL = 0, + mAC0AC, mAC1AC, mACACC, mACNAA, mALEC, mALEM, mAMAAC, mBRANCH, + mCALL, mCCLA, mCLA, mCLO, mCOMC, mCOMX, mCOMX8, mCPAIZ, mCTMDYN, + mDAN, mDMAN, mDMEA, mDNAA, mDYN, mHALT, + mIA, mIMAC, mINTDIS, mINTEN, mINTRTN, mIYC, + mKNEZ, mLDP, mLDX2, mLDX3, mLDX4, mMNEA, mMNEZ, + mNDMEA, mOFF, mRBIT, mREAC, mRETN, mRSTR, + mSAL, mSAMAN, mSBIT, mSBL, mSEAC, mSELIN, mSETR, + mTAC, mTADM, mTAM, mTAMACS, mTAMDYN, mTAMIY, mTAMIYC, mTAMZA, + mTASR, mTAX, mTAY, mTBIT, mTCA, mTCMIY, mTCY, mTDO, mTKA, + mTKM, mTMA, mTMSET, mTMY, mTPC, mTRA, mTSG, mTXA, mTYA, + mXDA, mXMA, mYMCY, mYNEA, mYNEC +}; + const char *const tms1000_base_disassembler::s_mnemonic[] = { "?", diff -Nru mame-0.263+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.h mame-0.264+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.h --- mame-0.263+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/tms1000/tms1k_dasm.h 2024-03-25 14:00:46.000000000 +0000 @@ -25,22 +25,7 @@ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; protected: - enum e_mnemonics - { - mILL = 0, - mAC0AC, mAC1AC, mACACC, mACNAA, mALEC, mALEM, mAMAAC, mBRANCH, - mCALL, mCCLA, mCLA, mCLO, mCOMC, mCOMX, mCOMX8, mCPAIZ, mCTMDYN, - mDAN, mDMAN, mDMEA, mDNAA, mDYN, mHALT, - mIA, mIMAC, mINTDIS, mINTEN, mINTRTN, mIYC, - mKNEZ, mLDP, mLDX2, mLDX3, mLDX4, mMNEA, mMNEZ, - mNDMEA, mOFF, mRBIT, mREAC, mRETN, mRSTR, - mSAL, mSAMAN, mSBIT, mSBL, mSEAC, mSELIN, mSETR, - mTAC, mTADM, mTAM, mTAMACS, mTAMDYN, mTAMIY, mTAMIYC, mTAMZA, - mTASR, mTAX, mTAY, mTBIT, mTCA, mTCMIY, mTCY, mTDO, mTKA, - mTKM, mTMA, mTMSET, mTMY, mTPC, mTRA, mTSG, mTXA, mTYA, - mXDA, mXMA, mYMCY, mYNEA, mYNEC - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonic[]; static const u32 s_flags[]; static const u8 s_bits[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/ucom4/ucom4d.cpp mame-0.264+dfsg.1/src/devices/cpu/ucom4/ucom4d.cpp --- mame-0.263+dfsg.1/src/devices/cpu/ucom4/ucom4d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/ucom4/ucom4d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,22 @@ #include "emu.h" #include "ucom4d.h" + +// common lookup tables + +enum ucom4_disassembler::e_mnemonics : unsigned +{ + mILL, + mLI, mL, mLM, mLDI, mLDZ, mS, mTAL, mTLA, + mX, mXI, mXD, mXM, mXMI, mXMD, mAD, mADC, mADS, mDAA, mDAS, + mEXL, mCLA, mCMA, mCIA, mCLC, mSTC, mTC, mINC, mDEC, mIND, mDED, + mRMB, mSMB, mREB, mSEB, mRPB, mSPB, mJMP, mJCP, mJPA, mCAL, mCZP, mRT, mRTS, + mCI, mCM, mCMB, mTAB, mCLI, mTMB, mTPA, mTPB, + mTIT, mIA, mIP, mOE, mOP, mOCD, mNOP, + mTAW, mTAZ, mTHX, mTLY, mXAW, mXAZ, mXHR, mXHX, mXLS, mXLY, mXC, + mSFB, mRFB, mFBT, mFBF, mRAR, mINM, mDEM, mSTM, mTTM, mEI, mDI +}; + const char *const ucom4_disassembler::s_mnemonics[] = { "?", @@ -75,6 +91,8 @@ }; +// disasm + offs_t ucom4_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { offs_t pos = pc; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/ucom4/ucom4d.h mame-0.264+dfsg.1/src/devices/cpu/ucom4/ucom4d.h --- mame-0.263+dfsg.1/src/devices/cpu/ucom4/ucom4d.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/ucom4/ucom4d.h 2024-03-25 14:00:46.000000000 +0000 @@ -6,7 +6,6 @@ */ - #ifndef MAME_CPU_UCOM4_UCOM4D_H #define MAME_CPU_UCOM4_UCOM4D_H @@ -25,19 +24,7 @@ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - enum e_mnemonics - { - mILL, - mLI, mL, mLM, mLDI, mLDZ, mS, mTAL, mTLA, - mX, mXI, mXD, mXM, mXMI, mXMD, mAD, mADC, mADS, mDAA, mDAS, - mEXL, mCLA, mCMA, mCIA, mCLC, mSTC, mTC, mINC, mDEC, mIND, mDED, - mRMB, mSMB, mREB, mSEB, mRPB, mSPB, mJMP, mJCP, mJPA, mCAL, mCZP, mRT, mRTS, - mCI, mCM, mCMB, mTAB, mCLI, mTMB, mTPA, mTPB, - mTIT, mIA, mIP, mOE, mOP, mOCD, mNOP, - mTAW, mTAZ, mTHX, mTLY, mXAW, mXAZ, mXHR, mXHX, mXLS, mXLY, mXC, - mSFB, mRFB, mFBT, mFBF, mRAR, mINM, mDEM, mSTM, mTTM, mEI, mDI - }; - + enum e_mnemonics : unsigned; static const char *const s_mnemonics[]; static const u8 s_bits[]; static const u32 s_flags[]; diff -Nru mame-0.263+dfsg.1/src/devices/cpu/z80/r800dasm.cpp mame-0.264+dfsg.1/src/devices/cpu/z80/r800dasm.cpp --- mame-0.263+dfsg.1/src/devices/cpu/z80/r800dasm.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/z80/r800dasm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,606 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/***************************************************************************** + * + * r800dasm.cpp + * Disassembler for ASCII R800 based on portable Z80 disassembler. + * + *****************************************************************************/ + +#include "emu.h" +#include "r800dasm.h" + +enum r800_disassembler::e_mnemonics : unsigned +{ + zADD ,zADDC ,zADJ ,zAND ,zBC ,zBIT ,zBM ,zBNC , + zBNZ ,zBP ,zBPE ,zBPO ,zBR ,zBRK ,zBZ ,zCALL , + zCLR ,zCMP ,zCMPM ,zDB ,zDBNZ ,zDEC ,zDI ,zEI , + zHALT ,zIM ,zIN ,zINC ,zINM ,zLD ,zMOVE ,zMOVEM, + zMULUB,zMULUW,zNEG ,zNOP ,zNOT ,zNOTC ,zOR ,zOUT , + zOUTM ,zPOP ,zPUSH ,zRET ,zRETI ,zRETN ,zROL ,zROL4 , + zROLA ,zROLC ,zROLCA,zROR ,zROR4 ,zRORA ,zRORC ,zRORCA, + zSET ,zSETC ,zSHL ,zSHORT,zSHR ,zSHRA ,zSLA ,zSUB , + zSUBC ,zXCH ,zXCHX ,zXOR +}; + +struct r800_disassembler::r800dasm +{ + e_mnemonics mnemonic; + const char *arguments; +}; + +static const char *const s_mnemonic[] = +{ + "add" ,"addc" ,"adj" ,"and" ,"bc" ,"bit" ,"bm" ,"bnc" , + "bnz" ,"bp" ,"bpe" ,"bpo" ,"br" ,"brk" ,"bz" ,"call" , + "clr" ,"cmp" ,"cmpm" ,"db" ,"dbnz" ,"dec" ,"di" ,"ei" , + "halt" ,"im" ,"in" ,"inc" ,"inm" ,"ld" ,"move" ,"movem", + "mulub","muluw","neg" ,"nop" ,"not" ,"notc" ,"or" ,"out" , + "outm" ,"pop" ,"push" ,"ret" ,"reti" ,"retn" ,"rol" ,"rol4" , + "rola" ,"rolc" ,"rolca","ror" ,"ror4" ,"rora" ,"rorc" ,"rorca", + "set" ,"setc" ,"shl" ,"short","shr" ,"shra" ,"sla" ,"sub" , + "subc" ,"xch" ,"xchx" ,"xor" +}; + +const u32 r800_disassembler::s_flags[] = +{ + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + 0 ,0 ,0 ,0 ,0 ,STEP_OVER,0 ,STEP_OVER, + 0 ,0 ,STEP_COND,0 ,STEP_COND,0 ,0 ,0 , + STEP_OVER,0 ,0 ,0 ,STEP_COND,0 ,0 ,STEP_COND, + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + STEP_COND,0 ,0 ,STEP_OUT ,STEP_OUT ,STEP_OUT ,0 ,0 , + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , + 0 ,0 ,0 ,0 +}; + +const r800_disassembler::r800dasm r800_disassembler::mnemonic_xx_cb[256] = +{ + // 00 - 0F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zROLC,"Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zRORC,"Y"}, {zDB,"?"}, + // 10 - 1F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zROL,"Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zROR,"Y"}, {zDB,"?"}, + // 20 - 2F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSLA,"Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSHRA,"Y"}, {zDB,"?"}, + // 30 - 3F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSHL,"Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSHR,"Y"}, {zDB,"?"}, + // 40 - 4F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"0,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"1,Y"}, {zDB,"?"}, + // 50 - 5F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"2,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"3,Y"}, {zDB,"?"}, + // 60 - 6F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"4,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"5,Y"}, {zDB,"?"}, + // 70 - 6F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"6,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zBIT,"7,Y"}, {zDB,"?"}, + // 80 - 8F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"0,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"1,Y"}, {zDB,"?"}, + // 90 - 9F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"2,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"3,Y"}, {zDB,"?"}, + // A0 - AF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"4,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"5,Y"}, {zDB,"?"}, + // B0 - BF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"6,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zCLR,"7,Y"}, {zDB,"?"}, + // C0 - CF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"0,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"1,Y"}, {zDB,"?"}, + // D0 - DF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"2,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"3,Y"}, {zDB,"?"}, + // E0 - EF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"4,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"5,Y"}, {zDB,"?"}, + // F0 - FF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"6,Y"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zSET,"7,Y"}, {zDB,"?"} +}; + +const r800_disassembler::r800dasm r800_disassembler::mnemonic_cb[256] = +{ + // 00 - 1F + {zROLC,".b"}, {zROLC,".c"}, {zROLC,".d"}, {zROLC,".e"}, + {zROLC,".h"}, {zROLC,".l"}, {zROLC,"[.hl]"}, {zROLC,".a"}, + {zRORC,".b"}, {zRORC,".c"}, {zRORC,".d"}, {zRORC,".e"}, + {zRORC,".h"}, {zRORC,".l"}, {zRORC,"[.hl]"}, {zRORC,".a"}, + // 10 - 1F + {zROL,".b"}, {zROL,".c"}, {zROL,".d"}, {zROL,".e"}, + {zROL,".h"}, {zROL,".l"}, {zROL,"[.hl]"}, {zROL,".a"}, + {zROR,".b"}, {zROR,".c"}, {zROR,".d"}, {zROR,".e"}, + {zROR,".h"}, {zROR,".l"}, {zROR,"[.hl]"}, {zROR,".a"}, + // 20 - 2F + {zSHL,".b"}, {zSHL,".c"}, {zSHL,".d"}, {zSHL,".e"}, + {zSHL,".h"}, {zSHL,".l"}, {zSHL,"[.hl]"}, {zSHL,".a"}, + {zSHRA,".b"}, {zSHRA,".c"}, {zSHRA,".d"}, {zSHRA,".e"}, + {zSHRA,".h"}, {zSHRA,".l"}, {zSHRA,"[.hl]"}, {zSHRA,".a"}, + // 30 - 3F + {zSHL,".b"}, {zSHL,".c"}, {zSHL,".d"}, {zSHL,".e"}, + {zSHL,".h"}, {zSHL,".l"}, {zSHL,"[.hl]"}, {zSHL,".a"}, + {zSHR,".b"}, {zSHR,".c"}, {zSHR,".d"}, {zSHR,".e"}, + {zSHR,".h"}, {zSHR,".l"}, {zSHR,"[.hl]"}, {zSHR,".a"}, + // 40 - 4F + {zBIT,"0,.b"}, {zBIT,"0,.c"}, {zBIT,"0,.d"}, {zBIT,"0,.e"}, + {zBIT,"0,.h"}, {zBIT,"0,.l"}, {zBIT,"0,[.hl]"}, {zBIT,"0,.a"}, + {zBIT,"1,.b"}, {zBIT,"1,.c"}, {zBIT,"1,.d"}, {zBIT,"1,.e"}, + {zBIT,"1,.h"}, {zBIT,"1,.l"}, {zBIT,"1,[.hl]"}, {zBIT,"1,.a"}, + // 50 - 5F + {zBIT,"2,.b"}, {zBIT,"2,.c"}, {zBIT,"2,.d"}, {zBIT,"2,.e"}, + {zBIT,"2,.h"}, {zBIT,"2,.l"}, {zBIT,"2,[.hl]"}, {zBIT,"2,.a"}, + {zBIT,"3,.b"}, {zBIT,"3,.c"}, {zBIT,"3,.d"}, {zBIT,"3,.e"}, + {zBIT,"3,.h"}, {zBIT,"3,.l"}, {zBIT,"3,[.hl]"}, {zBIT,"3,.a"}, + // 60 - 6F + {zBIT,"4,.b"}, {zBIT,"4,.c"}, {zBIT,"4,.d"}, {zBIT,"4,.e"}, + {zBIT,"4,.h"}, {zBIT,"4,.l"}, {zBIT,"4,[.hl]"}, {zBIT,"4,.a"}, + {zBIT,"5,.b"}, {zBIT,"5,.c"}, {zBIT,"5,.d"}, {zBIT,"5,.e"}, + {zBIT,"5,.h"}, {zBIT,"5,.l"}, {zBIT,"5,[.hl]"}, {zBIT,"5,.a"}, + // 70 - 7F + {zBIT,"6,.b"}, {zBIT,"6,.c"}, {zBIT,"6,.d"}, {zBIT,"6,.e"}, + {zBIT,"6,.h"}, {zBIT,"6,.l"}, {zBIT,"6,[.hl]"}, {zBIT,"6,.a"}, + {zBIT,"7,.b"}, {zBIT,"7,.c"}, {zBIT,"7,.d"}, {zBIT,"7,.e"}, + {zBIT,"7,.h"}, {zBIT,"7,.l"}, {zBIT,"7,[.hl]"}, {zBIT,"7,.a"}, + // 80 - 8F + {zCLR,"0,.b"}, {zCLR,"0,.c"}, {zCLR,"0,.d"}, {zCLR,"0,.e"}, + {zCLR,"0,.h"}, {zCLR,"0,.l"}, {zCLR,"0,[.hl]"}, {zCLR,"0,.a"}, + {zCLR,"1,.b"}, {zCLR,"1,.c"}, {zCLR,"1,.d"}, {zCLR,"1,.e"}, + {zCLR,"1,.h"}, {zCLR,"1,.l"}, {zCLR,"1,[.hl]"}, {zCLR,"1,.a"}, + // 90 - 9F + {zCLR,"2,.b"}, {zCLR,"2,.c"}, {zCLR,"2,.d"}, {zCLR,"2,.e"}, + {zCLR,"2,.h"}, {zCLR,"2,.l"}, {zCLR,"2,[.hl]"}, {zCLR,"2,.a"}, + {zCLR,"3,.b"}, {zCLR,"3,.c"}, {zCLR,"3,.d"}, {zCLR,"3,.e"}, + {zCLR,"3,.h"}, {zCLR,"3,.l"}, {zCLR,"3,[.hl]"}, {zCLR,"3,.a"}, + // A0 - AF + {zCLR,"4,.b"}, {zCLR,"4,.c"}, {zCLR,"4,.d"}, {zCLR,"4,.e"}, + {zCLR,"4,.h"}, {zCLR,"4,.l"}, {zCLR,"4,[.hl]"}, {zCLR,"4,.a"}, + {zCLR,"5,.b"}, {zCLR,"5,.c"}, {zCLR,"5,.d"}, {zCLR,"5,.e"}, + {zCLR,"5,.h"}, {zCLR,"5,.l"}, {zCLR,"5,[.hl]"}, {zCLR,"5,.a"}, + // B0 - BF + {zCLR,"6,.b"}, {zCLR,"6,.c"}, {zCLR,"6,.d"}, {zCLR,"6,.e"}, + {zCLR,"6,.h"}, {zCLR,"6,.l"}, {zCLR,"6,[.hl]"}, {zCLR,"6,.a"}, + {zCLR,"7,.b"}, {zCLR,"7,.c"}, {zCLR,"7,.d"}, {zCLR,"7,.e"}, + {zCLR,"7,.h"}, {zCLR,"7,.l"}, {zCLR,"7,[.hl]"}, {zCLR,"7,.a"}, + // C0 - CF + {zSET,"0,.b"}, {zSET,"0,.c"}, {zSET,"0,.d"}, {zSET,"0,.e"}, + {zSET,"0,.h"}, {zSET,"0,.l"}, {zSET,"0,[.hl]"}, {zSET,"0,.a"}, + {zSET,"1,.b"}, {zSET,"1,.c"}, {zSET,"1,.d"}, {zSET,"1,.e"}, + {zSET,"1,.h"}, {zSET,"1,.l"}, {zSET,"1,[.hl]"}, {zSET,"1,.a"}, + // D0 - DF + {zSET,"2,.b"}, {zSET,"2,.c"}, {zSET,"2,.d"}, {zSET,"2,.e"}, + {zSET,"2,.h"}, {zSET,"2,.l"}, {zSET,"2,[.hl]"}, {zSET,"2,.a"}, + {zSET,"3,.b"}, {zSET,"3,.c"}, {zSET,"3,.d"}, {zSET,"3,.e"}, + {zSET,"3,.h"}, {zSET,"3,.l"}, {zSET,"3,[.hl]"}, {zSET,"3,.a"}, + // E0 - EF + {zSET,"4,.b"}, {zSET,"4,.c"}, {zSET,"4,.d"}, {zSET,"4,.e"}, + {zSET,"4,.h"}, {zSET,"4,.l"}, {zSET,"4,[.hl]"}, {zSET,"4,.a"}, + {zSET,"5,.b"}, {zSET,"5,.c"}, {zSET,"5,.d"}, {zSET,"5,.e"}, + {zSET,"5,.h"}, {zSET,"5,.l"}, {zSET,"5,[.hl]"}, {zSET,"5,.a"}, + // F0 - FF + {zSET,"6,.b"}, {zSET,"6,.c"}, {zSET,"6,.d"}, {zSET,"6,.e"}, + {zSET,"6,.h"}, {zSET,"6,.l"}, {zSET,"6,[.hl]"}, {zSET,"6,.a"}, + {zSET,"7,.b"}, {zSET,"7,.c"}, {zSET,"7,.d"}, {zSET,"7,.e"}, + {zSET,"7,.h"}, {zSET,"7,.l"}, {zSET,"7,[.hl]"}, {zSET,"7,.a"} +}; + +const r800_disassembler::r800dasm r800_disassembler::mnemonic_ed[256] = +{ + // 00 - 0F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 10 - 1F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 20 - 2F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 30 - 3F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 40 - 4F + {zIN,".b,[.c]"}, {zOUT,"[.c],.b"}, {zSUBC,".hl,.bc"}, {zLD,"(W),.bc"}, + {zNEG,".a"}, {zRETN,nullptr}, {zIM,"0"}, {zLD,".i,.a"}, + {zIN,".c,[.c]"}, {zOUT,"[.c],.c"}, {zADDC,".hl,.bc"}, {zLD,".bc,(W)"}, + {zDB,"?"}, {zRETI,nullptr}, {zDB,"?"}, {zLD,".r,.a"}, + // 50 - 5F + {zIN,".d,[.c]"}, {zOUT,"[.c],.d"}, {zSUBC,".hl,.de"}, {zLD,"(W),.de"}, + {zDB,"?"}, {zDB,"?"}, {zIM,"1"}, {zLD,".a,.i"}, + {zIN,".e,[.c]"}, {zOUT,"[.c],.e"}, {zADDC,".hl,.de"}, {zLD,".de,(W)"}, + {zDB,"?"}, {zDB,"?"}, {zIM,"2"}, {zLD,".a,.r"}, + // 60 - 6F + {zIN,".h,[.c]"}, {zOUT,"[.c],.h"}, {zSUBC,".hl,.hl"}, {zLD,"(W),.hl"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zROR4,"[.hl]"}, + {zIN,".l,[.c]"}, {zOUT,"[.c],.l"}, {zADDC,".hl,.hl"}, {zLD,".hl,(W)"}, + {zDB,"?"}, {zRETI,nullptr}, {zIM,"0"}, {zROL4,"[.hl]"}, + // 70 - 7F + {zIN,".f,[.c]"}, {zDB,"?"}, {zSUBC,".hl,.sp"}, {zLD,"(W),.sp"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zIN,".a,[.c]"}, {zOUT,"[.c],.a"}, {zADDC,".hl,.sp"}, {zLD,".sp,(W)"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 80 - 8F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 90 - 9F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // A0 - AF + {zMOVE,"[.hl++],[.de++]"}, {zCMP,".a,[.hl++]"}, {zIN,"[.c],[.hl++]"}, {zOUT,"[.c],[.hl++]"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zMOVE,"[.hl--],[.de--]"}, {zCMP,".a,[.hl--]"}, {zIN,"[.c],[.hl--]"}, {zOUT,"[.c],[.hl--]"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // B0 - BF + {zMOVEM,"[.hl++],[.de++]"}, {zCMPM,".a,[.hl++]"}, {zINM,"[.c],[.hl++]"}, {zOUTM,"[.c],[.hl++]"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zMOVEM,"[.hl--],[.de--]"}, {zCMPM,".a,[.hl--]"}, {zINM,"[.c],[.hl--]"}, {zOUTM,"[.c],[.hl--]"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // C0 - CF + {zDB,"?"}, {zMULUB,".a,.b"}, {zDB,"?"}, {zMULUW,".hl,.bc"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zMULUB,".a,.c"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // D0 - DF + {zDB,"?"}, {zMULUB,".a,.d"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zMULUB,".a,.e"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // E0 - EF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // F0 - FF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zMULUW,".hl,.sp"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"} +}; + +const r800_disassembler::r800dasm r800_disassembler::mnemonic_xx[256] = +{ + // 00 - 0F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zADD,".I,.bc"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 10 - 1F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zADD,".I,.de"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 20 - 2F + {zDB,"?"}, {zLD,".I,N"}, {zLD,"(W),.I"}, {zINC,".I"}, + {zINC,".Ih"}, {zDEC,".Ih"}, {zLD,".Ih,B"}, {zDB,"?"}, + {zDB,"?"}, {zADD,".I,.I"}, {zLD,".I,(W)"}, {zDEC,".I"}, + {zINC,".Il"}, {zDEC,".Il"}, {zLD,".Il,B"}, {zDB,"?"}, + // 30 - 3F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zINC,"X"}, {zDEC,"X"}, {zLD,"X,B"}, {zDB,"?"}, + {zDB,"?"}, {zADD,".I,.sp"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // 40 - 4F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zLD,".b,.Ih"}, {zLD,".b,.Il"}, {zLD,".b,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zLD,".c,.Ih"}, {zLD,".c,.Il"}, {zLD,".c,X"}, {zDB,"?"}, + // 50 - 5F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zLD,".d,.Ih"}, {zLD,".d,.Il"}, {zLD,".d,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zLD,".e,.Ih"}, {zLD,".e,.Il"}, {zLD,".e,X"}, {zDB,"?"}, + // 60 - 6F + {zLD,".Ih,.b"}, {zLD,".Ih,.c"}, {zLD,".Ih,.d"}, {zLD,".Ih,.e"}, + {zLD,".Ih,.Ih"}, {zLD,".Ih,.Il"}, {zLD,".h,X"}, {zLD,".Ih,.a"}, + {zLD,".Il,.b"}, {zLD,".Il,.c"}, {zLD,".Il,.d"}, {zLD,".Il,.e"}, + {zLD,".Il,.Ih"}, {zLD,".Il,.Il"}, {zLD,".l,X"}, {zLD,".Il,.a"}, + // 70 - 7F + {zLD,"X,.b"}, {zLD,"X,.c"}, {zLD,"X,.d"}, {zLD,"X,.e"}, + {zLD,"X,.h"}, {zLD,"X,.l"}, {zDB,"?"}, {zLD,"X,.a"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zLD,".a,.Ih"}, {zLD,".a,Il"}, {zLD,".a,X"}, {zDB,"?"}, + // 80 - 8F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zADD,".a,.Ih"}, {zADD,".a,.Il"}, {zADD,".a,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zADDC,".a,.Ih"}, {zADDC,".a,.Il"}, {zADDC,".a,X"}, {zDB,"?"}, + // 90 - 9F + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zSUB,".a,.Ih"}, {zSUB,".a,.Il"}, {zSUB,".a,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zSUBC,".a,.Ih"}, {zSUBC,".a,.Il"}, {zSUBC,".a,X"}, {zDB,"?"}, + // A0 - AF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zAND,".a,.Ih"}, {zAND,".a,.Il"}, {zAND,".a,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zXOR,".a,.Ih"}, {zXOR,".a,.Il"}, {zXOR,".a,X"}, {zDB,"?"}, + // B0 - BF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zOR,".a,.Ih"}, {zOR,".a,.Il"}, {zOR,".a,X"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zCMP,".a,.Ih"}, {zCMP,".a,.Il"}, {zCMP,".a,X"}, {zDB,"?"}, + // C0 - CF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"cb"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // D0 - DF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // E0 - EF + {zDB,"?"}, {zPOP,".I"}, {zDB,"?"}, {zXCH,"[.sp],.I"}, + {zDB,"?"}, {zPUSH,".I"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zBR,"[.I]"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + // F0 - FF + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zLD,".sp,I"}, {zDB,"?"}, {zDB,"?"}, + {zDB,"?"}, {zDB,"?"}, {zDB,"?"}, {zDB,"?"} +}; + +const r800_disassembler::r800dasm r800_disassembler::mnemonic_main[256] = +{ + // 00 - 0F + {zNOP,nullptr}, {zLD,".bc,N"}, {zLD,"[.bc],.a"}, {zINC,".bc"}, + {zINC,".b"}, {zDEC,".b"}, {zLD,".b,B"}, {zROLCA,nullptr}, + {zXCH,".af,.af'"}, {zADD,".hl,.bc"}, {zLD,".a,[.bc]"}, {zDEC,".bc"}, + {zINC,".c"}, {zDEC,".c"}, {zLD,".c,B"}, {zRORCA,nullptr}, + // 10 - 1F + {zDBNZ,"O"}, {zLD,".de,N"}, {zLD,"[.de],.a"}, {zINC,".de"}, + {zINC,".d"}, {zDEC,".d"}, {zLD,".d,B"}, {zROLA,nullptr}, + {zSHORT,"br O"}, {zADD,".hl,.de"}, {zLD,".a,[.de]"}, {zDEC,".de"}, + {zINC,".e"}, {zDEC,".e"}, {zLD,".e,B"}, {zRORA,nullptr}, + // 20 - 2F + {zSHORT,"bnz O"}, {zLD,".hl,N"}, {zLD,"(W),.hl"}, {zINC,".hl"}, + {zINC,".h"}, {zDEC,".h"}, {zLD,".h,B"}, {zADJ,".a"}, + {zSHORT,"bz O"}, {zADD,".hl,.hl"}, {zLD,".hl,(W)"}, {zDEC,".hl"}, + {zINC,".l"}, {zDEC,".l"}, {zLD,".l,B"}, {zNOT,".a"}, + // 30 - 3F + {zSHORT,"bnc O"}, {zLD,".sp,N"}, {zLD,"(W),.a"}, {zINC,".sp"}, + {zINC,"[.hl]"}, {zDEC,"[.hl]"}, {zLD,"[.hl],B"}, {zSETC,nullptr}, + {zSHORT,"bc O"}, {zADD,".hl,.sp"}, {zLD,".a,(W)"}, {zDEC,".sp"}, + {zINC,".a"}, {zDEC,".a"}, {zLD,".a,B"}, {zNOTC,nullptr}, + // 40 - 4F + {zLD,".b,.b"}, {zLD,".b,.c"}, {zLD,".b,.d"}, {zLD,".b,.e"}, + {zLD,".b,.h"}, {zLD,".b,.l"}, {zLD,".b,[.hl]"}, {zLD,".b,.a"}, + {zLD,".c,.b"}, {zLD,".c,.c"}, {zLD,".c,.d"}, {zLD,".c,.e"}, + {zLD,".c,.h"}, {zLD,".c,.l"}, {zLD,".c,[.hl]"}, {zLD,".c,.a"}, + // 50 - 5F + {zLD,".d,.b"}, {zLD,".d,.c"}, {zLD,".d,.d"}, {zLD,".d,.e"}, + {zLD,".d,.h"}, {zLD,".d,.l"}, {zLD,".d,[.hl]"}, {zLD,".d,.a"}, + {zLD,".e,.b"}, {zLD,".e,.c"}, {zLD,".e,.d"}, {zLD,".e,.e"}, + {zLD,".e,.h"}, {zLD,".e,.l"}, {zLD,".e,[.hl]"}, {zLD,".e,.a"}, + // 60 - 6F + {zLD,".h,.b"}, {zLD,".h,.c"}, {zLD,".h,.d"}, {zLD,".h,.e"}, + {zLD,".h,.h"}, {zLD,".h,.l"}, {zLD,".h,[.hl]"}, {zLD,".h,.a"}, + {zLD,".l,.b"}, {zLD,".l,.c"}, {zLD,".l,.d"}, {zLD,".l,.e"}, + {zLD,".l,.h"}, {zLD,".l,.l"}, {zLD,".l,[.hl]"}, {zLD,".l,.a"}, + // 70 - 7F + {zLD,"[.hl],.b"}, {zLD,"[.hl],.c"}, {zLD,"[.hl],.d"}, {zLD,"[.hl],.e"}, + {zLD,"[.hl],.h"}, {zLD,"[.hl],.l"}, {zHALT,nullptr}, {zLD,"[.hl],.a"}, + {zLD,".a,.b"}, {zLD,".a,.c"}, {zLD,".a,.d"}, {zLD,".a,.e"}, + {zLD,".a,.h"}, {zLD,".a,.l"}, {zLD,".a,[.hl]"}, {zLD,".a,.a"}, + // 80 - BF + {zADD,".a,.b"}, {zADD,".a,.c"}, {zADD,".a,.d"}, {zADD,".a,.e"}, + {zADD,".a,.h"}, {zADD,".a,.l"}, {zADD,".a,[.hl]"}, {zADD,".a,.a"}, + {zADDC,".a,.b"}, {zADDC,".a,.c"}, {zADDC,".a,.d"}, {zADDC,".a,.e"}, + {zADDC,".a,.h"}, {zADDC,".a,.l"}, {zADDC,".a,[.hl]"}, {zADDC,".a,.a"}, + // 90 - 9F + {zSUB,".a,.b"}, {zSUB,".a,.c"}, {zSUB,".a,.d"}, {zSUB,".a,.e"}, + {zSUB,".a,.h"}, {zSUB,".a,.l"}, {zSUB,".a,[.hl]"}, {zSUB,".a,.a"}, + {zSUBC,".a,.b"}, {zSUBC,".a,.c"}, {zSUBC,".a,.d"}, {zSUBC,".a,.e"}, + {zSUBC,".a,.h"}, {zSUBC,".a,.l"}, {zSUBC,".a,[.hl]"}, {zSUBC,".a,.a"}, + // A0 - AF + {zAND,".a,.b"}, {zAND,".a,.c"}, {zAND,".a,.d"}, {zAND,".a,.e"}, + {zAND,".a,.h"}, {zAND,".a,.l"}, {zAND,".a,[.hl]"}, {zAND,".a,.a"}, + {zXOR,".a,.b"}, {zXOR,".a,.c"}, {zXOR,".a,.d"}, {zXOR,".a,.e"}, + {zXOR,".a,.h"}, {zXOR,".a,.l"}, {zXOR,".a,[.hl]"}, {zXOR,".a,.a"}, + // B0 - BF + {zOR,".a,.b"}, {zOR,".a,.c"}, {zOR,".a,.d"}, {zOR,".a,.e"}, + {zOR,".a,.h"}, {zOR,".a,.l"}, {zOR,".a,[.hl]"}, {zOR,".a,.a"}, + {zCMP,".a,.b"}, {zCMP,".a,.c"}, {zCMP,".d"}, {zCMP,".a,.e"}, + {zCMP,".a,.h"}, {zCMP,".a,.l"}, {zCMP,".a,[.hl]"}, {zCMP,".a,.a"}, + // C0 - CF + {zRET,"nz"}, {zPOP,".bc"}, {zBNZ,"A"}, {zBP,"A"}, + {zCALL,"nz,A"}, {zPUSH,".bc"}, {zADD,".a,B"}, {zBRK,"V"}, + {zRET,"z"}, {zRET,nullptr}, {zBZ,"A"}, {zDB,"cb"}, + {zCALL,"z,A"}, {zCALL,"A"}, {zADDC,".a,B"}, {zBRK,"V"}, + // D0 - DF + {zRET,"nc"}, {zPOP,".de"}, {zBNC,"A"}, {zOUT,"[P],[.a]"}, + {zCALL,"nc,A"}, {zPUSH,".de"}, {zSUB,".a,B"}, {zBRK,"V"}, + {zRET,"c"}, {zXCHX,nullptr}, {zBC,"A"}, {zIN,".a,[P]"}, + {zCALL,"c,A"}, {zDB,"dd"}, {zSUBC,".a,B"}, {zBRK,"V"}, + // E0 - EF + {zRET,"po"}, {zPOP,".hl"}, {zBPO,"A"}, {zXCH,"[.sp],.hl"}, + {zCALL,"po,A"}, {zPUSH,".hl"}, {zAND,".a,B"}, {zBRK,"V"}, + {zRET,"pe"}, {zBR,"[.hl]"}, {zBPE,"A"}, {zXCH,".de,.hl"}, + {zCALL,"pe,A"}, {zDB,"ed"}, {zXOR,".a,B"}, {zBRK,"V"}, + // F0 - FF + {zRET,"p"}, {zPOP,".af"}, {zBP,"A"}, {zDI,nullptr}, + {zCALL,"p,A"}, {zPUSH,".af"}, {zOR,".a,B"}, {zBRK,"V"}, + {zRET,"m"}, {zLD,".sp,.hl"}, {zBM,"A"}, {zEI,nullptr}, + {zCALL,"m,A"}, {zDB,"fd"}, {zCMP,".a,B"}, {zBRK,"V"} +}; + +char r800_disassembler::sign(s8 offset) +{ + return (offset < 0)? '-':'+'; +} + +u32 r800_disassembler::offs(s8 offset) +{ + if (offset < 0) + return -offset; + return offset; +} + +r800_disassembler::r800_disassembler() +{ +} + +u32 r800_disassembler::opcode_alignment() const +{ + return 1; +} + +offs_t r800_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + s8 offset = 0; + + offs_t pos = pc; + std::string ixy = "oops!!"; + + const r800dasm *d = nullptr; + u8 op = opcodes.r8(pos++); + switch (op) + { + case 0xcb: + op = opcodes.r8(pos++); + d = &mnemonic_cb[op]; + break; + case 0xed: + d = &mnemonic_ed[opcodes.r8(pos++)]; + if (d->mnemonic == zDB) + pos--; + break; + case 0xdd: + case 0xfd: + { + ixy = (op == 0xdd) ? "ix" : "iy"; + u8 op1 = opcodes.r8(pos++); + if (op1 == 0xcb) + { + offset = params.r8(pos++); + op1 = params.r8(pos++); + d = &mnemonic_xx_cb[op1]; + } + else + { + d = &mnemonic_xx[op1]; + if (d->mnemonic == zDB) + pos--; + } + break; + } + default: + d = &mnemonic_main[op]; + break; + } + + uint32_t flags = s_flags[d->mnemonic]; + if (d->arguments) + { + util::stream_format(stream, "%-5s ", s_mnemonic[d->mnemonic]); + const char *src = d->arguments; + while (*src) + { + switch (*src) + { + case '?': // illegal opcode + util::stream_format(stream, "$%02x", op); + break; + case 'A': + util::stream_format(stream, "$%04X", params.r16(pos)); + pos += 2; + if (src != d->arguments) + flags |= STEP_COND; + break; + case 'B': // Byte op arg + util::stream_format(stream, "$%02X", params.r8(pos++)); + break; + case 'N': // Immediate 16 bit + util::stream_format(stream, "$%04X", params.r16(pos)); + pos += 2; + break; + case 'O': // Offset relative to PC + util::stream_format(stream, "$%04X", (pc + s8(params.r8(pos++)) + 2) & 0xffff); + if (src != d->arguments) + flags |= STEP_COND; + break; + case 'P': // Port number + util::stream_format(stream, "$%02X", params.r8(pos++)); + break; + case 'V': // Break vector + util::stream_format(stream, "$%02X", op & 0x38); + break; + case 'W': // Memory address word + util::stream_format(stream, "$%04X", params.r16(pos)); + pos += 2; + break; + case 'X': + offset = params.r8(pos++); + [[fallthrough]]; + case 'Y': + util::stream_format(stream,"[.%s%c$%02x]", ixy, sign(offset), offs(offset)); + break; + case 'I': + util::stream_format(stream, "%s", ixy); + break; + default: + stream << *src; + } + src++; + } + if (d->mnemonic == zRET) + flags |= STEP_COND; + } + else + { + util::stream_format(stream, "%s", s_mnemonic[d->mnemonic]); + } + + return (pos - pc) | flags | SUPPORTED; +} diff -Nru mame-0.263+dfsg.1/src/devices/cpu/z80/r800dasm.h mame-0.264+dfsg.1/src/devices/cpu/z80/r800dasm.h --- mame-0.263+dfsg.1/src/devices/cpu/z80/r800dasm.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/cpu/z80/r800dasm.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,39 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/***************************************************************************** + * + * r800dasm.h + * Disassembler for ASCII R800 based on portable Z80 disassembler. + * + *****************************************************************************/ + +#ifndef MAME_CPU_Z80_R800DASM_H +#define MAME_CPU_Z80_R800DASM_H + +#pragma once + +class r800_disassembler : public util::disasm_interface +{ +public: + r800_disassembler(); + virtual ~r800_disassembler() = default; + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +protected: + enum e_mnemonics : unsigned; + struct r800dasm; + + static const u32 s_flags[]; + static const r800dasm mnemonic_xx_cb[256]; + static const r800dasm mnemonic_cb[256]; + static const r800dasm mnemonic_ed[256]; + static const r800dasm mnemonic_xx[256]; + static const r800dasm mnemonic_main[256]; + + static inline char sign(s8 offset); + static inline u32 offs(s8 offset); +}; + +#endif diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/cassette.cpp mame-0.264+dfsg.1/src/devices/imagedev/cassette.cpp --- mame-0.263+dfsg.1/src/devices/imagedev/cassette.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/cassette.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -17,6 +17,8 @@ #include "util/ioprocs.h" #include "util/ioprocsfilter.h" +#include + #define LOG_WARN (1U << 1) // Warnings #define LOG_DETAIL (1U << 2) // Details @@ -258,6 +260,16 @@ return std::make_pair(internal_load(false), std::string()); } +bool cassette_image_device::has_any_extension(std::string_view candidate_extensions) const +{ + const char separator = ','; + std::istringstream extension_stream(std::string{candidate_extensions}); + for (std::string extension; std::getline(extension_stream, extension, separator);) + if (is_filetype(extension)) + return true; + return false; +} + std::error_condition cassette_image_device::internal_load(bool is_create) { cassette_image::error err; @@ -270,10 +282,9 @@ auto io = util::random_read_write_fill(image_core_file(), 0x00); if (io) { - // creating an image err = cassette_image::create( std::move(io), - &cassette_image::wavfile_format, + has_any_extension(cassette_image::flacfile_format.extensions) ? &cassette_image::flacfile_format : &cassette_image::wavfile_format, m_create_opts, cassette_image::FLAG_READWRITE|cassette_image::FLAG_SAVEONEXIT, m_cassette); diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/cassette.h mame-0.264+dfsg.1/src/devices/imagedev/cassette.h --- mame-0.263+dfsg.1/src/devices/imagedev/cassette.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/cassette.h 2024-03-25 14:00:46.000000000 +0000 @@ -131,6 +131,7 @@ const char * m_interface; std::error_condition internal_load(bool is_create); + bool has_any_extension(std::string_view candidate_extensions) const; bool m_stereo; std::vector m_samples; }; diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/midiin.cpp mame-0.264+dfsg.1/src/devices/imagedev/midiin.cpp --- mame-0.263+dfsg.1/src/devices/imagedev/midiin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/midiin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,8 +10,10 @@ #include "emu.h" #include "midiin.h" + #include "osdepend.h" + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ @@ -183,11 +185,9 @@ } else { - m_midi = machine().osd().create_midi_device(); - - if (!m_midi->open_input(filename())) + m_midi = machine().osd().create_midi_input(filename()); + if (!m_midi) { - m_midi.reset(); return std::make_pair(image_error::UNSPECIFIED, std::string()); } @@ -202,11 +202,7 @@ void midiin_device::call_unload() { - if (m_midi) - { - m_midi->close(); - } - else + if (!m_midi) { // send "all notes off" CC if unloading a MIDI file for (u8 channel = 0; channel < 0x10; channel++) @@ -346,8 +342,8 @@ check_bounds(1); u8 result = 0; - std::size_t actual = 0; - if (m_stream.read_at(m_offset, &result, 1, actual) || actual != 1) + auto const [err, actual] = read_at(m_stream, m_offset, &result, 1); + if (err || actual != 1) throw error("Error reading data"); m_offset++; return result; @@ -363,8 +359,8 @@ check_bounds(2); u16 result = 0; - std::size_t actual = 0; - if (m_stream.read_at(m_offset, &result, 2, actual) || actual != 2) + auto const [err, actual] = read_at(m_stream, m_offset, &result, 2); + if (err || actual != 2) throw error("Error reading data"); m_offset += 2; return big_endianize_int16(result); @@ -380,8 +376,8 @@ check_bounds(3); u32 result = 0; - std::size_t actual = 0; - if (m_stream.read_at(m_offset, &result, 3, actual) || actual != 3) + auto const [err, actual] = read_at(m_stream, m_offset, &result, 3); + if (err || actual != 3) throw error("Error reading data"); m_offset += 3; return big_endianize_int32(result) >> 8; @@ -397,8 +393,8 @@ check_bounds(4); u32 result = 0; - std::size_t actual = 0; - if (m_stream.read_at(m_offset, &result, 4, actual) || actual != 4) + auto const [err, actual] = read_at(m_stream, m_offset, &result, 4); + if (err || actual != 4) throw error("Error reading data"); m_offset += 4; return big_endianize_int32(result); @@ -414,8 +410,8 @@ check_bounds(4); u32 result = 0; - std::size_t actual = 0; - if (m_stream.read_at(m_offset, &result, 4, actual) || actual != 4) + auto const [err, actual] = read_at(m_stream, m_offset, &result, 4); + if (err || actual != 4) throw error("Error reading data"); m_offset += 4; return little_endianize_int32(result); diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/midiin.h mame-0.264+dfsg.1/src/devices/imagedev/midiin.h --- mame-0.263+dfsg.1/src/devices/imagedev/midiin.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/midiin.h 2024-03-25 14:00:46.000000000 +0000 @@ -15,6 +15,8 @@ #include "diserial.h" +#include "interface/midiport.h" + #include #include #include @@ -67,7 +69,7 @@ void xmit_char(uint8_t data); - std::unique_ptr m_midi; + std::unique_ptr m_midi; required_ioport m_config; emu_timer *m_timer; devcb_write_line m_input_cb; diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/midiout.cpp mame-0.264+dfsg.1/src/devices/imagedev/midiout.cpp --- mame-0.263+dfsg.1/src/devices/imagedev/midiout.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/midiout.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,8 +10,10 @@ #include "emu.h" #include "midiout.h" + #include "osdepend.h" + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ @@ -57,11 +59,9 @@ std::pair midiout_device::call_load() { - m_midi = machine().osd().create_midi_device(); - - if (!m_midi->open_output(filename())) + m_midi = machine().osd().create_midi_output(filename()); + if (!m_midi) { - m_midi.reset(); return std::make_pair(image_error::UNSPECIFIED, std::string()); } @@ -74,11 +74,7 @@ void midiout_device::call_unload() { - if (m_midi) - { - m_midi->close(); - m_midi.reset(); - } + m_midi.reset(); } void midiout_device::rcv_complete() // Rx completed receiving byte diff -Nru mame-0.263+dfsg.1/src/devices/imagedev/midiout.h mame-0.264+dfsg.1/src/devices/imagedev/midiout.h --- mame-0.263+dfsg.1/src/devices/imagedev/midiout.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/imagedev/midiout.h 2024-03-25 14:00:46.000000000 +0000 @@ -15,6 +15,8 @@ #include "diserial.h" +#include "interface/midiport.h" + #include #include #include @@ -59,7 +61,7 @@ virtual void rcv_complete() override; // Rx completed receiving byte private: - std::unique_ptr m_midi; + std::unique_ptr m_midi; }; // device type definition diff -Nru mame-0.263+dfsg.1/src/devices/machine/1801vp128.cpp mame-0.264+dfsg.1/src/devices/machine/1801vp128.cpp --- mame-0.263+dfsg.1/src/devices/machine/1801vp128.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/1801vp128.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,785 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************** + + 1801VP1-128 gate array (MFM codec for floppy controllers) + + https://github.com/1801BM1/k1801/tree/master/128 + https://felixl.com/UKNC_FDD_1801vp1-128 + https://zx-pk.ru/threads/20406-emulyatsiya-1801vp1-128-v-plis.html + + To do: + - DRQ status in read and write modes is tracked separately (TR bit) + - missing MFM clock is added by MFM encoder for every 00 sequence + - deep internals of CRC, GDR bits; read/write mode switching + - optional external timer for PY device + +**********************************************************************/ + +#include "emu.h" +#include "1801vp128.h" + +#define LOG_WARN (1U << 1) // Show warnings +#define LOG_SHIFT (1U << 2) // Shows shift register contents +#define LOG_REGS (1U << 6) // Register I/O +#define LOG_STATE (1U << 11) // State machine +#define LOG_LIVE (1U << 12) // Live states + +//#define VERBOSE (LOG_GENERAL | LOG_REGS | LOG_STATE) +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) +#define LOGSHIFT(...) LOGMASKED(LOG_SHIFT, __VA_ARGS__) +#define LOGREGS(...) LOGMASKED(LOG_REGS, __VA_ARGS__) +#define LOGLIVE(...) LOGMASKED(LOG_LIVE, __VA_ARGS__) +#define LOGSTATE(...) LOGMASKED(LOG_STATE, __VA_ARGS__) + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(K1801VP128, k1801vp128_device, "1801vp1-128", "1801VP1-128") + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// k1801vp128_device - constructor +//------------------------------------------------- + +k1801vp128_device::k1801vp128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, K1801VP128, tag, owner, clock) + , m_connectors(*this, "%u", 0U) + , m_read_ds(*this, -1) +{ + memset(&cur_live, 0x00, sizeof(cur_live)); + cur_live.tm = attotime::never; + cur_live.state = IDLE; + cur_live.next_state = -1; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void k1801vp128_device::device_start() +{ + for (int i = 0; i != 4; i++) + { + flopi[i].tm = timer_alloc(FUNC(k1801vp128_device::update_floppy), this); + flopi[i].id = i; + if (m_connectors[i]) + { + flopi[i].dev = m_connectors[i]->get_device(); + if (flopi[i].dev != nullptr) + flopi[i].dev->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&k1801vp128_device::index_callback, this)); + } + else + flopi[i].dev = nullptr; + + flopi[i].main_state = IDLE; + flopi[i].sub_state = IDLE; + flopi[i].live = false; + } + + m_wbuf = m_rbuf = 0; + + // register for state saving + save_item(NAME(selected_drive)); + save_item(NAME(m_cr)); + save_item(NAME(m_sr)); + save_item(NAME(m_rbuf)); + save_item(NAME(m_wbuf)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void k1801vp128_device::device_reset() +{ + for (int i = 0; i < 4; i++) + { + flopi[i].main_state = IDLE; + flopi[i].sub_state = IDLE; + flopi[i].live = false; + } + live_abort(); + m_cr = m_sr = 0; + set_ds(-1); +} + +//------------------------------------------------- +// read - register read +//------------------------------------------------- + +uint16_t k1801vp128_device::read(offs_t offset) +{ + uint16_t data = 0; + + switch (offset & 1) + { + case 0: + data = m_sr; + if (selected_drive != -1) + { + floppy_info &fi = flopi[selected_drive]; + data = (fi.dev->trk00_r() ^ 1) | (fi.dev->ready_r() << 1) | (fi.dev->wpt_r() << 2) | (fi.dev->idx_r() << 15) | m_sr; + } + break; + + case 1: + data = m_rbuf; + if (!machine().side_effects_disabled()) + { + m_sr &= ~CSR_R_TR; + if (selected_drive != -1) + { + floppy_info &fi = flopi[selected_drive]; + if (fi.main_state == WRITE_DATA) + { + // semi-read mode + live_abort(); + fi.main_state = READ_DATA; + fi.sub_state = SCAN_ID; + read_data_continue(fi); + } + } + } + break; + } + + return data; +} + + +//------------------------------------------------- +// write - register write +//------------------------------------------------- + +void k1801vp128_device::write(offs_t offset, uint16_t data) +{ + LOGREGS("%s W %06o <- %06o\n", machine().describe_context(), 0177130 + (offset << 1), data); + + switch (offset & 1) + { + case 0: + set_ds((int16_t)m_read_ds(data & (CSR_W_DS | CSR_W_REZ))); + if (selected_drive != -1) + { + floppy_info &fi = flopi[selected_drive]; + fi.dev->mon_w(!BIT(data, 4)); + fi.dev->ss_w(BIT(data, 5)); + if (BIT(data, 7)) + { + LOG("COMMAND STEP %d %s\n", fi.id, BIT(data, 6) ? "+1" : "-1"); + execute_command(CMD_SEEK); + } + if (BIT(m_cr ^ data, 8) && !BIT(data, 8)) + { + LOG("COMMAND READ drive %d c:h %d:%d\n", selected_drive, fi.dev->get_cyl(), BIT(data, 5)); + m_sr &= ~CSR_R_TR; + execute_command(CMD_READ); + } + } + m_cr = data; + break; + + case 1: + m_wbuf = data; + m_sr &= ~CSR_R_TR; + if (selected_drive != -1) + { + floppy_info &fi = flopi[selected_drive]; + if (fi.main_state != WRITE_DATA) + { + LOG("COMMAND WRITE drive %d c:h %d:%d\n", selected_drive, fi.dev->get_cyl(), BIT(m_cr, 5)); + execute_command(CMD_WRITE); + } + } + break; + } +} + +void k1801vp128_device::execute_command(int command) +{ + live_abort(); + + switch (command) + { + case CMD_READ: + read_data_start(flopi[selected_drive]); + break; + + case CMD_WRITE: + write_data_start(flopi[selected_drive]); + break; + + case CMD_SEEK: + seek_start(flopi[selected_drive]); + break; + } +} + + +//------------------------------------------------- +// update_tick - pump the device life cycle +//------------------------------------------------- + +TIMER_CALLBACK_MEMBER(k1801vp128_device::update_floppy) +{ + live_sync(); + + floppy_info &fi = flopi[param]; + switch (fi.sub_state) + { + case SEEK_WAIT_STEP_SIGNAL_TIME: + fi.sub_state = SEEK_WAIT_STEP_SIGNAL_TIME_DONE; + break; + case SEEK_WAIT_STEP_TIME: + fi.sub_state = SEEK_WAIT_STEP_TIME_DONE; + break; + } + + general_continue(fi); +} + +void k1801vp128_device::live_start(floppy_info &fi, int state) +{ + cur_live.tm = machine().time(); + cur_live.state = state; + cur_live.next_state = -1; + cur_live.fi = &fi; + cur_live.shift_reg = 0; + cur_live.crc = 0xffff; + cur_live.crc_init = false; + cur_live.bit_counter = 0; + cur_live.data_separator_phase = false; + cur_live.data_reg = 0; + cur_live.data_bit_context = false; + cur_live.pll.reset(cur_live.tm); + cur_live.pll.set_clock(attotime::from_hz(500000)); + checkpoint_live = cur_live; + fi.live = true; + + live_run(); +} + +void k1801vp128_device::checkpoint() +{ + if (cur_live.fi) + cur_live.pll.commit(cur_live.fi->dev, cur_live.tm); + checkpoint_live = cur_live; +} + +void k1801vp128_device::rollback() +{ + cur_live = checkpoint_live; +} + +void k1801vp128_device::live_delay(int state) +{ + cur_live.next_state = state; + if (cur_live.tm != machine().time()) + cur_live.fi->tm->adjust(cur_live.tm - machine().time(), cur_live.fi->id); + else + live_sync(); +} + +void k1801vp128_device::live_sync() +{ + if (!cur_live.tm.is_never()) + { + if (cur_live.tm > machine().time()) + { + rollback(); + live_run(machine().time()); + cur_live.pll.commit(cur_live.fi->dev, cur_live.tm); + } + else + { + cur_live.pll.commit(cur_live.fi->dev, cur_live.tm); + if (cur_live.next_state != -1) + { + cur_live.state = cur_live.next_state; + cur_live.next_state = -1; + } + if (cur_live.state == IDLE) + { + cur_live.pll.stop_writing(cur_live.fi->dev, cur_live.tm); + cur_live.tm = attotime::never; + cur_live.fi->live = false; + cur_live.fi = nullptr; + } + } + cur_live.next_state = -1; + checkpoint(); + } +} + +void k1801vp128_device::live_abort() +{ + if (!cur_live.tm.is_never() && cur_live.tm > machine().time()) + { + rollback(); + live_run(machine().time()); + } + + if (cur_live.fi) + { + cur_live.pll.stop_writing(cur_live.fi->dev, cur_live.tm); + cur_live.fi->live = false; + cur_live.fi = nullptr; + } + + cur_live.tm = attotime::never; + cur_live.state = IDLE; + cur_live.next_state = -1; +} + +void k1801vp128_device::live_run(attotime limit) +{ + if (cur_live.state == IDLE || cur_live.next_state != -1) + return; + + if (limit == attotime::never) + { + if (cur_live.fi->dev) + limit = cur_live.fi->dev->time_next_index(); + if (limit == attotime::never) + { + // Happens when there's no disk or if the fdc is not + // connected to a drive, hence no index pulse. Force a + // sync from time to time in that case, so that the main + // cpu timeout isn't too painful. Avoids looping into + // infinity looking for data too. + + limit = machine().time() + attotime::from_msec(1); + cur_live.fi->tm->adjust(attotime::from_msec(1), cur_live.fi->id); + } + } + + for (;;) + { + switch (cur_live.state) + { + case SEARCH_ADDRESS_MARK_HEADER: + if (read_one_bit(limit)) + return; + + if (!(cur_live.bit_counter & 255)) + { + LOGSHIFT("%s (%s): shift = %04x data=%02x c=%d\n", cur_live.tm.to_string(), limit.to_string(), cur_live.shift_reg, + bitswap<8>(cur_live.shift_reg, 14, 12, 10, 8, 6, 4, 2, 0), cur_live.bit_counter); + } + + if (cur_live.shift_reg == 0x4489) + { + LOGLIVE("%s: Found A1\n", cur_live.tm.to_string()); + cur_live.crc = 0x443b; + cur_live.data_separator_phase = false; + cur_live.bit_counter = 0; + cur_live.state = READ_DATA_LOW; + cur_live.data_reg = 0xa1; + m_sr &= ~CSR_R_CRC; + checkpoint(); + } + break; + + case READ_DATA_HIGH: + if (read_one_bit(limit)) + return; + if (cur_live.bit_counter & 15) + break; + live_delay(READ_DATA_HIGH_BYTE); + return; + + case READ_DATA_HIGH_BYTE: + cur_live.state = READ_DATA_LOW; + checkpoint(); + break; + + case READ_DATA_LOW: + if (read_one_bit(limit)) + return; + if (cur_live.bit_counter & 15) + break; + live_delay(READ_DATA_LOW_BYTE); + return; + + case READ_DATA_LOW_BYTE: + m_rbuf = cur_live.data_reg; + if (cur_live.crc == 0) + { + m_sr |= CSR_R_CRC; + } + m_sr |= CSR_R_TR; + LOGLIVE("%s: Read %04x (CRC %04x)\n", cur_live.tm.to_string(), cur_live.data_reg, cur_live.crc); + cur_live.state = READ_DATA_HIGH; + checkpoint(); + break; + + case WRITE_MFM_DATA_LOW: + if ((m_wbuf & 255) == 0xa1 && cur_live.crc_init == false && !(m_sr & CSR_R_CRC)) + { + cur_live.crc_init = true; + cur_live.crc = 0xffff; + } + // if DRQ has not been serviced, write CRC + // if DRQ has not been serviced AND CRC has been written, write zeros + if (m_sr & CSR_R_TR) + { + if (cur_live.crc_init) + { + LOGLIVE("%s: Write CRC %04x\n", cur_live.tm.to_string(), cur_live.crc); + m_sr |= CSR_R_CRC; + m_sr &= ~CSR_R_TR; + cur_live.crc_init = false; + } + else + { + LOGLIVE("%s: Write after CRC\n", cur_live.tm.to_string()); + m_wbuf = 0; + } + } + live_write_mfm((m_sr & CSR_R_CRC) ? (cur_live.crc >> 8) : m_wbuf, BIT(m_cr, 9)); + cur_live.state++; + cur_live.bit_counter = 16; + checkpoint(); + break; + + case WRITE_MFM_DATA_HIGH: + live_write_mfm((m_sr & CSR_R_CRC) ? cur_live.crc : (m_wbuf >> 8), BIT(m_cr, 9)); + LOGLIVE("%s: Write next %s\n", cur_live.tm.to_string(), (m_sr & CSR_R_TR)?"TR":""); + if (!(m_sr & CSR_R_CRC)) + m_sr |= CSR_R_TR; + cur_live.state++; + cur_live.bit_counter = 16; + checkpoint(); + break; + + case WRITE_MFM_DATA_LOW_BYTE: + if (write_one_bit(limit)) + return; + if (cur_live.bit_counter == 0) + { + live_delay(WRITE_MFM_DATA_HIGH); + return; + } + break; + + case WRITE_MFM_DATA_HIGH_BYTE: + if (write_one_bit(limit)) + return; + if (cur_live.bit_counter == 0) + { + live_delay(WRITE_MFM_DATA_LOW); + m_sr &= ~CSR_R_CRC; + return; + } + break; + + default: + LOGWARN("%s: Unknown live state %d\n", cur_live.tm.to_string(), cur_live.state); + return; + } + } +} + + +void k1801vp128_device::seek_start(floppy_info &fi) +{ + fi.sub_state = SEEK_MOVE; + fi.dir = !BIT(m_cr, 6); + general_continue(fi); +} + + +void k1801vp128_device::read_data_start(floppy_info &fi) +{ + fi.main_state = READ_DATA; + fi.sub_state = WAIT_INDEX_DONE; + m_sr &= ~CSR_R_CRC; + read_data_continue(fi); +} + +void k1801vp128_device::read_data_continue(floppy_info &fi) +{ + for (;;) + { + switch (fi.sub_state) + { + case SEEK_MOVE: + LOGSTATE("sub %d SEEK_MOVE\n", fi.id); + fi.sub_state = SEEK_WAIT_STEP_SIGNAL_TIME; + fi.tm->adjust(attotime::from_msec(2), fi.id); + return; + + case SEEK_WAIT_STEP_SIGNAL_TIME: + LOGSTATE("sub %d SEEK_WAIT_STEP_SIGNAL_TIME\n", fi.id); + return; + + case SEEK_WAIT_STEP_SIGNAL_TIME_DONE: + LOGSTATE("sub %d SEEK_WAIT_STEP_SIGNAL_TIME_DONE\n", fi.id); + if (fi.dev) + { + fi.dev->dir_w(fi.dir); + fi.dev->stp_w(0); + fi.dev->stp_w(1); + fi.sub_state = WAIT_INDEX_DONE; + } + else + fi.main_state = fi.sub_state = IDLE; + break; + + case WAIT_INDEX: + LOGSTATE("sub %d WAIT_INDEX\n", fi.id); + return; + + case WAIT_INDEX_DONE: + LOGSTATE("sub %d WAIT_INDEX_DONE\n", fi.id); + fi.counter = 0; + fi.sub_state = SCAN_ID; + LOGSTATE("live %d SEARCH_ADDRESS_MARK_HEADER\n", fi.id); + live_start(fi, SEARCH_ADDRESS_MARK_HEADER); + return; + + case SCAN_ID: + LOGSTATE("sub %d SCAN_ID\n", fi.id); + fi.sub_state = TRACK_READ; + LOGSTATE("live %d READ_DATA_HIGH\n", fi.id); + live_start(fi, READ_DATA_HIGH); + return; + + case SCAN_ID_FAILED: + LOGSTATE("sub %d SCAN_ID_FAILED\n", fi.id); + fi.sub_state = COMMAND_DONE; + break; + + case TRACK_READ: + LOGSTATE("sub %d TRACK_READ\n", fi.id); + fi.sub_state = COMMAND_DONE; + break; + + case COMMAND_DONE: + LOGSTATE("sub %d COMMAND_DONE\n", fi.id); + fi.main_state = fi.sub_state = IDLE; + return; + + default: + LOGWARN("%s: read sector unknown sub-state %d\n", ttsn(), fi.sub_state); + return; + } + } +} + +void k1801vp128_device::write_data_start(floppy_info &fi) +{ + fi.main_state = WRITE_DATA; + fi.sub_state = WAIT_INDEX_DONE; + m_sr &= ~CSR_R_CRC; + write_data_continue(fi); +} + +void k1801vp128_device::write_data_continue(floppy_info &fi) +{ + for (;;) + { + switch (fi.sub_state) + { + case WAIT_INDEX: + LOGSTATE("sub %d WAIT_INDEX\n", fi.id); + return; + + case WAIT_INDEX_DONE: + LOGSTATE("sub %d WAIT_INDEX_DONE\n", fi.id); + fi.sub_state = TRACK_WRITTEN; + LOGSTATE("live %d WRITE_MFM_DATA_LOW\n", fi.id); + live_start(fi, WRITE_MFM_DATA_LOW); + return; + + case TRACK_WRITTEN: + LOGSTATE("sub %d TRACK_WRITTEN\n", fi.id); + fi.sub_state = COMMAND_DONE; + break; + + case COMMAND_DONE: + LOGSTATE("sub %d COMMAND_DONE\n", fi.id); + fi.main_state = fi.sub_state = IDLE; + return; + + default: + LOGWARN("%s: write sector unknown sub-state %d\n", ttsn(), fi.sub_state); + return; + } + } +} + + +void k1801vp128_device::index_callback(floppy_image_device *floppy, int state) +{ + LOGLIVE("%s: Pulse %d\n", machine().time().to_string(), state); + for (floppy_info &fi : flopi) + { + if (fi.dev != floppy) + continue; + + if (!state) + { + general_continue(fi); + continue; + } + + switch (fi.sub_state) + { + case IDLE: + case SEEK_MOVE: + case SEEK_WAIT_STEP_SIGNAL_TIME: + case SEEK_WAIT_STEP_SIGNAL_TIME_DONE: + case SEEK_WAIT_STEP_TIME: + case SEEK_WAIT_STEP_TIME_DONE: + case HEAD_LOAD: + case HEAD_LOAD_DONE: + case SCAN_ID: + case SCAN_ID_FAILED: + break; + + case TRACK_READ: + fi.sub_state = IDLE; + break; + + case WAIT_INDEX: + fi.sub_state = WAIT_INDEX_DONE; + live_abort(); + break; + + default: + LOGWARN("%s: Index pulse on unknown sub-state %d\n", ttsn(), fi.sub_state); + break; + } + + general_continue(fi); + } +} + + +void k1801vp128_device::general_continue(floppy_info &fi) +{ + if (fi.live && cur_live.state != IDLE) + { + live_run(); + if (cur_live.state != IDLE) + return; + } + + switch (fi.main_state) + { + case IDLE: + break; + + case READ_DATA: + read_data_continue(fi); + break; + + case WRITE_DATA: + write_data_continue(fi); + break; + + default: + LOGWARN("%s: general_continue on unknown main-state %d\n", ttsn(), fi.main_state); + break; + } +} + + +bool k1801vp128_device::read_one_bit(const attotime &limit) +{ + int bit = cur_live.pll.get_next_bit(cur_live.tm, cur_live.fi->dev, limit); + if (bit < 0) + return true; + cur_live.shift_reg = (cur_live.shift_reg << 1) | bit; + cur_live.bit_counter++; + if (cur_live.data_separator_phase) + { + cur_live.data_reg = (cur_live.data_reg << 1) | bit; + if ((cur_live.crc ^ (bit ? 0x8000 : 0x0000)) & 0x8000) + cur_live.crc = (cur_live.crc << 1) ^ 0x1021; + else + cur_live.crc = cur_live.crc << 1; + } + cur_live.data_separator_phase = !cur_live.data_separator_phase; + return false; +} + +bool k1801vp128_device::write_one_bit(const attotime &limit) +{ + bool bit = cur_live.shift_reg & 0x8000; + if (cur_live.pll.write_next_bit(bit, cur_live.tm, cur_live.fi->dev, limit)) + return true; + if ((cur_live.bit_counter & 1) && cur_live.crc_init) + { + if ((cur_live.crc ^ (bit ? 0x8000 : 0x0000)) & 0x8000) + cur_live.crc = (cur_live.crc << 1) ^ 0x1021; + else + cur_live.crc = cur_live.crc << 1; + } + cur_live.shift_reg = cur_live.shift_reg << 1; + cur_live.bit_counter--; + return false; +} + +void k1801vp128_device::live_write_mfm(uint8_t mfm, bool marker) +{ + bool context = cur_live.data_bit_context; + uint16_t raw = 0; + for (int i = 0; i < 8; i++) + { + bool bit = mfm & (0x80 >> i); + if (!(bit || context)) + raw |= 0x8000 >> (2*i); + if (bit) + raw |= 0x4000 >> (2*i); + context = bit; + } + if (marker && (mfm & 0xc) == 0) raw &= 0xffdf; // A1 and C2 sync sequences + cur_live.data_reg = mfm; + cur_live.shift_reg = raw; + cur_live.data_bit_context = context; + LOGLIVE("%s: write %02x %04x %04x\n", cur_live.tm.to_string(), mfm, cur_live.crc, raw); +} + + +void k1801vp128_device::set_ds(int fid) +{ + if (selected_drive == fid) + return; + + live_abort(); + + // pass drive select to connected drives + for (floppy_info &fi : flopi) + if (fi.dev) + fi.dev->ds_w(fid); + + // record selected drive + selected_drive = fid; + + if (fid != -1) + { + LOG("COMMAND ~READ drive %d c:h %d:%d\n", selected_drive, flopi[fid].dev->get_cyl(), BIT(m_cr, 5)); + m_sr &= ~CSR_R_TR; + execute_command(CMD_READ); + } +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/1801vp128.h mame-0.264+dfsg.1/src/devices/machine/1801vp128.h --- mame-0.263+dfsg.1/src/devices/machine/1801vp128.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/1801vp128.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,209 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************** + + 1801VP1-128 gate array (MFM codec for floppy controllers) + +********************************************************************** + _____ _____ + _AD0 1 |* \_/ | 42 +5V + _AD1 2 | | 41 _DS0 + _AD2 3 | | 30 _DS1 + _AD3 4 | | 39 _DS2 + _AD4 5 | | 38 _DS3 + _AD5 6 | | 37 _MSW + _AD6 7 | | 36 HS + _AD7 8 | | 35 DIR + _AD8 9 | | 34 _ST + _AD9 10 | | 33 TR0 + _AD10 11 | 1801VP1-128 | 32 RDY + _AD11 12 | | 31 WPR + _AD12 13 | | 30 _REZ + _AD13 14 | | 29 DI + _AD14 15 | | 28 _WRE + _AD15 16 | | 27 _D01 + _SYNC 17 | | 26 _D02 + _DIN 18 | | 25 _D03 + _DOUT 19 | | 24 IND + _INIT 20 | | 23 _RPLY + GND 21 |_____________| 22 CLC + +**********************************************************************/ + +#ifndef MAME_MACHINE_1801VP128_H +#define MAME_MACHINE_1801VP128_H + +#pragma once + +#include "imagedev/floppy.h" +#include "machine/pdp11.h" + +#include "fdc_pll.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> k1801vp128_device + +class k1801vp128_device : public device_t +{ +public: + // construction/destruction + k1801vp128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + auto ds_in_callback() { return m_read_ds.bind(); } + + uint16_t read(offs_t offset); + void write(offs_t offset, uint16_t data); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + TIMER_CALLBACK_MEMBER(update_floppy); + +private: + enum { + CMD_READ, + CMD_WRITE, + CMD_SEEK + }; + + enum { + IDLE, + + // Main states + READ_DATA, + WRITE_DATA, + + // Sub-states + COMMAND_DONE, + + SEEK_MOVE, + SEEK_WAIT_STEP_SIGNAL_TIME, + SEEK_WAIT_STEP_SIGNAL_TIME_DONE, + SEEK_WAIT_STEP_TIME, + SEEK_WAIT_STEP_TIME_DONE, + SEEK_WAIT_DONE, + SEEK_DONE, + + HEAD_LOAD, + HEAD_LOAD_DONE, + + WAIT_INDEX, + WAIT_INDEX_DONE, + + SCAN_ID, + SCAN_ID_FAILED, + + TRACK_READ, + TRACK_WRITTEN, + + // Live states + SEARCH_ADDRESS_MARK_HEADER, + READ_DATA_HIGH, + READ_DATA_HIGH_BYTE, + READ_DATA_LOW, + READ_DATA_LOW_BYTE, + + WRITE_MFM_DATA_HIGH, + WRITE_MFM_DATA_HIGH_BYTE, + WRITE_MFM_DATA_LOW, + WRITE_MFM_DATA_LOW_BYTE, + }; + + enum { + CSR_R_TR0 = 0000001, + CSR_R_RDY = 0000002, + CSR_R_WPR = 0000004, + CSR_R_TR = CSR_DONE, + CSR_R_CRC = 0040000, + CSR_R_IND = 0100000, + + CSR_W_DS0 = 0000001, + CSR_W_DS1 = 0000002, + CSR_W_DS2 = 0000004, + CSR_W_DS3 = 0000010, + CSR_W_MSW = 0000020, // motor + CSR_W_HS = 0000040, // head select + CSR_W_DIR = 0000100, // step direction + CSR_W_ST = 0000200, // step pulse + CSR_W_GDR = 0000400, + CSR_W_WM = 0001000, + CSR_W_REZ = 0002000, + CSR_W_DS = 0000017, + }; + + struct floppy_info + { + emu_timer *tm; + floppy_image_device *dev; + int id; + int main_state, sub_state; + int dir, counter; + bool live, index; + }; + + struct live_info + { + attotime tm; + int state, next_state; + floppy_info *fi; + uint16_t shift_reg, crc; + int bit_counter; + bool data_separator_phase, data_bit_context, crc_init; + uint16_t data_reg; + fdc_pll_t pll; + }; + + required_device_array m_connectors; + devcb_read16 m_read_ds; + + std::string ttsn() const; + + floppy_info flopi[4]; + int selected_drive; + + uint16_t m_cr; + uint16_t m_sr; + uint16_t m_rbuf; + uint16_t m_wbuf; + + live_info cur_live, checkpoint_live; + + void execute_command(int command); + void set_ds(int fid); + + void seek_start(floppy_info &fi); + void seek_continue(floppy_info &fi); + + void read_data_start(floppy_info &fi); + void read_data_continue(floppy_info &fi); + + void write_data_start(floppy_info &fi); + void write_data_continue(floppy_info &fi); + + void general_continue(floppy_info &fi); + void index_callback(floppy_image_device *floppy, int state); + + void live_start(floppy_info &fi, int live_state); + void live_abort(); + void checkpoint(); + void rollback(); + void live_delay(int state); + void live_sync(); + void live_run(attotime limit = attotime::never); + void live_write_mfm(uint8_t mfm, bool marker); + + bool read_one_bit(const attotime &limit); + bool write_one_bit(const attotime &limit); +}; + + +// device type definition +DECLARE_DEVICE_TYPE(K1801VP128, k1801vp128_device) + +#endif // MAME_MACHINE_1801VP128_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/28fxxx.cpp mame-0.264+dfsg.1/src/devices/machine/28fxxx.cpp --- mame-0.263+dfsg.1/src/devices/machine/28fxxx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/28fxxx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -105,14 +105,14 @@ bool base_28fxxx_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_data.get(), m_size, actual) && actual == m_size; + auto const [err, actual] = util::read(file, m_data.get(), m_size); + return !err && (actual == m_size); } bool base_28fxxx_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_data.get(), m_size, actual) && actual == m_size; + auto const [err, actual] = util::write(file, m_data.get(), m_size); + return !err; } void base_28fxxx_device::erase() diff -Nru mame-0.263+dfsg.1/src/devices/machine/at28c16.cpp mame-0.264+dfsg.1/src/devices/machine/at28c16.cpp --- mame-0.263+dfsg.1/src/devices/machine/at28c16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/at28c16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -107,18 +107,16 @@ // .nv file //------------------------------------------------- -bool at28c16_device::nvram_read( util::read_stream &file ) +bool at28c16_device::nvram_read(util::read_stream &file) { - std::vector buffer( AT28C16_TOTAL_BYTES ); - size_t actual; + std::vector buffer(AT28C16_TOTAL_BYTES); - if (file.read( &buffer[0], AT28C16_TOTAL_BYTES, actual ) || actual != AT28C16_TOTAL_BYTES) + auto const [err, actual] = util::read(file, &buffer[0], AT28C16_TOTAL_BYTES); + if (err || (actual != AT28C16_TOTAL_BYTES)) return false; - for( offs_t offs = 0; offs < AT28C16_TOTAL_BYTES; offs++ ) - { - space(AS_PROGRAM).write_byte( offs, buffer[ offs ] ); - } + for (offs_t offs = 0; offs < AT28C16_TOTAL_BYTES; offs++) + space(AS_PROGRAM).write_byte(offs, buffer[offs]); return true; } @@ -130,15 +128,13 @@ bool at28c16_device::nvram_write( util::write_stream &file ) { - std::vector buffer ( AT28C16_TOTAL_BYTES ); - size_t actual; + std::vector buffer(AT28C16_TOTAL_BYTES); - for( offs_t offs = 0; offs < AT28C16_TOTAL_BYTES; offs++ ) - { - buffer[ offs ] = space(AS_PROGRAM).read_byte( offs ); - } + for (offs_t offs = 0; offs < AT28C16_TOTAL_BYTES; offs++) + buffer[offs] = space(AS_PROGRAM).read_byte(offs); - return !file.write( &buffer[0], AT28C16_TOTAL_BYTES, actual ) && actual == AT28C16_TOTAL_BYTES; + auto const [err, actual] = util::write(file, &buffer[0], AT28C16_TOTAL_BYTES); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/at28c64b.cpp mame-0.264+dfsg.1/src/devices/machine/at28c64b.cpp --- mame-0.263+dfsg.1/src/devices/machine/at28c64b.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/at28c64b.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,16 +89,14 @@ void at28c64b_device::nvram_default() { - uint16_t default_value = 0xff; - for( offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++ ) - { - space(AS_PROGRAM).write_byte( offs, default_value ); - } + uint16_t const default_value = 0xff; + for (offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++) + space(AS_PROGRAM).write_byte(offs, default_value); /* populate from a memory region if present */ if (m_default_data.found()) { - for( offs_t offs = 0; offs < AT28C64B_DATA_BYTES; offs++ ) + for (offs_t offs = 0; offs < AT28C64B_DATA_BYTES; offs++) space(AS_PROGRAM).write_byte(offs, m_default_data[offs]); } } @@ -109,18 +107,16 @@ // .nv file //------------------------------------------------- -bool at28c64b_device::nvram_read( util::read_stream &file ) +bool at28c64b_device::nvram_read(util::read_stream &file) { - std::vector buffer( AT28C64B_TOTAL_BYTES ); - size_t actual; + std::vector buffer(AT28C64B_TOTAL_BYTES); - if (file.read( &buffer[0], AT28C64B_TOTAL_BYTES, actual ) || actual != AT28C64B_TOTAL_BYTES) + auto const [err, actual] = util::read(file, &buffer[0], AT28C64B_TOTAL_BYTES); + if (err || (actual != AT28C64B_TOTAL_BYTES)) return false; - for( offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++ ) - { - space(AS_PROGRAM).write_byte( offs, buffer[ offs ] ); - } + for (offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++) + space(AS_PROGRAM).write_byte(offs, buffer[offs]); return true; } @@ -130,17 +126,15 @@ // .nv file //------------------------------------------------- -bool at28c64b_device::nvram_write( util::write_stream &file ) +bool at28c64b_device::nvram_write(util::write_stream &file) { - std::vector buffer ( AT28C64B_TOTAL_BYTES ); - size_t actual; + std::vector buffer(AT28C64B_TOTAL_BYTES); - for( offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++ ) - { - buffer[ offs ] = space(AS_PROGRAM).read_byte( offs ); - } + for (offs_t offs = 0; offs < AT28C64B_TOTAL_BYTES; offs++) + buffer[offs] = space(AS_PROGRAM).read_byte(offs); - return !file.write( &buffer[0], AT28C64B_TOTAL_BYTES, actual ) && actual == AT28C64B_TOTAL_BYTES; + auto const [err, actual] = util::write(file, &buffer[0], AT28C64B_TOTAL_BYTES); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/at29x.cpp mame-0.264+dfsg.1/src/devices/machine/at29x.cpp --- mame-0.263+dfsg.1/src/devices/machine/at29x.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/at29x.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,8 @@ bool at29x_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_eememory.get(), m_memory_size+2, actual) && actual == m_memory_size+2; + auto const [err, actual] = util::read(file, m_eememory.get(), m_memory_size+2); + return !err && (actual == m_memory_size+2); } //------------------------------------------------- @@ -126,8 +126,8 @@ LOGMASKED(LOG_PRG, "Write to NVRAM file\n"); m_eememory[0] = m_version; - size_t actual; - return !file.write(m_eememory.get(), m_memory_size+2, actual) && actual == m_memory_size+2; + auto const [err, actual] = util::write(file, m_eememory.get(), m_memory_size+2); + return !err; } /* diff -Nru mame-0.263+dfsg.1/src/devices/machine/at45dbxx.cpp mame-0.264+dfsg.1/src/devices/machine/at45dbxx.cpp --- mame-0.263+dfsg.1/src/devices/machine/at45dbxx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/at45dbxx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -162,8 +162,8 @@ bool at45db041_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_data[0], m_size, actual) && actual == m_size; + auto const [err, actual] = read(file, &m_data[0], m_size); + return !err && (actual == m_size); } //------------------------------------------------- @@ -173,8 +173,8 @@ bool at45db041_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_data[0], m_size, actual) && actual == m_size; + auto const [err, actual] = write(file, &m_data[0], m_size); + return !err; } uint8_t at45db041_device::read_byte() diff -Nru mame-0.263+dfsg.1/src/devices/machine/bq4847.cpp mame-0.264+dfsg.1/src/devices/machine/bq4847.cpp --- mame-0.263+dfsg.1/src/devices/machine/bq4847.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/bq4847.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -500,12 +500,12 @@ bool bq4847_device::nvram_read(util::read_stream& file) { - size_t actual; - return !file.read(m_register, std::size(m_register), actual) && actual == std::size(m_register); + auto const [err, actual] = util::read(file, m_register, std::size(m_register)); + return !err && (actual == std::size(m_register)); } bool bq4847_device::nvram_write(util::write_stream& file) { - size_t actual; - return !file.write(m_register, std::size(m_register), actual) && actual == std::size(m_register); + auto const [err, actual] = util::write(file, m_register, std::size(m_register)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/bq48x2.cpp mame-0.264+dfsg.1/src/devices/machine/bq48x2.cpp --- mame-0.263+dfsg.1/src/devices/machine/bq48x2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/bq48x2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -537,8 +537,8 @@ bool bq48x2_device::nvram_read(util::read_stream &file) { - size_t actual; - if (file.read(m_sram.get(), m_memsize, actual) || actual != m_memsize) + auto const [err, actual] = util::read(file, m_sram.get(), m_memsize); + if (err || (actual != m_memsize)) return false; transfer_to_access(); // Transfer the system time into the readable registers @@ -553,6 +553,6 @@ { transfer_to_access(); - size_t actual; - return !file.write(m_sram.get(), m_memsize, actual) && actual == m_memsize; + auto const [err, actual] = util::write(file, m_sram.get(), m_memsize); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/dp8573a.cpp mame-0.264+dfsg.1/src/devices/machine/dp8573a.cpp --- mame-0.263+dfsg.1/src/devices/machine/dp8573a.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/dp8573a.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -456,8 +456,8 @@ bool dp8573a_device::nvram_read(util::read_stream &file) { - size_t actual; - if (file.read(m_ram.get(), ram_size(), actual) || actual != ram_size()) + auto const [err, actual] = util::read(file, m_ram.get(), ram_size()); + if (err || (actual != ram_size())) return false; return true; @@ -465,8 +465,8 @@ bool dp8573a_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_ram.get(), ram_size(), actual) && actual == ram_size(); + auto const [err, actual] = util::write(file, m_ram.get(), ram_size()); + return !err; } void dp8572a_device::write(offs_t offset, uint8_t data) diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1204.cpp mame-0.264+dfsg.1/src/devices/machine/ds1204.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1204.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1204.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,6 +12,7 @@ #include #include +#include #define VERBOSE_LEVEL ( 0 ) @@ -21,7 +22,7 @@ if( VERBOSE_LEVEL >= n_level ) { va_list v; - char buf[ 32768 ]; + char buf[32768]; va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); @@ -94,22 +95,44 @@ bool ds1204_device::nvram_read( util::read_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.read( m_unique_pattern, sizeof( m_unique_pattern ), actual ) && actual == sizeof( m_unique_pattern ); - result = result && !file.read( m_identification, sizeof( m_identification ), actual ) && actual == sizeof( m_identification ); - result = result && !file.read( m_security_match, sizeof( m_security_match ), actual ) && actual == sizeof( m_security_match ); - result = result && !file.read( m_secure_memory, sizeof( m_secure_memory ), actual ) && actual == sizeof( m_secure_memory ); - return result; + + std::tie( err, actual ) = read( file, m_unique_pattern, sizeof( m_unique_pattern ) ); + if( err || ( sizeof( m_unique_pattern ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_identification, sizeof( m_identification ) ); + if( err || ( sizeof( m_identification ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_security_match, sizeof( m_security_match ) ); + if( err || ( sizeof( m_security_match ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_secure_memory, sizeof( m_secure_memory ) ); + if( err || ( sizeof( m_secure_memory ) != actual ) ) + return false; + + return true; } bool ds1204_device::nvram_write( util::write_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.write( m_unique_pattern, sizeof( m_unique_pattern ), actual ) && actual == sizeof( m_unique_pattern ); - result = result && !file.write( m_identification, sizeof( m_identification ), actual ) && actual == sizeof( m_identification ); - result = result && !file.write( m_security_match, sizeof( m_security_match ), actual ) && actual == sizeof( m_security_match ); - result = result && !file.write( m_secure_memory, sizeof( m_secure_memory ), actual ) && actual == sizeof( m_secure_memory ); - return result; + + std::tie( err, actual ) = write( file, m_unique_pattern, sizeof( m_unique_pattern ) ); + if( err ) + return false; + std::tie( err, actual ) = write( file, m_identification, sizeof( m_identification ) ); + if( err ) + return false; + std::tie( err, actual ) = write( file, m_security_match, sizeof( m_security_match ) ); + if( err ) + return false; + std::tie( err, actual ) = write( file, m_secure_memory, sizeof( m_secure_memory ) ); + if( err ) + return false; + + return true; } void ds1204_device::new_state( int state ) @@ -127,11 +150,11 @@ if( m_dqw ) { - buffer[ index ] |= mask; + buffer[index] |= mask; } else { - buffer[ index ] &= ~mask; + buffer[index] &= ~mask; } m_bit++; @@ -145,7 +168,7 @@ int index = m_bit / 8; int mask = 1 << ( m_bit % 8 ); - if( buffer[ index ] & mask ) + if( buffer[index] & mask ) { m_dqr = 1; } @@ -212,17 +235,17 @@ if( m_bit == 24 ) { verboselog( 1, "-> command %02x %02x %02x (%02x %02x)\n", - m_command[ 0 ], m_command[ 1 ], m_command[ 2 ], m_unique_pattern[ 0 ], m_unique_pattern[ 1 ] ); + m_command[0], m_command[1], m_command[2], m_unique_pattern[0], m_unique_pattern[1] ); - if( m_command[ 0 ] == COMMAND_READ && m_command[ 1 ] == ( m_unique_pattern[ 0 ] | CYCLE_NORMAL ) && m_command[ 2 ] == m_unique_pattern[ 1 ] ) + if( m_command[0] == COMMAND_READ && m_command[1] == ( m_unique_pattern[0] | CYCLE_NORMAL ) && m_command[2] == m_unique_pattern[1] ) { new_state( STATE_READ_IDENTIFICATION ); } - else if( m_command[ 0 ] == COMMAND_WRITE && m_command[ 1 ] == ( m_unique_pattern[ 0 ] | CYCLE_NORMAL ) && m_command[ 2 ] == m_unique_pattern[ 1 ] ) + else if( m_command[0] == COMMAND_WRITE && m_command[1] == ( m_unique_pattern[0] | CYCLE_NORMAL ) && m_command[2] == m_unique_pattern[1] ) { new_state( STATE_READ_IDENTIFICATION ); } - else if( m_command[ 0 ] == COMMAND_WRITE && m_command[ 1 ] == ( m_unique_pattern[ 0 ] | CYCLE_PROGRAM ) && m_command[ 2 ] == m_unique_pattern[ 1 ] ) + else if( m_command[0] == COMMAND_WRITE && m_command[1] == ( m_unique_pattern[0] | CYCLE_PROGRAM ) && m_command[2] == m_unique_pattern[1] ) { new_state( STATE_WRITE_IDENTIFICATION ); } @@ -239,8 +262,8 @@ if( m_bit == 64 ) { verboselog( 1, "<- identification %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_identification[ 0 ], m_identification[ 1 ], m_identification[ 2 ], m_identification[ 3 ], - m_identification[ 4 ], m_identification[ 5 ], m_identification[ 6 ], m_identification[ 7 ] ); + m_identification[0], m_identification[1], m_identification[2], m_identification[3], + m_identification[4], m_identification[5], m_identification[6], m_identification[7] ); new_state( STATE_WRITE_COMPARE_REGISTER ); } @@ -252,14 +275,14 @@ if( m_bit == 64 ) { verboselog( 1, "-> compare register %02x %02x %02x %02x %02x %02x %02x %02x (%02x %02x %02x %02x %02x %02x %02x %02x)\n", - m_compare_register[ 0 ], m_compare_register[ 1 ], m_compare_register[ 2 ], m_compare_register[ 3 ], - m_compare_register[ 4 ], m_compare_register[ 5 ], m_compare_register[ 6 ], m_compare_register[ 7 ], - m_security_match[ 0 ], m_security_match[ 1 ], m_security_match[ 2 ], m_security_match[ 3 ], - m_security_match[ 4 ], m_security_match[ 5 ], m_security_match[ 6 ], m_security_match[ 7 ] ); + m_compare_register[0], m_compare_register[1], m_compare_register[2], m_compare_register[3], + m_compare_register[4], m_compare_register[5], m_compare_register[6], m_compare_register[7], + m_security_match[0], m_security_match[1], m_security_match[2], m_security_match[3], + m_security_match[4], m_security_match[5], m_security_match[6], m_security_match[7] ); if( memcmp( m_compare_register, m_security_match, sizeof( m_compare_register ) ) == 0 ) { - if( m_command[ 0 ] == COMMAND_READ ) + if( m_command[0] == COMMAND_READ ) { new_state( STATE_READ_SECURE_MEMORY ); } @@ -281,10 +304,10 @@ if( m_bit == 128 ) { verboselog( 1, "<- secure memory %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_secure_memory[ 0 ], m_secure_memory[ 1 ], m_secure_memory[ 2 ], m_secure_memory[ 3 ], - m_secure_memory[ 4 ], m_secure_memory[ 5 ], m_secure_memory[ 6 ], m_secure_memory[ 7 ], - m_secure_memory[ 8 ], m_secure_memory[ 9 ], m_secure_memory[ 10 ], m_secure_memory[ 11 ], - m_secure_memory[ 12 ], m_secure_memory[ 13 ], m_secure_memory[ 14 ], m_secure_memory[ 15 ] ); + m_secure_memory[0], m_secure_memory[1], m_secure_memory[2], m_secure_memory[3], + m_secure_memory[4], m_secure_memory[5], m_secure_memory[6], m_secure_memory[7], + m_secure_memory[8], m_secure_memory[9], m_secure_memory[10], m_secure_memory[11], + m_secure_memory[12], m_secure_memory[13], m_secure_memory[14], m_secure_memory[15] ); new_state( STATE_STOP ); } @@ -296,10 +319,10 @@ if( m_bit == 128 ) { verboselog( 1, "-> secure memory %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_secure_memory[ 0 ], m_secure_memory[ 1 ], m_secure_memory[ 2 ], m_secure_memory[ 3 ], - m_secure_memory[ 4 ], m_secure_memory[ 5 ], m_secure_memory[ 6 ], m_secure_memory[ 7 ], - m_secure_memory[ 8 ], m_secure_memory[ 9 ], m_secure_memory[ 10 ], m_secure_memory[ 11 ], - m_secure_memory[ 12 ], m_secure_memory[ 13 ], m_secure_memory[ 14 ], m_secure_memory[ 15 ] ); + m_secure_memory[0], m_secure_memory[1], m_secure_memory[2], m_secure_memory[3], + m_secure_memory[4], m_secure_memory[5], m_secure_memory[6], m_secure_memory[7], + m_secure_memory[8], m_secure_memory[9], m_secure_memory[10], m_secure_memory[11], + m_secure_memory[12], m_secure_memory[13], m_secure_memory[14], m_secure_memory[15] ); new_state( STATE_STOP ); } @@ -311,8 +334,8 @@ if( m_bit == 64 ) { verboselog( 1, "-> identification %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_identification[ 0 ], m_identification[ 1 ], m_identification[ 2 ], m_identification[ 3 ], - m_identification[ 4 ], m_identification[ 5 ], m_identification[ 6 ], m_identification[ 7 ] ); + m_identification[0], m_identification[1], m_identification[2], m_identification[3], + m_identification[4], m_identification[5], m_identification[6], m_identification[7] ); new_state( STATE_WRITE_SECURITY_MATCH ); } @@ -324,27 +347,27 @@ if( m_bit == 64 ) { verboselog( 1, ">- security match %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_security_match[ 0 ], m_security_match[ 1 ], m_security_match[ 2 ], m_security_match[ 3 ], - m_security_match[ 4 ], m_security_match[ 5 ], m_security_match[ 6 ], m_security_match[ 7 ] ); + m_security_match[0], m_security_match[1], m_security_match[2], m_security_match[3], + m_security_match[4], m_security_match[5], m_security_match[6], m_security_match[7] ); new_state( STATE_STOP ); } break; case STATE_OUTPUT_GARBLED_DATA: - if( !m_clk && m_command[ 0 ] == COMMAND_READ ) + if( !m_clk && m_command[0] == COMMAND_READ ) { m_dqr = machine().rand() & 1; m_bit++; } - else if( m_clk && m_command[ 0 ] == COMMAND_WRITE ) + else if( m_clk && m_command[0] == COMMAND_WRITE ) { m_bit++; } if( m_bit == 64 ) { - if( m_command[ 0 ] == COMMAND_READ ) + if( m_command[0] == COMMAND_READ ) { verboselog( 1, "<- random\n" ); } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1205.cpp mame-0.264+dfsg.1/src/devices/machine/ds1205.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1205.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1205.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,6 +12,7 @@ #include #include +#include #define VERBOSE_LEVEL ( 0 ) @@ -21,7 +22,7 @@ if( VERBOSE_LEVEL >= n_level ) { va_list v; - char buf[ 32768 ]; + char buf[32768]; va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); @@ -96,14 +97,19 @@ bool ds1205_device::nvram_read( util::read_stream &file ) { + std::error_condition err; + size_t actual; + for(int i = 0; i < 3; i++) { - size_t actual; - if( file.read( m_identification[i], sizeof( m_identification[i] ), actual ) || actual != sizeof( m_identification[i] ) ) + std::tie( err, actual ) = read( file, m_identification[i], sizeof( m_identification[i] ) ); + if( err || ( sizeof( m_identification[i] ) != actual ) ) return false; - if( file.read( m_security_match[i], sizeof( m_security_match[i] ), actual ) || actual != sizeof( m_security_match[i] ) ) + std::tie( err, actual ) = read( file, m_security_match[i], sizeof( m_security_match[i] ) ); + if( err || ( sizeof( m_security_match[i] ) != actual ) ) return false; - if( file.read( m_secure_memory[i], sizeof( m_secure_memory[i] ), actual ) || actual != sizeof( m_secure_memory[i] ) ) + std::tie( err, actual ) = read( file, m_secure_memory[i], sizeof( m_secure_memory[i] ) ); + if( err || ( sizeof( m_secure_memory[i] ) != actual ) ) return false; } @@ -112,14 +118,19 @@ bool ds1205_device::nvram_write( util::write_stream &file ) { + std::error_condition err; + size_t actual; + for(int i = 0; i < 3; i++) { - size_t actual; - if( file.write( m_identification[i], sizeof( m_identification[i] ), actual ) || actual != sizeof( m_identification[i] ) ) + std::tie( err, actual ) = write( file, m_identification[i], sizeof( m_identification[i] ) ); + if( err ) return false; - if( file.write( m_security_match[i], sizeof( m_security_match[i] ), actual ) || actual != sizeof( m_security_match[i] ) ) + std::tie( err, actual ) = write( file, m_security_match[i], sizeof( m_security_match[i] ) ); + if( err ) return false; - if( file.write( m_secure_memory[i], sizeof( m_secure_memory[i] ), actual ) || actual != sizeof( m_secure_memory[i] ) ) + std::tie( err, actual ) = write( file, m_secure_memory[i], sizeof( m_secure_memory[i] ) ); + if( err ) return false; } @@ -141,11 +152,11 @@ if( m_dqw ) { - buffer[ index ] |= mask; + buffer[index] |= mask; } else { - buffer[ index ] &= ~mask; + buffer[index] &= ~mask; } m_bit++; @@ -159,7 +170,7 @@ int index = m_bit / 8; int mask = 1 << ( m_bit % 8 ); - if( buffer[ index ] & mask ) + if( buffer[index] & mask ) { m_dqr = 1; } @@ -226,17 +237,17 @@ if( m_bit == 24 ) { verboselog( 1, "-> command %02x %02x %02x\n", - m_command[ 0 ], m_command[ 1 ], m_command[ 2 ] ); + m_command[0], m_command[1], m_command[2] ); - if( m_command[ 0 ] == COMMAND_GET_SCRATCHPAD && (m_command[ 1 ] & 0xc0) == 0xc0 && m_command[ 1 ] == ( ~m_command[ 2 ] & 0xff ) ) + if( m_command[0] == COMMAND_GET_SCRATCHPAD && (m_command[1] & 0xc0) == 0xc0 && m_command[1] == ( ~m_command[2] & 0xff ) ) { new_state( STATE_READ_SCRATCH ); } - else if( m_command[ 0 ] == COMMAND_GET_DATA && (m_command[ 1 ] & 0xc0) != 0xc0 && (m_command[ 1 ] & 0x3f) >= 0x10 && m_command[ 1 ] == ( ~m_command[ 2 ] & 0xff ) ) + else if( m_command[0] == COMMAND_GET_DATA && (m_command[1] & 0xc0) != 0xc0 && (m_command[1] & 0x3f) >= 0x10 && m_command[1] == ( ~m_command[2] & 0xff ) ) { new_state( STATE_READ_IDENTIFICATION ); } - else if( m_command[ 0 ] == COMMAND_SET_SECURITY && (m_command[ 1 ] & 0xc0) != 0xc0 && !(m_command [ 1 ] & 0x3f) && m_command[ 1 ] == ( ~m_command[ 2 ] & 0xff ) ) + else if( m_command[0] == COMMAND_SET_SECURITY && (m_command[1] & 0xc0) != 0xc0 && !(m_command[1] & 0x3f) && m_command[1] == ( ~m_command[2] & 0xff ) ) { new_state( STATE_READ_IDENTIFICATION ); } @@ -248,14 +259,14 @@ break; case STATE_READ_IDENTIFICATION: - readbit( m_identification[ m_command[ 1 ] >> 6 ] ); + readbit( m_identification[m_command[1] >> 6] ); if( m_bit == 64 ) { - int page = m_command [ 1 ] >> 6; + int page = m_command [1] >> 6; verboselog( 1, "<- identification %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_identification[ page ][ 0 ], m_identification[ page ][ 1 ], m_identification[ page ][ 2 ], m_identification[ page ][ 3 ], - m_identification[ page ][ 4 ], m_identification[ page ][ 5 ], m_identification[ page ][ 6 ], m_identification[ page ][ 7 ] ); + m_identification[page][0], m_identification[page][1], m_identification[page][2], m_identification[page][3], + m_identification[page][4], m_identification[page][5], m_identification[page][6], m_identification[page][7] ); new_state( STATE_WRITE_COMPARE_REGISTER ); } @@ -266,24 +277,24 @@ if( m_bit == 64 ) { - int page = m_command[ 1 ] >> 6; + int page = m_command[1] >> 6; verboselog( 1, "-> compare register %02x %02x %02x %02x %02x %02x %02x %02x (%02x %02x %02x %02x %02x %02x %02x %02x)\n", - m_compare_register[ 0 ], m_compare_register[ 1 ], m_compare_register[ 2 ], m_compare_register[ 3 ], - m_compare_register[ 4 ], m_compare_register[ 5 ], m_compare_register[ 6 ], m_compare_register[ 7 ], - m_security_match[ page ][ 0 ], m_security_match[ page ][ 1 ], m_security_match[ page ][ 2 ], m_security_match[ page ][ 3 ], - m_security_match[ page ][ 4 ], m_security_match[ page ][ 5 ], m_security_match[ page ][ 6 ], m_security_match[ page ][ 7 ] ); + m_compare_register[0], m_compare_register[1], m_compare_register[2], m_compare_register[3], + m_compare_register[4], m_compare_register[5], m_compare_register[6], m_compare_register[7], + m_security_match[page][0], m_security_match[page][1], m_security_match[page][2], m_security_match[page][3], + m_security_match[page][4], m_security_match[page][5], m_security_match[page][6], m_security_match[page][7] ); - if( memcmp( m_compare_register, m_security_match[ page ], sizeof( m_compare_register ) ) == 0 ) + if( memcmp( m_compare_register, m_security_match[page], sizeof( m_compare_register ) ) == 0 ) { - if( m_command[ 0 ] == COMMAND_GET_DATA ) + if( m_command[0] == COMMAND_GET_DATA ) { new_state( STATE_READ_DATA ); } - else if( m_command[ 0 ] == COMMAND_GET_SCRATCHPAD) + else if( m_command[0] == COMMAND_GET_SCRATCHPAD) { new_state( STATE_READ_SCRATCH ); } - else if( m_command[ 0 ] == COMMAND_SET_SECURITY) + else if( m_command[0] == COMMAND_SET_SECURITY) { new_state( STATE_WRITE_IDENTIFICATION ); } @@ -296,16 +307,16 @@ break; case STATE_READ_DATA: - readbit( m_secure_memory[ m_command[ 1 ] >> 6 ] ); + readbit( m_secure_memory[m_command[1] >> 6] ); if( m_bit == 384 ) { - int page = m_command [ 1 ] >> 6; + int page = m_command[1] >> 6; verboselog( 1, "<- secure memory %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_secure_memory[ page ][ 0 ], m_secure_memory[ page ][ 1 ], m_secure_memory[ page ][ 2 ], m_secure_memory[ page ][ 3 ], - m_secure_memory[ page ][ 4 ], m_secure_memory[ page ][ 5 ], m_secure_memory[ page ][ 6 ], m_secure_memory[ page ][ 7 ], - m_secure_memory[ page ][ 8 ], m_secure_memory[ page ][ 9 ], m_secure_memory[ page ][ 10 ], m_secure_memory[ page ][ 11 ], - m_secure_memory[ page ][ 12 ], m_secure_memory[ page ][ 13 ], m_secure_memory[ page ][ 14 ], m_secure_memory[ page ][ 15 ] ); + m_secure_memory[page][0], m_secure_memory[page][1], m_secure_memory[page][2], m_secure_memory[page][3], + m_secure_memory[page][4], m_secure_memory[page][5], m_secure_memory[page][6], m_secure_memory[page][7], + m_secure_memory[page][8], m_secure_memory[page][9], m_secure_memory[page][10], m_secure_memory[page][11], + m_secure_memory[page][12], m_secure_memory[page][13], m_secure_memory[page][14], m_secure_memory[page][15] ); new_state( STATE_STOP ); } @@ -317,57 +328,57 @@ if( m_bit == 512 ) { verboselog( 1, "<- scratchpad %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_scratchpad[ 0 ], m_scratchpad[ 1 ], m_scratchpad[ 2 ], m_scratchpad[ 3 ], - m_scratchpad[ 4 ], m_scratchpad[ 5 ], m_scratchpad[ 6 ], m_scratchpad[ 7 ], - m_scratchpad[ 8 ], m_scratchpad[ 9 ], m_scratchpad[ 10 ], m_scratchpad[ 11 ], - m_scratchpad[ 12 ], m_scratchpad[ 13 ], m_scratchpad[ 14 ], m_scratchpad[ 15 ] ); + m_scratchpad[0], m_scratchpad[1], m_scratchpad[2], m_scratchpad[3], + m_scratchpad[4], m_scratchpad[5], m_scratchpad[6], m_scratchpad[7], + m_scratchpad[8], m_scratchpad[9], m_scratchpad[10], m_scratchpad[11], + m_scratchpad[12], m_scratchpad[13], m_scratchpad[14], m_scratchpad[15] ); new_state( STATE_STOP ); } break; case STATE_WRITE_IDENTIFICATION: - writebit( m_identification[ m_command[ 1 ] >> 6 ] ); + writebit( m_identification[m_command[1] >> 6] ); if( m_bit == 64 ) { - int page = m_command[ 1 ] >> 6; + int page = m_command[1] >> 6; verboselog( 1, "-> identification %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_identification[ page ][ 0 ], m_identification[ page ][ 1 ], m_identification[ page ][ 2 ], m_identification[ page ][ 3 ], - m_identification[ page ][ 4 ], m_identification[ page ][ 5 ], m_identification[ page ][ 6 ], m_identification[ page ][ 7 ] ); + m_identification[page][0], m_identification[page][1], m_identification[page][2], m_identification[page][3], + m_identification[page][4], m_identification[page][5], m_identification[page][6], m_identification[page][7] ); new_state( STATE_WRITE_SECURITY_MATCH ); } break; case STATE_WRITE_SECURITY_MATCH: - writebit( m_security_match[ m_command[ 1 ] >> 6 ] ); + writebit( m_security_match[m_command[1] >> 6] ); if( m_bit == 64 ) { - int page = m_command[ 1 ] >> 6; + int page = m_command[1] >> 6; verboselog( 1, ">- security match %02x %02x %02x %02x %02x %02x %02x %02x\n", - m_security_match[ page ][ 0 ], m_security_match[ page ][ 1 ], m_security_match[ page ][ 2 ], m_security_match[ page ][ 3 ], - m_security_match[ page ][ 4 ], m_security_match[ page ][ 5 ], m_security_match[ page ][ 6 ], m_security_match[ page ][ 7 ] ); + m_security_match[page][0], m_security_match[page][1], m_security_match[page][2], m_security_match[page][3], + m_security_match[page][4], m_security_match[page][5], m_security_match[page][6], m_security_match[page][7] ); new_state( STATE_STOP ); } break; case STATE_OUTPUT_GARBLED_DATA: - if( !m_clk && m_command[ 0 ] == COMMAND_GET_DATA ) + if( !m_clk && m_command[0] == COMMAND_GET_DATA ) { m_dqr = machine().rand() & 1; m_bit++; } - else if( m_clk && m_command[ 0 ] == COMMAND_SET_DATA ) + else if( m_clk && m_command[0] == COMMAND_SET_DATA ) { m_bit++; } if( m_bit == 64 ) { - if( m_command[ 0 ] == COMMAND_GET_DATA ) + if( m_command[0] == COMMAND_GET_DATA ) { verboselog( 1, "<- random\n" ); } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1207.cpp mame-0.264+dfsg.1/src/devices/machine/ds1207.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1207.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1207.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -33,6 +33,8 @@ #include "emu.h" #include "ds1207.h" +#include + #define LOG_LINES (1U << 1) #define LOG_STATE (1U << 2) #define LOG_DATA (1U << 3) @@ -138,28 +140,62 @@ bool ds1207_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.read(m_unique_pattern, sizeof(m_unique_pattern), actual) && actual == sizeof(m_unique_pattern); - result = result && !file.read(m_identification, sizeof(m_identification), actual) && actual == sizeof(m_identification); - result = result && !file.read(m_security_match, sizeof(m_security_match), actual) && actual == sizeof(m_security_match); - result = result && !file.read(m_secure_memory, sizeof(m_secure_memory), actual) && actual == sizeof(m_secure_memory); - result = result && !file.read(m_days_left, sizeof(m_days_left), actual) && actual == sizeof(m_days_left); - result = result && !file.read(m_start_time, sizeof(m_start_time), actual) && actual == sizeof(m_start_time); - result = result && !file.read(&m_device_state, sizeof(m_device_state), actual) && actual == sizeof(m_device_state); - return result; + + std::tie(err, actual) = read(file, m_unique_pattern, sizeof(m_unique_pattern)); + if (err || (sizeof(m_unique_pattern) != actual)) + return false; + std::tie(err, actual) = read(file, m_identification, sizeof(m_identification)); + if (err || (sizeof(m_identification) != actual)) + return false; + std::tie(err, actual) = read(file, m_security_match, sizeof(m_security_match)); + if (err || (sizeof(m_security_match) != actual)) + return false; + std::tie(err, actual) = read(file, m_secure_memory, sizeof(m_secure_memory)); + if (err || (sizeof(m_secure_memory) != actual)) + return false; + std::tie(err, actual) = read(file, m_days_left, sizeof(m_days_left)); + if (err || (sizeof(m_days_left) != actual)) + return false; + std::tie(err, actual) = read(file, m_start_time, sizeof(m_start_time)); + if (err || (sizeof(m_start_time) != actual)) + return false; + std::tie(err, actual) = read(file, &m_device_state, sizeof(m_device_state)); + if (err || (sizeof(m_device_state) != actual)) + return false; + + return true; } bool ds1207_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.write(m_unique_pattern, sizeof(m_unique_pattern), actual) && actual == sizeof(m_unique_pattern); - result = result && !file.write(m_identification, sizeof(m_identification), actual) && actual == sizeof(m_identification); - result = result && !file.write(m_security_match, sizeof(m_security_match), actual) && actual == sizeof(m_security_match); - result = result && !file.write(m_secure_memory, sizeof(m_secure_memory), actual) && actual == sizeof(m_secure_memory); - result = result && !file.write(m_days_left, sizeof(m_days_left), actual) && actual == sizeof(m_days_left); - result = result && !file.write(m_start_time, sizeof(m_start_time), actual) && actual == sizeof(m_start_time); - result = result && !file.write(&m_device_state, sizeof(m_device_state), actual) && actual == sizeof(m_device_state); - return result; + + std::tie(err, actual) = write(file, m_unique_pattern, sizeof(m_unique_pattern)); + if (err) + return false; + std::tie(err, actual) = write(file, m_identification, sizeof(m_identification)); + if (err) + return false; + std::tie(err, actual) = write(file, m_security_match, sizeof(m_security_match)); + if (err) + return false; + std::tie(err, actual) = write(file, m_secure_memory, sizeof(m_secure_memory)); + if (err) + return false; + std::tie(err, actual) = write(file, m_days_left, sizeof(m_days_left)); + if (err) + return false; + std::tie(err, actual) = write(file, m_start_time, sizeof(m_start_time)); + if (err) + return false; + std::tie(err, actual) = write(file, &m_device_state, sizeof(m_device_state)); + if (err) + return false; + + return true; } void ds1207_device::new_state(uint8_t state) diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1302.cpp mame-0.264+dfsg.1/src/devices/machine/ds1302.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1302.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1302.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -159,8 +159,8 @@ bool ds1302_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = read(file, &m_ram[0], m_ram_size); + return !err && (actual == m_ram_size); } @@ -171,8 +171,8 @@ bool ds1302_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = write(file, &m_ram[0], m_ram_size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1386.cpp mame-0.264+dfsg.1/src/devices/machine/ds1386.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1386.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1386.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -361,14 +361,14 @@ bool ds1386_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = read(file, &m_ram[0], m_ram_size); + return !err && (actual == m_ram_size); } bool ds1386_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_ram[0], m_ram_size, actual) && actual == m_ram_size; + auto const [err, actual] = write(file, &m_ram[0], m_ram_size); + return !err; } void ds1386_device::data_w(offs_t offset, uint8_t data) diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds1994.cpp mame-0.264+dfsg.1/src/devices/machine/ds1994.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds1994.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds1994.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,12 +9,14 @@ * */ -// FIXME: convert to device_rtc_interface and remove time.h +// FIXME: convert to device_rtc_interface and remove #include "emu.h" #include "machine/ds1994.h" #include +#include + #define LOG_ERRORS (1U << 1) #define LOG_1WIRE (1U << 2) @@ -750,13 +752,26 @@ bool ds1994_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.read(m_rom, ROM_SIZE, actual) && actual == ROM_SIZE; - result = result && !file.read(m_ram, SPD_SIZE, actual) && actual == SPD_SIZE; - result = result && !file.read(m_sram, DATA_SIZE, actual) && actual == DATA_SIZE; - result = result && !file.read(m_rtc, RTC_SIZE, actual) && actual == RTC_SIZE; - result = result && !file.read(m_regs, REGS_SIZE, actual) && actual == REGS_SIZE; - return result; + + std::tie(err, actual) = util::read(file, m_rom, ROM_SIZE); + if (err || (ROM_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_ram, SPD_SIZE); + if (err || (SPD_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_sram, DATA_SIZE); + if (err || (DATA_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_rtc, RTC_SIZE); + if (err || (RTC_SIZE != actual)) + return false; + std::tie(err, actual) = util::read(file, m_regs, REGS_SIZE); + if (err || (REGS_SIZE != actual)) + return false; + + return true; } //------------------------------------------------- @@ -766,11 +781,24 @@ bool ds1994_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.write(m_rom, ROM_SIZE, actual) && actual == ROM_SIZE; - result = result && !file.write(m_ram, SPD_SIZE, actual) && actual == SPD_SIZE; - result = result && !file.write(m_sram, DATA_SIZE, actual) && actual == DATA_SIZE; - result = result && !file.write(m_rtc, RTC_SIZE, actual) && actual == RTC_SIZE; - result = result && !file.write(m_regs, REGS_SIZE, actual) && actual == REGS_SIZE; - return result; + + std::tie(err, actual) = util::write(file, m_rom, ROM_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_ram, SPD_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_sram, DATA_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_rtc, RTC_SIZE); + if (err) + return false; + std::tie(err, actual) = util::write(file, m_regs, REGS_SIZE); + if (err) + return false; + + return true; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds2404.cpp mame-0.264+dfsg.1/src/devices/machine/ds2404.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds2404.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds2404.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -346,8 +346,8 @@ bool ds2404_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_sram, sizeof(m_sram), actual) && actual == sizeof(m_sram); + auto const [err, actual] = read(file, m_sram, sizeof(m_sram)); + return !err && (actual == sizeof(m_sram)); } @@ -358,6 +358,6 @@ bool ds2404_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_sram, sizeof(m_sram), actual) && actual == sizeof(m_sram); + auto const [err, actual] = write(file, m_sram, sizeof(m_sram)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ds2430a.cpp mame-0.264+dfsg.1/src/devices/machine/ds2430a.cpp --- mame-0.263+dfsg.1/src/devices/machine/ds2430a.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ds2430a.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,6 +39,7 @@ #include "ds2430a.h" #include // std::accumulate +#include // std::tie #define LOG_PULSE (1U << 1) #define LOG_BITS (1U << 2) @@ -458,10 +459,13 @@ bool ds2430a_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - if (file.read(&m_eeprom[0], 0x20, actual) || actual != 0x20) + std::tie(err, actual) = read(file, &m_eeprom[0], 0x20); + if (err || (0x20 != actual)) return false; - if (file.read(&m_rom[0], 8, actual) || actual != 8) + std::tie(err, actual) = read(file, &m_rom[0], 8); + if (err || (8 != actual)) return false; if (m_rom[0] != 0x14) @@ -481,10 +485,13 @@ bool ds2430a_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - if (file.write(&m_eeprom[0], 0x20, actual) || actual != 0x20) + std::tie(err, actual) = write(file, &m_eeprom[0], 0x20); + if (err) return false; - if (file.write(&m_rom[0], 8, actual) || actual != 8) + std::tie(err, actual) = write(file, &m_rom[0], 8); + if (err) return false; return true; diff -Nru mame-0.263+dfsg.1/src/devices/machine/edlc.cpp mame-0.264+dfsg.1/src/devices/machine/edlc.cpp --- mame-0.263+dfsg.1/src/devices/machine/edlc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/edlc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,7 +82,7 @@ // TODO: deassert RxDC and TxRET - if (m_dev) + if (has_net_device()) m_out_txrdy(1); interrupt(); @@ -427,7 +427,7 @@ else { // assume transmit failure and no device means loss of carrier - if ((m_control & CTL_TNC) && !m_dev) + if ((m_control & CTL_TNC) && !has_net_device()) m_flags |= FLAGS_TNC; } } diff -Nru mame-0.263+dfsg.1/src/devices/machine/eeprom.cpp mame-0.264+dfsg.1/src/devices/machine/eeprom.cpp --- mame-0.263+dfsg.1/src/devices/machine/eeprom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/eeprom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -255,9 +255,9 @@ { uint32_t const eeprom_length = 1 << m_address_bits; uint32_t const eeprom_bytes = eeprom_length * m_data_bits / 8; - size_t actual_bytes; - return !file.read(&m_data[0], eeprom_bytes, actual_bytes) && actual_bytes == eeprom_bytes; + auto const [err, actual_bytes] = util::read(file, &m_data[0], eeprom_bytes); + return !err && (actual_bytes == eeprom_bytes); } @@ -270,9 +270,9 @@ { uint32_t const eeprom_length = 1 << m_address_bits; uint32_t const eeprom_bytes = eeprom_length * m_data_bits / 8; - size_t actual_bytes; - return !file.write(&m_data[0], eeprom_bytes, actual_bytes) && actual_bytes == eeprom_bytes; + auto const [err, actual_bytes] = util::write(file, &m_data[0], eeprom_bytes); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/er1400.cpp mame-0.264+dfsg.1/src/devices/machine/er1400.cpp --- mame-0.263+dfsg.1/src/devices/machine/er1400.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/er1400.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,10 +106,10 @@ bool er1400_device::nvram_read(util::read_stream &file) { - size_t size = 100 * sizeof(m_data_array[0]); - size_t actual; + size_t const size = 100 * sizeof(m_data_array[0]); - return !file.read(&m_data_array[0], size, actual) && actual == size; + auto const [err, actual] = read(file, &m_data_array[0], size); + return !err && (actual == size); } @@ -120,10 +120,10 @@ bool er1400_device::nvram_write(util::write_stream &file) { - size_t size = 100 * sizeof(m_data_array[0]); - size_t actual; + size_t const size = 100 * sizeof(m_data_array[0]); - return !file.write(&m_data_array[0], size, actual) && actual == size; + auto const [err, actual] = write(file, &m_data_array[0], size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/er2055.cpp mame-0.264+dfsg.1/src/devices/machine/er2055.cpp --- mame-0.263+dfsg.1/src/devices/machine/er2055.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/er2055.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,8 +85,8 @@ bool er2055_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_rom_data[0], SIZE_DATA, actual) && actual == SIZE_DATA; + auto const [err, actual] = read(file, &m_rom_data[0], SIZE_DATA); + return !err && (actual == SIZE_DATA); } @@ -97,8 +97,8 @@ bool er2055_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_rom_data[0], SIZE_DATA, actual) && actual == SIZE_DATA; + auto const [err, actual] = write(file, &m_rom_data[0], SIZE_DATA); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/generic_spi_flash.cpp mame-0.264+dfsg.1/src/devices/machine/generic_spi_flash.cpp --- mame-0.263+dfsg.1/src/devices/machine/generic_spi_flash.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/generic_spi_flash.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -187,13 +187,13 @@ return false; } - size_t actual; - return !file.read(m_spiptr, m_length, actual) && actual == m_length; + auto const [err, actual] = util::read(file, m_spiptr, m_length); + return !err && (actual == m_length); } bool generic_spi_flash_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_spiptr, m_length, actual) && actual == m_length; + auto const [err, actual] = util::write(file, m_spiptr, m_length); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/hd64610.cpp mame-0.264+dfsg.1/src/devices/machine/hd64610.cpp --- mame-0.263+dfsg.1/src/devices/machine/hd64610.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/hd64610.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -249,8 +249,8 @@ bool hd64610_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_regs, 0x10, actual) && actual == 0x10; + auto const [err, actual] = util::read(file, m_regs, 0x10); + return !err && (actual == 0x10); } @@ -261,8 +261,8 @@ bool hd64610_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_regs, 0x10, actual) && actual == 0x10; + auto const [err, actual] = util::write(file, m_regs, 0x10); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/i2cmem.cpp mame-0.264+dfsg.1/src/devices/machine/i2cmem.cpp --- mame-0.263+dfsg.1/src/devices/machine/i2cmem.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/i2cmem.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -255,8 +255,8 @@ bool i2cmem_device::nvram_read( util::read_stream &file ) { - size_t actual; - return !file.read( &m_data[0], m_data_size, actual ) && actual == m_data_size; + auto const [err, actual] = read( file, &m_data[0], m_data_size ); + return !err && ( actual == m_data_size ); } //------------------------------------------------- @@ -266,8 +266,8 @@ bool i2cmem_device::nvram_write( util::write_stream &file ) { - size_t actual; - return !file.write( &m_data[0], m_data_size, actual ) && actual == m_data_size; + auto const [err, actual] = write( file, &m_data[0], m_data_size ); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/i82371sb.cpp mame-0.264+dfsg.1/src/devices/machine/i82371sb.cpp --- mame-0.263+dfsg.1/src/devices/machine/i82371sb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/i82371sb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -35,16 +35,23 @@ void i82371sb_isa_device::internal_io_map(address_map &map) { map(0x0000, 0x001f).rw("dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write)); - map(0x0020, 0x003f).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x0020, 0x0021).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); +// map(0x002e, 0x002f) Super I/O config map(0x0040, 0x005f).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write)); map(0x0061, 0x0061).rw(FUNC(i82371sb_isa_device::at_portb_r), FUNC(i82371sb_isa_device::at_portb_w)); +// map(0x0070, 0x0070) RTC address, bit 7 NMI enable +// map(0x0071, 0x0071) RTC data +// map(0x0078, 0x0079) Board Configuration map(0x0080, 0x009f).rw(FUNC(i82371sb_isa_device::at_page8_r), FUNC(i82371sb_isa_device::at_page8_w)); - map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x00a0, 0x00a1).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x00b2, 0x00b3).rw(FUNC(i82371sb_isa_device::read_apmcapms), FUNC(i82371sb_isa_device::write_apmcapms)); + // Up to $de according to TC430HX spec? map(0x00c0, 0x00df).rw(FUNC(i82371sb_isa_device::at_dma8237_2_r), FUNC(i82371sb_isa_device::at_dma8237_2_w)); + map(0x00e0, 0x00ef).noprw(); +// map(0x00f0, 0x00f0) Reset Numeric Error +// map(0x0270, 0x0273) I/O read port for PnP map(0x04d0, 0x04d1).rw(FUNC(i82371sb_isa_device::eisa_irq_read), FUNC(i82371sb_isa_device::eisa_irq_write)); map(0x0cf9, 0x0cf9).rw(FUNC(i82371sb_isa_device::reset_control_r), FUNC(i82371sb_isa_device::reset_control_w)); - map(0x00e0, 0x00ef).noprw(); } //------------------------------------------------- @@ -817,6 +824,7 @@ redirect_irq(irq, state); } +// FIXME: this is PIIX specific, doesn't exist on PIIX3 void i82371sb_isa_device::pc_mirq1_w(int state) { int irq = mbirq1 & 15; diff -Nru mame-0.263+dfsg.1/src/devices/machine/i82586.cpp mame-0.264+dfsg.1/src/devices/machine/i82586.cpp --- mame-0.263+dfsg.1/src/devices/machine/i82586.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/i82586.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -533,7 +533,7 @@ } // individual address - if (!memcmp(mac, get_mac(), cfg_address_length())) + if (!memcmp(mac, &get_mac()[0], cfg_address_length())) { LOGMASKED(LOG_FILTER, "address_filter accepted: individual address match\n"); @@ -950,7 +950,7 @@ // optionally insert source, destination address and length (14 bytes) if (!cfg_no_src_add_ins()) { - const char *mac = get_mac(); + const std::array &mac = get_mac(); u32 data; // insert destination address (6 bytes) @@ -1054,7 +1054,7 @@ memcpy(&buf[0x00], &m_cfg_bytes[0], CFG_SIZE); // individual address - memcpy(&buf[0x0c], get_mac(), 6); + memcpy(&buf[0x0c], &get_mac()[0], 6); // hash register *(u64 *)&buf[0x24] = m_mac_multi; @@ -1584,7 +1584,7 @@ // optionally insert destination, source and length (14 bytes) if (!cfg_no_src_add_ins()) { - const char *mac = get_mac(); + const std::array &mac = get_mac(); u32 data; // insert destination address (6 bytes) @@ -1719,7 +1719,7 @@ memcpy(&buf[0x02], &m_cfg_bytes[2], 9); // individual address - memcpy(&buf[0x0c], get_mac(), 6); + memcpy(&buf[0x0c], &get_mac()[0], 6); // hash register *(u64 *)&buf[0x24] = m_mac_multi; @@ -1730,7 +1730,7 @@ memcpy(&buf[0x00], &m_cfg_bytes[2], 12); // individual address - memcpy(&buf[0x0e], get_mac(), 6); + memcpy(&buf[0x0e], &get_mac()[0], 6); // hash register *(u64 *)&buf[0x26] = m_mac_multi; @@ -1827,7 +1827,7 @@ // TODO: increment alignment error counter // set multicast status - if (mode() != MODE_82586 && memcmp(buf, get_mac(), cfg_address_length())) + if (mode() != MODE_82586 && memcmp(buf, &get_mac()[0], cfg_address_length())) status |= RFD_S_MULTICAST; // fetch initial rbd address from rfd diff -Nru mame-0.263+dfsg.1/src/devices/machine/icm7170.cpp mame-0.264+dfsg.1/src/devices/machine/icm7170.cpp --- mame-0.263+dfsg.1/src/devices/machine/icm7170.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/icm7170.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -257,8 +257,8 @@ bool icm7170_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_regs, 0x20, actual) && actual == 0x20; + auto const [err, actual] = util::read(file, m_regs, 0x20); + return !err && (actual == 0x20); } @@ -269,8 +269,8 @@ bool icm7170_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_regs, 0x20, actual) && actual == 0x20; + auto const [err, actual] = util::write(file, m_regs, 0x20); + return !err; } // non-inherited device functions diff -Nru mame-0.263+dfsg.1/src/devices/machine/intelfsh.cpp mame-0.264+dfsg.1/src/devices/machine/intelfsh.cpp --- mame-0.263+dfsg.1/src/devices/machine/intelfsh.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/intelfsh.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -396,8 +396,8 @@ bool intelfsh_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_data[0], m_size, actual) && actual == m_size; + auto const [err, actual] = read(file, &m_data[0], m_size); + return !err && (actual == m_size); } @@ -408,8 +408,8 @@ bool intelfsh_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_data[0], m_size, actual) && actual == m_size; + auto const [err, actual] = write(file, &m_data[0], m_size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/it8705f.cpp mame-0.264+dfsg.1/src/devices/machine/it8705f.cpp --- mame-0.263+dfsg.1/src/devices/machine/it8705f.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/it8705f.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,593 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +Winbond IT8705F LPC Super I/O + +TODO: +- Move stuff from sis950_lpc; +- shutms11 fails detecting FDC; + +**************************************************************************************************/ + +#include "emu.h" +#include "machine/it8705f.h" + +#include "formats/naslite_dsk.h" + +#include + +#define VERBOSE (LOG_GENERAL) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + + +DEFINE_DEVICE_TYPE(IT8705F, it8705f_device, "it8705f", "ITE IT8705F LPC Super I/O") + +it8705f_device::it8705f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, IT8705F, tag, owner, clock) + , device_isa16_card_interface(mconfig, *this) + , device_memory_interface(mconfig, *this) + , m_space_config("superio_config_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(it8705f_device::config_map), this)) + , m_pc_fdc(*this, "fdc") + , m_pc_com(*this, "uart%d", 0U) + , m_pc_lpt(*this, "lpta") + , m_logical_view(*this, "logical_view") + , m_irq1_callback(*this) + , m_irq8_callback(*this) + , m_irq9_callback(*this) + , m_txd1_callback(*this) + , m_ndtr1_callback(*this) + , m_nrts1_callback(*this) + , m_txd2_callback(*this) + , m_ndtr2_callback(*this) + , m_nrts2_callback(*this) + , m_index(0) + , m_logical_index(0) + , m_lock_sequence_index(0) +{ + std::fill(std::begin(m_activate), std::end(m_activate), false); +} + +it8705f_device::~it8705f_device() +{ +} + +void it8705f_device::device_start() +{ + set_isa_device(); + m_isa->set_dma_channel(0, this, true); + m_isa->set_dma_channel(1, this, true); + m_isa->set_dma_channel(2, this, true); + m_isa->set_dma_channel(3, this, true); + remap(AS_IO, 0, 0x400); + +} + +void it8705f_device::device_reset() +{ + m_index = 0; + m_lock_sequence_index = 0; + + m_pc_fdc_irq_line = 6; + m_pc_fdc_drq_line = 2; +// m_pc_fdc_mode = ; + m_pc_fdc_address = 0x3f0; + + m_pc_lpt_address = 0x0378; + m_pc_lpt_irq_line = 7; + m_pc_lpt_drq_line = 4; // disabled +// m_pc_lpt_mode = 0x3f; + + m_pc_fdc->set_rate(500000); +} + +device_memory_interface::space_config_vector it8705f_device::memory_space_config() const +{ + return space_config_vector { + std::make_pair(0, &m_space_config) + }; +} + +static void pc_hd_floppies(device_slot_interface &device) +{ + device.option_add("525hd", FLOPPY_525_HD); + device.option_add("35hd", FLOPPY_35_HD); + device.option_add("525dd", FLOPPY_525_DD); + device.option_add("35dd", FLOPPY_35_DD); +} + +void it8705f_device::floppy_formats(format_registration &fr) +{ + fr.add_pc_formats(); + fr.add(FLOPPY_NASLITE_FORMAT); +} + +void it8705f_device::device_add_mconfig(machine_config &config) +{ + // 82077 compatible + N82077AA(config, m_pc_fdc, XTAL(24'000'000), upd765_family_device::mode_t::AT); + m_pc_fdc->intrq_wr_callback().set(FUNC(it8705f_device::irq_floppy_w)); + m_pc_fdc->drq_wr_callback().set(FUNC(it8705f_device::drq_floppy_w)); + FLOPPY_CONNECTOR(config, "fdc:0", pc_hd_floppies, "35hd", it8705f_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", pc_hd_floppies, "35hd", it8705f_device::floppy_formats); + + NS16550(config, m_pc_com[0], XTAL(24'000'000) / 13); + m_pc_com[0]->out_int_callback().set(FUNC(it8705f_device::irq_serial1_w)); + m_pc_com[0]->out_tx_callback().set(FUNC(it8705f_device::txd_serial1_w)); + m_pc_com[0]->out_dtr_callback().set(FUNC(it8705f_device::dtr_serial1_w)); + m_pc_com[0]->out_rts_callback().set(FUNC(it8705f_device::rts_serial1_w)); + + NS16550(config, m_pc_com[1], XTAL(24'000'000) / 13); + m_pc_com[1]->out_int_callback().set(FUNC(it8705f_device::irq_serial2_w)); + m_pc_com[1]->out_tx_callback().set(FUNC(it8705f_device::txd_serial2_w)); + m_pc_com[1]->out_dtr_callback().set(FUNC(it8705f_device::dtr_serial2_w)); + m_pc_com[1]->out_rts_callback().set(FUNC(it8705f_device::rts_serial2_w)); + + PC_LPT(config, m_pc_lpt); + m_pc_lpt->irq_handler().set(FUNC(it8705f_device::irq_parallel_w)); + +} + + +void it8705f_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_IO) + { + // TODO: apparently installs two ports, an alias at 0x4e/0x4f + m_isa->install_device(0x002e, 0x002f, read8sm_delegate(*this, FUNC(it8705f_device::read)), write8sm_delegate(*this, FUNC(it8705f_device::write))); + + if (m_activate[0]) + { + m_isa->install_device(m_pc_fdc_address, m_pc_fdc_address + 7, *m_pc_fdc, &n82077aa_device::map); + } + + for (int i = 0; i < 2; i++) + { + if (m_activate[i + 1]) + { + const u16 uart_addr = m_pc_com_address[i]; + m_isa->install_device(uart_addr, uart_addr + 7, read8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_r)), write8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_w))); + } + } + + // can't map below 0x100 + if (m_activate[3] & 1 && m_pc_lpt_address & 0xf00) + { + m_isa->install_device(m_pc_lpt_address, m_pc_lpt_address + 3, read8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::read)), write8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::write))); + } + } +} + +uint8_t it8705f_device::read(offs_t offset) +{ + if (m_lock_sequence_index != 4) + return 0; + + if (offset == 0) + return m_index; + + return space().read_byte(m_index); +} + +void it8705f_device::write(offs_t offset, u8 data) +{ + if (offset == 0) + { + if (m_lock_sequence_index == 4) + m_index = data; + else + { + // TODO: 0xaa for lock_seq[3] with 0x4e alias + const u8 lock_seq[4] = { 0x87, 0x01, 0x55, 0x55 }; + if (data == lock_seq[m_lock_sequence_index]) + m_lock_sequence_index ++; + else + m_lock_sequence_index = 0; + } + } + else + { + if (m_lock_sequence_index == 4) + space().write_byte(m_index, data); + } +} + +void it8705f_device::config_map(address_map &map) +{ + map(0x02, 0x02).lw8( + NAME([this] (offs_t offset, u8 data) { + if (BIT(data, 1)) + m_lock_sequence_index = 0; + // TODO: bit 0 for global reset + }) + ); + map(0x07, 0x07).lr8(NAME([this] () { return m_logical_index; })).w(FUNC(it8705f_device::logical_device_select_w)); + map(0x20, 0x20).lr8(NAME([] () { return 0x87; })); // device ID + map(0x21, 0x21).lr8(NAME([] () { return 0x05; })); // revision +// map(0x22, 0x22) Configuration Select and Chip Version +// map(0x23, 0x23) Software Suspend +// map(0x24, 0x24) Clock Selection and Flash ROM I/F control +// map(0x25, 0x2a) LDN5 GPIO set multi-function pins +// map(0x2b, 0x2b) LDN4 alternate GPIO set multi-function pins +// map(0x2e, 0x2f) LDNF4 Test Modes + + map(0x30, 0xff).view(m_logical_view); + // FDC + m_logical_view[0](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<0>), FUNC(it8705f_device::activate_w<0>)); + m_logical_view[0](0x60, 0x61).lrw8( + NAME([this] (offs_t offset) { + return (m_pc_fdc_address >> (offset * 8)) & 0xff; + }), + NAME([this] (offs_t offset, u8 data) { + const u8 shift = offset * 8; + m_pc_fdc_address &= 0xff << shift; + m_pc_fdc_address |= data << (shift ^ 8); + m_pc_fdc_address &= ~0xf007; + LOG("LDN0 (FDC): remap %04x ([%d] %02x)\n", m_pc_fdc_address, offset, data); + + remap(AS_IO, 0, 0x400); + }) + ); + m_logical_view[0](0x70, 0x70).lrw8( + NAME([this] () { + return m_pc_fdc_irq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_fdc_irq_line = data & 0xf; + LOG("LDN0 (FDC): irq routed to %02x\n", m_pc_lpt_irq_line); + }) + ); + m_logical_view[0](0x74, 0x74).lrw8( + NAME([this] () { + return m_pc_lpt_drq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_fdc_drq_line = data & 0x7; + LOG("LDN0 (FDC): drq %s (%02x)\n", BIT(m_pc_lpt_drq_line, 2) ? "disabled" : "enabled", data); + }) + ); + // TODO: m_logical_view[0](0xf0, 0xf1) FDC config + + // UART1 + m_logical_view[1](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<1>), FUNC(it8705f_device::activate_w<1>)); + m_logical_view[1](0x60, 0x61).rw(FUNC(it8705f_device::uart_address_r<0>), FUNC(it8705f_device::uart_address_w<0>)); + m_logical_view[1](0x70, 0x70).rw(FUNC(it8705f_device::uart_irq_r<0>), FUNC(it8705f_device::uart_irq_w<0>)); + m_logical_view[1](0xf0, 0xf0).rw(FUNC(it8705f_device::uart_config_r<0>), FUNC(it8705f_device::uart_config_w<0>)); + + // UART2 + m_logical_view[2](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<2>), FUNC(it8705f_device::activate_w<2>)); + m_logical_view[2](0x60, 0x61).rw(FUNC(it8705f_device::uart_address_r<1>), FUNC(it8705f_device::uart_address_w<1>)); + m_logical_view[2](0x70, 0x70).rw(FUNC(it8705f_device::uart_irq_r<1>), FUNC(it8705f_device::uart_irq_w<1>)); + m_logical_view[2](0xf0, 0xf0).rw(FUNC(it8705f_device::uart_config_r<1>), FUNC(it8705f_device::uart_config_w<1>)); + + // LPT + m_logical_view[3](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<3>), FUNC(it8705f_device::activate_w<3>)); + m_logical_view[3](0x60, 0x61).lrw8( + NAME([this] (offs_t offset) { + return (m_pc_lpt_address >> (offset * 8)) & 0xff; + }), + NAME([this] (offs_t offset, u8 data) { + const u8 shift = offset * 8; + m_pc_lpt_address &= 0xff << shift; + m_pc_lpt_address |= data << (shift ^ 8); + m_pc_lpt_address &= ~0xf003; + LOG("LDN3 (LPT): remap %04x ([%d] %02x)\n", m_pc_lpt_address, offset, data); + + remap(AS_IO, 0, 0x400); + }) + ); + //m_logical_view[3](0x62, 0x63) secondary base address + //m_logical_view[3](0x64, 0x65) POST data port base address + m_logical_view[3](0x70, 0x70).lrw8( + NAME([this] () { + return m_pc_lpt_irq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_lpt_irq_line = data & 0xf; + LOG("LDN3 (LPT): irq routed to %02x\n", m_pc_lpt_irq_line); + }) + ); + m_logical_view[3](0x74, 0x74).lrw8( + NAME([this] () { + return m_pc_lpt_drq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_lpt_drq_line = data & 0x7; + LOG("LDN3 (LPT): drq %s (%02x)\n", BIT(m_pc_lpt_drq_line, 2) ? "disabled" : "enabled", data); + }) + ); + + // Environment controller / HW monitor + m_logical_view[4](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<4>), FUNC(it8705f_device::activate_w<4>)); + m_logical_view[4](0x31, 0xff).unmaprw(); + + // GPIO + m_logical_view[5](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<5>), FUNC(it8705f_device::activate_w<5>)); + m_logical_view[5](0x31, 0xff).unmaprw(); + + // Game port + m_logical_view[6](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<6>), FUNC(it8705f_device::activate_w<6>)); + m_logical_view[6](0x31, 0xff).unmaprw(); + + // Consumer IR + m_logical_view[7](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<7>), FUNC(it8705f_device::activate_w<7>)); + m_logical_view[7](0x31, 0xff).unmaprw(); + + // MIDI port + m_logical_view[8](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<8>), FUNC(it8705f_device::activate_w<8>)); + m_logical_view[8](0x31, 0xff).unmaprw(); +} + +/* + * Global register space + */ + +void it8705f_device::logical_device_select_w(offs_t offset, u8 data) +{ + m_logical_index = data; + if (m_logical_index <= 0x8) + m_logical_view.select(m_logical_index); + else + LOG("Attempt to select an unmapped device with %02x\n", data); +} + +template u8 it8705f_device::activate_r(offs_t offset) +{ + return m_activate[N]; +} + +template void it8705f_device::activate_w(offs_t offset, u8 data) +{ + m_activate[N] = data & 1; + LOG("LDN%d Device %s\n", N, data & 1 ? "enabled" : "disabled"); + remap(AS_IO, 0, 0x400); +} + +void it8705f_device::request_irq(int irq, int state) +{ + switch (irq) + { + case 1: + m_irq1_callback(state); + break; + case 3: + m_isa->irq3_w(state); + break; + case 4: + m_isa->irq4_w(state); + break; + case 5: + m_isa->irq5_w(state); + break; + case 6: + m_isa->irq6_w(state); + break; + case 7: + m_isa->irq7_w(state); + break; + case 8: + m_irq8_callback(state); + break; + case 9: + m_irq9_callback(state); + break; + case 10: + m_isa->irq10_w(state); + break; + case 11: + m_isa->irq11_w(state); + break; + case 12: + m_isa->irq12_w(state); + break; + case 14: + m_isa->irq14_w(state); + break; + case 15: + m_isa->irq15_w(state); + break; + } +} + +void it8705f_device::request_dma(int dreq, int state) +{ + switch (dreq) + { + case 0: + m_isa->drq0_w(state); + break; + case 1: + m_isa->drq1_w(state); + break; + case 2: + m_isa->drq2_w(state); + break; + case 3: + m_isa->drq3_w(state); + break; + } +} + +/* + * Device #0 (FDC) + */ + +void it8705f_device::irq_floppy_w(int state) +{ + if (!m_activate[0]) + return; + request_irq(m_pc_fdc_irq_line, state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::drq_floppy_w(int state) +{ + if (!m_activate[0]) + return; + request_dma(m_pc_fdc_drq_line, state ? ASSERT_LINE : CLEAR_LINE); +} + +/* + * Device #1/#2 (UART) + */ + +template u8 it8705f_device::uart_address_r(offs_t offset) +{ + return (m_pc_com_address[N] >> (offset * 8)) & 0xff; +} + +template void it8705f_device::uart_address_w(offs_t offset, u8 data) +{ + const u8 shift = offset * 8; + m_pc_com_address[N] &= 0xff << shift; + m_pc_com_address[N] |= data << (shift ^ 8); + m_pc_com_address[N] &= ~0xf007; + LOG("LDN%d (COM%d): remap %04x ([%d] %02x)\n", N, N + 1, m_pc_com_address[N], offset, data); + + remap(AS_IO, 0, 0x400); +} + +template u8 it8705f_device::uart_irq_r(offs_t offset) +{ + return m_pc_com_irq_line[N]; +} + +template void it8705f_device::uart_irq_w(offs_t offset, u8 data) +{ + m_pc_com_irq_line[N] = data & 0xf; + LOG("LDN%d (UART): irq routed to %02x\n", N, m_pc_com_irq_line[N]); +} + +template u8 it8705f_device::uart_config_r(offs_t offset) +{ + return m_pc_com_control[N]; +} + +/* + * ---- -xx- Clock Source + * ---- -00- 24 MHz/13 + * ---- -??- + * ---- ---x IRQ sharing enable + */ +template void it8705f_device::uart_config_w(offs_t offset, u8 data) +{ + m_pc_com_control[N] = data; + LOG("LDN%d (UART): control %02x\n", N, m_pc_com_control[N]); +} + +void it8705f_device::irq_serial1_w(int state) +{ + if (!m_activate[1]) + return; + request_irq(m_pc_com_irq_line[0], state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::irq_serial2_w(int state) +{ + if (!m_activate[2]) + return; + request_irq(m_pc_com_irq_line[1], state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::txd_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_txd1_callback(state); +} + +void it8705f_device::txd_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_txd2_callback(state); +} + +void it8705f_device::dtr_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_ndtr1_callback(state); +} + +void it8705f_device::dtr_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_ndtr2_callback(state); +} + +void it8705f_device::rts_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_nrts1_callback(state); +} + +void it8705f_device::rts_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_nrts2_callback(state); +} + +void it8705f_device::rxd1_w(int state) +{ + m_pc_com[0]->rx_w(state); +} + +void it8705f_device::ndcd1_w(int state) +{ + m_pc_com[0]->dcd_w(state); +} + +void it8705f_device::ndsr1_w(int state) +{ + m_pc_com[0]->dsr_w(state); +} + +void it8705f_device::nri1_w(int state) +{ + m_pc_com[0]->ri_w(state); +} + +void it8705f_device::ncts1_w(int state) +{ + m_pc_com[0]->cts_w(state); +} + +void it8705f_device::rxd2_w(int state) +{ + m_pc_com[1]->rx_w(state); +} + +void it8705f_device::ndcd2_w(int state) +{ + m_pc_com[1]->dcd_w(state); +} + +void it8705f_device::ndsr2_w(int state) +{ + m_pc_com[1]->dsr_w(state); +} + +void it8705f_device::nri2_w(int state) +{ + m_pc_com[1]->ri_w(state); +} + +void it8705f_device::ncts2_w(int state) +{ + m_pc_com[1]->cts_w(state); +} + +/* + * Device #3 (Parallel) + */ + +void it8705f_device::irq_parallel_w(int state) +{ + if (m_activate[3] == false) + return; + request_irq(m_pc_lpt_irq_line, state ? ASSERT_LINE : CLEAR_LINE); +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/it8705f.h mame-0.264+dfsg.1/src/devices/machine/it8705f.h --- mame-0.263+dfsg.1/src/devices/machine/it8705f.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/it8705f.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_MACHINE_IT8705F_H +#define MAME_MACHINE_IT8705F_H + +#pragma once + +#include "bus/isa/isa.h" +#include "imagedev/floppy.h" +#include "machine/8042kbdc.h" +#include "machine/ds128x.h" +#include "machine/ins8250.h" +#include "machine/pc_lpt.h" +#include "machine/upd765.h" + +class it8705f_device : public device_t, + public device_isa16_card_interface, + public device_memory_interface +{ +public: + it8705f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ~it8705f_device(); + + void remap(int space_id, offs_t start, offs_t end) override; + + auto irq1() { return m_irq1_callback.bind(); } + auto irq8() { return m_irq8_callback.bind(); } + auto irq9() { return m_irq9_callback.bind(); } + auto txd1() { return m_txd1_callback.bind(); } + auto ndtr1() { return m_ndtr1_callback.bind(); } + auto nrts1() { return m_nrts1_callback.bind(); } + auto txd2() { return m_txd2_callback.bind(); } + auto ndtr2() { return m_ndtr2_callback.bind(); } + auto nrts2() { return m_nrts2_callback.bind(); } + + void rxd1_w(int state); + void ndcd1_w(int state); + void ndsr1_w(int state); + void nri1_w(int state); + void ncts1_w(int state); + void rxd2_w(int state); + void ndcd2_w(int state); + void ndsr2_w(int state); + void nri2_w(int state); + void ncts2_w(int state); + + static void floppy_formats(format_registration &fr); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual space_config_vector memory_space_config() const override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + const address_space_config m_space_config; + + required_device m_pc_fdc; + required_device_array m_pc_com; + required_device m_pc_lpt; + memory_view m_logical_view; + + devcb_write_line m_irq1_callback; + devcb_write_line m_irq8_callback; + devcb_write_line m_irq9_callback; + devcb_write_line m_txd1_callback; + devcb_write_line m_ndtr1_callback; + devcb_write_line m_nrts1_callback; + devcb_write_line m_txd2_callback; + devcb_write_line m_ndtr2_callback; + devcb_write_line m_nrts2_callback; + + u8 m_index = 0; + u8 m_logical_index = 0; + bool m_activate[9]{}; + + u8 m_lock_sequence_index = 0; + + uint8_t read(offs_t offset); + void write(offs_t offset, u8 data); + + void config_map(address_map &map); + + void logical_device_select_w(offs_t offset, u8 data); + template u8 activate_r(offs_t offset); + template void activate_w(offs_t offset, u8 data); + + void request_irq(int irq, int state); + void request_dma(int dreq, int state); + + u8 m_pc_fdc_irq_line = 6; + u8 m_pc_fdc_drq_line = 2; +// u8 m_pc_fdc_mode; + u16 m_pc_fdc_address = 0x3f0; + + void irq_floppy_w(int state); + void drq_floppy_w(int state); + + u8 m_pc_lpt_irq_line = 7; + u8 m_pc_lpt_drq_line = 4; +// u8 m_pc_lpt_mode; + u16 m_pc_lpt_address = 0x378; + + void irq_parallel_w(int state); + + u16 m_pc_com_address[2]{}; + u8 m_pc_com_irq_line[2]{}; + u8 m_pc_com_control[2]{}; + + void irq_serial1_w(int state); + void txd_serial1_w(int state); + void dtr_serial1_w(int state); + void rts_serial1_w(int state); + void irq_serial2_w(int state); + void txd_serial2_w(int state); + void dtr_serial2_w(int state); + void rts_serial2_w(int state); + + template u8 uart_address_r(offs_t offset); + template void uart_address_w(offs_t offset, u8 data); + template u8 uart_irq_r(offs_t offset); + template void uart_irq_w(offs_t offset, u8 data); + template u8 uart_config_r(offs_t offset); + template void uart_config_w(offs_t offset, u8 data); +}; + +DECLARE_DEVICE_TYPE(IT8705F, it8705f_device); + +#endif // MAME_MACHINE_IT8705F_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/kr1601rr1.cpp mame-0.264+dfsg.1/src/devices/machine/kr1601rr1.cpp --- mame-0.263+dfsg.1/src/devices/machine/kr1601rr1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/kr1601rr1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -120,8 +120,8 @@ bool kr1601rr1_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_earom, EAROM_SIZE, actual) && actual == EAROM_SIZE; + auto const [err, actual] = util::read(file, m_earom, EAROM_SIZE); + return !err && (actual == EAROM_SIZE); } //------------------------------------------------- @@ -131,8 +131,8 @@ bool kr1601rr1_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_earom, EAROM_SIZE, actual) && actual == EAROM_SIZE; + auto const [err, actual] = util::write(file, m_earom, EAROM_SIZE); + return !err; } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/machine/m3002.cpp mame-0.264+dfsg.1/src/devices/machine/m3002.cpp --- mame-0.263+dfsg.1/src/devices/machine/m3002.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/m3002.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -100,8 +100,8 @@ bool m3002_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_ram[0], 0x10, actual) && actual == 0x10; + auto const [err, actual] = util::read(file, &m_ram[0], 0x10); + return !err && (actual == 0x10); } @@ -111,8 +111,8 @@ bool m3002_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_ram[0], 0x10, actual) && actual == 0x10; + auto const [err, actual] = util::write(file, &m_ram[0], 0x10); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/m6m80011ap.cpp mame-0.264+dfsg.1/src/devices/machine/m6m80011ap.cpp --- mame-0.263+dfsg.1/src/devices/machine/m6m80011ap.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/m6m80011ap.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -78,8 +78,8 @@ bool m6m80011ap_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_eeprom_data, 0x100, actual) && actual == 0x100; + auto const [err, actual] = read(file, m_eeprom_data, 0x100); + return !err && (actual == 0x100); } @@ -90,8 +90,8 @@ bool m6m80011ap_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_eeprom_data, 0x100, actual) && actual == 0x100; + auto const [err, actual] = write(file, m_eeprom_data, 0x100); + return !err; } //************************************************************************** diff -Nru mame-0.263+dfsg.1/src/devices/machine/mc146818.cpp mame-0.264+dfsg.1/src/devices/machine/mc146818.cpp --- mame-0.263+dfsg.1/src/devices/machine/mc146818.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mc146818.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -279,9 +279,9 @@ bool mc146818_device::nvram_read(util::read_stream &file) { - size_t size = data_size(); - size_t actual; - if (file.read(&m_data[0], size, actual) || actual != size) + size_t const size = data_size(); + auto const [err, actual] = read(file, &m_data[0], size); + if (err || (actual != size)) return false; update_timer(); @@ -298,9 +298,9 @@ bool mc146818_device::nvram_write(util::write_stream &file) { - size_t size = data_size(); - size_t actual; - return !file.write(&m_data[0], size, actual) && actual == size; + size_t const size = data_size(); + auto const [err, actual] = write(file, &m_data[0], size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/mccs1850.cpp mame-0.264+dfsg.1/src/devices/machine/mccs1850.cpp --- mame-0.263+dfsg.1/src/devices/machine/mccs1850.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mccs1850.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -373,8 +373,8 @@ bool mccs1850_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_ram, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = read(file, m_ram, RAM_SIZE); + return !err && (actual == RAM_SIZE); } @@ -385,8 +385,8 @@ bool mccs1850_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_ram, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = write(file, m_ram, RAM_SIZE); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/mediagx_cs5530_video.cpp mame-0.264+dfsg.1/src/devices/machine/mediagx_cs5530_video.cpp --- mame-0.263+dfsg.1/src/devices/machine/mediagx_cs5530_video.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mediagx_cs5530_video.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,55 @@ +// license: BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +[Cyrix/National Semiconductor/AMD] [MediaGX/Geode] [Cx/CS]5530 VIDEO implementation (XpressGRAPHICS?) + +TODO: +- extensions for host display section (GX_BASE+8300h); + +**************************************************************************************************/ + +#include "emu.h" +#include "mediagx_cs5530_video.h" + +#define VERBOSE (LOG_GENERAL) +//#define LOG_OUTPUT_FUNC osd_printf_info + +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(MEDIAGX_CS5530_VIDEO, mediagx_cs5530_video_device, "mediagx_cs5530_video", "MediaGX CS5530 Video Controller") + +mediagx_cs5530_video_device::mediagx_cs5530_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pci_device(mconfig, MEDIAGX_CS5530_VIDEO, tag, owner, clock) +{ + set_ids(0x10780104, 0x00, 0x030000, 0x00); +} + +void mediagx_cs5530_video_device::config_map(address_map &map) +{ + pci_device::config_map(map); +// map(0x14, 0xff).unmaprw(); // +} + +void mediagx_cs5530_video_device::io_map(address_map &map) +{ + +} + +void mediagx_cs5530_video_device::device_start() +{ + pci_device::device_start(); + + add_map(4*1024, M_MEM, FUNC(mediagx_cs5530_video_device::io_map)); + + // no INT pin +} + +void mediagx_cs5530_video_device::device_reset() +{ + pci_device::device_reset(); + + command = 0x0000; + command_mask = 0x0003; + status = 0x0280; +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/mediagx_cs5530_video.h mame-0.264+dfsg.1/src/devices/machine/mediagx_cs5530_video.h --- mame-0.263+dfsg.1/src/devices/machine/mediagx_cs5530_video.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mediagx_cs5530_video.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,29 @@ +// license: BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_MACHINE_SIS630_VGA_H +#define MAME_MACHINE_SIS630_VGA_H + +#pragma once + +#include "pci.h" +#include "video/pc_vga.h" + +class mediagx_cs5530_video_device : public pci_device +{ +public: + mediagx_cs5530_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual void config_map(address_map &map) override; + + void io_map(address_map &map); +}; + +DECLARE_DEVICE_TYPE(MEDIAGX_CS5530_VIDEO, mediagx_cs5530_video_device) + + +#endif diff -Nru mame-0.263+dfsg.1/src/devices/machine/mediagx_host.cpp mame-0.264+dfsg.1/src/devices/machine/mediagx_host.cpp --- mame-0.263+dfsg.1/src/devices/machine/mediagx_host.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mediagx_host.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2,7 +2,7 @@ // copyright-holders: Angelo Salese /************************************************************************************************** - MediaGX host implementation (northbridge) +MediaGX host implementation (northbridge) **************************************************************************************************/ @@ -23,6 +23,7 @@ mediagx_host_device::mediagx_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pci_host_device(mconfig, MEDIAGX_HOST, tag, owner, clock) , m_host_cpu(*this, finder_base::DUMMY_TAG) + , m_vga(*this, "vga") { m_superio_space_config = address_space_config("superio_space", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(mediagx_host_device::superio_map), this)); } @@ -114,6 +115,7 @@ io_offset = 0; m_ram.resize(m_ram_size/4); + m_smm_ram.resize(SMM_SIZE/4); } void mediagx_host_device::device_reset() @@ -134,6 +136,17 @@ remap_cb(); } +void mediagx_host_device::device_add_mconfig(machine_config &config) +{ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); + screen.set_screen_update(m_vga, FUNC(mediagx_vga_device::screen_update)); + + MEDIAGX_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); + m_vga->set_vram_size(4*1024*1024); +} + void mediagx_host_device::config_map(address_map &map) { pci_host_device::config_map(map); @@ -200,7 +213,11 @@ ); memory_space->install_ram(0x00000000, 0x0009ffff, &m_ram[0x00000000/4]); -// memory_space->install_ram(0x000a0000, 0x000bffff, &m_ram[0x000a0000/4]); + // TODO: BC_XMAP_1, which is always 0 in both astropc and matrix (???) + //memory_space->install_ram(0x000a0000, 0x000bffff, &m_ram[0x000a0000/4]); + memory_space->install_device(0x000a0000, 0x000bffff, *this, &mediagx_host_device::legacy_memory_map); + io_space->install_device(0x03b0, 0x03df, *this, &mediagx_host_device::legacy_io_map); + LOGMAP("Host Remapping table (BC_XMAP_1 %08x BC_XMAP_2 %08x BC_XMAP_3):\n", m_bc_xmap[0], m_bc_xmap[1], m_bc_xmap[2]); // BC_XMAP_2 & BC_XMAP_3 bits remaps with this arrangement: @@ -241,7 +258,7 @@ if (gx_base) { - LOG("gxbase mapped at %08x\n", gx_base); + LOGMAP("gxbase mapped at %08x\n", gx_base); memory_space->install_device(gx_base, (gx_base) | 0xffffff, *this, &mediagx_host_device::gxbase_map); } } @@ -249,20 +266,110 @@ void mediagx_host_device::gxbase_map(address_map &map) { // 0x001000 scratchpad -// 0x008000 Internal bus I/F Unit + map(0x008000, 0x008003).lrw32( + NAME([this] (offs_t offset) { + return m_bc_dram_top; + }), + NAME([this] (offs_t offset, u32 data, u32 mem_mask) { + LOG("GXBASE+%04x: BC_DRAM_TOP %08x & %08x\n", (offset * 4) + 0x8000, data, mem_mask); + COMBINE_DATA(&m_bc_dram_top); + remap_cb(); + }) + ); map(0x008004, 0x00800f).lrw32( NAME([this] (offs_t offset) { return m_bc_xmap[offset]; }), NAME([this] (offs_t offset, u32 data, u32 mem_mask) { + LOG("GXBASE+%04x: BC_XMAP_%d %08x & %08x\n", (offset * 4) + 0x8004, offset + 1, data, mem_mask); COMBINE_DATA(&m_bc_xmap[offset]); remap_cb(); }) ); -// 0x008100 GFX pipeline -// 0x008300 Display controller + map(0x008100, 0x0082ff).m(*this, FUNC(mediagx_host_device::gfx_pipeline_map)); + map(0x008300, 0x0083ff).m(*this, FUNC(mediagx_host_device::display_ctrl_map)); // 0x008400 Memory controller // 0x008500 Power Management -// 0x400000 SMM System Code + // SMM System Code + map(0x400000, 0x41ffff).lrw32( + NAME([this] (offs_t offset) { return m_smm_ram[offset]; }), + NAME([this] (offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_smm_ram[offset]); }) + ); // 0x800000 GFX memory } + +/**************************** + * + * Graphics Pipeline + * + ***************************/ + +// GX_BASE+$8100 +void mediagx_host_device::gfx_pipeline_map(address_map &map) +{ +// map(0x0000, 0x012f) +// map(0x0140, 0x0143) GP_VGA_WRITE +// map(0x0144, 0x0147) GP_VGA_READ +// map(0x0200, 0x020f) +// map(0x0210, 0x0213) GGP_VGA_BASE (sic?) +// map(0x0214, 0x0217) GP_VGA_LATCH +} + +/**************************** + * + * Display Controller + * + ***************************/ + +// GX_BASE+$8300 +void mediagx_host_device::display_ctrl_map(address_map &map) +{ +// map(0x0000, 0x0003) DC_UNLOCK +// map(0x0004, 0x0007) DC_GENERAL_CFG +// map(0x0008, 0x000b) DC_TIMING_CFG +// map(0x000c, 0x000f) DC_OUTPUT_CFG +// map(0x0010, 0x0013) DC_FB_ST_OFFSET +// map(0x0014, 0x0017) DC_CB_ST_OFFSET +// map(0x0018, 0x001b) DC_CURS_ST_OFFSET +// map(0x0020, 0x0023) DC_VID_ST_OFFSET +// map(0x0024, 0x0027) DC_LINE_DELTA +// map(0x0028, 0x002b) DC_BUF_SIZE +// map(0x0030, 0x0033) DC_H_TIMING_1 +// map(0x0033, 0x0037) DC_H_TIMING_2 +// map(0x0038, 0x003b) DC_H_TIMING_3 +// map(0x003c, 0x003f) DC_FP_H_TIMING +// map(0x0040, 0x0043) DC_V_TIMING_1 +// map(0x0044, 0x0047) DC_V_TIMING_2 +// map(0x0048, 0x004b) DC_V_TIMING_3 +// map(0x004c, 0x004f) DC_FP_V_TIMING +// map(0x0050, 0x0053) DC_CURSOR_X +// map(0x0054, 0x0057) DC_V_LINE_CNT +// map(0x0058, 0x005b) DC_CURSOR_Y +// map(0x005c, 0x005f) DC_SS_LINE_CMP +// map(0x0060, 0x0063) DC_CURSOR_COLOR +// map(0x0068, 0x006b) DC_BORDER_COLOR +// map(0x0070, 0x0073) DC_PAL_ADDRESS +// map(0x0074, 0x0077) DC_PAL_DATA +// map(0x0078, 0x007b) DC_DFIFO_DIAG +// map(0x007c, 0x007f) DC_CFIFO_DIAG +} + +void mediagx_host_device::legacy_memory_map(address_map &map) +{ + map(0x00000, 0x1ffff).rw(FUNC(mediagx_host_device::vram_r), FUNC(mediagx_host_device::vram_w)); +} + +void mediagx_host_device::legacy_io_map(address_map &map) +{ + map(0x000, 0x02f).m(m_vga, FUNC(mediagx_vga_device::io_map)); +} + +uint8_t mediagx_host_device::vram_r(offs_t offset) +{ + return downcast(m_vga.target())->mem_r(offset); +} + +void mediagx_host_device::vram_w(offs_t offset, uint8_t data) +{ + downcast(m_vga.target())->mem_w(offset, data); +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/mediagx_host.h mame-0.264+dfsg.1/src/devices/machine/mediagx_host.h --- mame-0.263+dfsg.1/src/devices/machine/mediagx_host.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mediagx_host.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,6 +7,7 @@ #pragma once #include "pci.h" +#include "video/pc_vga_mediagx.h" class mediagx_host_device : public pci_host_device { @@ -28,6 +29,7 @@ protected: virtual void device_start() override; virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; @@ -42,7 +44,9 @@ AS_PCI_IO = 2 }; required_device m_host_cpu; + required_device m_vga; std::vector m_ram; + std::vector m_smm_ram; address_space_config m_superio_space_config; void superio_map(address_map &map); @@ -55,13 +59,23 @@ u8 gcr = 0; }m_superio; - int m_ram_size = 0; + u32 m_ram_size = 0; + // FIXME: check size + static constexpr u32 SMM_SIZE = 0x20000; u8 m_pci_control[2]{}; u8 m_pci_arbitration[2]{}; void gxbase_map(address_map &map); + void gfx_pipeline_map(address_map &map); + void display_ctrl_map(address_map &map); + u32 m_bc_dram_top = 0; u32 m_bc_xmap[3]{}; + + void legacy_memory_map(address_map &map); + void legacy_io_map(address_map &map); + u8 vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); }; DECLARE_DEVICE_TYPE(MEDIAGX_HOST, mediagx_host_device) diff -Nru mame-0.263+dfsg.1/src/devices/machine/mpu401.cpp mame-0.264+dfsg.1/src/devices/machine/mpu401.cpp --- mame-0.263+dfsg.1/src/devices/machine/mpu401.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/mpu401.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,7 +145,7 @@ TIMER_CALLBACK_MEMBER(mpu401_device::serial_tick) { - m_ourcpu->m6801_clock_serial(); + m_ourcpu->clock_serial(); } uint8_t mpu401_device::port1_r() diff -Nru mame-0.263+dfsg.1/src/devices/machine/msm5001n.cpp mame-0.264+dfsg.1/src/devices/machine/msm5001n.cpp --- mame-0.263+dfsg.1/src/devices/machine/msm5001n.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/msm5001n.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -171,14 +171,14 @@ bool msm5001n_device::nvram_write(util::write_stream &file) { - size_t actual; u8 buf[5]; // current time for (int i = 0; i < 5; i++) buf[i] = get_clock_register(i); - if (file.write(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + auto const [err, actual] = write(file, &buf, sizeof(buf)); + if (err) return false; return true; @@ -186,10 +186,9 @@ bool msm5001n_device::nvram_read(util::read_stream &file) { - size_t actual; - u8 buf[5]; - if (file.read(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + auto const [err, actual] = read(file, &buf, sizeof(buf)); + if (err || (sizeof(buf) != actual)) return false; // current time diff -Nru mame-0.263+dfsg.1/src/devices/machine/msm58321.cpp mame-0.264+dfsg.1/src/devices/machine/msm58321.cpp --- mame-0.263+dfsg.1/src/devices/machine/msm58321.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/msm58321.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -348,8 +348,8 @@ bool msm58321_device::nvram_read(util::read_stream &file) { - size_t actual; - if (file.read(m_reg.data(), m_reg.size(), actual) || actual != m_reg.size()) + auto const [err, actual] = read(file, m_reg.data(), m_reg.size()); + if (err || (actual != m_reg.size())) return false; clock_updated(); @@ -364,8 +364,8 @@ bool msm58321_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_reg.data(), m_reg.size(), actual) && actual == m_reg.size(); + auto const [err, actual] = write(file, m_reg.data(), m_reg.size()); + return !err; } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/machine/nandflash.cpp mame-0.264+dfsg.1/src/devices/machine/nandflash.cpp --- mame-0.263+dfsg.1/src/devices/machine/nandflash.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/nandflash.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -231,16 +231,16 @@ bool nand_device::nvram_read(util::read_stream &file) { - size_t actual; - uint32_t size = m_page_total_size * m_num_pages; - return !file.read(&m_feeprom_data[0], size, actual) && actual == size; + uint32_t const size = m_page_total_size * m_num_pages; + auto const [err, actual] = read(file, &m_feeprom_data[0], size); + return !err && (actual == size); } bool nand_device::nvram_write(util::write_stream &file) { - size_t actual; - uint32_t size = m_page_total_size * m_num_pages; - return !file.write(&m_feeprom_data[0], size, actual) && actual == size; + uint32_t const size = m_page_total_size * m_num_pages; + auto const [err, actual] = write(file, &m_feeprom_data[0], size); + return !err; } int nand_device::is_present() diff -Nru mame-0.263+dfsg.1/src/devices/machine/ncr5385.cpp mame-0.264+dfsg.1/src/devices/machine/ncr5385.cpp --- mame-0.263+dfsg.1/src/devices/machine/ncr5385.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ncr5385.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,119 +1,841 @@ // license:BSD-3-Clause // copyright-holders:Ryan Holtz -/*********************************************************************** - NCR 5385E SCSI Controller - - TOOD: - - Everything. - -***********************************************************************/ +/* + * NCR 5385 SCSI Protocol Controller + * + * Sources: + * - NCR 5385 SCSI Protocol Controller, 1983, NCR Corporation, Dayton, Ohio, USA + * - NCR SCSI Engineering Notebook, 1984, NCR Microelectronics + * + * TODO: + * - target mode send/receive + * - disconnect/reselection + */ #include "emu.h" #include "ncr5385.h" -DEFINE_DEVICE_TYPE(NCR5385, ncr5385_device, "ncr5385", "NCR 5385E SCSI Controller") +#define LOG_GENERAL (1U << 0) +#define LOG_REGW (1U << 1) +#define LOG_REGR (1U << 2) +#define LOG_STATE (1U << 3) +#define LOG_DMA (1U << 4) +#define LOG_COMMAND (1U << 5) + +//#define VERBOSE (LOG_GENERAL|LOG_REGW|LOG_REGR|LOG_STATE|LOG_DMA|LOG_COMMAND) +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(NCR5385, ncr5385_device, "ncr5385", "NCR 5385 SCSI Protocol Controller") -ncr5385_device::ncr5385_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NCR5385, tag, owner, clock) +// FIXME: would be better to reuse from nscsi_full_device +unsigned constexpr SCSI_ARB_DELAY = 2'400; +unsigned constexpr SCSI_BUS_CLEAR = 800; +unsigned constexpr SCSI_BUS_FREE = 800; +unsigned constexpr SCSI_BUS_SETTLE = 400; +unsigned constexpr SCSI_BUS_SKEW = 10; +unsigned constexpr SCSI_RST_HOLD = 25'000; +unsigned constexpr SCSI_SEL_TIMEOUT = 250'000'000; + +ncr5385_device::ncr5385_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : nscsi_device(mconfig, NCR5385, tag, owner, clock) + , nscsi_slot_card_interface(mconfig, *this, DEVICE_SELF) , m_int(*this) + , m_dreq(*this) + , m_int_state(false) + , m_dreq_state(false) { } +enum state : u32 +{ + IDLE, + DIAGNOSTIC, + + ARB_BUS_FREE, + ARB_START, + ARB_EVALUATE, + SEL_START, + SEL_DELAY, + SEL_WAIT_BSY, + SEL_COMPLETE, + SEL_WAIT_REQ, + + XFI_START, + XFI_IN_REQ, + XFI_IN_DRQ, + XFI_IN_ACK, + XFI_OUT_REQ, + XFI_OUT_DRQ, + XFI_OUT_ACK, + XFI_OUT_PAD, +}; + +enum mode : u8 +{ + DISCONNECTED, + INITIATOR, + TARGET, +}; + +enum diag_mask : u8 +{ + DIAG_SELF = 0x07, // self-diagnostic status + DIAG_CMD = 0x38, // diagnostic command status + DIAG_DONE = 0x80, // self-diagnostic complete + + DIAG_CMD_GP = 0x18, // diagnostic good parity + DIAG_CMD_BP = 0x20, // diagnostic bad parity +}; + +enum int_mask : u8 +{ + INT_FUNC_COMPLETE = 0x01, + INT_BUS_SERVICE = 0x02, + INT_DISCONNECTED = 0x04, + INT_SELECTED = 0x08, + INT_RESELECTED = 0x10, + INT_INVALID_CMD = 0x40, +}; + +enum aux_status_mask : u8 +{ + AUX_STATUS_TC_ZERO = 0x02, + AUX_STATUS_PAUSED = 0x04, + AUX_STATUS_IO = 0x08, + AUX_STATUS_CD = 0x10, + AUX_STATUS_MSG = 0x20, + AUX_STATUS_PARITY_ERR = 0x40, + AUX_STATUS_DATA_FULL = 0x80, +}; + +enum cmd_mask : u8 +{ + CMD_INT = 0x08, // interrupting + CMD_SBX = 0x40, // single byte transfer + CMD_DMA = 0x80, // DMA mode +}; + void ncr5385_device::device_start() { + save_item(NAME(m_dat)); + save_item(NAME(m_cmd)); + save_item(NAME(m_ctl)); + save_item(NAME(m_dst_id)); + save_item(NAME(m_aux_status)); + save_item(NAME(m_own_id)); + save_item(NAME(m_int_status)); + save_item(NAME(m_src_id)); + save_item(NAME(m_dia_status)); + save_item(NAME(m_cnt)); + + save_item(NAME(m_state)); + save_item(NAME(m_phase)); + save_item(NAME(m_mode)); + save_item(NAME(m_sbx)); + + save_item(NAME(m_int_state)); + save_item(NAME(m_dreq_state)); + + m_state_timer = timer_alloc(timer_expired_delegate(FUNC(ncr5385_device::state_timer), this)); + + m_dia_status = DIAG_DONE; } void ncr5385_device::device_reset() { - m_state = STATE_IDLE; - m_int_reg = 0; - m_ctrl_reg = 0; - m_aux_status_reg = AUX_STATUS_TC_ZERO; - m_diag_status_reg = DIAG_COMPLETE; -} - -void ncr5385_device::write(offs_t offset, uint8_t data) -{ - switch (offset) - { - case 0x0: // Data Register - switch (m_state) - { - case STATE_DIAGNOSTIC_GOOD_PARITY: - m_aux_status_reg &= ~AUX_STATUS_PARITY_ERR; - m_aux_status_reg |= AUX_STATUS_DATA_FULL; - m_int_reg = INT_FUNC_COMPLETE; - m_diag_status_reg = DIAG_COMPLETE | DIAG_TURN_GOOD_PARITY; - m_state = STATE_IDLE; - m_int(1); - logerror("%s: ncr5385_w: data=%02x (diagnostic w/ good parity)\n", machine().describe_context(), data); - break; - case STATE_DIAGNOSTIC_BAD_PARITY: - m_aux_status_reg |= AUX_STATUS_PARITY_ERR | AUX_STATUS_DATA_FULL; - m_int_reg = INT_FUNC_COMPLETE; - m_diag_status_reg = DIAG_COMPLETE | DIAG_TURN_BAD_PARITY; - m_state = STATE_IDLE; - m_int(1); - logerror("%s: ncr5385_w: data=%02x (diagnostic w/ bad parity)\n", machine().describe_context(), data); - break; - default: - logerror("%s: ncr5385_w: data=%02x\n", machine().describe_context(), data); - break; - } - break; - case 0x1: // Command Register - switch (data & 0x3f) - { - case 0x00: // Chip Reset - logerror("%s: ncr5385_w: command: reset\n", machine().describe_context()); - m_state = STATE_IDLE; - m_int_reg = 0; - m_aux_status_reg = AUX_STATUS_TC_ZERO; - m_diag_status_reg = DIAG_COMPLETE; - m_int(0); - break; - case 0x0b: // Diagnostic - logerror("%s: ncr5385_w: command: diagnostic (%s parity)\n", machine().describe_context(), BIT(data, 6) ? "bad" : "good"); - if (BIT(data, 6)) - m_state = STATE_DIAGNOSTIC_BAD_PARITY; - else - m_state = STATE_DIAGNOSTIC_GOOD_PARITY; - break; - default: - logerror("%s: ncr5385_w: command: %02x\n", machine().describe_context(), data); - break; - } - break; - case 0x2: // Control Register - m_ctrl_reg = data & 0x07; - logerror("%s: ncr5385_w: control: parity_en=%d, reselect_en=%d, select_en=%d\n", machine().describe_context(), BIT(data, CTRL_PARITY_BIT), BIT(data, CTRL_RESELECT_BIT), BIT(data, CTRL_SELECT_BIT)); - break; - default: - logerror("%s: ncr5385_w: %x=%02x\n", machine().describe_context(), offset, data); - break; - } -} - -uint8_t ncr5385_device::read(offs_t offset) -{ - switch (offset) - { - case 0x2: - logerror("%s: ncr5385_r: control (%02x)\n", machine().describe_context(), m_ctrl_reg); - return m_ctrl_reg; - case 0x4: - logerror("%s: ncr5385_r: aux status (%02x)\n", machine().describe_context(), m_aux_status_reg); - return m_aux_status_reg; - case 0x6: - logerror("%s: ncr5385_r: interrupt (%02x)\n", machine().describe_context(), m_int_reg); - m_int(1); - return m_int_reg; - case 0x9: - logerror("%s: ncr5385_r: diagnostic status (%02x)\n", machine().describe_context(), m_diag_status_reg); - return m_diag_status_reg; - default: - logerror("%s: ncr5385_r: %x (%02x)\n", machine().describe_context(), offset, 0); - return 0; + m_cmd = 0; + m_ctl = 0; + m_dst_id = 0; + m_aux_status = AUX_STATUS_TC_ZERO; + m_int_status = 0; + m_src_id = 0; + m_dia_status &= (DIAG_DONE | DIAG_SELF); + m_cnt = 0; + + m_state = IDLE; + m_mode = DISCONNECTED; + m_sbx = false; + + // monitor all control lines (device has no RST line) + scsi_bus->ctrl_wait(scsi_refid, S_ALL & ~S_RST, S_ALL & ~S_RST); + + update_int(); +} + +void ncr5385_device::scsi_ctrl_changed() +{ + u32 const ctrl = scsi_bus->ctrl_r(); + + static char const *const nscsi_phase[] = { "DATA OUT", "DATA IN", "COMMAND", "STATUS", "*", "*", "MESSAGE OUT", "MESSAGE IN" }; + + if ((ctrl & S_BSY) && !(ctrl & S_SEL)) + { + LOGMASKED(LOG_STATE, "scsi_ctrl_changed 0x%03x phase %s%s%s\n", ctrl, nscsi_phase[ctrl & S_PHASE_MASK], + ctrl & S_REQ ? " REQ" : "", ctrl & S_ACK ? " ACK" : ""); + + if (m_state != IDLE) + m_state_timer->adjust(attotime::zero); + } + else if (ctrl & S_BSY) + LOGMASKED(LOG_STATE, "scsi_ctrl_changed 0x%03x arbitration/selection\n", ctrl); + else + { + LOGMASKED(LOG_STATE, "scsi_ctrl_changed 0x%03x BUS FREE\n", ctrl); + + if (m_mode == INITIATOR) + { + m_mode = DISCONNECTED; + m_int_status |= INT_DISCONNECTED; + update_int(); + } + } +} + +void ncr5385_device::map(address_map &map) +{ + map(0x0, 0x0).rw(FUNC(ncr5385_device::dat_r), FUNC(ncr5385_device::dat_w)); + map(0x1, 0x1).rw(FUNC(ncr5385_device::cmd_r), FUNC(ncr5385_device::cmd_w)); + map(0x2, 0x2).rw(FUNC(ncr5385_device::ctl_r), FUNC(ncr5385_device::ctl_w)); + map(0x3, 0x3).rw(FUNC(ncr5385_device::dst_id_r), FUNC(ncr5385_device::dst_id_w)); + map(0x4, 0x4).r(FUNC(ncr5385_device::aux_status_r)); + map(0x5, 0x5).r(FUNC(ncr5385_device::own_id_r)); + map(0x6, 0x6).r(FUNC(ncr5385_device::int_status_r)); + map(0x7, 0x7).r(FUNC(ncr5385_device::src_id_r)); + map(0x9, 0x9).r(FUNC(ncr5385_device::dia_status_r)); + map(0xc, 0xc).rw(FUNC(ncr5385_device::cnt_r<2>), FUNC(ncr5385_device::cnt_w<2>)); + map(0xd, 0xd).rw(FUNC(ncr5385_device::cnt_r<1>), FUNC(ncr5385_device::cnt_w<1>)); + map(0xe, 0xe).rw(FUNC(ncr5385_device::cnt_r<0>), FUNC(ncr5385_device::cnt_w<0>)); + map(0xf, 0xf).rw(FUNC(ncr5385_device::tst_r), FUNC(ncr5385_device::tst_w)); +} + +u8 ncr5385_device::dat_r() +{ + if (m_aux_status & AUX_STATUS_DATA_FULL) + { + m_aux_status &= ~AUX_STATUS_DATA_FULL; + + if (m_state != IDLE) + m_state_timer->adjust(attotime::zero); + } + else + logerror("data register empty (%s)\n", machine().describe_context()); + + return m_dat; +} + +u8 ncr5385_device::cmd_r() +{ + return m_cmd; +} + +u8 ncr5385_device::ctl_r() +{ + return m_ctl; +} + +u8 ncr5385_device::dst_id_r() +{ + return m_dst_id; +} + +u8 ncr5385_device::aux_status_r() +{ + u8 data = m_aux_status; + + if (!m_int_status) + { + // return current phase + u32 const ctrl = scsi_bus->ctrl_r(); + if (ctrl & S_MSG) + data |= AUX_STATUS_MSG; + if (ctrl & S_CTL) + data |= AUX_STATUS_CD; + if (ctrl & S_INP) + data |= AUX_STATUS_IO; + } + LOGMASKED(LOG_REGR, "aux_status_r 0x%02x (%s)\n", data, machine().describe_context()); + + return data; +} + +u8 ncr5385_device::own_id_r() +{ + return m_own_id; +} + +u8 ncr5385_device::int_status_r() +{ + u8 const data = m_int_status; + LOGMASKED(LOG_REGR, "int_status_r 0x%02x (%s)\n", data, machine().describe_context()); + m_aux_status &= ~AUX_STATUS_PARITY_ERR; + m_int_status = 0; + update_int(); + + if (m_state != IDLE) + m_state_timer->adjust(attotime::zero); + + return data; +} + +u8 ncr5385_device::src_id_r() +{ + return m_src_id; +} + +u8 ncr5385_device::dia_status_r() +{ + return m_dia_status; +} + +template u8 ncr5385_device::cnt_r() +{ + return u8(m_cnt >> (N * 8)); +} + +u8 ncr5385_device::tst_r() +{ + return 0; +} + +void ncr5385_device::dat_w(u8 data) +{ + LOGMASKED(LOG_REGW, "dat_w 0x%02x (%s)\n", data, machine().describe_context()); + + if (!(m_aux_status & AUX_STATUS_DATA_FULL)) + { + m_dat = data; + m_aux_status |= AUX_STATUS_DATA_FULL; + + if (m_state != IDLE) + m_state_timer->adjust(attotime::zero); + } + else + logerror("data register full\n"); +} + +void ncr5385_device::cmd_w(u8 data) +{ + LOGMASKED(LOG_REGW, "cmd_w 0x%02x (%s)\n", data, machine().describe_context()); + if (!(data & 0x18)) + { + // immediate commands + + switch (data & 0x1f) + { + case 0x00: + LOGMASKED(LOG_COMMAND, "reset\n"); + reset(); + break; + case 0x01: // disconnect + LOGMASKED(LOG_COMMAND, "disconnect\n"); + m_mode = DISCONNECTED; + break; + case 0x02: // pause + LOGMASKED(LOG_COMMAND, "pause\n"); + break; + case 0x03: // set atn + LOGMASKED(LOG_COMMAND, "set atn\n"); + scsi_bus->ctrl_w(scsi_refid, S_ATN, S_ATN); + break; + case 0x04: // message accepted + LOGMASKED(LOG_COMMAND, "message accepted\n"); + scsi_bus->ctrl_w(scsi_refid, 0, S_ACK); + break; + case 0x05: // chip disabled + LOGMASKED(LOG_COMMAND, "chip disabled\n"); + break; + case 0x06: case 0x07: + // reserved + break; + } + } + else + { + // interrupting commands + m_aux_status &= ~AUX_STATUS_DATA_FULL; + m_cmd = data; + + switch (data & 0x1f) + { + case 0x08: // select w/atn + LOGMASKED(LOG_COMMAND, "select %d w/atn (timeout %d)\n", m_dst_id, attotime::from_ticks(m_cnt * 1024, clock()).to_string()); + m_state = ARB_BUS_FREE; + m_state_timer->adjust(attotime::zero); + break; + case 0x09: // select w/o atn + LOGMASKED(LOG_COMMAND, "select %d w/o atn (timeout %d)\n", m_dst_id, attotime::from_ticks(m_cnt * 1024, clock()).to_string()); + m_state = ARB_BUS_FREE; + m_state_timer->adjust(attotime::zero); + break; + case 0x0a: // reselect + LOGMASKED(LOG_COMMAND, "reselect\n"); + break; + case 0x0b: // diagnostic + LOGMASKED(LOG_COMMAND, "diagnostic (%s parity)\n", BIT(data, 6) ? "bad" : "good"); + m_state = DIAGNOSTIC; + break; + case 0x0c: // receive command + LOGMASKED(LOG_COMMAND, "receive command\n"); + break; + case 0x0d: // receive data + LOGMASKED(LOG_COMMAND, "receive data\n"); + break; + case 0x0e: // receive message out + LOGMASKED(LOG_COMMAND, "receive message out\n"); + break; + case 0x0f: // receive unspecified info out + LOGMASKED(LOG_COMMAND, "receive unspecified info out\n"); + break; + case 0x10: // send status + LOGMASKED(LOG_COMMAND, "send status\n"); + break; + case 0x11: // send data + LOGMASKED(LOG_COMMAND, "send data\n"); + break; + case 0x12: // send message in + LOGMASKED(LOG_COMMAND, "send message in\n"); + break; + case 0x13: // send unspecified info in + LOGMASKED(LOG_COMMAND, "send unspecified info in\n"); + break; + case 0x14: // transfer info + if (data & CMD_SBX) + LOGMASKED(LOG_COMMAND, "transfer info (%s, single byte)\n", (data & CMD_DMA) ? "dma" : "pio"); + else + LOGMASKED(LOG_COMMAND, "transfer info (%s, count=%d)\n", (data & CMD_DMA) ? "dma" : "pio", m_cnt); + m_state = XFI_START; + m_sbx = data & CMD_SBX; + m_state_timer->adjust(attotime::zero); + break; + case 0x15: // transfer pad + if (data & CMD_SBX) + LOGMASKED(LOG_COMMAND, "transfer pad (%s, single byte)\n", (data & CMD_DMA) ? "dma" : "pio"); + else + LOGMASKED(LOG_COMMAND, "transfer pad (%s, count=%d)\n", (data & CMD_DMA) ? "dma" : "pio", m_cnt); + m_state = XFI_START; + m_sbx = data & CMD_SBX; + m_state_timer->adjust(attotime::zero); + break; + case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: + // reserved + break; + } + } +} + +void ncr5385_device::ctl_w(u8 data) +{ + LOGMASKED(LOG_REGW, "ctl_w 0x%02x (%s)\n", data, machine().describe_context()); + + m_ctl = data & 7; +} + +void ncr5385_device::dst_id_w(u8 data) +{ + LOGMASKED(LOG_REGW, "dst_id_w 0x%02x (%s)\n", data, machine().describe_context()); + m_dst_id = (data & 7); +} + +template void ncr5385_device::cnt_w(u8 data) +{ + m_cnt = (m_cnt & ~(u32(0xff) << (N * 8))) | (u32(data) << (N * 8)); + + if (m_cnt) + m_aux_status &= ~AUX_STATUS_TC_ZERO; + else + m_aux_status |= AUX_STATUS_TC_ZERO; +} + +void ncr5385_device::tst_w(u8 data) +{ + LOGMASKED(LOG_REGW, "tst_w 0x%02x (%s)\n", data, machine().describe_context()); +} + +u8 ncr5385_device::dma_r() +{ + u8 const data = m_dat; + m_aux_status &= ~AUX_STATUS_DATA_FULL; + + set_dreq(false); + m_state_timer->adjust(attotime::zero); + + return data; +} + +void ncr5385_device::dma_w(u8 data) +{ + m_dat = data; + m_aux_status |= AUX_STATUS_DATA_FULL; + + set_dreq(false); + m_state_timer->adjust(attotime::zero); +} + +void ncr5385_device::state_timer(s32 param) +{ + // step state machine + int const delay = state_step(); + + // check for data stall + if (delay < 0) + return; + + // repeat until idle + if (m_state != IDLE) + m_state_timer->adjust(attotime::from_nsec(delay)); +} + +int ncr5385_device::state_step() +{ + u32 const ctrl = scsi_bus->ctrl_r(); + int delay = 0; + + u8 const oid = 1 << m_own_id; + u8 const tid = 1 << m_dst_id; + + switch (m_state) + { + case DIAGNOSTIC: + m_dia_status &= DIAG_DONE | DIAG_SELF; + if (BIT(m_cmd, 6)) + { + m_aux_status |= AUX_STATUS_PARITY_ERR; + m_dia_status |= DIAG_CMD_BP; + } + else + { + m_aux_status &= ~AUX_STATUS_PARITY_ERR; + m_dia_status |= DIAG_CMD_GP; + } + + m_int_status |= INT_FUNC_COMPLETE; + m_state = IDLE; + + update_int(); + break; + + case ARB_BUS_FREE: + LOGMASKED(LOG_STATE, "arbitration: waiting for bus free\n"); + if (!(ctrl & (S_SEL | S_BSY | S_RST))) + { + m_state = ARB_START; + delay = SCSI_BUS_FREE; + } + break; + case ARB_START: + LOGMASKED(LOG_STATE, "arbitration: started\n"); + m_state = ARB_EVALUATE; + delay = SCSI_ARB_DELAY; + + // assert own ID and BSY + scsi_bus->data_w(scsi_refid, oid); + scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY); + break; + case ARB_EVALUATE: + // check if SEL asserted, or if there's a higher ID on the bus + if ((ctrl & S_SEL) || (scsi_bus->data_r() & ~((oid - 1) | oid))) + { + LOGMASKED(LOG_STATE, "arbitration: lost\n"); + m_state = ARB_BUS_FREE; + + // clear data and BSY + scsi_bus->data_w(scsi_refid, 0); + scsi_bus->ctrl_w(scsi_refid, 0, S_BSY); + } + else + { + LOGMASKED(LOG_STATE, "arbitration: won\n"); + m_state = SEL_START; + delay = SCSI_BUS_CLEAR + SCSI_BUS_SETTLE; + } + break; + + case SEL_START: + LOGMASKED(LOG_STATE, "selection: SEL asserted\n"); + m_state = SEL_DELAY; + delay = SCSI_BUS_SKEW * 2; + + // assert own and target ID and SEL + scsi_bus->data_w(scsi_refid, oid | tid); + scsi_bus->ctrl_w(scsi_refid, S_SEL, S_SEL); + break; + case SEL_DELAY: + LOGMASKED(LOG_STATE, "selection: BSY cleared\n"); + m_state = SEL_WAIT_BSY; + delay = SCSI_SEL_TIMEOUT; + + // clear BSY, optionally assert ATN + if (!BIT(m_cmd, 0)) + scsi_bus->ctrl_w(scsi_refid, S_ATN, S_BSY | S_ATN); + else + scsi_bus->ctrl_w(scsi_refid, 0, S_BSY); + break; + case SEL_WAIT_BSY: + if (ctrl & S_BSY) + { + LOGMASKED(LOG_STATE, "selection: BSY asserted by target\n"); + m_state = SEL_COMPLETE; + delay = SCSI_BUS_SKEW * 2; + } + else + { + LOGMASKED(LOG_STATE, "selection: timed out\n"); + m_int_status |= INT_DISCONNECTED; + m_state = IDLE; + + scsi_bus->ctrl_w(scsi_refid, 0, S_ATN | S_SEL); + + update_int(); + } + break; + case SEL_COMPLETE: + LOGMASKED(LOG_STATE, "selection: complete\n"); + m_int_status |= INT_FUNC_COMPLETE; + m_mode = INITIATOR; + m_state = SEL_WAIT_REQ; + delay = -1; + + update_int(); + + // clear data and SEL + scsi_bus->data_w(scsi_refid, 0); + scsi_bus->ctrl_w(scsi_refid, 0, S_SEL); + break; + case SEL_WAIT_REQ: + // don't generate bus service interrupt until the function complete is cleared + if ((ctrl & S_REQ) && !m_int_state) + { + LOGMASKED(LOG_STATE, "selection: REQ asserted by target\n"); + m_int_status |= INT_BUS_SERVICE; + m_state = IDLE; + + update_int(); + } + else + delay = -1; + break; + + case XFI_START: + m_phase = ctrl & S_PHASE_MASK; + m_state = (ctrl & S_INP) ? XFI_IN_REQ : XFI_OUT_REQ; + break; + + case XFI_IN_REQ: + // TODO: disconnect + if (ctrl & S_REQ) + { + if (remaining() && (ctrl & S_PHASE_MASK) == m_phase) + { + m_state = XFI_IN_DRQ; + + // transfer pad in doesn't transfer any data + if (!BIT(m_cmd, 0)) + { + m_aux_status |= AUX_STATUS_DATA_FULL; + m_dat = scsi_bus->data_r(); + + if (m_cmd & CMD_DMA) + set_dreq(true); + + delay = -1; + } + } + else + { + LOGMASKED(LOG_STATE, "xfi_in: %s\n", remaining() ? "phase change" : "transfer complete"); + + m_int_status |= INT_BUS_SERVICE; + m_state = IDLE; + + update_int(); + } + } + else + delay = -1; + break; + case XFI_IN_DRQ: + m_state = XFI_IN_ACK; + + LOGMASKED(LOG_STATE, "xfi_in: data 0x%02x\n", m_dat); + + // assert ACK + scsi_bus->ctrl_w(scsi_refid, S_ACK, S_ACK); + break; + case XFI_IN_ACK: + if (!(ctrl & S_REQ)) + { + m_state = XFI_IN_REQ; + + if (!(m_cmd & CMD_SBX)) + { + m_cnt--; + + LOGMASKED(LOG_STATE, "xfi_in: %d remaining\n", m_cnt); + + if (!m_cnt) + m_aux_status |= AUX_STATUS_TC_ZERO; + } + else + m_sbx = false; + + // clear ACK except after last byte of message input phase + if (!remaining() && (ctrl & S_PHASE_MASK) == S_PHASE_MSG_IN) + { + m_int_status |= INT_FUNC_COMPLETE; + m_state = IDLE; + + update_int(); + } + else + scsi_bus->ctrl_w(scsi_refid, 0, S_ACK); + } + else + delay = -1; + break; + + case XFI_OUT_REQ: + if (ctrl & S_REQ) + { + // TODO: disconnect + if (remaining() && (ctrl & S_PHASE_MASK) == m_phase) + { + m_state = XFI_OUT_DRQ; + + // FIXME: only one byte dma for transfer pad + if (m_cmd & CMD_DMA) + set_dreq(true); + + if (!(m_aux_status & AUX_STATUS_DATA_FULL)) + delay = -1; + } + else + { + LOGMASKED(LOG_STATE, "xfi_out: %s\n", remaining() ? "phase change" : "transfer complete"); + m_int_status |= INT_BUS_SERVICE; + m_state = IDLE; + + update_int(); + } + } + else + delay = -1; + break; + case XFI_OUT_DRQ: + m_state = XFI_OUT_ACK; + m_aux_status &= ~AUX_STATUS_DATA_FULL; + + LOGMASKED(LOG_STATE, "xfi_out: data 0x%02x\n", m_dat); + + // assert data and ACK + scsi_bus->data_w(scsi_refid, m_dat); + if (remaining(1) && (ctrl & S_PHASE_MASK) == S_PHASE_MSG_OUT) + scsi_bus->ctrl_w(scsi_refid, S_ACK, S_ACK | S_ATN); + else + scsi_bus->ctrl_w(scsi_refid, S_ACK, S_ACK); + break; + case XFI_OUT_ACK: + if (!(ctrl & S_REQ)) + { + if (BIT(m_cmd, 0)) + m_state = XFI_OUT_PAD; + else + m_state = XFI_OUT_REQ; + + if (!(m_cmd & CMD_SBX)) + { + m_cnt--; + + LOGMASKED(LOG_STATE, "xfi_out: %d remaining\n", m_cnt); + + if (!m_cnt) + m_aux_status |= AUX_STATUS_TC_ZERO; + } + else + m_sbx = false; + + // clear data and ACK + scsi_bus->data_w(scsi_refid, 0); + scsi_bus->ctrl_w(scsi_refid, 0, S_ACK); + } + else + delay = -1; + break; + case XFI_OUT_PAD: + if (ctrl & S_REQ) + { + // TODO: disconnect + if (remaining() && (ctrl & S_PHASE_MASK) == m_phase) + m_state = XFI_OUT_DRQ; + else + { + LOGMASKED(LOG_STATE, "xfi_out: %s\n", remaining() ? "phase change" : "transfer complete"); + m_int_status |= INT_BUS_SERVICE; + m_state = IDLE; + + update_int(); + } + } + break; + } + + return delay; +} + +/* + * Returns a boolean indicating whether any data remains to be transferred: + * + * - for single byte transfer commands, m_sbx indicates data remaining + * - alternatively, return if there's a specific amount of data to transfer + * - otherwise, check if there's any data to transfer + */ +bool ncr5385_device::remaining(u32 const count) const +{ + if (m_cmd & CMD_SBX) + return m_sbx; + else if (count) + return m_cnt == count; + else + return m_cnt; +} + +void ncr5385_device::set_dreq(bool dreq) +{ + if (m_dreq_state != dreq) + { + LOGMASKED(LOG_DMA, "set_dreq %d\n", dreq); + + m_dreq_state = dreq; + m_dreq(m_dreq_state); + } +} + +void ncr5385_device::update_int() +{ + bool const int_state = m_int_status & 0x5f; + + if (m_int_state != int_state) + { + LOG("update_int %d\n", int_state); + + m_aux_status &= ~(AUX_STATUS_MSG | AUX_STATUS_CD | AUX_STATUS_IO); + if (int_state) + { + m_cmd = 0; + + // latch current phase + u32 const ctrl = scsi_bus->ctrl_r(); + if (ctrl & S_MSG) + m_aux_status |= AUX_STATUS_MSG; + if (ctrl & S_CTL) + m_aux_status |= AUX_STATUS_CD; + if (ctrl & S_INP) + m_aux_status |= AUX_STATUS_IO; + } + + m_int_state = int_state; + m_int(m_int_state); } } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ncr5385.h mame-0.264+dfsg.1/src/devices/machine/ncr5385.h --- mame-0.263+dfsg.1/src/devices/machine/ncr5385.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ncr5385.h 2024-03-25 14:00:46.000000000 +0000 @@ -4,11 +4,6 @@ NCR 5385 SCSI Controller emulation - TODO: - - Everything. Currently, just enough is implemented to make the - Philips VP415 CPU / Datagrabber board satisfied that the - controller has passed its internal diagnostics. - ************************************************************************ _____ _____ D2 1 |* \_/ | 48 VCC @@ -43,91 +38,89 @@ #pragma once +#include "machine/nscsi_bus.h" -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> ncr5385_device - -class ncr5385_device : public device_t +class ncr5385_device + : public nscsi_device + , public nscsi_slot_card_interface { public: - // construction/destruction - ncr5385_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - auto irq() { return m_int.bind(); } + auto dreq() { return m_dreq.bind(); } + + void set_own_id(unsigned id) { m_own_id = id; } + + ncr5385_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); - void write(offs_t offset, uint8_t data); - uint8_t read(offs_t offset); + void map(address_map &map); + + u8 dma_r(); + void dma_w(u8 data); protected: - // device-level overrides + // device_t implementation virtual void device_start() override; virtual void device_reset() override; -private: - enum - { - STATE_IDLE, - STATE_DIAGNOSTIC_GOOD_PARITY, - STATE_DIAGNOSTIC_BAD_PARITY, - }; - - enum - { - DIAG_TURN_MISCOMPARE_INITIAL = 0x08, - DIAG_TURN_MISCOMPARE_FINAL = 0x10, - DIAG_TURN_GOOD_PARITY = 0x18, - DIAG_TURN_BAD_PARITY = 0x20, - DIAG_COMPLETE = 0x80, - - DIAG_COMPLETE_BIT = 7, - }; - - enum - { - INT_FUNC_COMPLETE = 0x01, - INT_INVALID_CMD = 0x40, - - INT_FUNC_COMPLETE_BIT = 0, - INT_INVALID_CMD_BIT = 6, - }; - - enum - { - AUX_STATUS_TC_ZERO = 0x02, - AUX_STATUS_PAUSED = 0x04, - AUX_STATUS_PARITY_ERR = 0x40, - AUX_STATUS_DATA_FULL = 0x80, - - AUX_STATUS_TC_ZERO_BIT = 1, - AUX_STATUS_PAUSED_BIT = 2, - AUX_STATUS_PARITY_ERR_BIT = 6, - AUX_STATUS_DATA_FULL_BIT = 7, - }; - - enum - { - CTRL_SELECT = 0x01, - CTRL_RESELECT = 0x02, - CTRL_PARITY = 0x04, - - CTRL_SELECT_BIT = 0, - CTRL_RESELECT_BIT = 1, - CTRL_PARITY_BIT = 2, - }; + // ncsci_device implementation + virtual void scsi_ctrl_changed() override; + + // read handlers + u8 dat_r(); + u8 cmd_r(); + u8 ctl_r(); + u8 dst_id_r(); + u8 aux_status_r(); + u8 own_id_r(); + u8 int_status_r(); + u8 src_id_r(); + u8 dia_status_r(); + template u8 cnt_r(); + u8 tst_r(); + + // write handlers + void dat_w(u8 data); + void cmd_w(u8 data); + void ctl_w(u8 data); + void dst_id_w(u8 data); + template void cnt_w(u8 data); + void tst_w(u8 data); + + // state machine, interrupts and dma + void state_timer(s32 param); + int state_step(); + bool remaining(u32 const count = 0) const; + void update_int(); + void set_dreq(bool dreq); +private: devcb_write_line m_int; + devcb_write_line m_dreq; + + emu_timer *m_state_timer; + + // registers + u8 m_dat; + u8 m_cmd; + u8 m_ctl; + u8 m_dst_id; + u8 m_aux_status; + u8 m_own_id; + u8 m_int_status; + u8 m_src_id; + u8 m_dia_status; + u32 m_cnt; + + // other state + u32 m_state; + u8 m_phase; + u8 m_mode; + bool m_sbx; - uint32_t m_state; - uint8_t m_ctrl_reg; - uint8_t m_int_reg; - uint8_t m_aux_status_reg; - uint8_t m_diag_status_reg; + bool m_int_state; + bool m_dreq_state; }; -// device type definition DECLARE_DEVICE_TYPE(NCR5385, ncr5385_device) #endif // MAME_MACHINE_NCR5385_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/nmc9306.cpp mame-0.264+dfsg.1/src/devices/machine/nmc9306.cpp --- mame-0.263+dfsg.1/src/devices/machine/nmc9306.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/nmc9306.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -165,8 +165,8 @@ bool nmc9306_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_register, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = util::read(file, m_register, RAM_SIZE); + return !err && (actual == RAM_SIZE); } @@ -177,8 +177,8 @@ bool nmc9306_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_register, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = util::write(file, m_register, RAM_SIZE); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32081.cpp mame-0.264+dfsg.1/src/devices/machine/ns32081.cpp --- mame-0.263+dfsg.1/src/devices/machine/ns32081.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32081.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,7 +8,9 @@ * - Microprocessor Databook, Series 32000, NSC800, 1989 Edition, National Semiconductor * * TODO: - * - NS32381 + * - poly/scalb/logb/dot + * - ns32381 timing + * - no-result operations */ #include "emu.h" @@ -21,6 +23,7 @@ #include "logmacro.h" DEFINE_DEVICE_TYPE(NS32081, ns32081_device, "ns32081", "National Semiconductor NS32081 Floating-Point Unit") +DEFINE_DEVICE_TYPE(NS32381, ns32381_device, "ns32381", "National Semiconductor NS32381 Floating-Point Unit") enum fsr_mask : u32 { @@ -31,6 +34,7 @@ FSR_IF = 0x00000040, // inexact result flag FSR_RM = 0x00000180, // rounding mode FSR_SWF = 0x0000fe00, // software field + FSR_RMB = 0x00010000, // (32381 only) register modify bit }; enum rm_mask : u32 @@ -61,149 +65,159 @@ RESULT = 5, // result word available }; -enum idbyte : u8 -{ - FORMAT_9 = 0x3e, - FORMAT_11 = 0xbe, -}; - enum operand_length : unsigned { LENGTH_F = 4, // single precision LENGTH_L = 8, // double precision }; -enum size_code : unsigned -{ - SIZE_B = 0, - SIZE_W = 1, - SIZE_D = 3, -}; - -ns32081_device::ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) - : device_t(mconfig, NS32081, tag, owner, clock) - , ns32000_slow_slave_interface(mconfig, *this) +ns32081_device_base::ns32081_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , ns32000_fpu_interface(mconfig, *this) { } -void ns32081_device::device_start() +void ns32081_device_base::device_start() { save_item(NAME(m_fsr)); - save_item(NAME(m_f)); + save_item(NAME(m_state)); save_item(NAME(m_idbyte)); save_item(NAME(m_opword)); + save_item(STRUCT_MEMBER(m_op, expected)); save_item(STRUCT_MEMBER(m_op, issued)); save_item(STRUCT_MEMBER(m_op, value)); - save_item(NAME(m_status)); - save_item(NAME(m_state)); + save_item(NAME(m_status)); save_item(NAME(m_tcy)); m_complete = timer_alloc(FUNC(ns32081_device::complete), this); } -void ns32081_device::device_reset() +void ns32081_device_base::device_reset() { m_fsr = 0; - std::fill(std::begin(m_f), std::end(m_f), 0); - m_state = IDLE; + m_idbyte = 0; + m_opword = 0; + m_status = 0; + m_tcy = 0; } -void ns32081_device::state_add(device_state_interface &parent, int &index) +void ns32081_device_base::state_add(device_state_interface &parent, int &index) { parent.state_add(index++, "FSR", m_fsr).formatstr("%04X"); - - for (unsigned i = 0; i < 8; i++) - parent.state_add(index++, util::string_format("F%d", i).c_str(), m_f[i]).formatstr("%08X"); } -u16 ns32081_device::read_st(int *icount) +template T ns32081_device_base::read() { - if (m_state == STATUS) + if (m_state == RESULT && m_op[2].issued < m_op[2].expected) { - m_state = (m_op[2].issued == m_op[2].expected) ? IDLE : RESULT; + T const data = m_op[2].value >> (m_op[2].issued * 8); - if (icount) - *icount -= m_tcy; + m_op[2].issued += sizeof(T); - LOG("read_st status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, - (m_state == RESULT ? "results pending" : "complete"), machine().describe_context()); + LOG("read %d data 0x%0*x (%s)\n", + m_op[2].issued / sizeof(T), sizeof(T) * 2, data, machine().describe_context()); - return m_status; + if (m_op[2].issued == m_op[2].expected) + { + LOG("read complete\n"); + m_state = IDLE; + } + + return data; } - logerror("protocol error reading status word (%s)\n", machine().describe_context()); + logerror("read protocol error (%s)\n", machine().describe_context()); return 0; } -u16 ns32081_device::read_op() +template void ns32081_device_base::write(T data) { - if (m_state == RESULT && m_op[2].issued < m_op[2].expected) + switch (m_state) { - u16 const data = u16(m_op[2].value >> (m_op[2].issued * 8)); - LOG("read_op word %d data 0x%04x (%s)\n", m_op[2].issued >> 1, data, machine().describe_context()); - - m_op[2].issued += 2; + case IDLE: + if (sizeof(T) == 4) + { + // decode instruction + if (!decode(BIT(data, 24, 8), swapendian_int16(BIT(data, 8, 16)))) + return; - if (m_op[2].issued == m_op[2].expected) + m_state = OPERAND; + } + else { - LOG("read_op last result word issued\n"); - m_state = IDLE; + LOG("write idbyte 0x%04x (%s)\n", data, machine().describe_context()); + if ((data == FORMAT_9) || (data == FORMAT_11) || (type() == NS32381 && data == FORMAT_12)) + { + // record idbyte + m_idbyte = data; + + m_state = OPERATION; + } } + break; - return data; - } + case OPERATION: + LOG("write opword 0x%0*x (%s)\n", sizeof(T) * 2, data, machine().describe_context()); - logerror("protocol error reading result word (%s)\n", machine().describe_context()); - return 0; -} + // decode instruction + decode(m_idbyte, swapendian_int16(data)); -void ns32081_device::write_id(u16 data) -{ - bool const match = (data == FORMAT_9) || (data == FORMAT_11); + m_state = OPERAND; + break; - if (match) - { - LOG("write_id match 0x%04x (%s)\n", data, machine().describe_context()); - m_state = OPERATION; - } - else - { - LOG("write_id ignore 0x%04x (%s)\n", data, machine().describe_context()); - m_state = IDLE; + case OPERAND: + // check awaiting operand data + if (m_op[0].issued < m_op[0].expected || m_op[1].issued < m_op[1].expected) + { + unsigned const n = (m_op[0].issued < m_op[0].expected) ? 0 : 1; + operand &op = m_op[n]; + + LOG("write operand %d data 0x%0*x (%s)\n", + n, sizeof(T) * 2, data, machine().describe_context()); + + // insert data into operand value + op.value |= u64(data) << (op.issued * 8); + op.issued += sizeof(T); + } + else + logerror("write protocol error unexpected operand data 0x%0*x (%s)\n", + sizeof(T) * 2, data, machine().describe_context()); + break; } - m_idbyte = u8(data); + // start execution when all operands are available + if (m_state == OPERAND && m_op[0].issued >= m_op[0].expected && m_op[1].issued >= m_op[1].expected) + execute(); } -void ns32081_device::write_op(u16 data) +bool ns32081_device_base::decode(u8 const idbyte, u16 const opword) { - switch (m_state) - { - case OPERATION: - m_opword = swapendian_int16(data); - LOG("write_op opword 0x%04x (%s)\n", m_opword, machine().describe_context()); + LOG("decode idbyte 0x%02x opword 0x%04x (%s)\n", idbyte, opword, machine().describe_context()); - // initialize operands - for (operand &op : m_op) - { - op.expected = 0; - op.issued = 0; - op.value = 0; - } + m_idbyte = idbyte; + m_opword = opword; - // decode operands - if (m_idbyte == FORMAT_9) + // initialize operands + for (operand &op : m_op) + { + op.expected = 0; + op.issued = 0; + op.value = 0; + } + + switch (m_idbyte) + { + case FORMAT_9: { // format 9: 1111 1222 22oo ofii unsigned const f_length = BIT(m_opword, 2) ? LENGTH_F : LENGTH_L; unsigned const size = m_opword & 3; - switch ((m_opword >> 3) & 7) + switch (BIT(m_opword, 3, 3)) { case 0: // movif m_op[0].expected = size + 1; @@ -231,10 +245,11 @@ break; } } - else if (m_idbyte == FORMAT_11) + break; + case FORMAT_11: { // format 11: 1111 1222 22oo oo0f - unsigned const opcode = (m_opword >> 2) & 15; + unsigned const opcode = BIT(m_opword, 2, 4); unsigned const f_length = BIT(m_opword, 0) ? LENGTH_F : LENGTH_L; m_op[0].expected = f_length; @@ -247,69 +262,65 @@ if (opcode != 2) m_op[2].expected = f_length; } - - // operand 1 in register - if (m_op[0].expected && !(m_opword & 0xc000)) + break; + case FORMAT_12: { - // exclude integer operands - if (m_idbyte == FORMAT_11 || ((m_opword >> 3) & 7) > 1) - { - unsigned const reg = (m_opword >> 11) & 7; - LOG("write_op read f%d\n", reg); - - m_op[0].value = m_f[reg ^ 0]; - if (m_op[0].expected == 8) - m_op[0].value |= u64(m_f[reg ^ 1]) << 32; + // format 12: 1111 1222 22oo oo0f + unsigned const f_length = BIT(m_opword, 0) ? LENGTH_F : LENGTH_L; - m_op[0].issued = m_op[0].expected; + switch (BIT(m_opword, 2, 4)) + { + case 2: // polyf + case 3: // dotf + m_op[0].expected = f_length; + m_op[1].expected = f_length; + break; + case 4: // scalbf + m_op[0].expected = f_length; + m_op[1].expected = f_length; + m_op[2].expected = f_length; + break; + case 5: // logbf + m_op[0].expected = f_length; + m_op[2].expected = f_length; + break; } } + break; + default: + LOG("decode idbyte 0x%02x unknown (%s)\n", m_idbyte, machine().describe_context()); + return false; + } - // operand 2 in register - if (m_op[1].expected && !(m_opword & 0x0600)) + // operand 1 in register + if (m_op[0].expected && !BIT(m_opword, 14, 2)) + { + // exclude integer operands + if (m_idbyte != FORMAT_9 || (BIT(m_opword, 3, 3) > 1)) { - unsigned const reg = (m_opword >> 6) & 7; - LOG("write_op read f%d\n", reg); - - m_op[1].value = m_f[reg ^ 0]; - if (m_op[1].expected == 8) - m_op[1].value |= u64(m_f[reg ^ 1]) << 32; + reg_get(m_op[0].expected, m_op[0].value, BIT(m_opword, 11, 3)); - m_op[1].issued = m_op[1].expected; + m_op[0].issued = m_op[0].expected; } + } - m_state = OPERAND; - break; - - case OPERAND: - // check awaiting operand word - if (m_op[0].issued < m_op[0].expected || m_op[1].issued < m_op[1].expected) - { - unsigned const n = (m_op[0].issued < m_op[0].expected) ? 0 : 1; - operand &op = m_op[n]; - - LOG("write_op op%d data 0x%04x (%s)\n", n, data, machine().describe_context()); + // operand 2 in register + if (m_op[1].expected && !BIT(m_opword, 9, 2)) + { + reg_get(m_op[1].expected, m_op[1].value, BIT(m_opword, 6, 3)); - // insert word into operand value - op.value |= u64(data) << (op.issued * 8); - op.issued += 2; - } - else - logerror("protocol error unexpected operand word 0x%04x (%s)\n", data, machine().describe_context()); - break; + m_op[1].issued = m_op[1].expected; } - // start execution when all operands are available - if (m_state == OPERAND && m_op[0].issued >= m_op[0].expected && m_op[1].issued >= m_op[1].expected) - execute(); + return true; } -void ns32081_device::execute() +void ns32081_device_base::execute() { - softfloat_exceptionFlags = 0; u32 const fsr = m_fsr; m_fsr &= ~FSR_TT; + softfloat_exceptionFlags = 0; m_status = 0; m_tcy = 0; @@ -317,235 +328,247 @@ { case FORMAT_9: // format 9: 1111 1222 22oo ofii + switch (BIT(m_opword, 3, 3)) { - bool const single = BIT(m_opword, 2); - unsigned const f_length = single ? LENGTH_F : LENGTH_L; - unsigned const size = m_opword & 3; - - switch ((m_opword >> 3) & 7) + case 0: + // MOVif src,dest + // gen,gen + // read.i,write.f { - case 0: - // MOVif src,dest - // gen,gen - // read.i,write.f - { - s32 const src = - (size == SIZE_D) ? s32(m_op[0].value) : - (size == SIZE_W) ? s16(m_op[0].value) : - s8(m_op[0].value); - - if (single) - m_op[2].value = i32_to_f32(src).v; - else - m_op[2].value = i32_to_f64(src).v; - m_op[2].expected = f_length; - m_tcy = 53; - } - break; - case 1: - // LFSR src - // gen - // read.D - m_fsr = u16(m_op[0].value); - - switch (m_fsr & FSR_RM) - { - case RM_N: softfloat_roundingMode = softfloat_round_near_even; break; - case RM_Z: softfloat_roundingMode = softfloat_round_minMag; break; - case RM_U: softfloat_roundingMode = softfloat_round_max; break; - case RM_D: softfloat_roundingMode = softfloat_round_min; break; - } - m_tcy = 18; - break; - case 2: - // MOVLF src,dest - // gen,gen - // read.L,write.F - m_op[2].value = f64_to_f32(float64_t{ m_op[0].value }).v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc000) ? 23 : 27; - break; - case 3: - // MOVFL src,dest - // gen,gen - // read.F,write.L - m_op[2].value = f32_to_f64(float32_t{ u32(m_op[0].value) }).v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc000) ? 22 : 26; - break; - case 4: - // ROUNDfi src,dest - // gen,gen - // read.f,write.i - if (single) - m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_near_even, true); - else - m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_near_even, true); + s32 const src = util::sext(m_op[0].value, m_op[0].expected * 8); - if ((size == SIZE_D && s64(m_op[2].value) != s32(m_op[2].value)) - || (size == SIZE_W && s64(m_op[2].value) != s16(m_op[2].value)) - || (size == SIZE_B && s64(m_op[2].value) != s8(m_op[2].value))) - softfloat_exceptionFlags |= softfloat_flag_overflow; - - m_op[2].expected = size + 1; - m_tcy = (m_opword & 0xc000) ? 53 : 66; - break; - case 5: - // TRUNCfi src,dest - // gen,gen - // read.f,write.i - if (single) - m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_minMag, true); + if (m_op[2].expected == LENGTH_F) + m_op[2].value = i32_to_f32(src).v; else - m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_minMag, true); + m_op[2].value = i32_to_f64(src).v; - if ((size == SIZE_D && s64(m_op[2].value) != s32(m_op[2].value)) - || (size == SIZE_W && s64(m_op[2].value) != s16(m_op[2].value)) - || (size == SIZE_B && s64(m_op[2].value) != s8(m_op[2].value))) - softfloat_exceptionFlags |= softfloat_flag_overflow; + m_tcy = 53; + } + break; + case 1: + // LFSR src + // gen + // read.D + m_fsr = u16(m_op[0].value); - m_op[2].expected = size + 1; - m_tcy = (m_opword & 0xc000) ? 53 : 66; - break; - case 6: - // SFSR dest - // gen - // write.D - m_op[2].value = fsr; - m_op[2].expected = 4; - m_tcy = 13; - break; - case 7: - // FLOORfi src,dest - // gen,gen - // read.f,write.i - if (single) - m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_min, true); - else - m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_min, true); + switch (m_fsr & FSR_RM) + { + case RM_N: softfloat_roundingMode = softfloat_round_near_even; break; + case RM_Z: softfloat_roundingMode = softfloat_round_minMag; break; + case RM_U: softfloat_roundingMode = softfloat_round_max; break; + case RM_D: softfloat_roundingMode = softfloat_round_min; break; + } + m_tcy = 18; + break; + case 2: + // MOVLF src,dest + // gen,gen + // read.L,write.F + m_op[2].value = f64_to_f32(float64_t{ m_op[0].value }).v; + + m_tcy = BIT(m_opword, 14, 2) ? 23 : 27; + break; + case 3: + // MOVFL src,dest + // gen,gen + // read.F,write.L + m_op[2].value = f32_to_f64(float32_t{ u32(m_op[0].value) }).v; + + m_tcy = BIT(m_opword, 14, 2) ? 22 : 26; + break; + case 4: + // ROUNDfi src,dest + // gen,gen + // read.f,write.i + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_near_even, true); + else + m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_near_even, true); + + if (s64(m_op[2].value) != util::sext(m_op[2].value, m_op[2].expected * 8)) + softfloat_exceptionFlags |= softfloat_flag_overflow; + + m_tcy = BIT(m_opword, 14, 2) ? 53 : 66; + break; + case 5: + // TRUNCfi src,dest + // gen,gen + // read.f,write.i + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_minMag, true); + else + m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_minMag, true); + + if (s64(m_op[2].value) != util::sext(m_op[2].value, m_op[2].expected * 8)) + softfloat_exceptionFlags |= softfloat_flag_overflow; + + m_tcy = BIT(m_opword, 14, 2) ? 53 : 66; + break; + case 6: + // SFSR dest + // gen + // write.D + m_op[2].value = fsr; + + m_tcy = 13; + break; + case 7: + // FLOORfi src,dest + // gen,gen + // read.f,write.i + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_to_i64(float32_t{ u32(m_op[0].value) }, softfloat_round_min, true); + else + m_op[2].value = f64_to_i64(float64_t{ m_op[0].value }, softfloat_round_min, true); - if ((size == SIZE_D && s64(m_op[2].value) != s32(m_op[2].value)) - || (size == SIZE_W && s64(m_op[2].value) != s16(m_op[2].value)) - || (size == SIZE_B && s64(m_op[2].value) != s8(m_op[2].value))) - softfloat_exceptionFlags |= softfloat_flag_overflow; + if (s64(m_op[2].value) != util::sext(m_op[2].value, m_op[2].expected * 8)) + softfloat_exceptionFlags |= softfloat_flag_overflow; - m_op[2].expected = size + 1; - m_tcy = (m_opword & 0xc000) ? 53 : 66; - break; - } + m_tcy = BIT(m_opword, 14, 2) ? 53 : 66; + break; } break; case FORMAT_11: - // format 11: 1111122222oooo0f + // format 11: 1111 1222 22oo oo0f + switch (BIT(m_opword, 2, 4)) { - bool const single = BIT(m_opword, 0); - unsigned const f_length = single ? LENGTH_F : LENGTH_L; - - switch ((m_opword >> 2) & 15) - { - case 0x0: - // ADDf src,dest - // gen,gen - // read.f,rmw.f - if (single) - m_op[2].value = f32_add(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; - else - m_op[2].value = f64_add(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc600) ? 70 : 74; - break; - case 0x1: - // MOVf src,dest - // gen,gen - // read.f,write.f - m_op[2].value = m_op[0].value; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc000) ? 23 : 27; - break; - case 0x2: - // CMPf src1,src2 - // gen,gen - // read.f,read.f - if (m_op[0].value == m_op[1].value) - m_status |= SLAVE_Z; - if ((single && f32_le(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) })) - || (!single && f64_le(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }))) - m_status |= SLAVE_N; - m_tcy = (m_opword & 0xc600) ? 45 : 49; - break; - case 0x3: - // Trap(SLAVE) - m_fsr |= TT_ILL; - m_status = SLAVE_Q; - break; - case 0x4: - // SUBf src,dest - // gen,gen - // read.f,rmw.f - if (single) - m_op[2].value = f32_sub(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; - else - m_op[2].value = f64_sub(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc600) ? 70 : 74; - break; - case 0x5: - // NEGf src,dest - // gen,gen - // read.f,write.f - if (single) + case 0x0: + // ADDf src,dest + // gen,gen + // read.f,rmw.f + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_add(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; + else + m_op[2].value = f64_add(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; + + m_tcy = (m_opword & 0xc600) ? 70 : 74; + break; + case 0x1: + // MOVf src,dest + // gen,gen + // read.f,write.f + m_op[2].value = m_op[0].value; + + m_tcy = BIT(m_opword, 14, 2) ? 23 : 27; + break; + case 0x2: + // CMPf src1,src2 + // gen,gen + // read.f,read.f + if (m_op[0].value == m_op[1].value) + m_status |= SLAVE_Z; + if ((m_op[0].expected == LENGTH_F && f32_le(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) })) + || (m_op[0].expected == LENGTH_L && f64_le(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }))) + m_status |= SLAVE_N; + + m_tcy = (m_opword & 0xc600) ? 45 : 49; + break; + case 0x3: + // Trap(SLAVE) + m_fsr |= TT_ILL; + m_status = SLAVE_Q; + break; + case 0x4: + // SUBf src,dest + // gen,gen + // read.f,rmw.f + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_sub(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; + else + m_op[2].value = f64_sub(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; + + m_tcy = (m_opword & 0xc600) ? 70 : 74; + break; + case 0x5: + // NEGf src,dest + // gen,gen + // read.f,write.f + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_mul(float32_t{ u32(m_op[0].value) }, i32_to_f32(-1)).v; + else + m_op[2].value = f64_mul(float64_t{ m_op[0].value }, i32_to_f64(-1)).v; + + m_tcy = BIT(m_opword, 14, 2) ? 20 : 24; + break; + case 0x8: + // DIVf src,dest + // gen,gen + // read.f,rmw.f + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_div(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; + else + m_op[2].value = f64_div(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; + + m_tcy = ((m_opword & 0xc600) ? 55 : 59) + (m_op[0].expected == LENGTH_F ? 30 : 60); + break; + case 0x9: + // Trap(SLAVE) + m_fsr |= TT_ILL; + m_status = SLAVE_Q; + break; + case 0xc: + // MULf src,dest + // gen,gen + // read.f,rmw.f + if (m_op[0].expected == LENGTH_F) + m_op[2].value = f32_mul(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; + else + m_op[2].value = f64_mul(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; + + m_tcy = ((m_opword & 0xc600) ? 30 : 34) + (m_op[0].expected == LENGTH_F ? 14 : 28); + break; + case 0xd: + // ABSf src,dest + // gen,gen + // read.f,write.f + if (m_op[0].expected == LENGTH_F) + if (f32_lt(float32_t{ u32(m_op[0].value) }, float32_t{ 0 })) m_op[2].value = f32_mul(float32_t{ u32(m_op[0].value) }, i32_to_f32(-1)).v; else + m_op[2].value = float32_t{ u32(m_op[0].value) }.v; + else + if (f64_lt(float64_t{ m_op[0].value }, float64_t{ 0 })) m_op[2].value = f64_mul(float64_t{ m_op[0].value }, i32_to_f64(-1)).v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc000) ? 20 : 24; - break; - case 0x8: - // DIVf src,dest - // gen,gen - // read.f,rmw.f - if (single) - m_op[2].value = f32_div(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; else - m_op[2].value = f64_div(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; - m_op[2].expected = f_length; - m_tcy = ((m_opword & 0xc600) ? 55 : 59) + (single ? 30 : 60); - break; - case 0x9: - // Trap(SLAVE) - m_fsr |= TT_ILL; - m_status = SLAVE_Q; - break; - case 0xc: - // MULf src,dest - // gen,gen - // read.f,rmw.f - if (single) - m_op[2].value = f32_mul(float32_t{ u32(m_op[1].value) }, float32_t{ u32(m_op[0].value) }).v; - else - m_op[2].value = f64_mul(float64_t{ m_op[1].value }, float64_t{ m_op[0].value }).v; - m_op[2].expected = f_length; - m_tcy = ((m_opword & 0xc600) ? 30 : 34) + (single ? 14 : 28); - break; - case 0xd: - // ABSf src,dest - // gen,gen - // read.f,write.f - if (single) - if (f32_lt(float32_t{ u32(m_op[0].value) }, float32_t{ 0 })) - m_op[2].value = f32_mul(float32_t{ u32(m_op[0].value) }, i32_to_f32(-1)).v; - else - m_op[2].value = float32_t{ u32(m_op[0].value) }.v; - else - if (f64_lt(float64_t{ m_op[0].value }, float64_t{ 0 })) - m_op[2].value = f64_mul(float64_t{ m_op[0].value }, i32_to_f64(-1)).v; - else - m_op[2].value = float64_t{ m_op[0].value }.v; - m_op[2].expected = f_length; - m_tcy = (m_opword & 0xc000) ? 20 : 24; - break; - } + m_op[2].value = float64_t{ m_op[0].value }.v; + + m_tcy = BIT(m_opword, 14, 2) ? 20 : 24; + break; + } + break; + + case FORMAT_12: + // format 12: 1111 1222 22oo oo0f + switch (BIT(m_opword, 2, 4)) + { + case 0x2: + // POLYf src1,src2 + // gen,gen + // read.f,read.f + m_fsr |= FSR_RMB; + break; + case 0x3: + // DOTf src1,src2 + // gen,gen + // read.f,read.f + m_fsr |= FSR_RMB; + break; + case 0x4: + // SCALBf src,dest + // gen,gen + // read.f,rmw.f + break; + case 0x5: + // LOGBf src,dest + // gen,gen + // read.f,write.f + break; + default: + // Trap(SLAVE) + m_fsr |= TT_ILL; + m_status = SLAVE_Q; + break; } break; } @@ -595,47 +618,177 @@ "addf", "movf", "cmpf", nullptr, "subf", "negf", nullptr, nullptr, "divf", nullptr, nullptr, nullptr, "mulf", "absf", nullptr, nullptr }; + static char const *format12[] = + { + nullptr, nullptr, "polyf", "dotf", "scalbf", "logbf", nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + }; + + char const *operation = nullptr; + switch (m_idbyte) + { + case FORMAT_9: operation = format9[BIT(m_opword, 3, 3)]; break; + case FORMAT_11: operation = format11[BIT(m_opword, 2, 4)]; break; + case FORMAT_12: operation = format12[BIT(m_opword, 2, 4)]; break; + } if (m_status & SLAVE_Q) - LOG("execute %s 0x%x,0x%x exception\n", - (m_idbyte == FORMAT_9) - ? format9[(m_opword >> 3) & 7] - : format11[(m_opword >> 2) & 15], - m_op[0].value, m_op[1].value); + LOG("execute %s 0x%x,0x%x exception\n", operation, m_op[0].value, m_op[1].value); else - LOG("execute %s 0x%x,0x%x result 0x%x\n", - (m_idbyte == FORMAT_9) - ? format9[(m_opword >> 3) & 7] - : format11[(m_opword >> 2) & 15], - m_op[0].value, m_op[1].value, m_op[2].value); + LOG("execute %s 0x%x,0x%x result 0x%x\n", operation, m_op[0].value, m_op[1].value, m_op[2].value); } // write-back floating point register results - if (m_op[2].expected && !(m_opword & 0x0600)) + if (m_op[2].expected && !BIT(m_opword, 9, 2)) { // exclude integer results (roundfi, truncfi, sfsr, floorfi) - if (m_idbyte == FORMAT_11 || ((m_opword >> 3) & 7) < 4) + if (m_idbyte != FORMAT_9 || (BIT(m_opword, 3, 3) < 4)) { - unsigned const reg = (m_opword >> 6) & 7; - - LOG("execute write-back f%d\n", reg); + reg_set(BIT(m_opword, 6, 3), m_op[2].expected, m_op[2].value); - m_f[reg ^ 0] = u32(m_op[2].value >> 0); - if (m_op[2].expected == 8) - m_f[reg ^ 1] = u32(m_op[2].value >> 32); + if (type() == NS32381) + m_fsr |= FSR_RMB; m_op[2].issued = m_op[2].expected; } } - m_state = STATUS; - if (!m_out_scb.isunset()) m_complete->adjust(attotime::from_ticks(m_tcy, clock())); + + m_state = STATUS; } -void ns32081_device::complete(s32 param) +u16 ns32081_device_base::status(int *icount) +{ + if (m_state == STATUS) + { + m_state = (m_op[2].issued == m_op[2].expected) ? IDLE : RESULT; + + if (icount) + *icount -= m_tcy; + + LOG("status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, + (m_state == RESULT ? "results pending" : "complete"), machine().describe_context()); + + return m_status; + } + + logerror("status protocol error (%s)\n", machine().describe_context()); + return 0; +} + +void ns32081_device_base::complete(s32 param) { m_out_scb(0); m_out_scb(1); } + +ns32081_device::ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : ns32081_device_base(mconfig, NS32081, tag, owner, clock) + , ns32000_slow_slave_interface(mconfig, *this) +{ +} + +void ns32081_device::device_start() +{ + ns32081_device_base::device_start(); + + save_item(NAME(m_f)); +} + +void ns32081_device::device_reset() +{ + ns32081_device_base::device_reset(); + + std::fill(std::begin(m_f), std::end(m_f), 0); +} + +void ns32081_device::state_add(device_state_interface &parent, int &index) +{ + ns32081_device_base::state_add(parent, index); + + for (unsigned i = 0; i < 8; i++) + parent.state_add(index++, util::string_format("F%d", i).c_str(), m_f[i]).formatstr("%08X"); +} + +void ns32081_device::reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const +{ + op_value = m_f[reg ^ 0]; + if (op_size == LENGTH_L) + op_value |= u64(m_f[reg ^ 1]) << 32; + + if (op_size == LENGTH_L) + LOG("reg_get f%d:%d data 0x%016x\n", reg ^ 1, reg ^ 0, op_value); + else + LOG("reg_get f%d data 0x%08x\n", reg, op_value); +} + +void ns32081_device::reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) +{ + if (op_size == LENGTH_L) + LOG("reg_set f%d:%d data 0x%016x\n", reg ^ 1, reg ^ 0, op_value); + else + LOG("reg_set f%d data 0x%08x\n", reg, op_value); + + m_f[reg ^ 0] = u32(op_value >> 0); + if (op_size == LENGTH_L) + m_f[reg ^ 1] = u32(op_value >> 32); +} + +ns32381_device::ns32381_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : ns32081_device_base(mconfig, NS32381, tag, owner, clock) + , ns32000_slow_slave_interface(mconfig, *this) + , ns32000_fast_slave_interface(mconfig, *this) +{ +} + +void ns32381_device::device_start() +{ + ns32081_device_base::device_start(); + + save_item(NAME(m_l)); +} + +void ns32381_device::device_reset() +{ + std::fill(std::begin(m_l), std::end(m_l), 0); +} + +void ns32381_device::state_add(device_state_interface &parent, int &index) +{ + ns32081_device_base::state_add(parent, index); + + for (unsigned i = 0; i < 8; i++) + parent.state_add(index++, util::string_format("L%d", i).c_str(), m_l[i]).formatstr("%016X"); +} + +void ns32381_device::reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const +{ + if (op_size == LENGTH_L) + op_value = m_l[reg]; + else if (reg & 1) + op_value = m_l[reg & 6] >> 32; + else + op_value = u32(m_l[reg & 6]); + + if (op_size == LENGTH_L) + LOG("reg_get l%d data 0x%016x\n", reg, op_value); + else + LOG("reg_get f%d data 0x%08x\n", reg, op_value); +} + +void ns32381_device::reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) +{ + if (op_size == LENGTH_L) + LOG("reg_set l%d data 0x%016x\n", reg, op_value); + else + LOG("reg_set f%d data 0x%08x\n", reg, op_value); + + if (op_size == LENGTH_L) + m_l[reg] = op_value; + else if (reg & 1) + m_l[reg & 6] = (op_value << 32) | u32(m_l[reg & 6]); + else + m_l[reg & 6] = (m_l[reg & 6] & 0xffff'ffff'0000'0000ULL) | u32(op_value); +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32081.h mame-0.264+dfsg.1/src/devices/machine/ns32081.h --- mame-0.263+dfsg.1/src/devices/machine/ns32081.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32081.h 2024-03-25 14:00:46.000000000 +0000 @@ -8,54 +8,119 @@ #include "cpu/ns32000/common.h" -class ns32081_device +class ns32081_device_base : public device_t - , public ns32000_slow_slave_interface , public ns32000_fpu_interface { -public: - ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); - - virtual void state_add(device_state_interface &parent, int &index) override; - - virtual u16 read_st(int *icount = nullptr) override; - virtual u16 read_op() override; - - virtual void write_id(u16 data) override; - virtual void write_op(u16 data) override; - protected: + ns32081_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); + // device_t implementation virtual void device_start() override; virtual void device_reset() override; + // ns32000_slave_interface implementation + virtual void state_add(device_state_interface &parent, int &index) override; + + // slave interface handlers + template T read(); + template void write(T data); + + // execution helpers + bool decode(u8 const idbyte, u16 const opword); void execute(); + u16 status(int *icount); void complete(s32 param); + // register helpers + virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const = 0; + virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) = 0; + private: emu_timer *m_complete; - // registers - u32 m_fsr; - u32 m_f[8]; + u32 m_fsr; // floating-point status register // operating state + u32 m_state; u8 m_idbyte; u16 m_opword; struct operand { - unsigned expected; - unsigned issued; + u32 expected; + u32 issued; u64 value; } m_op[3]; u16 m_status; + u32 m_tcy; +}; + +class ns32081_device + : public ns32081_device_base + , public ns32000_slow_slave_interface +{ +public: + ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + + // ns32000_slave_interface implementation + virtual void state_add(device_state_interface &parent, int &index) override; + + // ns32000_slow_slave_interface implementation + virtual u16 slow_status(int *icount = nullptr) override { return status(icount); } + virtual u16 slow_read() override { return read(); } + virtual void slow_write(u16 data) override { write(data); } - // implementation state - unsigned m_state; - unsigned m_tcy; +protected: + // device_t implementation + virtual void device_start() override; + virtual void device_reset() override; + + // register helpers + virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const override; + virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) override; + +private: + // registers + u32 m_f[8]; +}; + +class ns32381_device + : public ns32081_device_base + , public ns32000_slow_slave_interface + , public ns32000_fast_slave_interface +{ +public: + ns32381_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + + // ns32000_slave_interface implementation + virtual void state_add(device_state_interface &parent, int &index) override; + + // ns32000_slow_slave_interface implementation + virtual u16 slow_status(int *icount = nullptr) override { return status(icount); } + virtual u16 slow_read() override { return read(); } + virtual void slow_write(u16 data) override { write(data); } + + // ns32000_fast_slave_interface implementation + virtual u32 fast_status(int *icount = nullptr) override { return status(icount); } + virtual u32 fast_read() override { return read(); } + virtual void fast_write(u32 data) override { write(data); } + +protected: + // device_t implementation + virtual void device_start() override; + virtual void device_reset() override; + + // register helpers + virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const override; + virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) override; + +private: + // registers + u64 m_l[8]; }; DECLARE_DEVICE_TYPE(NS32081, ns32081_device) +DECLARE_DEVICE_TYPE(NS32381, ns32381_device) #endif // MAME_MACHINE_NS32081_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32082.cpp mame-0.264+dfsg.1/src/devices/machine/ns32082.cpp --- mame-0.263+dfsg.1/src/devices/machine/ns32082.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32082.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,11 +34,6 @@ RESULT = 6, // result word available }; -enum idbyte : u8 -{ - FORMAT_14 = 0x1e, -}; - enum reg_mask : unsigned { BPR0 = 0x0, // breakpoint register 0 @@ -127,8 +122,8 @@ ns32082_device::ns32082_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : device_t(mconfig, NS32082, tag, owner, clock) - , ns32000_slow_slave_interface(mconfig, *this) , ns32000_mmu_interface(mconfig, *this) + , ns32000_slow_slave_interface(mconfig, *this) , m_bpr{} , m_pf{} , m_sc(0) @@ -170,9 +165,12 @@ void ns32082_device::state_add(device_state_interface &parent, int &index) { parent.state_add(index++, "MSR", m_msr).formatstr("%08X"); + parent.state_add(index++, "PTB0", m_ptb[0]).formatstr("%08X"); + parent.state_add(index++, "PTB1", m_ptb[1]).formatstr("%08X"); + parent.state_add(index++, "EIA", m_eia).formatstr("%08X"); } -u16 ns32082_device::read_st(int *icount) +u16 ns32082_device::slow_status(int *icount) { if (m_state == STATUS) { @@ -181,63 +179,54 @@ if (icount) *icount -= m_tcy; - LOG("read_st status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, + LOG("status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, (m_state == RESULT ? "results pending" : "complete"), machine().describe_context()); return m_status; } - logerror("read_st protocol error reading status word (%s)\n", machine().describe_context()); + logerror("status protocol error (%s)\n", machine().describe_context()); return 0; } -u16 ns32082_device::read_op() +u16 ns32082_device::slow_read() { if (m_state == RESULT && m_op[2].issued < m_op[2].expected) { u16 const data = u16(m_op[2].value >> (m_op[2].issued * 8)); - LOG("read_op word %d data 0x%04x (%s)\n", m_op[2].issued >> 1, data, machine().describe_context()); + LOG("read %d data 0x%04x (%s)\n", m_op[2].issued >> 1, data, machine().describe_context()); m_op[2].issued += 2; if (m_op[2].issued == m_op[2].expected) { - LOG("read_op last result word issued\n"); + LOG("read complete\n"); m_state = IDLE; } return data; } - logerror("read_op protocol error reading result word (%s)\n", machine().describe_context()); + logerror("read protocol error (%s)\n", machine().describe_context()); return 0; } -void ns32082_device::write_id(u16 data) -{ - bool const match = (data == FORMAT_14); - - if (match) - { - LOG("write_id match 0x%04x (%s)\n", data, machine().describe_context()); - m_state = OPERATION; - } - else - { - LOG("write_id ignore 0x%04x (%s)\n", data, machine().describe_context()); - m_state = IDLE; - } - - m_idbyte = u8(data); -} - -void ns32082_device::write_op(u16 data) +void ns32082_device::slow_write(u16 data) { switch (m_state) { + case IDLE: + LOG("write idbyte 0x%04x (%s)\n", data, machine().describe_context()); + if (data == FORMAT_14) + { + m_idbyte = u8(data); + m_state = OPERATION; + } + break; + case OPERATION: m_opword = swapendian_int16(data); - LOG("write_op opword 0x%04x (%s)\n", m_opword, machine().describe_context()); + LOG("write opword 0x%04x (%s)\n", m_opword, machine().describe_context()); m_tcy = 0; @@ -282,14 +271,16 @@ unsigned const n = (m_op[0].issued < m_op[0].expected) ? 0 : 1; operand &op = m_op[n]; - LOG("write_op op%d data 0x%04x (%s)\n", n, data, machine().describe_context()); + LOG("write operand %d data 0x%04x (%s)\n", + n, data, machine().describe_context()); // insert word into operand value op.value |= u64(data) << (op.issued * 8); op.issued += 2; } else - logerror("write_op protocol error unexpected operand word 0x%04x (%s)\n", data, machine().describe_context()); + logerror("write protocol error unexpected operand data 0x%04x (%s)\n", + data, machine().describe_context()); break; } @@ -480,7 +471,7 @@ if (m_state == RDVAL || m_state == WRVAL) { m_state = STATUS; - if (pte1 & PTE_V) + if (pte2 & PTE_V) m_status |= SLAVE_F; return CANCEL; diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32082.h mame-0.264+dfsg.1/src/devices/machine/ns32082.h --- mame-0.263+dfsg.1/src/devices/machine/ns32082.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32082.h 2024-03-25 14:00:46.000000000 +0000 @@ -10,24 +10,25 @@ class ns32082_device : public device_t - , public ns32000_slow_slave_interface , public ns32000_mmu_interface + , public ns32000_slow_slave_interface { public: ns32082_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + // ns32000_slave_interface implementation virtual void state_add(device_state_interface &parent, int &index) override; - virtual u16 read_st(int *icount = nullptr) override; - virtual u16 read_op() override; - - virtual void write_id(u16 data) override; - virtual void write_op(u16 data) override; + // ns32000_slow_slave_interface implementation + virtual u16 slow_status(int *icount = nullptr) override; + virtual u16 slow_read() override; + virtual void slow_write(u16 data) override; + // ns32000_mmu_interface implementation virtual translate_result translate(address_space &space, unsigned st, u32 &address, bool user, bool write, bool pfs = false, bool suppress = false) override; protected: - // device_t overrides + // device_t implementation virtual void device_start() override; virtual void device_reset() override; @@ -51,16 +52,16 @@ u16 m_opword; struct operand { - unsigned expected; - unsigned issued; + u32 expected; + u32 issued; u64 value; } m_op[3]; u16 m_status; // implementation state - unsigned m_state; - unsigned m_tcy; + u32 m_state; + u32 m_tcy; }; DECLARE_DEVICE_TYPE(NS32082, ns32082_device) diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32202.cpp mame-0.264+dfsg.1/src/devices/machine/ns32202.cpp --- mame-0.263+dfsg.1/src/devices/machine/ns32202.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32202.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -712,14 +712,24 @@ void ns32202_device::isrvl_w(u8 data) { - LOGMASKED(LOG_REGW, "isrvl_w 0x%02x (%s)\n", data, machine().describe_context()); - m_isrv = (m_isrv & 0xff00) | data; + if (u8(m_isrv >> 0) ^ data) + { + LOGMASKED(LOG_REGW, "isrvl_w 0x%02x (%s)\n", data, machine().describe_context()); + m_isrv = (m_isrv & 0xff00) | data; + + m_interrupt->adjust(attotime::zero); + } } void ns32202_device::isrvh_w(u8 data) { - LOGMASKED(LOG_REGW, "isrvh_w 0x%02x (%s)\n", data, machine().describe_context()); - m_isrv = (u16(data) << 8) | u8(m_isrv); + if (u8(m_isrv >> 8) ^ data) + { + LOGMASKED(LOG_REGW, "isrvh_w 0x%02x (%s)\n", data, machine().describe_context()); + m_isrv = (u16(data) << 8) | u8(m_isrv); + + m_interrupt->adjust(attotime::zero); + } } void ns32202_device::imskl_w(u8 data) diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32382.cpp mame-0.264+dfsg.1/src/devices/machine/ns32382.cpp --- mame-0.263+dfsg.1/src/devices/machine/ns32382.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32382.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2,7 +2,7 @@ // copyright-holders:Patrick Mackinlay /* - * National Semiconductor 32382 Memory Management Unit. + * National Semiconductor NS32382 Memory Management Unit. * * Sources: * - Microprocessor Databook, Series 32000, NSC800, 1989 Edition, National Semiconductor @@ -23,7 +23,7 @@ #include "logmacro.h" -DEFINE_DEVICE_TYPE(NS32382, ns32382_device, "ns32382", "National Semiconductor 32382 Memory Management Unit") +DEFINE_DEVICE_TYPE(NS32382, ns32382_device, "ns32382", "National Semiconductor NS32382 Memory Management Unit") enum state : unsigned { @@ -35,11 +35,6 @@ RESULT = 6, // result word available }; -enum idbyte : u8 -{ - FORMAT_14 = 0x1e, -}; - enum reg_mask : unsigned { BAR = 0x0, // breakpoint address register @@ -125,8 +120,8 @@ ns32382_device::ns32382_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : device_t(mconfig, NS32382, tag, owner, clock) - , ns32000_fast_slave_interface(mconfig, *this) , ns32000_mmu_interface(mconfig, *this) + , ns32000_fast_slave_interface(mconfig, *this) { } @@ -165,7 +160,7 @@ parent.state_add(index++, "MSR", m_msr).formatstr("%08X"); } -u32 ns32382_device::read_st32(int *icount) +u32 ns32382_device::fast_status(int *icount) { if (m_state == STATUS) { @@ -174,48 +169,49 @@ if (icount) *icount -= m_tcy; - LOG("read_st status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, + LOG("status 0x%04x tcy %d %s (%s)\n", m_status, m_tcy, (m_state == RESULT ? "results pending" : "complete"), machine().describe_context()); return m_status; } - logerror("read_st protocol error reading status (%s)\n", machine().describe_context()); + logerror("status protocol error (%s)\n", machine().describe_context()); return 0; } -u32 ns32382_device::read() +u32 ns32382_device::fast_read() { if (m_state == RESULT && m_op[2].issued < m_op[2].expected) { u32 const data = u32(m_op[2].value >> (m_op[2].issued * 8)); - LOG("read_op dword %d data 0x%08x (%s)\n", m_op[2].issued >> 2, data, machine().describe_context()); + LOG("read %d data 0x%08x (%s)\n", m_op[2].issued >> 2, data, machine().describe_context()); m_op[2].issued += 4; if (m_op[2].issued == m_op[2].expected) { - LOG("read_op last result dword issued\n"); + LOG("read complete\n"); m_state = IDLE; } return data; } - logerror("read_op protocol error reading result dword (%s)\n", machine().describe_context()); + logerror("read protocol error (%s)\n", machine().describe_context()); return 0; } -void ns32382_device::write(u32 data) +void ns32382_device::fast_write(u32 data) { switch (m_state) { case IDLE: if (BIT(data, 24, 8) == FORMAT_14) { - LOG("write_fast match 0x%08x (%s)\n", data, machine().describe_context()); - m_opword = swapendian_int16(data >> 8); + + LOG("write idbyte 0x%02x opword 0x%04x (%s)\n", FORMAT_14, m_opword, machine().describe_context()); + m_tcy = 0; // initialize operands @@ -254,14 +250,15 @@ unsigned const n = (m_op[0].issued < m_op[0].expected) ? 0 : 1; operand &op = m_op[n]; - LOG("write_op op%d data 0x%04x (%s)\n", n, data, machine().describe_context()); + LOG("write opword 0x%08x (%s)\n", data, machine().describe_context()); // insert dword into operand value op.value |= u64(data) << (op.issued * 8); op.issued += 4; } else - logerror("write_fast protocol error unexpected operand 0x%08x (%s)\n", data, machine().describe_context()); + logerror("write protocol error unexpected operand data 0x%08x (%s)\n", + data, machine().describe_context()); break; } @@ -274,7 +271,7 @@ { m_status = 0; - // format 14: xxxx xsss s0oo ooii 0001 1110 + // format 14: xxxx xsss s0oo ooii unsigned const quick = BIT(m_opword, 7, 4); switch (BIT(m_opword, 2, 4)) @@ -409,7 +406,7 @@ if (m_state == RDVAL || m_state == WRVAL) { m_state = STATUS; - if (pte1 & PTE_V) + if (pte2 & PTE_V) m_status |= SLAVE_F; return CANCEL; diff -Nru mame-0.263+dfsg.1/src/devices/machine/ns32382.h mame-0.264+dfsg.1/src/devices/machine/ns32382.h --- mame-0.263+dfsg.1/src/devices/machine/ns32382.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/ns32382.h 2024-03-25 14:00:46.000000000 +0000 @@ -10,25 +10,25 @@ class ns32382_device : public device_t - , public ns32000_fast_slave_interface , public ns32000_mmu_interface + , public ns32000_fast_slave_interface { public: ns32382_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); - // ns32000_slave_interface overrides + // ns32000_slave_interface implementation virtual void state_add(device_state_interface &parent, int &index) override; - // ns32000_fast_slave_interface overrides - virtual u32 read_st32(int *icount = nullptr) override; - virtual void write(u32 data) override; - virtual u32 read() override; + // ns32000_fast_slave_interface implementation + virtual u32 fast_status(int *icount = nullptr) override; + virtual u32 fast_read() override; + virtual void fast_write(u32 data) override; - // ns32000_mmu_interface overrides + // ns32000_mmu_interface implementation virtual translate_result translate(address_space &space, unsigned st, u32 &address, bool user, bool write, bool pfs = false, bool debug = false) override; protected: - // device_t overrides + // device_t implementation virtual void device_start() override; virtual void device_reset() override; diff -Nru mame-0.263+dfsg.1/src/devices/machine/nvram.cpp mame-0.264+dfsg.1/src/devices/machine/nvram.cpp --- mame-0.263+dfsg.1/src/devices/machine/nvram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/nvram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -107,8 +107,9 @@ // make sure we have a valid base pointer determine_final_base(); - size_t actual; - return !file.read(m_base, m_length, actual) && actual == m_length; + // FIXME: consider width/Endianness + auto const [err, actual] = read(file, m_base, m_length); + return !err && (actual == m_length); } @@ -119,8 +120,9 @@ bool nvram_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_base, m_length, actual) && actual == m_length; + // FIXME: consider width/Endianness + auto const [err, actual] = write(file, m_base, m_length); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/nvram.h mame-0.264+dfsg.1/src/devices/machine/nvram.h --- mame-0.263+dfsg.1/src/devices/machine/nvram.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/nvram.h 2024-03-25 14:00:46.000000000 +0000 @@ -62,13 +62,13 @@ void determine_final_base(); // configuration state - optional_memory_region m_region; - default_value m_default_value; - init_delegate m_custom_handler; + optional_memory_region m_region; + default_value m_default_value; + init_delegate m_custom_handler; // runtime state - void * m_base; - size_t m_length; + void * m_base; + size_t m_length; }; DECLARE_DEVICE_TYPE(NVRAM, nvram_device) diff -Nru mame-0.263+dfsg.1/src/devices/machine/pc87306.cpp mame-0.264+dfsg.1/src/devices/machine/pc87306.cpp --- mame-0.263+dfsg.1/src/devices/machine/pc87306.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/pc87306.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,13 +1,14 @@ // license:BSD-3-Clause // copyright-holders: Angelo Salese -/*************************************************************************** +/************************************************************************************************** National Semiconductor PC87306 Super I/O TODO: -- Barely enough to make it surpass POST test 0x05 in misc/odyssey.cpp +- Barely enough to make it surpass POST test 0x05 in misc/odyssey.cpp; +- COM1/COM2/LPT1 address and irq select; -***************************************************************************/ +**************************************************************************************************/ #include "emu.h" #include "bus/isa/isa.h" @@ -32,18 +33,19 @@ , m_space_config("superio_config_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(pc87306_device::config_map), this)) , m_kbdc(*this, "pc_kbdc") , m_rtc(*this, "rtc") - //, m_logical_view(*this, "logical_view") + , m_pc_com(*this, "uart%d", 0U) + , m_pc_lpt(*this, "lpta") , m_gp20_reset_callback(*this) , m_gp25_gatea20_callback(*this) , m_irq1_callback(*this) , m_irq8_callback(*this) , m_irq9_callback(*this) -// , m_txd1_callback(*this) -// , m_ndtr1_callback(*this) -// , m_nrts1_callback(*this) -// , m_txd2_callback(*this) -// , m_ndtr2_callback(*this) -// , m_nrts2_callback(*this) + , m_txd1_callback(*this) + , m_ndtr1_callback(*this) + , m_nrts1_callback(*this) + , m_txd2_callback(*this) + , m_ndtr2_callback(*this) + , m_nrts2_callback(*this) { } @@ -89,6 +91,21 @@ at_keyboard_device &at_keyb(AT_KEYB(config, "at_keyboard", pc_keyboard_device::KEYBOARD_TYPE::AT, 1)); at_keyb.keypress().set(m_kbdc, FUNC(kbdc8042_device::keyboard_w)); + + PC_LPT(config, m_pc_lpt); + m_pc_lpt->irq_handler().set(FUNC(pc87306_device::irq_parallel_w)); + + NS16550(config, m_pc_com[0], XTAL(1'843'200)); + m_pc_com[0]->out_int_callback().set(FUNC(pc87306_device::irq_serial1_w)); + m_pc_com[0]->out_tx_callback().set(FUNC(pc87306_device::txd_serial1_w)); + m_pc_com[0]->out_dtr_callback().set(FUNC(pc87306_device::dtr_serial1_w)); + m_pc_com[0]->out_rts_callback().set(FUNC(pc87306_device::rts_serial1_w)); + + NS16550(config, m_pc_com[1], XTAL(1'843'200)); + m_pc_com[1]->out_int_callback().set(FUNC(pc87306_device::irq_serial2_w)); + m_pc_com[1]->out_tx_callback().set(FUNC(pc87306_device::txd_serial2_w)); + m_pc_com[1]->out_dtr_callback().set(FUNC(pc87306_device::dtr_serial2_w)); + m_pc_com[1]->out_rts_callback().set(FUNC(pc87306_device::rts_serial2_w)); } void pc87306_device::remap(int space_id, offs_t start, offs_t end) @@ -107,6 +124,16 @@ if (BIT(m_krr, 3)) m_isa->install_device(0x70, 0x71, read8sm_delegate(*this, FUNC(pc87306_device::rtc_r)), write8sm_delegate(*this, FUNC(pc87306_device::rtc_w))); + + if (BIT(m_fer, 0)) + m_isa->install_device(0x378, 0x37f, read8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::read)), write8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::write))); + + if (BIT(m_fer, 1)) + m_isa->install_device(0x3f8, 0x3ff, read8sm_delegate(*m_pc_com[0], FUNC(ns16450_device::ins8250_r)), write8sm_delegate(*m_pc_com[0], FUNC(ns16450_device::ins8250_w))); + + if (BIT(m_fer, 2)) + m_isa->install_device(0x2f8, 0x2ff, read8sm_delegate(*m_pc_com[1], FUNC(ns16450_device::ins8250_r)), write8sm_delegate(*m_pc_com[1], FUNC(ns16450_device::ins8250_w))); + } } @@ -140,8 +167,8 @@ void pc87306_device::config_map(address_map &map) { -// map(0x00, 0x00) FER Function Enable Register -// map(0x01, 0x01) FAR Function Address Register + map(0x00, 0x00).rw(FUNC(pc87306_device::fer_r), FUNC(pc87306_device::fer_w)); + map(0x01, 0x01).rw(FUNC(pc87306_device::far_r), FUNC(pc87306_device::far_w)); // map(0x02, 0x02) PTR Power and Test Register // map(0x03, 0x03) FCR Function Control Register // map(0x04, 0x04) PCR Printer Control Register @@ -171,8 +198,49 @@ // map(0x1c, 0x1c) PNP1 Plug and Play Configuration 1 Register } -// [0x05] KRR KBC and RTC Control Register /* + * [0x00] FER Function Enable Register + * x--- ---- IDE address select + * -x-- ---- IDE i/f enable + * --x- ---- FDC address select + * ---x ---- (0) x2 floppy drives (1) x4 floppy drives + * ---- x--- FDC enable + * ---- -x-- UART2 enable + * ---- --x- UART1 enable + * ---- ---x Parallel Port enable + */ +u8 pc87306_device::fer_r(offs_t offset) +{ + return m_fer; +} + +void pc87306_device::fer_w(offs_t offset, u8 data) +{ + m_fer = data; + remap(AS_IO, 0, 0x400); +} + +/* + * [0x01] FAR Function Address Register + * xxxx ---- UART2 address select + * xx-- xx-- UART1 address select + * ---- --xx parallel address select + */ +u8 pc87306_device::far_r(offs_t offset) +{ + return m_far; +} + +void pc87306_device::far_w(offs_t offset, u8 data) +{ + m_far = data; + remap(AS_IO, 0, 0x400); +} + + +/* + * [0x05] KRR KBC and RTC Control Register + * * x--- ---- KBC clock source select (0) X1 clock (1) SYSCLK * --x- ---- RAMSREL RTC bank select * ---- x--- RTC enable bit @@ -254,6 +322,128 @@ request_irq(12, state ? ASSERT_LINE : CLEAR_LINE); } +/* + * Serial + */ + +void pc87306_device::irq_serial1_w(int state) +{ + if (!(BIT(m_fer, 1))) + return; + request_irq(3, state ? ASSERT_LINE : CLEAR_LINE); +} + +void pc87306_device::irq_serial2_w(int state) +{ + if (!(BIT(m_fer, 2))) + return; + request_irq(4, state ? ASSERT_LINE : CLEAR_LINE); +} + +void pc87306_device::txd_serial1_w(int state) +{ + if (!(BIT(m_fer, 1))) + return; + m_txd1_callback(state); +} + +void pc87306_device::txd_serial2_w(int state) +{ + if (!(BIT(m_fer, 2))) + return; + m_txd2_callback(state); +} + +void pc87306_device::dtr_serial1_w(int state) +{ + if (!(BIT(m_fer, 1))) + return; + m_ndtr1_callback(state); +} + +void pc87306_device::dtr_serial2_w(int state) +{ + if (!(BIT(m_fer, 2))) + return; + m_ndtr2_callback(state); +} + +void pc87306_device::rts_serial1_w(int state) +{ + if (!(BIT(m_fer, 1))) + return; + m_nrts1_callback(state); +} + +void pc87306_device::rts_serial2_w(int state) +{ + if (!(BIT(m_fer, 2))) + return; + m_nrts2_callback(state); +} + +void pc87306_device::rxd1_w(int state) +{ + m_pc_com[0]->rx_w(state); +} + +void pc87306_device::ndcd1_w(int state) +{ + m_pc_com[0]->dcd_w(state); +} + +void pc87306_device::ndsr1_w(int state) +{ + m_pc_com[0]->dsr_w(state); +} + +void pc87306_device::nri1_w(int state) +{ + m_pc_com[0]->ri_w(state); +} + +void pc87306_device::ncts1_w(int state) +{ + m_pc_com[0]->cts_w(state); +} + +void pc87306_device::rxd2_w(int state) +{ + m_pc_com[1]->rx_w(state); +} + +void pc87306_device::ndcd2_w(int state) +{ + m_pc_com[1]->dcd_w(state); +} + +void pc87306_device::ndsr2_w(int state) +{ + m_pc_com[1]->dsr_w(state); +} + +void pc87306_device::nri2_w(int state) +{ + m_pc_com[1]->ri_w(state); +} + +void pc87306_device::ncts2_w(int state) +{ + m_pc_com[1]->cts_w(state); +} + +/* + * Parallel + */ + +void pc87306_device::irq_parallel_w(int state) +{ + if (!(BIT(m_fer, 0))) + return; + request_irq(5, state ? ASSERT_LINE : CLEAR_LINE); +} + + void pc87306_device::request_irq(int irq, int state) { switch (irq) diff -Nru mame-0.263+dfsg.1/src/devices/machine/pc87306.h mame-0.264+dfsg.1/src/devices/machine/pc87306.h --- mame-0.263+dfsg.1/src/devices/machine/pc87306.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/pc87306.h 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,8 @@ #include "bus/isa/isa.h" #include "machine/8042kbdc.h" #include "machine/ds128x.h" +#include "machine/ins8250.h" +#include "machine/pc_lpt.h" class pc87306_device : public device_t, public device_isa16_card_interface, @@ -25,12 +27,23 @@ auto irq1() { return m_irq1_callback.bind(); } auto irq8() { return m_irq8_callback.bind(); } auto irq9() { return m_irq9_callback.bind(); } -// auto txd1() { return m_txd1_callback.bind(); } -// auto ndtr1() { return m_ndtr1_callback.bind(); } -// auto nrts1() { return m_nrts1_callback.bind(); } -// auto txd2() { return m_txd2_callback.bind(); } -// auto ndtr2() { return m_ndtr2_callback.bind(); } -// auto nrts2() { return m_nrts2_callback.bind(); } + auto txd1() { return m_txd1_callback.bind(); } + auto ndtr1() { return m_ndtr1_callback.bind(); } + auto nrts1() { return m_nrts1_callback.bind(); } + auto txd2() { return m_txd2_callback.bind(); } + auto ndtr2() { return m_ndtr2_callback.bind(); } + auto nrts2() { return m_nrts2_callback.bind(); } + + void rxd1_w(int state); + void ndcd1_w(int state); + void ndsr1_w(int state); + void nri1_w(int state); + void ncts1_w(int state); + void rxd2_w(int state); + void ndcd2_w(int state); + void ndsr2_w(int state); + void nri2_w(int state); + void ncts2_w(int state); protected: virtual void device_start() override; @@ -44,19 +57,20 @@ required_device m_kbdc; required_device m_rtc; -// memory_view m_logical_view; + required_device_array m_pc_com; + required_device m_pc_lpt; devcb_write_line m_gp20_reset_callback; devcb_write_line m_gp25_gatea20_callback; devcb_write_line m_irq1_callback; devcb_write_line m_irq8_callback; devcb_write_line m_irq9_callback; -// devcb_write_line m_txd1_callback; -// devcb_write_line m_ndtr1_callback; -// devcb_write_line m_nrts1_callback; -// devcb_write_line m_txd2_callback; -// devcb_write_line m_ndtr2_callback; -// devcb_write_line m_nrts2_callback; + devcb_write_line m_txd1_callback; + devcb_write_line m_ndtr1_callback; + devcb_write_line m_nrts1_callback; + devcb_write_line m_txd2_callback; + devcb_write_line m_ndtr2_callback; + devcb_write_line m_nrts2_callback; void request_irq(int irq, int state); @@ -65,6 +79,12 @@ void config_map(address_map &map); + u8 far_r(offs_t offset); + void far_w(offs_t offset, u8 data); + + u8 fer_r(offs_t offset); + void fer_w(offs_t offset, u8 data); + u8 keybc_status_r(offs_t offset); void keybc_command_w(offs_t offset, u8 data); u8 rtc_r(offs_t offset); @@ -79,10 +99,23 @@ u8 krr_r(offs_t offset); void krr_w(offs_t offset, u8 data); + void irq_parallel_w(int state); + + void irq_serial1_w(int state); + void txd_serial1_w(int state); + void dtr_serial1_w(int state); + void rts_serial1_w(int state); + void irq_serial2_w(int state); + void txd_serial2_w(int state); + void dtr_serial2_w(int state); + void rts_serial2_w(int state); + u8 m_index = 0; u8 m_locked_state = 2; u8 m_krr = 0; + u8 m_fer = 0; + u8 m_far = 0; }; DECLARE_DEVICE_TYPE(PC87306, pc87306_device); diff -Nru mame-0.263+dfsg.1/src/devices/machine/pcf8583.cpp mame-0.264+dfsg.1/src/devices/machine/pcf8583.cpp --- mame-0.263+dfsg.1/src/devices/machine/pcf8583.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/pcf8583.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -181,8 +181,8 @@ bool pcf8583_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + auto const [err, actual] = read(file, m_data, sizeof(m_data)); + return !err && (actual == sizeof(m_data)); } //------------------------------------------------- @@ -192,8 +192,8 @@ bool pcf8583_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + auto const [err, actual] = write(file, m_data, sizeof(m_data)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/pcf8593.cpp mame-0.264+dfsg.1/src/devices/machine/pcf8593.cpp --- mame-0.263+dfsg.1/src/devices/machine/pcf8593.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/pcf8593.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -134,8 +134,8 @@ bool pcf8593_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + auto const [err, actual] = read(file, m_data, sizeof(m_data)); + return !err && (actual == sizeof(m_data)); } @@ -146,8 +146,8 @@ bool pcf8593_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + auto const [err, actual] = write(file, m_data, sizeof(m_data)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/psion_ssd.cpp mame-0.264+dfsg.1/src/devices/machine/psion_ssd.cpp --- mame-0.263+dfsg.1/src/devices/machine/psion_ssd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/psion_ssd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -42,6 +42,8 @@ #include "softlist_dev.h" +#include + DEFINE_DEVICE_TYPE(PSION_SSD, psion_ssd_device, "psion_ssd", "Psion Solid State Disk") @@ -163,8 +165,11 @@ if (size < 0x10000 || size > 0x800000 || (size & (size - 1)) != 0) return std::make_pair(image_error::INVALIDLENGTH, "Invalid size, must be 64K, 128K, 256K, 512K, 1M, 2M, 4M, 8M"); - if (fread(m_ssd_data, size) != size) - return std::make_pair(std::errc::io_error, std::string()); + std::error_condition err; + size_t actual; + std::tie(err, m_ssd_data, actual) = read(image_core_file(), size); + if (err || (actual != size)) + return std::make_pair(err ? err : std::errc::io_error, std::string()); // check for Flash header if ((m_ssd_data[0] | (m_ssd_data[1] << 8)) == 0xf1a5) // Flash diff -Nru mame-0.263+dfsg.1/src/devices/machine/rp5c01.cpp mame-0.264+dfsg.1/src/devices/machine/rp5c01.cpp --- mame-0.263+dfsg.1/src/devices/machine/rp5c01.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/rp5c01.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -290,8 +290,8 @@ bool rp5c01_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_ram, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = util::read(file, m_ram, RAM_SIZE); + return !err && (actual == RAM_SIZE); } @@ -302,8 +302,8 @@ bool rp5c01_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_ram, RAM_SIZE, actual) && actual == RAM_SIZE; + auto const [err, actual] = util::write(file, m_ram, RAM_SIZE); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/rtc65271.cpp mame-0.264+dfsg.1/src/devices/machine/rtc65271.cpp --- mame-0.263+dfsg.1/src/devices/machine/rtc65271.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/rtc65271.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,6 +21,9 @@ #include "emu.h" #include "rtc65271.h" +#include + + /* Delay between the beginning (UIP asserted) and the end (UIP cleared and update interrupt asserted) of the update cycle */ #define UPDATE_CYCLE_TIME attotime::from_usec(1984) @@ -184,36 +187,45 @@ bool rtc65271_device::nvram_read(util::read_stream &file) { uint8_t buf; + std::error_condition err; size_t actual; /* version flag */ - if (file.read(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &buf, 1); + if (err || (actual != 1)) return false; if (buf != 0) return false; /* control registers */ - if (file.read(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &buf, 1); + if (err || (actual != 1)) return false; m_regs[reg_A] = buf & (reg_A_DV /*| reg_A_RS*/); - if (file.read(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &buf, 1); + if (err || (actual != 1)) return false; m_regs[reg_B] = buf & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); /* alarm registers */ - if (file.read(&m_regs[reg_alarm_second], 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &m_regs[reg_alarm_second], 1); + if (err || (actual != 1)) return false; - if (file.read(&m_regs[reg_alarm_minute], 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &m_regs[reg_alarm_minute], 1); + if (err || (actual != 1)) return false; - if (file.read(&m_regs[reg_alarm_hour], 1, actual) || actual != 1) + std::tie(err, actual) = util::read(file, &m_regs[reg_alarm_hour], 1); + if (err || (actual != 1)) return false; /* user RAM */ - if (file.read(m_regs+14, 50, actual) || actual != 50) + std::tie(err, actual) = util::read(file, m_regs+14, 50); + if (err || (actual != 50)) return false; /* extended RAM */ - if (file.read(m_xram, 4096, actual) || actual != 4096) + std::tie(err, actual) = util::read(file, m_xram, 4096); + if (err || (actual != 4096)) return false; m_regs[reg_D] |= reg_D_VRT; /* the data was backed up successfully */ @@ -273,35 +285,44 @@ bool rtc65271_device::nvram_write(util::write_stream &file) { uint8_t buf; + std::error_condition err; size_t actual; /* version flag */ buf = 0; - if (file.write(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &buf, 1); + if (err) return false; /* control registers */ buf = m_regs[reg_A] & (reg_A_DV | reg_A_RS); - if (file.write(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &buf, 1); + if (err) return false; buf = m_regs[reg_B] & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); - if (file.write(&buf, 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &buf, 1); + if (err) return false; /* alarm registers */ - if (file.write(&m_regs[reg_alarm_second], 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &m_regs[reg_alarm_second], 1); + if (err) return false; - if (file.write(&m_regs[reg_alarm_minute], 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &m_regs[reg_alarm_minute], 1); + if (err) return false; - if (file.write(&m_regs[reg_alarm_hour], 1, actual) || actual != 1) + std::tie(err, actual) = util::write(file, &m_regs[reg_alarm_hour], 1); + if (err) return false; /* user RAM */ - if (file.write(m_regs+14, 50, actual) || actual != 50) + std::tie(err, actual) = util::write(file, m_regs+14, 50); + if (err) return false; /* extended RAM */ - if (file.write(m_xram, 4096, actual) || actual != 4096) + std::tie(err, actual) = util::write(file, m_xram, 4096); + if (err) return false; return true; diff -Nru mame-0.263+dfsg.1/src/devices/machine/rtc9701.cpp mame-0.264+dfsg.1/src/devices/machine/rtc9701.cpp --- mame-0.263+dfsg.1/src/devices/machine/rtc9701.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/rtc9701.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,8 +168,8 @@ bool rtc9701_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(rtc9701_data, 0x200, actual) && actual == 0x200; + auto const [err, actual] = read(file, rtc9701_data, 0x200); + return !err && (actual == 0x200); } @@ -180,8 +180,8 @@ bool rtc9701_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(rtc9701_data, 0x200, actual) && actual == 0x200; + auto const [err, actual] = write(file, rtc9701_data, 0x200); + return !err; } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/machine/s3520cf.cpp mame-0.264+dfsg.1/src/devices/machine/s3520cf.cpp --- mame-0.263+dfsg.1/src/devices/machine/s3520cf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/s3520cf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -164,8 +164,8 @@ bool s3520cf_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_nvdata, 15, actual) && actual == 15; + auto const [err, actual] = read(file, m_nvdata, 15); + return !err && (actual == 15); } //------------------------------------------------- @@ -175,8 +175,8 @@ bool s3520cf_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_nvdata, 15, actual) && actual == 15; + auto const [err, actual] = write(file, m_nvdata, 15); + return !err; } void s3520cf_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) diff -Nru mame-0.263+dfsg.1/src/devices/machine/sda2006.cpp mame-0.264+dfsg.1/src/devices/machine/sda2006.cpp --- mame-0.263+dfsg.1/src/devices/machine/sda2006.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sda2006.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,8 @@ bool sda2006_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_eeprom_data, EEPROM_CAPACITY, actual) && actual == EEPROM_CAPACITY; + auto const [err, actual] = read(file, m_eeprom_data, EEPROM_CAPACITY); + return !err && (actual == EEPROM_CAPACITY); } //------------------------------------------------- @@ -127,8 +127,8 @@ bool sda2006_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_eeprom_data, EEPROM_CAPACITY, actual) && actual == EEPROM_CAPACITY; + auto const [err, actual] = write(file, m_eeprom_data, EEPROM_CAPACITY); + return !err; } int sda2006_device::read_data() diff -Nru mame-0.263+dfsg.1/src/devices/machine/sensorboard.cpp mame-0.264+dfsg.1/src/devices/machine/sensorboard.cpp --- mame-0.263+dfsg.1/src/devices/machine/sensorboard.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sensorboard.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -214,15 +214,15 @@ bool sensorboard_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_curstate, sizeof(m_curstate), actual) && actual == sizeof(m_curstate); + auto const [err, actual] = read(file, m_curstate, sizeof(m_curstate)); + return !err && (sizeof(m_curstate) == actual); } bool sensorboard_device::nvram_write(util::write_stream &file) { // save last board position - size_t actual; - return !file.write(m_curstate, sizeof(m_curstate), actual) && actual == sizeof(m_curstate); + auto const [err, actual] = write(file, m_curstate, sizeof(m_curstate)); + return !err; } bool sensorboard_device::nvram_can_write() const diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis5513_ide.cpp mame-0.264+dfsg.1/src/devices/machine/sis5513_ide.cpp --- mame-0.263+dfsg.1/src/devices/machine/sis5513_ide.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis5513_ide.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -144,6 +144,7 @@ pci_device::device_reset(); command = 0x0000; + command_mask = 5; status = 0x0000; pclass = 0x01018a; m_ide_ctrl0 = 0; diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis5513_ide.h mame-0.264+dfsg.1/src/devices/machine/sis5513_ide.h --- mame-0.263+dfsg.1/src/devices/machine/sis5513_ide.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis5513_ide.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,7 +7,7 @@ #pragma once #include "pci.h" -#include "machine/pci-ide.h" +#include "idectrl.h" class sis5513_ide_device : public pci_device { @@ -40,11 +40,6 @@ virtual void config_map(address_map &map) override; - void ide1_command_map(address_map &map); - void ide1_control_map(address_map &map); - void ide2_command_map(address_map &map); - void ide2_control_map(address_map &map); - void bus_master_ide_control_map(address_map &map); private: required_device m_ide1; required_device m_ide2; @@ -52,6 +47,12 @@ devcb_write_line m_irq_sec_callback; required_address_space m_bus_master_space; + void ide1_command_map(address_map &map); + void ide1_control_map(address_map &map); + void ide2_command_map(address_map &map); + void ide2_control_map(address_map &map); + void bus_master_ide_control_map(address_map &map); + bool ide1_mode(); bool ide2_mode(); diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis630_gui.cpp mame-0.264+dfsg.1/src/devices/machine/sis630_gui.cpp --- mame-0.263+dfsg.1/src/devices/machine/sis630_gui.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis630_gui.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -63,7 +63,7 @@ sis630_gui_device::sis630_gui_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : pci_device(mconfig, SIS630_GUI, tag, owner, clock) - , m_svga(*this, "svga") + , m_vga(*this, "svga") , m_gui_rom(*this, "gui_rom") { set_ids(0x10396300, 0x00, 0x030000, 0x00); @@ -93,13 +93,13 @@ { screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); - screen.set_screen_update(m_svga, FUNC(sis630_svga_device::screen_update)); + screen.set_screen_update(m_vga, FUNC(sis630_vga_device::screen_update)); - SIS630_SVGA(config, m_svga, 0); - m_svga->set_screen("screen"); + SIS630_VGA(config, m_vga, 0); + m_vga->set_screen("screen"); // 64MB according to POST // documentation claims 128MB, assume being wrong - m_svga->set_vram_size(64*1024*1024); + m_vga->set_vram_size(64*1024*1024); } void sis630_gui_device::config_map(address_map &map) @@ -129,7 +129,7 @@ { LOGAGP("Read AGP ID [$50]\n"); // bits 23-16 AGP v1.0 - // bits 15-8 0x5c NEXT_PTR (which goes to NULL terminator, heh) + // bits 15-8 0x5c NEXT_PTR (which goes to NULL terminator) // bits 7-0 CAP_ID (0x02 for AGP) return 0x00105c02; } @@ -196,7 +196,7 @@ void sis630_gui_device::memory_map(address_map &map) { - map(0x0000000, 0x3ffffff).rw(m_svga, FUNC(sis630_svga_device::mem_linear_r), FUNC(sis630_svga_device::mem_linear_w)).umask32(0xffffffff); + map(0x0000000, 0x3ffffff).rw(m_vga, FUNC(sis630_vga_device::mem_linear_r), FUNC(sis630_vga_device::mem_linear_w)); } void sis630_gui_device::io_map(address_map &map) @@ -216,7 +216,7 @@ // RIO + 0x16: 301 RAMDAC // RIO + 0x30/+0x40/+0x50: omitted, legacy '300/'630 VGA regs? // (gamecstl definitely tries to access 0x44 index 5 for readback extension ID) - map(0x30, 0x5f).m(m_svga, FUNC(sis630_svga_device::io_map)); + map(0x30, 0x5f).m(m_vga, FUNC(sis630_vga_device::io_map)); } void sis630_gui_device::legacy_memory_map(address_map &map) @@ -226,7 +226,7 @@ void sis630_gui_device::legacy_io_map(address_map &map) { - map(0x03b0, 0x03df).m(m_svga, FUNC(sis630_svga_device::io_map)); + map(0x03b0, 0x03df).m(m_vga, FUNC(sis630_vga_device::io_map)); } void sis630_gui_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, @@ -264,12 +264,12 @@ // TODO: remove these trampolines uint8_t sis630_gui_device::vram_r(offs_t offset) { - return downcast(m_svga.target())->mem_r(offset); + return downcast(m_vga.target())->mem_r(offset); } void sis630_gui_device::vram_w(offs_t offset, uint8_t data) { - downcast(m_svga.target())->mem_w(offset, data); + downcast(m_vga.target())->mem_w(offset, data); } /***************************** diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis630_gui.h mame-0.264+dfsg.1/src/devices/machine/sis630_gui.h --- mame-0.263+dfsg.1/src/devices/machine/sis630_gui.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis630_gui.h 2024-03-25 14:00:46.000000000 +0000 @@ -36,7 +36,7 @@ void space_io_map(address_map &map); private: - required_device m_svga; + required_device m_vga; required_memory_region m_gui_rom; u8 vram_r(offs_t offset); diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis85c496.cpp mame-0.264+dfsg.1/src/devices/machine/sis85c496.cpp --- mame-0.263+dfsg.1/src/devices/machine/sis85c496.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis85c496.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,6 +34,7 @@ ); map(0x58, 0x59).rw(FUNC(sis85c496_host_device::ide_vesa_config_r), FUNC(sis85c496_host_device::ide_vesa_config_w)); map(0x5a, 0x5a).rw(FUNC(sis85c496_host_device::smram_ctrl_r), FUNC(sis85c496_host_device::smram_ctrl_w)); + map(0xc0, 0xc3).rw(FUNC(sis85c496_host_device::pirqrc_r), FUNC(sis85c496_host_device::pirqrc_w)); map(0xc8, 0xcb).rw(FUNC(sis85c496_host_device::mailbox_r), FUNC(sis85c496_host_device::mailbox_w)); map(0xd0, 0xd0).rw(FUNC(sis85c496_host_device::bios_config_r), FUNC(sis85c496_host_device::bios_config_w)); map(0xd1, 0xd1).rw(FUNC(sis85c496_host_device::isa_decoder_r), FUNC(sis85c496_host_device::isa_decoder_w)); @@ -43,14 +44,15 @@ { pci_host_device::io_configuration_access_map(map); map(0x0000, 0x001f).rw("dma8237_1", FUNC(am9517a_device::read), FUNC(am9517a_device::write)); - map(0x0020, 0x003f).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x0020, 0x0021).rw("pic8259_master", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); +// map(0x0022, 0x0023) 85C497 super I/O map(0x0040, 0x005f).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write)); map(0x0060, 0x0063).rw(FUNC(sis85c496_host_device::at_keybc_r), FUNC(sis85c496_host_device::at_keybc_w)); map(0x0064, 0x0067).rw("keybc", FUNC(at_keyboard_controller_device::status_r), FUNC(at_keyboard_controller_device::command_w)); - map(0x0070, 0x007f).w(FUNC(sis85c496_host_device::rtc_nmi_w)).umask32(0x00ff00ff); - map(0x0070, 0x007f).rw("rtc", FUNC(ds12885_device::data_r), FUNC(ds12885_device::data_w)).umask32(0xff00ff00); + map(0x0070, 0x0070).lr8(NAME([this] () { return m_ds12885->get_address(); })).w(FUNC(sis85c496_host_device::rtc_address_nmi_w)); + map(0x0071, 0x0071).rw("rtc", FUNC(ds12885_device::data_r), FUNC(ds12885_device::data_w)); map(0x0080, 0x009f).rw(FUNC(sis85c496_host_device::at_page8_r), FUNC(sis85c496_host_device::at_page8_w)); - map(0x00a0, 0x00bf).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x00a0, 0x00a1).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x00c0, 0x00df).rw(FUNC(sis85c496_host_device::at_dma8237_2_r), FUNC(sis85c496_host_device::at_dma8237_2_w)); map(0x00e0, 0x00ef).noprw(); } @@ -127,6 +129,25 @@ ISA16(config, m_isabus, 0); m_isabus->set_memspace(m_maincpu, AS_PROGRAM); m_isabus->set_iospace(m_maincpu, AS_IO); + m_isabus->irq3_callback().set(FUNC(sis85c496_host_device::pc_irq3_w)); + m_isabus->irq4_callback().set(FUNC(sis85c496_host_device::pc_irq4_w)); + m_isabus->irq5_callback().set(FUNC(sis85c496_host_device::pc_irq5_w)); + m_isabus->irq6_callback().set(FUNC(sis85c496_host_device::pc_irq6_w)); + m_isabus->irq7_callback().set(FUNC(sis85c496_host_device::pc_irq7_w)); + m_isabus->irq2_callback().set(FUNC(sis85c496_host_device::pc_irq9_w)); + m_isabus->irq10_callback().set(FUNC(sis85c496_host_device::pc_irq10_w)); + m_isabus->irq11_callback().set(FUNC(sis85c496_host_device::pc_irq11_w)); + m_isabus->irq12_callback().set(FUNC(sis85c496_host_device::pc_irq12m_w)); + m_isabus->irq14_callback().set(FUNC(sis85c496_host_device::pc_irq14_w)); + m_isabus->irq15_callback().set(FUNC(sis85c496_host_device::pc_irq15_w)); + m_isabus->drq0_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq0_w)); + m_isabus->drq1_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq1_w)); + m_isabus->drq2_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq2_w)); + m_isabus->drq3_callback().set(m_dma8237_1, FUNC(am9517a_device::dreq3_w)); + m_isabus->drq5_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq1_w)); + m_isabus->drq6_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq2_w)); + m_isabus->drq7_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq3_w)); + m_isabus->iochck_callback().set(FUNC(sis85c496_host_device::iochck_w)); IDE_CONTROLLER_32(config, m_ide[0]).options(ata_devices, "hdd", nullptr, false); m_ide[0]->irq_handler().set(m_pic8259_slave, FUNC(pic8259_device::ir6_w)); @@ -174,6 +195,9 @@ set_spaces(&m_maincpu->space(AS_PROGRAM), &m_maincpu->space(AS_IO)); + m_pci_root->set_pin_mapper(pci_pin_mapper(*this, FUNC(sis85c496_host_device::pin_mapper))); + m_pci_root->set_irq_handler(pci_irq_handler(*this, FUNC(sis85c496_host_device::irq_handler))); + memory_window_start = 0; memory_window_end = 0xffffffff; memory_offset = 0; @@ -215,6 +239,8 @@ m_shadctrl = 0; m_smramctrl = 0; m_ide_vesa_ctrl = 0; + + memset(m_pirqrc, 0x80, sizeof(m_pirqrc)); } void sis85c496_host_device::device_config_complete() @@ -562,6 +588,129 @@ void sis85c496_host_device::pc_dack6_w(int state) { pc_select_dma_channel(6, state); } void sis85c496_host_device::pc_dack7_w(int state) { pc_select_dma_channel(7, state); } +void sis85c496_host_device::pc_irq1_w(int state) { m_pic8259_master->ir1_w(state); } +void sis85c496_host_device::pc_irq3_w(int state) { m_pic8259_master->ir3_w(state); } +void sis85c496_host_device::pc_irq4_w(int state) { m_pic8259_master->ir4_w(state); } +void sis85c496_host_device::pc_irq5_w(int state) { m_pic8259_master->ir5_w(state); } +void sis85c496_host_device::pc_irq6_w(int state) { m_pic8259_master->ir6_w(state); } +void sis85c496_host_device::pc_irq7_w(int state) { m_pic8259_master->ir7_w(state); } +void sis85c496_host_device::pc_irq8n_w(int state) { m_pic8259_slave->ir0_w(state); } +void sis85c496_host_device::pc_irq9_w(int state) { m_pic8259_slave->ir1_w(state); } +void sis85c496_host_device::pc_irq10_w(int state) { m_pic8259_slave->ir2_w(state); } +void sis85c496_host_device::pc_irq11_w(int state) { m_pic8259_slave->ir3_w(state); } +void sis85c496_host_device::pc_irq12m_w(int state) { m_pic8259_slave->ir4_w(state); } +void sis85c496_host_device::pc_irq14_w(int state) { m_pic8259_slave->ir6_w(state); } +void sis85c496_host_device::pc_irq15_w(int state) { m_pic8259_slave->ir7_w(state); } + +uint8_t sis85c496_host_device::pirqrc_r(offs_t offset) +{ + return m_pirqrc[offset]; +} + +void sis85c496_host_device::pirqrc_w(offs_t offset, uint8_t data) +{ + m_pirqrc[offset] = data; + logerror("pirqrc[%d] = %02x\n", offset, m_pirqrc[offset]); +} + +int sis85c496_host_device::pin_mapper(int pin) +{ + if(pin < 0 || pin >= 4 || (m_pirqrc[pin] & 0x80)) + return -1; + return m_pirqrc[pin]; +} + +void sis85c496_host_device::irq_handler(int line, int state) +{ + if(line < 0 && line >= 16) + return; + + logerror("irq_handler %d %d\n", line, state); + redirect_irq(line, state); +} + +void sis85c496_host_device::pc_pirqa_w(int state) +{ + int irq = m_pirqrc[0] & 15; + + if (!(BIT(m_pirqrc[0], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqb_w(int state) +{ + int irq = m_pirqrc[1] & 15; + + if (!(BIT(m_pirqrc[1], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqc_w(int state) +{ + int irq = m_pirqrc[2] & 15; + + if (!(BIT(m_pirqrc[2], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::pc_pirqd_w(int state) +{ + int irq = m_pirqrc[3] & 15; + + if (!(BIT(m_pirqrc[3], 7))) + return; + redirect_irq(irq, state); +} + +void sis85c496_host_device::redirect_irq(int irq, int state) +{ + switch (irq) + { + case 0: + case 1: + case 2: + case 8: + case 13: + break; + case 3: + m_pic8259_master->ir3_w(state); + break; + case 4: + m_pic8259_master->ir4_w(state); + break; + case 5: + m_pic8259_master->ir5_w(state); + break; + case 6: + m_pic8259_master->ir6_w(state); + break; + case 7: + m_pic8259_master->ir7_w(state); + break; + case 9: + m_pic8259_slave->ir1_w(state); + break; + case 10: + m_pic8259_slave->ir2_w(state); + break; + case 11: + m_pic8259_slave->ir3_w(state); + break; + case 12: + m_pic8259_slave->ir4_w(state); + break; + case 14: + m_pic8259_slave->ir6_w(state); + break; + case 15: + m_pic8259_slave->ir7_w(state); + break; + } +} + uint8_t sis85c496_host_device::at_portb_r() { uint8_t data = m_at_speaker; @@ -584,17 +733,24 @@ m_pit8254->write_gate2(BIT(data, 0)); at_speaker_set_spkrdata( BIT(data, 1)); m_channel_check = BIT(data, 3); - //m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); + if (m_channel_check) + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); +} + +void sis85c496_host_device::iochck_w(int state) +{ + if (!state && !m_channel_check && m_nmi_enabled) + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } uint8_t sis85c496_host_device::at_dma8237_2_r(offs_t offset) { - return m_dma8237_2->read( offset / 2); + return m_dma8237_2->read(offset / 2); } void sis85c496_host_device::at_dma8237_2_w(offs_t offset, uint8_t data) { - m_dma8237_2->write( offset / 2, data); + m_dma8237_2->write(offset / 2, data); } uint8_t sis85c496_host_device::at_keybc_r(offs_t offset) @@ -617,10 +773,9 @@ } } - -void sis85c496_host_device::rtc_nmi_w(uint8_t data) +void sis85c496_host_device::rtc_address_nmi_w(uint8_t data) { - m_nmi_enabled = BIT(data,7); + m_nmi_enabled = BIT(data, 7); //m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0)); m_ds12885->address_w(data); } diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis85c496.h mame-0.264+dfsg.1/src/devices/machine/sis85c496.h --- mame-0.263+dfsg.1/src/devices/machine/sis85c496.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis85c496.h 2024-03-25 14:00:46.000000000 +0000 @@ -46,6 +46,25 @@ void set_cpu_tag(const char *tag); void set_ram_size(int ram_size); + void pc_pirqa_w(int state); + void pc_pirqb_w(int state); + void pc_pirqc_w(int state); + void pc_pirqd_w(int state); + + void pc_irq1_w(int state); + void pc_irq3_w(int state); + void pc_irq4_w(int state); + void pc_irq5_w(int state); + void pc_irq6_w(int state); + void pc_irq7_w(int state); + void pc_irq8n_w(int state); + void pc_irq9_w(int state); + void pc_irq10_w(int state); + void pc_irq11_w(int state); + void pc_irq12m_w(int state); + void pc_irq14_w(int state); + void pc_irq15_w(int state); + protected: virtual void device_start() override; virtual void device_reset() override; @@ -90,6 +109,8 @@ uint8_t m_channel_check; uint8_t m_nmi_enabled; + uint8_t m_pirqrc[4]; + int ram_size; std::vector ram; uint32_t m_mailbox; @@ -150,15 +171,24 @@ void pc_dack7_w(int state); uint8_t at_dma8237_2_r(offs_t offset); void at_dma8237_2_w(offs_t offset, uint8_t data); + void iochck_w(int state); uint8_t at_keybc_r(offs_t offset); void at_keybc_w(offs_t offset, uint8_t data); - void rtc_nmi_w(uint8_t data); + u8 rtc_address_r(); + void rtc_address_nmi_w(uint8_t data); uint8_t pc_dma_read_byte(offs_t offset); void pc_dma_write_byte(offs_t offset, uint8_t data); uint8_t pc_dma_read_word(offs_t offset); void pc_dma_write_word(offs_t offset, uint8_t data); void cpu_a20_w(int state); void cpu_reset_w(int state); + + uint8_t pirqrc_r(offs_t offset); + void pirqrc_w(offs_t offset, uint8_t data); + void redirect_irq(int irq, int state); + + int pin_mapper(int pin); + void irq_handler(int line, int state); }; DECLARE_DEVICE_TYPE(SIS85C496_HOST, sis85c496_host_device) diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis950_lpc.cpp mame-0.264+dfsg.1/src/devices/machine/sis950_lpc.cpp --- mame-0.263+dfsg.1/src/devices/machine/sis950_lpc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis950_lpc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2,28 +2,30 @@ // copyright-holders: Angelo Salese /************************************************************************************************** - SiS950 LPC implementation (Super I/O & southbridge) +SiS950 LPC implementation (Super I/O & southbridge) - TODO: - - Convert most stuff declared here to generic interfaces; - - Flash ROM handling - \- Doesn't survive a soft reset; - - Fix EISA; - - INIT register (reset & A20 control + fast gates + fast reset timing control); - - Override PS/2 ports if USB legacy mode is enabled; - - NMI & SMI handling; - - SMBus handling; - - RTC extended bank enable; - \- Doesn't survive a CMOS write after fast reset; - - Shadow registers for PIC and PIT; - - IRQ remaps - \- INTA GUI - \- INTB AUDIO and MODEM - \- INTC ethernet - \- INTD USB - - IRQ software traps ($6e-$6f); - \- Documentation mentions that those can be read-back too, huh? - - Understand what's the caveat of "changing device ID number" via BIOS control $40 bit 6; +TODO: +- Convert most stuff declared here to generic interfaces; + \- Despite what the datasheet claims it really looks like that a separate Super I/O provides + the usual x86 resources; +- Flash ROM handling + \- Doesn't survive a soft reset; +- Fix EISA; +- INIT register (reset & A20 control + fast gates + fast reset timing control); +- Override PS/2 ports if USB legacy mode is enabled; +- NMI & SMI handling; +- SMBus handling; +- RTC extended bank enable; + \- Doesn't survive a CMOS write after fast reset; +- Shadow registers for PIC and PIT; +- IRQ remaps for PCI_SLOT + \- INTA GUI + \- INTB AUDIO and MODEM + \- INTC ethernet + \- INTD USB +- IRQ software traps ($6e-$6f); + \- Documentation mentions that those can be read-back too, huh? +- Understand what's the catch of "changing device ID number" via BIOS control $40 bit 6; **************************************************************************************************/ @@ -63,9 +65,11 @@ , m_dmac_slave(*this, "dmac_slave") , m_pit(*this, "pit") , m_keybc(*this, "keybc") + , m_isabus(*this, "isabus") , m_speaker(*this, "speaker") , m_rtc(*this, "rtc") - , m_uart(*this, "uart") + , m_ps2_con(*this, "ps2_con") + , m_aux_con(*this, "aux_con") , m_acpi(*this, "acpi") , m_smbus(*this, "smbus") , m_fast_reset_cb(*this) @@ -158,18 +162,26 @@ // TODO: EISA, from virtual bridge - // TODO: selectable between PCI clock / 4 (33 MHz) or 7.159 MHz, via reg $47 bit 5 - KBDC8042(config, m_keybc); - m_keybc->set_keyboard_type(kbdc8042_device::KBDC8042_PS2); - m_keybc->set_interrupt_type(kbdc8042_device::KBDC8042_DOUBLE); - m_keybc->input_buffer_full_callback().set(m_pic_master, FUNC(pic8259_device::ir1_w)); - m_keybc->input_buffer_full_mouse_callback().set(m_pic_slave, FUNC(pic8259_device::ir4_w)); - m_keybc->system_reset_callback().set(FUNC(sis950_lpc_device::cpu_reset_w)); - m_keybc->gate_a20_callback().set(FUNC(sis950_lpc_device::cpu_a20_w)); - m_keybc->set_keyboard_tag("at_keyboard"); - - at_keyboard_device &at_keyb(AT_KEYB(config, "at_keyboard", pc_keyboard_device::KEYBOARD_TYPE::AT, 1)); - at_keyb.keypress().set(m_keybc, FUNC(kbdc8042_device::keyboard_w)); + // TODO: selectable between PCI clock / 4 or 7.159 MHz, via reg $47 bit 5 + PS2_KEYBOARD_CONTROLLER(config, m_keybc, DERIVED_CLOCK(1, 4)); + m_keybc->set_default_bios_tag("compaq"); + m_keybc->hot_res().set(FUNC(sis950_lpc_device::cpu_reset_w)); + m_keybc->gate_a20().set(FUNC(sis950_lpc_device::cpu_a20_w)); + m_keybc->kbd_irq().set(m_pic_master, FUNC(pic8259_device::ir1_w)); + m_keybc->kbd_clk().set(m_ps2_con, FUNC(pc_kbdc_device::clock_write_from_mb)); + m_keybc->kbd_data().set(m_ps2_con, FUNC(pc_kbdc_device::data_write_from_mb)); + m_keybc->aux_irq().set(m_pic_slave, FUNC(pic8259_device::ir4_w)); + m_keybc->aux_clk().set(m_aux_con, FUNC(pc_kbdc_device::clock_write_from_mb)); + m_keybc->aux_data().set(m_aux_con, FUNC(pc_kbdc_device::data_write_from_mb)); + + PC_KBDC(config, m_ps2_con, pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL); + m_ps2_con->out_clock_cb().set(m_keybc, FUNC(ps2_keyboard_controller_device::kbd_clk_w)); + m_ps2_con->out_data_cb().set(m_keybc, FUNC(ps2_keyboard_controller_device::kbd_data_w)); + + // TODO: doesn't work (wrong PS/2 BIOS?), worked around by disabling for now + PC_KBDC(config, m_aux_con, ps2_mice, nullptr); + m_aux_con->out_clock_cb().set(m_keybc, FUNC(ps2_keyboard_controller_device::aux_clk_w)); + m_aux_con->out_data_cb().set(m_keybc, FUNC(ps2_keyboard_controller_device::aux_data_w)); // TODO: unknown RTC type // Has external RTC bank select at $48, using this one as convenience @@ -177,25 +189,32 @@ m_rtc->irq().set(m_pic_slave, FUNC(pic8259_device::ir0_w)); m_rtc->set_century_index(0x32); - // serial fragment - // TODO: unconfirmed type / clock - INS8250(config, m_uart, XTAL(18'432'000) / 10); - m_uart->out_tx_callback().set("com1", FUNC(rs232_port_device::write_txd)); - m_uart->out_dtr_callback().set("com1", FUNC(rs232_port_device::write_dtr)); - m_uart->out_rts_callback().set("com1", FUNC(rs232_port_device::write_rts)); -// m_uart->out_int_callback().set() -// m_uart->out_baudout_callback().set([this](int state){ if (m_8251dtr_state) m_uart->rclk_w(state); }); // TODO: Fix INS8250 BAUDOUT pin support - - rs232_port_device &rs232(RS232_PORT(config, "com1", default_rs232_devices, nullptr)); - rs232.rxd_handler().set(m_uart, FUNC(ins8250_uart_device::rx_w)); - rs232.dcd_handler().set(m_uart, FUNC(ins8250_uart_device::dcd_w)); - rs232.dsr_handler().set(m_uart, FUNC(ins8250_uart_device::dsr_w)); - rs232.ri_handler().set(m_uart, FUNC(ins8250_uart_device::ri_w)); - rs232.cts_handler().set(m_uart, FUNC(ins8250_uart_device::cts_w)); - // TODO: left/right speaker connection SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); + + ISA16(config, m_isabus, 0); + m_isabus->irq3_callback().set(FUNC(sis950_lpc_device::pc_irq3_w)); + m_isabus->irq4_callback().set(FUNC(sis950_lpc_device::pc_irq4_w)); + m_isabus->irq6_callback().set(FUNC(sis950_lpc_device::pc_irq6_w)); + m_isabus->irq5_callback().set(FUNC(sis950_lpc_device::pc_irq5_w)); + m_isabus->irq7_callback().set(FUNC(sis950_lpc_device::pc_irq7_w)); + m_isabus->irq2_callback().set(FUNC(sis950_lpc_device::pc_irq9_w)); + m_isabus->irq10_callback().set(FUNC(sis950_lpc_device::pc_irq10_w)); + m_isabus->irq11_callback().set(FUNC(sis950_lpc_device::pc_irq11_w)); + m_isabus->irq12_callback().set(FUNC(sis950_lpc_device::pc_irq12m_w)); + m_isabus->irq14_callback().set(FUNC(sis950_lpc_device::pc_irq14_w)); + m_isabus->irq15_callback().set(FUNC(sis950_lpc_device::pc_irq15_w)); + m_isabus->iochck_callback().set(FUNC(sis950_lpc_device::iochck_w)); +} + +void sis950_lpc_device::device_config_complete() +{ + auto isabus = m_isabus.finder_target(); + isabus.first.subdevice(isabus.second)->set_memspace(m_host_cpu, AS_PROGRAM); + isabus.first.subdevice(isabus.second)->set_iospace(m_host_cpu, AS_IO); + + pci_device::device_config_complete(); } void sis950_lpc_device::config_map(address_map &map) @@ -391,26 +410,6 @@ remap_cb(); } -u8 sis950_lpc_device::at_keybc_r(offs_t offset) -{ - return m_keybc->data_r(0); -} - -void sis950_lpc_device::at_keybc_w(offs_t offset, u8 data) -{ - m_keybc->data_w(0, data); -} - -u8 sis950_lpc_device::keybc_status_r(offs_t offset) -{ - return (m_keybc->data_r(4) & 0xfb) | 0x10; // bios needs bit 2 to be 0 as powerup and bit 4 to be 1 -} - -void sis950_lpc_device::keybc_command_w(offs_t offset, u8 data) -{ - m_keybc->data_w(4, data); -} - template void sis950_lpc_device::memory_map(address_map &map) { map(0x00000000, 0x0001ffff).lrw8( @@ -428,11 +427,11 @@ map(0x0020, 0x0021).rw(m_pic_master, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); // map(0x0040, 0x0043) PIT map(0x0040, 0x0043).rw(m_pit, FUNC(pit8254_device::read), FUNC(pit8254_device::write)); - map(0x0060, 0x0060).rw(FUNC(sis950_lpc_device::at_keybc_r), FUNC(sis950_lpc_device::at_keybc_w)); + map(0x0060, 0x0060).rw(m_keybc, FUNC(ps2_keyboard_controller_device::data_r), FUNC(ps2_keyboard_controller_device::data_w)); // map(0x0061, 0x0061) NMI Status Register map(0x0061, 0x0061).rw(FUNC(sis950_lpc_device::nmi_status_r), FUNC(sis950_lpc_device::nmi_control_w)); // undocumented but read, assume LPC complaint - map(0x0064, 0x0064).rw(FUNC(sis950_lpc_device::keybc_status_r), FUNC(sis950_lpc_device::keybc_command_w)); + map(0x0064, 0x0064).rw(m_keybc, FUNC(ps2_keyboard_controller_device::status_r), FUNC(ps2_keyboard_controller_device::command_w)); // map(0x0070, 0x0070) CMOS and NMI Mask map(0x0070, 0x0070).w(FUNC(sis950_lpc_device::rtc_index_w)); map(0x0071, 0x0071).rw(FUNC(sis950_lpc_device::rtc_data_r), FUNC(sis950_lpc_device::rtc_data_w)); @@ -494,7 +493,7 @@ // map(0x03bc, 0x03bf) parallel port 3 // map(0x03e8, 0x03ef) serial 4 // map(0x03f0, 0x03f7) FDC 1 - map(0x03f8, 0x03ff).rw(m_uart, FUNC(ins8250_device::ins8250_r), FUNC(ins8250_device::ins8250_w)); // COM1 + // map(0x03f8, 0x03ff).rw(m_uart, FUNC(ins8250_device::ins8250_r), FUNC(ins8250_device::ins8250_w)); // COM1 // map(0x0530, 0x0537) - MSS (TCP Maximum Segment Size?) // map(0x0604, 0x060b) / @@ -509,6 +508,8 @@ void sis950_lpc_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) { + m_isabus->remap(AS_PROGRAM, 0, 1 << 24); + m_isabus->remap(AS_IO, 0, 0xffff); io_space->install_device(0, 0x07ff, *this, &sis950_lpc_device::io_map); LOGMAP("LPC Remapping table (BIOS: %02x, flash: %02x)\n", m_bios_control, m_flash_control); @@ -571,6 +572,24 @@ } /* + * IRQ sharing + */ + +void sis950_lpc_device::pc_irq1_w(int state) { m_pic_master->ir1_w(state); } +void sis950_lpc_device::pc_irq3_w(int state) { m_pic_master->ir3_w(state); } +void sis950_lpc_device::pc_irq4_w(int state) { m_pic_master->ir4_w(state); } +void sis950_lpc_device::pc_irq5_w(int state) { m_pic_master->ir5_w(state); } +void sis950_lpc_device::pc_irq6_w(int state) { m_pic_master->ir6_w(state); } +void sis950_lpc_device::pc_irq7_w(int state) { m_pic_master->ir7_w(state); } +void sis950_lpc_device::pc_irq8n_w(int state) { m_pic_slave->ir0_w(state); } +void sis950_lpc_device::pc_irq9_w(int state) { m_pic_slave->ir1_w(state); } +void sis950_lpc_device::pc_irq10_w(int state) { m_pic_slave->ir2_w(state); } +void sis950_lpc_device::pc_irq11_w(int state) { m_pic_slave->ir3_w(state); } +void sis950_lpc_device::pc_irq12m_w(int state) { m_pic_slave->ir4_w(state); } +void sis950_lpc_device::pc_irq14_w(int state) { m_pic_slave->ir6_w(state); } +void sis950_lpc_device::pc_irq15_w(int state) { m_pic_slave->ir7_w(state); } + +/* * Start of legacy handling, to be moved out */ @@ -710,14 +729,12 @@ m_dmac_slave->hack_w( state ); } -#if 0 void sis950_lpc_device::iochck_w(int state) { // if (!state && !m_channel_check && m_nmi_enabled) if (!state && !m_channel_check) m_host_cpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } -#endif uint8_t sis950_lpc_device::pc_dma_read_byte(offs_t offset) { diff -Nru mame-0.263+dfsg.1/src/devices/machine/sis950_lpc.h mame-0.264+dfsg.1/src/devices/machine/sis950_lpc.h --- mame-0.263+dfsg.1/src/devices/machine/sis950_lpc.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/sis950_lpc.h 2024-03-25 14:00:46.000000000 +0000 @@ -10,16 +10,15 @@ #include "bus/ata/ataintf.h" #include "bus/isa/isa.h" -#include "bus/rs232/rs232.h" #include "lpc-acpi.h" #include "sis950_smbus.h" #include "cpu/i386/i386.h" -#include "machine/8042kbdc.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "machine/at_keybc.h" #include "machine/am9517a.h" #include "machine/ds128x.h" -#include "machine/ins8250.h" #include "machine/intelfsh.h" #include "machine/pc_lpt.h" #include "machine/pic8259.h" @@ -51,9 +50,24 @@ auto fast_reset_cb() { return m_fast_reset_cb.bind(); } + void pc_irq1_w(int state); + void pc_irq3_w(int state); + void pc_irq4_w(int state); + void pc_irq5_w(int state); + void pc_irq6_w(int state); + void pc_irq7_w(int state); + void pc_irq8n_w(int state); + void pc_irq9_w(int state); + void pc_irq10_w(int state); + void pc_irq11_w(int state); + void pc_irq12m_w(int state); + void pc_irq14_w(int state); + void pc_irq15_w(int state); + protected: virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; + virtual void device_config_complete() override; // virtual void reset_all_mappings() override; @@ -65,6 +79,8 @@ template void memory_map(address_map &map); void io_map(address_map &map); + virtual bool map_first() const override { return true; } + private: required_device m_host_cpu; required_device m_flash_rom; @@ -73,10 +89,12 @@ required_device m_dmac_master; required_device m_dmac_slave; required_device m_pit; - required_device m_keybc; + required_device m_keybc; + required_device m_isabus; required_device m_speaker; required_device m_rtc; - required_device m_uart; + required_device m_ps2_con; + required_device m_aux_con; required_device m_acpi; required_device m_smbus; @@ -132,7 +150,7 @@ u8 fast_init; } m_lpc_legacy; - // SB implementation, to be moved out + // southbridge implementation void pit_out0(int state); void pit_out1(int state); void pit_out2(int state); @@ -161,11 +179,8 @@ void at_page8_w(offs_t offset, uint8_t data); u8 nmi_status_r(); void nmi_control_w(uint8_t data); - u8 at_keybc_r(offs_t offset); - void at_keybc_w(offs_t offset, u8 data); - u8 keybc_status_r(offs_t offset); - void keybc_command_w(offs_t offset, u8 data); void at_speaker_set_spkrdata(uint8_t data); + void iochck_w(int state); }; DECLARE_DEVICE_TYPE(SIS950_LPC, sis950_lpc_device) diff -Nru mame-0.263+dfsg.1/src/devices/machine/smartmed.cpp mame-0.264+dfsg.1/src/devices/machine/smartmed.cpp --- mame-0.263+dfsg.1/src/devices/machine/smartmed.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/smartmed.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -24,6 +24,8 @@ #include "softlist_dev.h" +#include + namespace { @@ -69,18 +71,17 @@ */ std::error_condition smartmedia_image_device::smartmedia_format_1() { + std::error_condition err; + size_t bytes_read; + SM_disk_image_header custom_header; - const int bytes_read = fread(&custom_header, sizeof(custom_header)); - if (bytes_read != sizeof(custom_header)) - { - return std::errc::io_error; - } + std::tie(err, bytes_read) = read(image_core_file(), &custom_header, sizeof(custom_header)); + if (err || (bytes_read != sizeof(custom_header))) + return err ? err : std::errc::io_error; if (custom_header.version > 1) - { return image_error::INVALIDIMAGE; - } m_page_data_size = get_UINT32BE(custom_header.page_data_size); m_page_total_size = get_UINT32BE(custom_header.page_total_size); @@ -116,7 +117,10 @@ fread(&m_mp_opcode, 1); fread(m_data_uid_ptr.get(), 256 + 16); } - fread(m_feeprom_data, m_page_total_size*m_num_pages); + + std::tie(err, m_feeprom_data, bytes_read) = read(image_core_file(), m_page_total_size * m_num_pages); + if (err || (bytes_read != (m_page_total_size * m_num_pages))) + return err ? err : std::errc::io_error; #ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 1; @@ -163,23 +167,20 @@ std::error_condition smartmedia_image_device::smartmedia_format_2() { + std::error_condition err; + size_t bytes_read; + disk_image_format_2_header custom_header; - const int bytes_read = fread(&custom_header, sizeof(custom_header)); - if (bytes_read != sizeof(custom_header)) - { - return std::errc::io_error; - } + std::tie(err, bytes_read) = read(image_core_file(), &custom_header, sizeof(custom_header)); + if (err || (bytes_read != sizeof(custom_header))) + return err ? err : std::errc::io_error; if ((custom_header.data1[0] != 0xEC) && (custom_header.data1[0] != 0x98)) - { return image_error::INVALIDIMAGE; - } if (!detect_geometry(custom_header.data1[0], custom_header.data1[1])) - { return image_error::INVALIDIMAGE; - } m_feeprom_data = std::make_unique(m_page_total_size*m_num_pages); m_data_uid_ptr = std::make_unique(256 + 16); @@ -207,7 +208,9 @@ } memcpy(m_data_uid_ptr.get() + 256, custom_header.data3, 16); - fread(m_feeprom_data, m_page_total_size*m_num_pages); + std::tie(err, m_feeprom_data, bytes_read) = read(image_core_file(), m_page_total_size * m_num_pages); + if (err || (bytes_read != (m_page_total_size * m_num_pages))) + return err ? err : std::errc::io_error; #ifdef SMARTMEDIA_IMAGE_SAVE m_image_format = 2; diff -Nru mame-0.263+dfsg.1/src/devices/machine/spi_sdcard.cpp mame-0.264+dfsg.1/src/devices/machine/spi_sdcard.cpp --- mame-0.263+dfsg.1/src/devices/machine/spi_sdcard.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/spi_sdcard.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,8 +34,8 @@ #define LOG_COMMAND (1U << 1) #define LOG_SPI (1U << 2) -//#define VERBOSE (LOG_COMMAND) -#define LOG_OUTPUT_FUNC osd_printf_info +//#define VERBOSE (LOG_GENERAL | LOG_COMMAND) +//#define LOG_OUTPUT_FUNC osd_printf_info #include "logmacro.h" @@ -259,8 +259,43 @@ break; case 9: // CMD9 - SEND_CSD - m_data[0] = 0x00; // TODO - send_data(1, SD_STATE_STBY); + m_data[0] = 0x00; + m_data[1] = 0xff; + m_data[2] = 0xfe; + + //if (m_type == SD_TYPE_V2) // CSD Version 1.0 + { + u8 block_len = 9; + for (auto i = m_blksize >> 10; i; i >>= 1, ++block_len); + + m_data[3] = 0x00; // 127: CSD_STRUCTURE:2 (00b) 0:6 + m_data[4] = 0x0e; // 119: TAAC:8 + m_data[5] = 0x00; // 111: NSAC:8 + m_data[6] = 0x32; // 103: TRAN_SPEED:8 (32h or 5Ah) + m_data[7] = 0x5b; // 95: CCC:12 (01x110110101b) + m_data[8] = 0x50; // .. READ_BL_LN:4 + m_data[8] |= block_len; + m_data[9] = 0x83; // 79: READ_BL_PARTIAL:1 (1b) WRITE_BLK_MISALIGN:1 READ_BLK_MISALIGN:1 DSR_IMP:1 0:2 C_SIZE:12 + m_data[10] = 0xff; // .. + m_data[11] = 0xed; // .. VDD_R_CURR_MIN:3 VDD_R_CURR_MAX:3 + m_data[12] = 0xb7; // 55: VDD_W_CURR_MIN:3 VDD_W_CURR_MAX:3 C_SIZE_MUL:3 + m_data[13] = 0xbf; // .. ERASE_BLK_EN:1 SECTOR_SIZE:7 + m_data[14] = 0xbf; // .. WP_GRP_SIZE:7 + m_data[15] = 0x04; // 31: WP_GRP_ENABLE:1 0:2 R2W_FACTOR:3 WRITE_BL_LEN:4 + m_data[15] |= (block_len >> 2); + m_data[16] = 0x00; /// .. WRITE_BL_PARTIAL:1 0:5 + m_data[16] |= (block_len & 3) << 6; + m_data[17] = 0x00; // 15: FILE_FORMAT_GRP:1 COPY:1 PERM_WRITE_PROTECT:1 TMP_WRITE_PROTECT:1 FILE_FORMAT:2 WP_UPC:1 0:1 + m_data[18] = 0x01; // 7: CRC7 1:1 + } + /* + else // SD_TYPE_HC: CSD Version 2.0 + { + m_data[3] = 0x40; + } + */ + + send_data(3 + 16, SD_STATE_STBY); break; case 10: // CMD10 - SEND_CID diff -Nru mame-0.263+dfsg.1/src/devices/machine/strata.cpp mame-0.264+dfsg.1/src/devices/machine/strata.cpp --- mame-0.263+dfsg.1/src/devices/machine/strata.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/strata.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -68,8 +68,8 @@ bool strataflash_device::nvram_read(util::read_stream &file) { - size_t actual; - if (file.read(m_flashmemory.get(), COMPLETE_SIZE, actual) || actual != COMPLETE_SIZE) + auto const [err, actual] = read(file, m_flashmemory.get(), COMPLETE_SIZE); + if (err || (COMPLETE_SIZE != actual)) return false; // TODO @@ -176,8 +176,8 @@ return 0; */ - size_t actual; - return !file.write(m_flashmemory.get(), COMPLETE_SIZE, actual) && actual == COMPLETE_SIZE; + auto const [err, actual] = write(file, m_flashmemory.get(), COMPLETE_SIZE); + return !err; } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/devices/machine/t10mmc.cpp mame-0.264+dfsg.1/src/devices/machine/t10mmc.cpp --- mame-0.263+dfsg.1/src/devices/machine/t10mmc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/t10mmc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -5,7 +5,7 @@ #include "multibyte.h" -static int to_msf(int frame) +static int to_msf_raw(int frame) { int m = frame / (75 * 60); int s = (frame / 75) % 60; @@ -14,6 +14,22 @@ return (m << 16) | (s << 8) | f; } +static int to_msf(int frame) +{ + int adjusted_frame = frame + 150; + if (frame <= -151) + adjusted_frame += 450000; + return to_msf_raw(adjusted_frame); +} + +static int to_lba(int msf) +{ + int lba = cdrom_file::msf_to_lba(msf) - 150; + if (BIT(msf, 16, 8) >= 90) // 90:00:00 and later + lba -= 450000; + return lba; +} + void t10mmc::set_model(std::string model_name) { m_model_name = model_name; @@ -308,16 +324,33 @@ break; case T10MMC_CMD_PLAY_AUDIO_MSF: + { + m_phase = SCSI_PHASE_STATUS; + m_transfer_length = 0; + if (!m_image->exists()) { - m_phase = SCSI_PHASE_STATUS; m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; - m_transfer_length = 0; break; } - m_lba = (command[5] % 75) + ((command[4] * 75) % (60*75)) + (command[3] * (75*60)); - m_blocks = (command[8] % 75) + ((command[7] * 75) % (60*75)) + (command[6] * (75*60)) - m_lba; + const uint32_t msf_start = get_u24be(&command[3]); + const uint32_t msf_end = get_u24be(&command[6]); + + int32_t lba_start = to_lba(msf_start); + int32_t lba_end = to_lba(msf_end); + + // LBA valid range is technically -45150 to 404849 but negatives are not handled anywhere + if (lba_start < 0 || lba_end < 0) + { + m_device->logerror("T10MMC: tried playing audio from lba %d to %d\n", lba_start, lba_end); + m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; + set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE); + break; + } + + m_lba = lba_start; + m_blocks = lba_end - lba_start; if (m_lba == 0) { @@ -326,31 +359,47 @@ else m_lba = 150; } - else if (m_lba == 0xffffffff) - { - m_device->logerror("T10MMC: play audio from current not implemented!\n"); - } - - //m_device->logerror("T10MMC: PLAY AUDIO MSF at LBA %x for %x blocks (MSF %i:%i:%i - %i:%i:%i)\n", - //m_lba, m_blocks, command[3], command[4], command[5], command[6], command[7], command[8]); trk = m_image->get_track(m_lba); - if (m_image->get_track_type(trk) == cdrom_file::CD_TRACK_AUDIO) + //m_device->logerror("T10MMC: PLAY AUDIO MSF at LBA %x (track %d) for %x blocks (MSF %02d:%02d:%02d - %02d:%02d:%02d)\n", + //m_lba, trk + 1, m_blocks, command[3], command[4], command[5], command[6], command[7], command[8]); + + if (msf_start == msf_end) { - m_cdda->start_audio(m_lba, m_blocks); - m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS; + // audio start operation does not happen but also isn't an error + m_device->logerror("T10MMC: track is not played\n"); + m_status_code = SCSI_STATUS_CODE_GOOD; + m_audio_sense = SCSI_SENSE_ASC_ASCQ_NO_SENSE; } - else + else if (msf_start == 0xffffff) + { + // when start MSF is set to all FFs, the starting address becomes the current optical head location + m_device->logerror("T10MMC: play audio from current not implemented!\n"); + m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; + set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_STOPPED_DUE_TO_ERROR); + } + else if (msf_start > msf_end) + { + m_device->logerror("T10MMC: track starts after requested end time!\n"); + m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; + set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_ILLEGAL_FIELD_IN_CDB); + } + else if (m_image->get_track_type(trk) != cdrom_file::CD_TRACK_AUDIO) { m_device->logerror("T10MMC: track is NOT audio!\n"); + m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION; set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK); } + else + { + m_cdda->start_audio(m_lba, m_blocks); + m_status_code = SCSI_STATUS_CODE_GOOD; + m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS; + } - m_phase = SCSI_PHASE_STATUS; - m_status_code = SCSI_STATUS_CODE_GOOD; - m_transfer_length = 0; break; + } case T10MMC_CMD_PLAY_AUDIO_TRACK_INDEX: if (!m_image->exists()) @@ -922,9 +971,7 @@ m_device->logerror("T10MMC: header data is not available for track type %d, inserting fake header data\n", track_type); uint32_t msf = to_msf(m_lba); - data[data_idx] = BIT(msf, 16, 8); - data[data_idx+1] = BIT(msf, 8, 8); - data[data_idx+2] = BIT(msf, 0, 8); + put_u24be(&data[data_idx], msf); data[data_idx+3] = 2; // mode 2 } else @@ -1143,7 +1190,8 @@ if (msf) { - frame = to_msf(frame); + // this is relative so don't adjust the LBA when converting to MSF + frame = to_msf_raw(frame); } put_u32be(&data[12], frame); @@ -1216,7 +1264,7 @@ if (msf) { - tstart = to_msf(tstart+150); + tstart = to_msf(tstart); } put_u32be(&data[dptr], tstart); @@ -1244,7 +1292,7 @@ if (msf) { - tstart = to_msf(tstart+150); + tstart = to_msf(tstart); } put_u32be(&data[dptr], tstart); diff -Nru mame-0.263+dfsg.1/src/devices/machine/t10spc.cpp mame-0.264+dfsg.1/src/devices/machine/t10spc.cpp --- mame-0.263+dfsg.1/src/devices/machine/t10spc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/t10spc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -97,7 +97,7 @@ if (command[4] == 0) { data[0] = m_sense_asc & 0x7f; - put_u24be(&data[1], m_sense_information); + put_u24be(&data[1], m_sense_information & 0x1fffff); } else { diff -Nru mame-0.263+dfsg.1/src/devices/machine/t10spc.h mame-0.264+dfsg.1/src/devices/machine/t10spc.h --- mame-0.263+dfsg.1/src/devices/machine/t10spc.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/t10spc.h 2024-03-25 14:00:46.000000000 +0000 @@ -50,6 +50,7 @@ SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_PAUSED = 0x0012, SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_SUCCESSFULLY_COMPLETED = 0x0013, SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_STOPPED_DUE_TO_ERROR = 0x0014, + SCSI_SENSE_ASC_ASCQ_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE = 0x2100, SCSI_SENSE_ASC_ASCQ_ILLEGAL_FIELD_IN_CDB = 0x2400, SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK = 0x6400 }; diff -Nru mame-0.263+dfsg.1/src/devices/machine/timekpr.cpp mame-0.264+dfsg.1/src/devices/machine/timekpr.cpp --- mame-0.263+dfsg.1/src/devices/machine/timekpr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/timekpr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -470,8 +470,8 @@ bool timekeeper_device::nvram_read(util::read_stream &file) { - size_t actual; - if (file.read(&m_data[0], m_size, actual) || actual != m_size) + auto const [err, actual] = util::read(file, &m_data[0], m_size); + if (err || (actual != m_size)) return false; counters_to_ram(); @@ -486,6 +486,6 @@ bool timekeeper_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_data[0], m_size, actual) && actual == m_size; + auto const [err, actual] = util::write(file, &m_data[0], m_size); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/upd7261.cpp mame-0.264+dfsg.1/src/devices/machine/upd7261.cpp --- mame-0.263+dfsg.1/src/devices/machine/upd7261.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/upd7261.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,733 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +/* + * NEC μPD7261A/μPD7261B Hard-Disk Controller + * + * Sources: + * - μPD7261A/μPD7261B Hard-Disk Controllers, © NEC Electronics Inc. + * + * TODO: + * - unemulated commands + * - hard sectored drives + * - concurrent recalibrate/seek commands + * - terminal count + * - drive/head mapping for 3b2 + */ + +#include "emu.h" +#include "upd7261.h" + +#define LOG_GENERAL (1U << 0) +#define LOG_REGR (1U << 1) +#define LOG_REGW (1U << 2) +#define LOG_COMMAND (1U << 3) +#define LOG_STATE (1U << 4) +#define LOG_DMA (1U << 5) + +//#define VERBOSE (LOG_GENERAL|LOG_COMMAND) +#include "logmacro.h" + +unsigned constexpr BUF_SIZE = 4096; + +enum state : u32 +{ + IDLE = 0, + + EXECUTE_READ, + EXECUTE_WRITE, + + SEEK_POLLED0, // recalibrate/seek with polling + SEEK_POLLED1, // recalibrate/seek with polling + + RESULTS_4, // detect error + RESULTS_56, // results: recalibrate, seek + RESULTS_bcdef, // results: read data, check, scan, verify data, write data + RESULTS_789, // results: format, verify id, read id + + COMPLETE, + ERROR, +}; + +enum status_mask : u8 +{ + S_DRQ = 0x01, // data request + S_NCI = 0x02, // not coincident + S_IER = 0x04, // ID error + S_RRQ = 0x08, // reset request + S_SRQ = 0x10, // sense interrupt status request + S_CEL = 0x20, // command end lo + S_CEH = 0x40, // command end hi + S_CB = 0x80, // controller busy +}; + +enum ist_mask : u8 +{ + IST_UA = 0x07, // unit address + IST_NR = 0x08, // not ready + IST_EQC = 0x10, // equipment check + IST_SER = 0x20, // seek error + IST_RC = 0x40, // ready change + IST_SEN = 0x80, // seek end +}; + +enum ust_mask : u8 +{ + UST_D0 = 0x01, // fault/write fault + UST_D1 = 0x02, // seek error/ready + UST_D2 = 0x04, // on cylinder/track 000 + UST_D3 = 0x08, // unit ready/seek complete + UST_D4 = 0x10, // -/drive selected + UST_D5 = 0x20, // write protected/- + UST_D6 = 0x40, // seek end/- + UST_D7 = 0x80, // unit selected/- +}; + +enum est_mask : u8 +{ + EST_MAM = 0x01, // missing address mark + EST_NWR = 0x02, // not writable + EST_ND = 0x04, // no data + EST_NR = 0x08, // not ready + EST_EQC = 0x10, // equipment check + EST_DER = 0x20, // data error + EST_OVR = 0x40, // overrun + EST_ENC = 0x80, // end of cylinder +}; + +enum specify_mode_mask : u8 +{ + SM_STP = 0x0f, // stepping rate + SM_SSEC = 0x10, // soft-sector disk + SM_CRCS = 0x20, // generator polynomial + SM_ECC = 0x40, // ecc is appended in data field +}; + +enum specify_dtlh_mask : u8 +{ + DTLH_DTLH = 0x0f, // data length high bits + DTLH_NPOL = 0x10, // non-polling mode + DTLH_PAD = 0x20, // ID/data pad (0=0x00, 1=0x4e) + DTLH_CRC = 0x40, // initial polynomial counter +}; + +DEFINE_DEVICE_TYPE(UPD7261, upd7261_device, "upd7261", "NEC uPD7261 Hard-Disk Controller") + +upd7261_device::upd7261_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, UPD7261, tag, owner, clock) + , m_drive(*this, "%u", 0) + , m_dreq(*this) + , m_int(*this) + , m_head(0) + , m_specify{} + , m_transfer{} + , m_dreq_state(false) + , m_int_state(false) + , m_tc_state(false) +{ +} + +void upd7261_device::device_start() +{ + save_item(NAME(m_state)); + save_item(NAME(m_head)); + + save_item(NAME(m_status)); + save_item(NAME(m_est)); + save_item(NAME(m_ist)); + save_item(NAME(m_ua)); + save_item(NAME(m_pcn)); + + save_item(STRUCT_MEMBER(m_specify, mode)); + save_item(STRUCT_MEMBER(m_specify, dtlh)); + save_item(STRUCT_MEMBER(m_specify, dtll)); + save_item(STRUCT_MEMBER(m_specify, etn)); + save_item(STRUCT_MEMBER(m_specify, esn)); + save_item(STRUCT_MEMBER(m_specify, gpl2)); + save_item(STRUCT_MEMBER(m_specify, rwch)); + save_item(STRUCT_MEMBER(m_specify, rwcl)); + + save_item(STRUCT_MEMBER(m_transfer, phn)); + save_item(STRUCT_MEMBER(m_transfer, lcnh)); + save_item(STRUCT_MEMBER(m_transfer, lcnl)); + save_item(STRUCT_MEMBER(m_transfer, lhn)); + save_item(STRUCT_MEMBER(m_transfer, lsn)); + save_item(STRUCT_MEMBER(m_transfer, scnt)); + + save_item(NAME(m_buf_index)); + save_item(NAME(m_buf_count)); + save_pointer(NAME(m_buf), BUF_SIZE); + + save_item(NAME(m_dreq_state)); + save_item(NAME(m_int_state)); + save_item(NAME(m_tc_state)); + + m_state_timer = timer_alloc(timer_expired_delegate(FUNC(upd7261_device::state_timer), this)); + + m_buf = std::make_unique(BUF_SIZE); +} + +void upd7261_device::device_reset() +{ + m_state = IDLE; + + m_status = 0; + m_est = 0; + m_ist = 0; + m_ua = 0; + + for (u16 &pcn : m_pcn) + pcn = 0; + + m_buf_index = 0; + m_buf_count = 0; + + set_dreq(false); + set_int(false); +} + +void upd7261_device::map(address_map &map) +{ + map(0x0, 0x0).rw(FUNC(upd7261_device::data_r), FUNC(upd7261_device::data_w)); + map(0x1, 0x1).rw(FUNC(upd7261_device::status_r), FUNC(upd7261_device::command_w)); +} + +void upd7261_device::set_dreq(int state) +{ + if (state != m_dreq_state) + { + LOGMASKED(LOG_STATE, "dreq %d\n", state); + + if (state) + { + m_status |= S_DRQ; + m_buf_count = m_specify.dtl(); + } + else + { + m_status &= ~S_DRQ; + m_buf_count = 0; + } + + m_dreq_state = state; + m_dreq(m_dreq_state); + } +} + +void upd7261_device::set_int(bool state) +{ + if (state != m_int_state) + { + LOGMASKED(LOG_STATE, "int %d\n", state); + m_int_state = state; + m_int(m_int_state); + } +} + +void upd7261_device::tc_w(int state) +{ + LOGMASKED(LOG_STATE, "tc %d\n", state); + + m_tc_state = !state; +} + +u8 upd7261_device::data_r() +{ + if (m_buf_index == m_buf_count) + fatalerror("%s: buffer underrun\n", tag()); + + u8 const data = m_buf[m_buf_index++]; + + if (m_status & S_DRQ) + LOGMASKED(LOG_DMA, "data_r 0x%02x (dma)\n", data); + else + LOGMASKED(LOG_REGR, "data_r 0x%02x (%s)\n", data, machine().describe_context()); + + if ((m_status & S_DRQ) && (m_buf_index == m_buf_count)) + m_state_timer->adjust(attotime::zero); + + return data; +} + +void upd7261_device::data_w(u8 data) +{ + if (m_status & S_DRQ) + LOGMASKED(LOG_DMA, "data_w 0x%02x (dma)\n", data); + else + LOGMASKED(LOG_REGW, "data_w 0x%02x (%s)\n", data, machine().describe_context()); + + if (m_buf_index == BUF_SIZE) + fatalerror("%s: buffer overrun\n", tag()); + + m_buf[m_buf_index++] = data; + + if ((m_status & S_DRQ) && (m_buf_index == m_buf_count)) + m_state_timer->adjust(attotime::zero); +} + +u8 upd7261_device::status_r() +{ + u8 data = m_status; + + LOGMASKED(LOG_REGR, "status_r 0x%02x (%s)\n", data, machine().describe_context()); + + return data; +} + +void upd7261_device::command_w(u8 data) +{ + LOGMASKED(LOG_REGW, "command_w 0x%02x (%s)\n", data, machine().describe_context()); + static constexpr attotime execute = attotime::from_nsec(400); + + if (BIT(data, 4, 4)) + { + m_status &= ~(S_CEH | S_CEL); + m_status |= S_CB; + + m_ua = BIT(data, 0, (m_specify.mode & SM_SSEC) ? 2 : 3); + + m_est = 0; + + switch (BIT(data, 4, 4)) + { + case 0x1: // sense interrupt status + LOGMASKED(LOG_COMMAND, "sense interrupt status 0x%02x\n", m_ist); + m_buf_index = 0; + m_buf_count = 0; + + if (m_status & S_SRQ) + { + m_buf[m_buf_count++] = m_ist; + m_status &= ~S_SRQ; + m_state = COMPLETE; + } + else + m_state = ERROR; + + m_ist = 0; + m_state_timer->adjust(execute); + break; + case 0x2: // specify + m_specify.mode = m_buf[0]; + m_specify.dtlh = m_buf[1]; + m_specify.dtll = m_buf[2]; + m_specify.etn = m_buf[3]; + m_specify.esn = m_buf[4]; + m_specify.gpl2 = m_buf[5]; + m_specify.rwch = m_buf[6]; + m_specify.rwcl = m_buf[7]; + + m_buf_index = 0; + m_buf_count = 0; + + LOGMASKED(LOG_COMMAND, "specify mode 0x%02x dtl 0x%04x etn 0x%02x esn 0x%02x gpl2 0x%02x rwch 0x%02x rwcl 0x%02x\n", + m_specify.mode, m_specify.dtl(), m_specify.etn, m_specify.esn, m_specify.gpl2, m_specify.rwch, m_specify.rwcl); + + if (!(m_specify.mode & SM_SSEC)) + fatalerror("%s: hard sectored mode is not emulated\n", tag()); + + m_state = COMPLETE; + m_state_timer->adjust(execute); + break; + case 0x3: // sense unit status + LOGMASKED(LOG_COMMAND, "sense unit status\n"); + m_buf_index = 0; + m_buf_count = 0; + + if (m_drive[m_ua] && m_drive[m_ua]->exists()) + m_buf[m_buf_count++] = UST_D4 | UST_D1; + else + m_buf[m_buf_count++] = 0; + + m_state = COMPLETE; + m_state_timer->adjust(execute); + break; + case 0x4: // detect error + LOGMASKED(LOG_COMMAND, "detect error (not emulated)\n"); + m_buf_index = 0; + m_buf_count = 0; + + m_state = RESULTS_4; + m_state_timer->adjust(execute); + break; + case 0x5: // recalibrate + LOGMASKED(LOG_COMMAND, "recalibrate (%s mode with polling %s)\n", + BIT(data, 3) ? "buffered" : "normal", (m_specify.dtlh & DTLH_NPOL) ? "disabled" : "enabled"); + m_buf_index = 0; + m_buf_count = 0; + + if (m_specify.mode & SM_SSEC) + { + if (m_specify.dtlh & DTLH_NPOL) + { + // non-polled mode + m_buf[m_buf_count++] = IST_SEN | m_ua; + m_state = COMPLETE; + + m_state_timer->adjust(attotime::from_ticks(m_specify.stp(m_pcn[m_ua]), clock())); + m_pcn[m_ua] = 0; + } + else + { + // polled mode + m_state = SEEK_POLLED0; + m_state_timer->adjust(execute, 0); + } + } + break; + case 0x6: // seek + LOGMASKED(LOG_COMMAND, "seek pcn 0x%04x (%s mode with polling %s)\n", + u16(m_buf[0]) << 8 | m_buf[1], BIT(data, 3) ? "buffered" : "normal", + (m_specify.dtlh & DTLH_NPOL) ? "disabled" : "enabled"); + + m_buf_index = 0; + m_buf_count = 0; + if (m_specify.mode & SM_SSEC) + { + u16 const pcn = u16(m_buf[0]) << 8 | m_buf[1]; + + if (m_specify.dtlh & DTLH_NPOL) + { + // non-polled mode + m_buf[m_buf_count++] = IST_SEN | m_ua; + m_state = COMPLETE; + + m_state_timer->adjust(attotime::from_ticks(m_specify.stp((pcn > m_pcn[m_ua]) ? pcn - m_pcn[m_ua] : m_pcn[m_ua] - pcn), clock())); + m_pcn[m_ua] = pcn; + } + else + { + m_state = SEEK_POLLED0; + m_state_timer->adjust(execute, pcn); + } + } + break; + case 0x7: // format + LOGMASKED(LOG_COMMAND, "format (not emulated)\n"); + break; + case 0x8: // verify id + LOGMASKED(LOG_COMMAND, "verify id (not emulated)\n"); + break; + case 0x9: // read id + LOGMASKED(LOG_COMMAND, "read id (not emulated)\n"); + break; + case 0xa: // read diagnostic + LOGMASKED(LOG_COMMAND, "read diagnostic (not emulated)\n"); + break; + case 0xb: // read data + if (m_specify.mode & SM_SSEC) + { + m_transfer.phn = m_buf[0]; + m_transfer.lcnh = m_buf[1]; + m_transfer.lcnl = m_buf[2]; + m_transfer.lhn = m_buf[3]; + m_transfer.lsn = m_buf[4]; + m_transfer.scnt = m_buf[5]; + + m_buf_index = 0; + m_buf_count = 0; + + LOGMASKED(LOG_COMMAND, "read data phn 0x%02x lcn 0x%04x lhn 0x%02x lsn 0x%02x scnt 0x%02x\n", + m_transfer.phn, m_transfer.lcn(), m_transfer.lhn, m_transfer.lsn, m_transfer.scnt); + + m_state = EXECUTE_READ; + m_state_timer->adjust(execute); + } + break; + case 0xc: // check + LOGMASKED(LOG_COMMAND, "check (not emulated)\n"); + break; + case 0xd: // scan + LOGMASKED(LOG_COMMAND, "scan (not emulated)\n"); + break; + case 0xe: // verify data + LOGMASKED(LOG_COMMAND, "verify data (not emulated)\n"); + break; + case 0xf: // write data + if (m_specify.mode & SM_SSEC) + { + m_transfer.phn = m_buf[0]; + m_transfer.lcnh = m_buf[1]; + m_transfer.lcnl = m_buf[2]; + m_transfer.lhn = m_buf[3]; + m_transfer.lsn = m_buf[4]; + m_transfer.scnt = m_buf[5]; + + m_buf_index = 0; + m_buf_count = 0; + + LOGMASKED(LOG_COMMAND, "write data phn 0x%02x lcn 0x%04x lhn 0x%02x lsn 0x%02x scnt 0x%02x\n", + m_transfer.phn, m_transfer.lcn(), m_transfer.lhn, m_transfer.lsn, m_transfer.scnt); + + m_state = EXECUTE_WRITE; + set_dreq(true); + } + break; + } + } + else + { + u8 mask = (S_CEH | S_CEL | S_SRQ); + + LOGMASKED(LOG_COMMAND, "auxiliary command%s%s%s%s\n", + BIT(data, 0) ? ", chip reset" : "", + BIT(data, 1) ? ", clear data" : "", + BIT(data, 2) ? ", clear srq" : "", + BIT(data, 3) ? ", clear ce" : ""); + + if (BIT(data, 0)) + reset(); + if (BIT(data, 1)) + { + m_buf_index = 0; + m_buf_count = 0; + } + if (BIT(data, 2)) + mask &= ~S_SRQ; + if (BIT(data, 3)) + m_status &= ~(S_CEH | S_CEL); + + set_int(m_status & mask); + } +} + +void upd7261_device::state_timer(s32 param) +{ + // step state machine + attotime const delay = state_step(param); + + // check for data stall + if (delay.is_never()) + return; + + // repeat until idle + if (m_state != IDLE) + m_state_timer->adjust(delay); +} + +attotime upd7261_device::state_step(s32 param) +{ + attotime delay = attotime::zero; + + switch (m_state) + { + case IDLE: + break; + + case EXECUTE_READ: + // check unit address is valid + if (!m_drive[m_ua] && m_drive[m_ua]->exists()) + m_est |= EST_NR; + + if (m_transfer.scnt && !m_est) + { + // HACK: The MG-1 has an additional external head select bit, and + // expects the controller to report "no data" when the sector to be + // transferred can't be found on the track. This hack uses a fake + // external head register to check whether the current head matches + // before reading the disk. + if (m_transfer.lhn == ((m_head & ~7) | (m_transfer.lhn & 7))) + { + // read a sector + harddisk_image_device &hid(*m_drive[m_ua]); + hard_disk_file::info const &i = hid.get_info(); + + u32 const lba = ((m_transfer.lcn() * i.heads) + m_transfer.lhn) * i.sectors + m_transfer.lsn; + + hid.read(lba, m_buf.get()); + m_buf_index = 0; + + m_transfer.scnt--; + + if (m_transfer.lsn++ == m_specify.esn) + { + m_transfer.lsn = 0; + + if (m_transfer.lhn++ == m_specify.etn) + { + m_transfer.lhn = 0; + m_transfer.lcnl++; + if (m_transfer.lcnl == 0) + m_transfer.lcnh++; + + if (m_transfer.scnt) + m_est |= EST_ENC; + } + } + + delay = attotime::never; + } + else + { + m_est = EST_ND; + m_state = RESULTS_bcdef; + m_buf_index = 0; + } + } + else + { + m_state = RESULTS_bcdef; + m_buf_index = 0; + } + + set_dreq(m_state == EXECUTE_READ); + break; + + case EXECUTE_WRITE: + // check unit address is valid + if (!m_drive[m_ua] && m_drive[m_ua]->exists()) + m_est |= EST_NR; + + if (m_transfer.scnt && !m_est) + { + // HACK: as above for reading + if (m_transfer.lhn == ((m_head & ~7) | (m_transfer.lhn & 7))) + { + // write a sector + harddisk_image_device &hid(*m_drive[m_ua]); + hard_disk_file::info const &i = hid.get_info(); + + u32 const lba = ((m_transfer.lcn() * i.heads) + m_transfer.lhn) * i.sectors + m_transfer.lsn; + + hid.write(lba, m_buf.get()); + m_buf_index = 0; + + m_transfer.scnt--; + + if (m_transfer.lsn++ == m_specify.esn) + { + m_transfer.lsn = 0; + + if (m_transfer.lhn++ == m_specify.etn) + { + m_transfer.lhn = 0; + m_transfer.lcnl++; + if (m_transfer.lcnl == 0) + m_transfer.lcnh++; + + if (m_transfer.scnt) + { + m_est |= EST_ENC; + m_state = RESULTS_bcdef; + } + } + } + + if (!m_transfer.scnt) + m_state = RESULTS_bcdef; + + if (m_state == EXECUTE_WRITE) + delay = attotime::never; + } + else + { + m_est = EST_ND; + m_state = RESULTS_bcdef; + m_buf_index = 0; + } + } + else + { + m_state = RESULTS_bcdef; + m_buf_index = 0; + } + + set_dreq(m_state == EXECUTE_WRITE); + break; + + case SEEK_POLLED0: + m_status &= ~S_CB; + m_status |= S_CEH; + m_state = SEEK_POLLED1; + + delay = attotime::from_ticks(m_specify.stp(std::abs(m_pcn[m_ua] - param)), clock()); + m_pcn[m_ua] = param; + + set_int(true); + break; + + case SEEK_POLLED1: + m_ist |= IST_SEN | m_ua; + m_status |= S_SRQ; + m_state = IDLE; + + set_int(true); + break; + + case RESULTS_4: + m_buf[m_buf_count++] = 0; // eadh + m_buf[m_buf_count++] = 0; // eadl + m_buf[m_buf_count++] = 0; // ept1 + m_buf[m_buf_count++] = 0; // ept2 + m_buf[m_buf_count++] = 0; // ept3 + + m_state = COMPLETE; + break; + + case RESULTS_789: + m_buf[m_buf_count++] = m_est; + m_buf[m_buf_count++] = m_transfer.scnt; + + m_state = COMPLETE; + break; + + case RESULTS_bcdef: + m_buf[m_buf_count++] = m_est; + m_buf[m_buf_count++] = m_transfer.phn; + // (flag) + m_buf[m_buf_count++] = m_transfer.lcnh; + m_buf[m_buf_count++] = m_transfer.lcnl; + m_buf[m_buf_count++] = m_transfer.lhn; + m_buf[m_buf_count++] = m_transfer.lsn; + m_buf[m_buf_count++] = m_transfer.scnt; + + m_state = COMPLETE; + break; + + case COMPLETE: + if (m_est) + m_status |= S_CEL; + else + m_status |= S_CEH; + m_status &= ~S_CB; + + set_int(true); + + m_state = IDLE; + break; + + case ERROR: + m_status |= S_CEH | S_CEL; + m_status &= ~S_CB; + + set_int(true); + + m_state = IDLE; + break; + } + + return delay; +} + +u16 upd7261_device::specify::dtl() const +{ + return u16(dtlh & DTLH_DTLH) << 8 | dtll; +} + +u16 upd7261_device::transfer::lcn() const +{ + return u16(lcnh) << 8 | lcnl; +} + +unsigned upd7261_device::specify::stp(unsigned cylinders) const +{ + /* + * Datasheet formula for ST506 interface stepping is given as: + * + * (16 - stp) * 2110 * tCY + * + * Example for a 10MHz clock gives a range of stepping values from + * 2.11ms to 33.76ms; formula seems incorrect by a factor of 10? + */ + return (16 - (mode & SM_STP)) * 21100 * cylinders; +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/upd7261.h mame-0.264+dfsg.1/src/devices/machine/upd7261.h --- mame-0.263+dfsg.1/src/devices/machine/upd7261.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/upd7261.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,104 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +#ifndef MAME_MACHINE_UPD7261_H +#define MAME_MACHINE_UPD7261_H + +#pragma once + +#include "imagedev/harddriv.h" + +class upd7261_device + : public device_t +{ +public: + upd7261_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + + // output lines + auto out_dreq() { return m_dreq.bind(); } + auto out_int() { return m_int.bind(); } + + // input lines + void tc_w(int state); + void head_w(u8 data) { m_head = data; } + + void map(address_map &map); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + void set_dreq(int state); + void set_int(bool state); + + u8 data_r(); + u8 status_r(); + void data_w(u8 data); + void command_w(u8 data); + + void state_timer(s32 param); + attotime state_step(s32 param); + +private: + optional_device_array m_drive; + + devcb_write_line m_dreq; + devcb_write_line m_int; + + emu_timer *m_state_timer; + + u32 m_state; + u8 m_head; // head number (extended) + + u8 m_status; // status register + u8 m_est; // error status byte + u8 m_ist; // interrupt status byte + u8 m_ua; // unit address + u16 m_pcn[4]; // physical cylinder number + + struct specify + { + // data transfer length + u16 dtl() const; + + // step time in ticks + unsigned stp(unsigned cylinders) const; + + u8 mode; // operation mode + u8 dtlh; // data transfer length (high byte) + u8 dtll; // data transfer length (low byte) + u8 etn; // ending track number + u8 esn; // ending sector number + u8 gpl2; // gap length 2 + u8 rwch; // reduced write current cylinder (high byte) + u8 rwcl; // reduced write current cylinder (low byte) + } + m_specify; + struct transfer + { + // logical cylinder number + u16 lcn() const; + + u8 phn; // physical head number + u8 lcnh; // logical cylinder number (high byte) + u8 lcnl; // logical cylinder number (low byte) + u8 lhn; // logical head number + u8 lsn; // logical sector number + u8 scnt; // sector count + } + m_transfer; + + // data buffer + u32 m_buf_index; + u32 m_buf_count; + std::unique_ptr m_buf; + + // i/o line state + bool m_dreq_state; + bool m_int_state; + bool m_tc_state; +}; + +DECLARE_DEVICE_TYPE(UPD7261, upd7261_device) + +#endif // MAME_MACHINE_UPD7261_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/w83787f.cpp mame-0.264+dfsg.1/src/devices/machine/w83787f.cpp --- mame-0.263+dfsg.1/src/devices/machine/w83787f.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/w83787f.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,346 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +Winbond W83787IF / W83787F + +'F is the base, 'IF adds IrDA. +Looks similar in design to National PC87306 (including similar reg names) + +**************************************************************************************************/ + +#include "emu.h" +#include "bus/isa/isa.h" +#include "machine/w83787f.h" + +#define LOG_WARN (1U << 1) + +#define VERBOSE (LOG_GENERAL | LOG_WARN) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) + +DEFINE_DEVICE_TYPE(W83787F, w83787f_device, "w83787f", "National Semiconductor W83787F Super I/O Enhanced Sidewinder Lite") + +w83787f_device::w83787f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, W83787F, tag, owner, clock) + , device_isa16_card_interface(mconfig, *this) + , device_memory_interface(mconfig, *this) + , m_space_config("superio_config_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(w83787f_device::config_map), this)) + , m_pc_com(*this, "uart%d", 0U) + , m_pc_lpt(*this, "lpta") + , m_irq1_callback(*this) + , m_irq8_callback(*this) + , m_irq9_callback(*this) + , m_txd1_callback(*this) + , m_ndtr1_callback(*this) + , m_nrts1_callback(*this) + , m_txd2_callback(*this) + , m_ndtr2_callback(*this) + , m_nrts2_callback(*this) +{ } + + +void w83787f_device::device_start() +{ + set_isa_device(); + //m_isa->set_dma_channel(0, this, true); + //m_isa->set_dma_channel(1, this, true); + //m_isa->set_dma_channel(2, this, true); + //m_isa->set_dma_channel(3, this, true); + remap(AS_IO, 0, 0x400); +} + +void w83787f_device::device_reset() +{ + m_locked_state = true; + m_cr1 = 0; +} + +device_memory_interface::space_config_vector w83787f_device::memory_space_config() const +{ + return space_config_vector { + std::make_pair(0, &m_space_config) + }; +} + +void w83787f_device::device_add_mconfig(machine_config &config) +{ + PC_LPT(config, m_pc_lpt); + m_pc_lpt->irq_handler().set(FUNC(w83787f_device::irq_parallel_w)); + + NS16550(config, m_pc_com[0], XTAL(1'843'200)); + m_pc_com[0]->out_int_callback().set(FUNC(w83787f_device::irq_serial1_w)); + m_pc_com[0]->out_tx_callback().set(FUNC(w83787f_device::txd_serial1_w)); + m_pc_com[0]->out_dtr_callback().set(FUNC(w83787f_device::dtr_serial1_w)); + m_pc_com[0]->out_rts_callback().set(FUNC(w83787f_device::rts_serial1_w)); + + NS16550(config, m_pc_com[1], XTAL(1'843'200)); + m_pc_com[1]->out_int_callback().set(FUNC(w83787f_device::irq_serial2_w)); + m_pc_com[1]->out_tx_callback().set(FUNC(w83787f_device::txd_serial2_w)); + m_pc_com[1]->out_dtr_callback().set(FUNC(w83787f_device::dtr_serial2_w)); + m_pc_com[1]->out_rts_callback().set(FUNC(w83787f_device::rts_serial2_w)); +} + +void w83787f_device::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_IO) + { + m_isa->install_device(0x0250, 0x0252, read8sm_delegate(*this, FUNC(w83787f_device::read)), write8sm_delegate(*this, FUNC(w83787f_device::write))); + + //if (BIT(m_fer, 0)) + const u8 lpt_setting = (m_cr1 >> 4) & 3; + if (lpt_setting != 3) + { + const u16 lpt_port[3] = { 0x3bc, 0x278, 0x378 }; + const u16 lpt_addr = lpt_port[lpt_setting & 3]; + LOG("Map LPT1 to I/O port %04x-%04x\n", lpt_addr, lpt_addr + 3); + + m_isa->install_device(lpt_addr, lpt_addr + 3, read8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::read)), write8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::write))); + } + + for (int i = 0; i < 2; i++) + { + const u8 uart_setting = (BIT(m_cr1, 2 + i) >> 1) | (BIT(m_cr1, i)); + if (uart_setting != 3) + { + const u16 uart_port[3] = { 0x2e8, 0x3e8, 0x3f8 }; + const u16 uart_addr = uart_port[uart_setting & 3] ^ (i ? 0x100 : 0x000); + LOG("Map UART%c to I/O port %04x-%04x\n", i ? 'A' : 'B', uart_addr, uart_addr + 7); + m_isa->install_device(uart_addr, uart_addr + 7, read8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_r)), write8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_w))); + } + } + } +} + +u8 w83787f_device::read(offs_t offset) +{ + if (offset != 2 && !machine().side_effects_disabled()) + { + LOGWARN("Invalid %s access read\n", offset & 1 ? "EFIR" : "EFIR"); + return space().unmap(); + } + + if (m_locked_state) + return space().unmap(); + + return space().read_byte(m_index); +} + +void w83787f_device::write(offs_t offset, u8 data) +{ + switch (offset) + { + // EFER + // TODO: 0x89 with GMRD# pin + case 0: m_locked_state = (data != 0x88); break; + // EFIR + case 1: m_index = data; break; + // EFDR + case 2: + if (!m_locked_state) + space().write_byte(m_index, data); + break; + } +} + +// none of these regs have a real naming, they are all CR* +void w83787f_device::config_map(address_map &map) +{ +// map(0x00, 0x00) IDE & FDC + map(0x01, 0x01).lrw8( + NAME([this] (offs_t offset) { + return m_cr1; + }), + NAME([this] (offs_t offset, u8 data) { + m_cr1 = data; + remap(AS_IO, 0, 0x400); + }) + ); +// map(0x02, 0x02) extension adapter mode +// map(0x03, 0x03) game port, UART clocks +// map(0x04, 0x04) game port, UARTA/B power-down tristate +// map(0x05, 0x05) ECP FIFO threshold +// map(0x06, 0x06) 2x / x4 FDD select, FDC power-down tristate, IDE power-down tristate +// map(0x07, 0x07) FDDs type +// map(0x08, 0x08) automatic power-down, FDD write protect +// map(0x09, 0x09) CHIP ID, lock alias, operating mode +// map(0x0a, 0x0a) LPT pins +// map(0x0c, 0x0c) UARTA/B clock source, lock select +// map(0x0d, 0x0d) IrDA select +// map(0x0e, 0x0f) +// map(0x10, 0x10) GIO0 address select 7-0 +// map(0x11, 0x11) GIO0 address select 10-8, GI0 address MODE0-1 +// map(0x12, 0x12) GIO1 address select 7-0 +// map(0x13, 0x13) GIO1 address select 10-8, GI0 address MODE0-1 +// map(0x14, 0x14) GIO0 ddr/mode +// map(0x15, 0x15) GIO1 ddr/mode +} + +/* + * Serial + */ + +void w83787f_device::irq_serial1_w(int state) +{ + if ((m_cr1 & 0x05) == 0x05) + return; + request_irq(3, state ? ASSERT_LINE : CLEAR_LINE); +} + +void w83787f_device::irq_serial2_w(int state) +{ + if ((m_cr1 & 0x0a) == 0x0a) + return; + request_irq(4, state ? ASSERT_LINE : CLEAR_LINE); +} + +void w83787f_device::txd_serial1_w(int state) +{ + if ((m_cr1 & 0x05) == 0x05) + return; + m_txd1_callback(state); +} + +void w83787f_device::txd_serial2_w(int state) +{ + if ((m_cr1 & 0x0a) == 0x0a) + return; + m_txd2_callback(state); +} + +void w83787f_device::dtr_serial1_w(int state) +{ + if ((m_cr1 & 0x05) == 0x05) + return; + m_ndtr1_callback(state); +} + +void w83787f_device::dtr_serial2_w(int state) +{ + if ((m_cr1 & 0x0a) == 0x0a) + return; + m_ndtr2_callback(state); +} + +void w83787f_device::rts_serial1_w(int state) +{ + if ((m_cr1 & 0x05) == 0x05) + return; + m_nrts1_callback(state); +} + +void w83787f_device::rts_serial2_w(int state) +{ + if ((m_cr1 & 0x0a) == 0x0a) + return; + m_nrts2_callback(state); +} + +void w83787f_device::rxd1_w(int state) +{ + m_pc_com[0]->rx_w(state); +} + +void w83787f_device::ndcd1_w(int state) +{ + m_pc_com[0]->dcd_w(state); +} + +void w83787f_device::ndsr1_w(int state) +{ + m_pc_com[0]->dsr_w(state); +} + +void w83787f_device::nri1_w(int state) +{ + m_pc_com[0]->ri_w(state); +} + +void w83787f_device::ncts1_w(int state) +{ + m_pc_com[0]->cts_w(state); +} + +void w83787f_device::rxd2_w(int state) +{ + m_pc_com[1]->rx_w(state); +} + +void w83787f_device::ndcd2_w(int state) +{ + m_pc_com[1]->dcd_w(state); +} + +void w83787f_device::ndsr2_w(int state) +{ + m_pc_com[1]->dsr_w(state); +} + +void w83787f_device::nri2_w(int state) +{ + m_pc_com[1]->ri_w(state); +} + +void w83787f_device::ncts2_w(int state) +{ + m_pc_com[1]->cts_w(state); +} + +/* + * Parallel + */ + +void w83787f_device::irq_parallel_w(int state) +{ + if ((m_cr1 & 0x30) == 0x30) + return; + request_irq(5, state ? ASSERT_LINE : CLEAR_LINE); +} + +void w83787f_device::request_irq(int irq, int state) +{ + switch (irq) + { + case 1: + m_irq1_callback(state); + break; + case 3: + m_isa->irq3_w(state); + break; + case 4: + m_isa->irq4_w(state); + break; + case 5: + m_isa->irq5_w(state); + break; + case 6: + m_isa->irq6_w(state); + break; + case 7: + m_isa->irq7_w(state); + break; + case 8: + m_irq8_callback(state); + break; + case 9: + m_irq9_callback(state); + break; + case 10: + m_isa->irq10_w(state); + break; + case 11: + m_isa->irq11_w(state); + break; + case 12: + m_isa->irq12_w(state); + break; + case 14: + m_isa->irq14_w(state); + break; + case 15: + m_isa->irq15_w(state); + break; + } +} diff -Nru mame-0.263+dfsg.1/src/devices/machine/w83787f.h mame-0.264+dfsg.1/src/devices/machine/w83787f.h --- mame-0.263+dfsg.1/src/devices/machine/w83787f.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/w83787f.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,95 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_MACHINE_W83787F_H +#define MAME_MACHINE_W83787F_H + +#pragma once + +#include "bus/isa/isa.h" +#include "machine/ins8250.h" +#include "machine/pc_lpt.h" + +class w83787f_device : public device_t, + public device_isa16_card_interface, + public device_memory_interface +{ +public: + w83787f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + ~w83787f_device() {} + + void remap(int space_id, offs_t start, offs_t end) override; + +// auto gp20_reset() { return m_gp20_reset_callback.bind(); } +// auto gp25_gatea20() { return m_gp25_gatea20_callback.bind(); } + auto irq1() { return m_irq1_callback.bind(); } + auto irq8() { return m_irq8_callback.bind(); } + auto irq9() { return m_irq9_callback.bind(); } + auto txd1() { return m_txd1_callback.bind(); } + auto ndtr1() { return m_ndtr1_callback.bind(); } + auto nrts1() { return m_nrts1_callback.bind(); } + auto txd2() { return m_txd2_callback.bind(); } + auto ndtr2() { return m_ndtr2_callback.bind(); } + auto nrts2() { return m_nrts2_callback.bind(); } + + void rxd1_w(int state); + void ndcd1_w(int state); + void ndsr1_w(int state); + void nri1_w(int state); + void ncts1_w(int state); + void rxd2_w(int state); + void ndcd2_w(int state); + void ndsr2_w(int state); + void nri2_w(int state); + void ncts2_w(int state); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual space_config_vector memory_space_config() const override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + const address_space_config m_space_config; + + required_device_array m_pc_com; + required_device m_pc_lpt; + + devcb_write_line m_irq1_callback; + devcb_write_line m_irq8_callback; + devcb_write_line m_irq9_callback; + devcb_write_line m_txd1_callback; + devcb_write_line m_ndtr1_callback; + devcb_write_line m_nrts1_callback; + devcb_write_line m_txd2_callback; + devcb_write_line m_ndtr2_callback; + devcb_write_line m_nrts2_callback; + + void request_irq(int irq, int state); + + u8 read(offs_t offset); + void write(offs_t offset, u8 data); + + void config_map(address_map &map); + + void irq_parallel_w(int state); + + void irq_serial1_w(int state); + void txd_serial1_w(int state); + void dtr_serial1_w(int state); + void rts_serial1_w(int state); + void irq_serial2_w(int state); + void txd_serial2_w(int state); + void dtr_serial2_w(int state); + void rts_serial2_w(int state); + + u8 m_index = 0; + + bool m_locked_state = true; + u8 m_cr1 = 0; +}; + +DECLARE_DEVICE_TYPE(W83787F, w83787f_device); + +#endif // MAME_MACHINE_W83787F_H diff -Nru mame-0.263+dfsg.1/src/devices/machine/w83977tf.cpp mame-0.264+dfsg.1/src/devices/machine/w83977tf.cpp --- mame-0.263+dfsg.1/src/devices/machine/w83977tf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/w83977tf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -214,7 +214,7 @@ // FDC m_logical_view[0](0x30, 0x30).rw(FUNC(w83977tf_device::activate_r<0>), FUNC(w83977tf_device::activate_w<0>)); m_logical_view[0](0x31, 0xff).unmaprw(); - // PRT + // LPT m_logical_view[1](0x30, 0x30).rw(FUNC(w83977tf_device::activate_r<1>), FUNC(w83977tf_device::activate_w<1>)); m_logical_view[1](0x60, 0x61).lrw8( NAME([this] (offs_t offset) { diff -Nru mame-0.263+dfsg.1/src/devices/machine/x2201.cpp mame-0.264+dfsg.1/src/devices/machine/x2201.cpp --- mame-0.263+dfsg.1/src/devices/machine/x2201.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x2201.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -99,8 +99,8 @@ bool x2201_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_eeprom[0], 1024 / 8, actual) && actual == 1024 / 8; + auto const [err, actual] = util::read(file, &m_eeprom[0], 1024 / 8); + return !err && (actual == 1024 / 8); } @@ -111,8 +111,8 @@ bool x2201_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_eeprom[0], 1024 / 8, actual) && actual == 1024 / 8; + auto const [err, actual] = util::write(file, &m_eeprom[0], 1024 / 8); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/x2212.cpp mame-0.264+dfsg.1/src/devices/machine/x2212.cpp --- mame-0.263+dfsg.1/src/devices/machine/x2212.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x2212.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,8 +82,8 @@ bool x2212_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_e2prom[0], m_size_data, actual) && actual == m_size_data; + auto const [err, actual] = util::read(file, &m_e2prom[0], m_size_data); + return !err && (actual == m_size_data); } @@ -98,8 +98,8 @@ if (m_auto_save) do_store(); - size_t actual; - return !file.write(&m_e2prom[0], m_size_data, actual) && actual == m_size_data; + auto const [err, actual] = util::write(file, &m_e2prom[0], m_size_data); + return !err; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/x76f041.cpp mame-0.264+dfsg.1/src/devices/machine/x76f041.cpp --- mame-0.263+dfsg.1/src/devices/machine/x76f041.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x76f041.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -17,6 +17,8 @@ #include "machine/x76f041.h" #include +#include + #define VERBOSE_LEVEL ( 0 ) @@ -25,7 +27,7 @@ if( VERBOSE_LEVEL >= n_level ) { va_list v; - char buf[ 32768 ]; + char buf[32768]; va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); @@ -33,11 +35,12 @@ } } + // device type definition DEFINE_DEVICE_TYPE(X76F041, x76f041_device, "x76f041", "X76F041 Secure SerialFlash") -x76f041_device::x76f041_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t( mconfig, X76F041, tag, owner, clock ), +x76f041_device::x76f041_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) : + device_t( mconfig, X76F041, tag, owner, clock ), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_cs( 0 ), @@ -169,8 +172,8 @@ void x76f041_device::password_ok() { - if( m_configuration_registers[ CONFIG_CR ] & CR_RETRY_COUNTER_RESET_BIT ) - m_configuration_registers[ CONFIG_RC ] = 0; + if( m_configuration_registers[CONFIG_CR] & CR_RETRY_COUNTER_RESET_BIT ) + m_configuration_registers[CONFIG_RC] = 0; switch( m_command & 0xe0 ) { @@ -233,9 +236,9 @@ verboselog( 1, "-> address: %02x\n", m_address ); - if( ( m_configuration_registers[ CONFIG_CR ] & CR_RETRY_COUNTER_ENABLE_BIT ) != 0 && - m_configuration_registers[ CONFIG_RR ] == m_configuration_registers[ CONFIG_RC ] && - ( m_configuration_registers[ CONFIG_CR ] & CR_UNAUTHORIZED_ACCESS_BITS ) == 0x80 ) + if( ( m_configuration_registers[CONFIG_CR] & CR_RETRY_COUNTER_ENABLE_BIT ) != 0 && + m_configuration_registers[CONFIG_RR] == m_configuration_registers[CONFIG_RC] && + ( m_configuration_registers[CONFIG_CR] & CR_UNAUTHORIZED_ACCESS_BITS ) == 0x80 ) { // No commands are allowed verboselog( 1, "unauthorized access rejected\n" ); @@ -266,9 +269,9 @@ return; } - if( ( m_configuration_registers[ CONFIG_CR ] & CR_RETRY_COUNTER_ENABLE_BIT ) != 0 && - m_configuration_registers[ CONFIG_RR ] == m_configuration_registers[ CONFIG_RC ] && - ( m_configuration_registers[ CONFIG_CR ] & CR_UNAUTHORIZED_ACCESS_BITS ) != 0x80 ) + if( ( m_configuration_registers[CONFIG_CR] & CR_RETRY_COUNTER_ENABLE_BIT ) != 0 && + m_configuration_registers[CONFIG_RR] == m_configuration_registers[CONFIG_RC] && + ( m_configuration_registers[CONFIG_CR] & CR_UNAUTHORIZED_ACCESS_BITS ) != 0x80 ) { // Only configuration commands are allowed verboselog( 1, "unauthorized access rejected\n" ); @@ -278,7 +281,7 @@ return; } - int bcr = m_configuration_registers[ ( m_command & 1 ) ? CONFIG_BCR2 : CONFIG_BCR1 ]; + int bcr = m_configuration_registers[( m_command & 1 ) ? CONFIG_BCR2 : CONFIG_BCR1]; if( ( m_address & 0x80 ) != 0 ) { bcr >>= 4; @@ -287,7 +290,7 @@ if( ( ( m_command & 0xe0 ) == COMMAND_READ && ( bcr & BCR_Z ) != 0 && ( bcr & BCR_T ) != 0 ) || ( ( m_command & 0xe0 ) == COMMAND_WRITE && ( bcr & BCR_Z ) != 0 ) ) { - /* todo: find out when this is really checked. */ + /* TODO: find out when this is really checked. */ verboselog( 1, "command not allowed\n" ); m_state = STATE_STOP; m_sdar = 1; @@ -333,7 +336,7 @@ case STATE_RESPONSE_TO_RESET: if( m_scl != 0 && state == 0 ) { - m_sdar = ( m_response_to_reset[ m_byte ] >> m_bit ) & 1; + m_sdar = ( m_response_to_reset[m_byte] >> m_bit ) & 1; verboselog( 2, "in response to reset %d (%d/%d)\n", m_sdar, m_byte, m_bit ); m_bit++; @@ -390,7 +393,7 @@ case STATE_LOAD_COMMAND: m_command = m_shift; verboselog( 1, "-> command: %02x\n", m_command ); - /* todo: verify command is valid? */ + /* TODO: verify command is valid? */ m_state = STATE_LOAD_ADDRESS; break; @@ -400,7 +403,7 @@ case STATE_LOAD_PASSWORD: verboselog( 1, "-> password: %02x\n", m_shift ); - m_write_buffer[ m_byte++ ] = m_shift; + m_write_buffer[m_byte++] = m_shift; if( m_byte == sizeof( m_write_buffer ) ) { @@ -412,8 +415,8 @@ m_is_password_accepted = memcmp( password(), m_write_buffer, sizeof( m_write_buffer ) ) == 0; if( !m_is_password_accepted ) { - if( m_configuration_registers[ CONFIG_CR ] & CR_RETRY_COUNTER_ENABLE_BIT ) - m_configuration_registers[ CONFIG_RC ]++; + if( m_configuration_registers[CONFIG_CR] & CR_RETRY_COUNTER_ENABLE_BIT ) + m_configuration_registers[CONFIG_RC]++; } } break; @@ -421,10 +424,10 @@ case STATE_VERIFY_PASSWORD: verboselog( 1, "-> verify password: %02x\n", m_shift ); - /* todo: this should probably be handled as a command */ + /* TODO: this should probably be handled as a command */ if( m_shift == 0xc0 ) { - /* todo: this should take 10ms before it returns ok. */ + /* TODO: this should take 10ms before it returns ok. */ if( m_is_password_accepted ) { password_ok(); @@ -438,11 +441,11 @@ case STATE_WRITE_DATA: verboselog( 2, "-> data: %02x\n", m_shift ); - m_write_buffer[ m_byte++ ] = m_shift; + m_write_buffer[m_byte++] = m_shift; if( m_byte == sizeof( m_write_buffer ) ) { - int bcr = m_configuration_registers[ ( m_command & 1 ) ? CONFIG_BCR2 : CONFIG_BCR1 ]; + int bcr = m_configuration_registers[( m_command & 1 ) ? CONFIG_BCR2 : CONFIG_BCR1]; if( ( m_address & 0x80 ) != 0 ) { bcr >>= 4; @@ -456,7 +459,7 @@ for( m_byte = 0; m_byte < sizeof( m_write_buffer ); m_byte++ ) { int offset = data_offset(); - if( m_write_buffer[ m_byte ] < m_data[ offset ] ) + if( m_write_buffer[m_byte] < m_data[offset] ) { verboselog( 1, "tried to unset bits while in program only mode\n" ); is_unauthorized_write = true; @@ -475,8 +478,8 @@ for( m_byte = 0; m_byte < sizeof( m_write_buffer ); m_byte++ ) { int offset = data_offset(); - verboselog( 1, "-> data[ %03x ]: %02x\n", offset, m_write_buffer[ m_byte ] ); - m_data[ offset ] = m_write_buffer[ m_byte ]; + verboselog( 1, "-> data[%03x]: %02x\n", offset, m_write_buffer[m_byte] ); + m_data[offset] = m_write_buffer[m_byte]; } m_byte = 0; @@ -489,14 +492,14 @@ // Unlike normal writes, configuration writes aren't required to be exactly 8 bytes // TODO: Store data in a temporary buffer until the proper end of the command before writing verboselog( 2, "-> data: %02x\n", m_shift ); - m_data[ data_offset() ] = m_shift; + m_data[data_offset()] = m_shift; m_byte++; break; case STATE_WRITE_CONFIGURATION_REGISTERS: - verboselog( 1, "-> configuration register[ %d ]: %02x\n", m_byte, m_shift ); - /* todo: write after all bytes received? */ - m_configuration_registers[ m_byte++ ] = m_shift; + verboselog( 1, "-> configuration register[%d]: %02x\n", m_byte, m_shift ); + /* TODO: write after all bytes received? */ + m_configuration_registers[m_byte++] = m_shift; if( m_byte == sizeof( m_configuration_registers ) ) { @@ -505,13 +508,13 @@ break; case STATE_PROGRAM_WRITE_PASSWORD: - verboselog( 1, "-> program write password[ %d ]: %02x\n", m_byte, m_shift ); - m_password_temp[ m_byte++ ] = m_shift; + verboselog( 1, "-> program write password[%d]: %02x\n", m_byte, m_shift ); + m_password_temp[m_byte++] = m_shift; if( m_byte == sizeof( m_password_temp ) ) { // Read in the password twice and if the two copies match then write it to the password field - if( memcmp( &m_password_temp[ 0 ], &m_password_temp[ 8 ], sizeof( m_write_password ) ) == 0 ) + if( memcmp( &m_password_temp[0], &m_password_temp[8], sizeof( m_write_password ) ) == 0 ) { std::copy_n( std::begin( m_password_temp ), sizeof( m_write_password ), std::begin ( m_write_password ) ); } @@ -526,12 +529,12 @@ break; case STATE_PROGRAM_READ_PASSWORD: - verboselog( 1, "-> program read password[ %d ]: %02x\n", m_byte, m_shift ); - m_password_temp[ m_byte++ ] = m_shift; + verboselog( 1, "-> program read password[%d]: %02x\n", m_byte, m_shift ); + m_password_temp[m_byte++] = m_shift; if( m_byte == sizeof( m_password_temp ) ) { - if( memcmp( &m_password_temp[ 0 ], &m_password_temp[ 8 ], sizeof( m_read_password ) ) == 0 ) + if( memcmp( &m_password_temp[0], &m_password_temp[8], sizeof( m_read_password ) ) == 0 ) { std::copy_n( std::begin( m_password_temp ), sizeof( m_read_password ), std::begin ( m_read_password ) ); } @@ -546,12 +549,12 @@ break; case STATE_PROGRAM_CONFIGURATION_PASSWORD: - verboselog( 1, "-> program configuration password[ %d ]: %02x\n", m_byte, m_shift ); - m_password_temp[ m_byte++ ] = m_shift; + verboselog( 1, "-> program configuration password[%d]: %02x\n", m_byte, m_shift ); + m_password_temp[m_byte++] = m_shift; if( m_byte == sizeof( m_password_temp ) ) { - if( memcmp( &m_password_temp[ 0 ], &m_password_temp[ 8 ], sizeof( m_configuration_password ) ) == 0 ) + if( memcmp( &m_password_temp[0], &m_password_temp[8], sizeof( m_configuration_password ) ) == 0 ) { std::copy_n( std::begin( m_password_temp ), sizeof( m_configuration_password ), std::begin ( m_configuration_password ) ); } @@ -611,14 +614,14 @@ { case STATE_READ_DATA: offset = data_offset(); - m_shift = m_data[ offset ]; - verboselog( 1, "<- data[ %03x ]: %02x\n", offset, m_shift ); + m_shift = m_data[offset]; + verboselog( 1, "<- data[%03x]: %02x\n", offset, m_shift ); break; case STATE_READ_CONFIGURATION_REGISTERS: offset = m_byte & 7; - m_shift = m_configuration_registers[ offset ]; - verboselog( 1, "<- configuration register[ %d ]: %02x\n", offset, m_shift ); + m_shift = m_configuration_registers[offset]; + verboselog( 1, "<- configuration register[%d]: %02x\n", offset, m_shift ); break; } } @@ -676,7 +679,7 @@ break; case STATE_LOAD_PASSWORD: - /* todo: this will be the 0xc0 command, but it's not handled as a command yet. */ + /* TODO: this will be the 0xc0 command, but it's not handled as a command yet. */ verboselog( 1, "goto start\n" ); break; @@ -751,24 +754,54 @@ bool x76f041_device::nvram_read( util::read_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.read( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.read( m_write_password, sizeof( m_write_password ), actual ) && actual == sizeof( m_write_password ); - result = result && !file.read( m_read_password, sizeof( m_read_password ), actual ) && actual == sizeof( m_read_password ); - result = result && !file.read( m_configuration_password, sizeof( m_configuration_password ), actual ) && actual == sizeof( m_configuration_password ); - result = result && !file.read( m_configuration_registers, sizeof( m_configuration_registers ), actual ) && actual == sizeof( m_configuration_registers ); - result = result && !file.read( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); - return result; + + std::tie( err, actual ) = read( file, m_response_to_reset, sizeof( m_response_to_reset ) ); + if( err || ( sizeof( m_response_to_reset ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_write_password, sizeof( m_write_password ) ); + if( err || ( sizeof( m_write_password ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_read_password, sizeof( m_read_password ) ); + if( err || ( sizeof( m_read_password ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_configuration_password, sizeof( m_configuration_password ) ); + if( err || ( sizeof( m_configuration_password ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_configuration_registers, sizeof( m_configuration_registers ) ); + if( err || ( sizeof( m_configuration_registers ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_data, sizeof( m_data ) ); + if( err || ( sizeof( m_data ) != actual ) ) + return false; + + return true; } bool x76f041_device::nvram_write( util::write_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.write( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.write( m_write_password, sizeof( m_write_password ), actual ) && actual == sizeof( m_write_password ); - result = result && !file.write( m_read_password, sizeof( m_read_password ), actual ) && actual == sizeof( m_read_password ); - result = result && !file.write( m_configuration_password, sizeof( m_configuration_password ), actual ) && actual == sizeof( m_configuration_password ); - result = result && !file.write( m_configuration_registers, sizeof( m_configuration_registers ), actual ) && actual == sizeof( m_configuration_registers ); - result = result && !file.write( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); - return result; + + std::tie( err, actual ) = write( file, m_response_to_reset, sizeof( m_response_to_reset ) ); + if (err) + return false; + std::tie( err, actual ) = write( file, m_write_password, sizeof( m_write_password ) ); + if (err) + return false; + std::tie( err, actual ) = write( file, m_read_password, sizeof( m_read_password ) ); + if (err) + return false; + std::tie( err, actual ) = write( file, m_configuration_password, sizeof( m_configuration_password ) ); + if (err) + return false; + std::tie( err, actual ) = write( file, m_configuration_registers, sizeof( m_configuration_registers ) ); + if (err) + return false; + std::tie( err, actual ) = write( file, m_data, sizeof( m_data ) ); + if (err) + return false; + + return true; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/x76f041.h mame-0.264+dfsg.1/src/devices/machine/x76f041.h --- mame-0.263+dfsg.1/src/devices/machine/x76f041.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x76f041.h 2024-03-25 14:00:46.000000000 +0000 @@ -18,7 +18,7 @@ { public: // construction/destruction - x76f041_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + x76f041_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void write_cs(int state); void write_rst(int state); @@ -33,11 +33,11 @@ // device_nvram_interface overrides virtual void nvram_default() override; - virtual bool nvram_read( util::read_stream &file ) override; - virtual bool nvram_write( util::write_stream &file ) override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; private: - inline void ATTR_PRINTF( 3, 4 ) verboselog( int n_level, const char *s_fmt, ... ); + inline void ATTR_PRINTF(3, 4) verboselog(int n_level, const char *s_fmt, ...); uint8_t *password(); void password_ok(); void load_address(); @@ -134,14 +134,14 @@ int m_command; int m_address; bool m_is_password_accepted; - uint8_t m_write_buffer[ 8 ]; - uint8_t m_response_to_reset[ 4 ]; - uint8_t m_write_password[ 8 ]; - uint8_t m_read_password[ 8 ]; - uint8_t m_configuration_password[ 8 ]; - uint8_t m_configuration_registers[ 8 ]; - uint8_t m_data[ 512 ]; - uint8_t m_password_temp[ 16 ]; + uint8_t m_write_buffer[8]; + uint8_t m_response_to_reset[4]; + uint8_t m_write_password[8]; + uint8_t m_read_password[8]; + uint8_t m_configuration_password[8]; + uint8_t m_configuration_registers[8]; + uint8_t m_data[512]; + uint8_t m_password_temp[16]; }; diff -Nru mame-0.263+dfsg.1/src/devices/machine/x76f100.cpp mame-0.264+dfsg.1/src/devices/machine/x76f100.cpp --- mame-0.263+dfsg.1/src/devices/machine/x76f100.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x76f100.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -15,6 +15,8 @@ #include "machine/x76f100.h" #include +#include + #define VERBOSE_LEVEL ( 0 ) @@ -23,7 +25,7 @@ if( VERBOSE_LEVEL >= n_level ) { va_list v; - char buf[ 32768 ]; + char buf[32768]; va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); @@ -31,11 +33,13 @@ } } + // device type definition DEFINE_DEVICE_TYPE(X76F100, x76f100_device, "x76f100", "X76F100 Secure SerialFlash") -x76f100_device::x76f100_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) - : device_t( mconfig, X76F100, tag, owner, clock ), + +x76f100_device::x76f100_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock ) : + device_t( mconfig, X76F100, tag, owner, clock ), device_nvram_interface(mconfig, *this), m_region(*this, DEVICE_SELF), m_cs( 0 ), @@ -49,7 +53,7 @@ m_byte( 0 ), m_command( 0 ), m_password_retry_counter( 0 ), - m_is_password_accepted ( false ) + m_is_password_accepted( false ) { } @@ -197,7 +201,7 @@ { if( m_bit == 0 ) { - m_shift = m_response_to_reset[ m_byte ]; + m_shift = m_response_to_reset[m_byte]; verboselog( 1, "<- response_to_reset[%d]: %02x\n", m_byte, m_shift ); } @@ -248,13 +252,13 @@ case STATE_LOAD_COMMAND: m_command = m_shift; verboselog( 1, "-> command: %02x\n", m_command ); - /* todo: verify command is valid? */ + /* TODO: verify command is valid? */ m_state = STATE_LOAD_PASSWORD; break; case STATE_LOAD_PASSWORD: verboselog( 1, "-> password: %02x\n", m_shift ); - m_write_buffer[ m_byte++ ] = m_shift; + m_write_buffer[m_byte++] = m_shift; if( m_byte == sizeof( m_write_buffer ) ) { @@ -284,10 +288,10 @@ case STATE_VERIFY_PASSWORD: verboselog( 1, "-> verify password: %02x\n", m_shift ); - /* todo: this should probably be handled as a command */ + /* TODO: this should probably be handled as a command */ if( m_shift == COMMAND_ACK_PASSWORD ) { - /* todo: this should take 10ms before it returns ok. */ + /* TODO: this should take 10ms before it returns ok. */ if( m_is_password_accepted ) { password_ok(); @@ -301,7 +305,7 @@ case STATE_WRITE_DATA: verboselog( 2, "-> data: %02x\n", m_shift ); - m_write_buffer[ m_byte++ ] = m_shift; + m_write_buffer[m_byte++] = m_shift; if( m_byte == sizeof( m_write_buffer ) ) { @@ -321,8 +325,8 @@ if( offset != -1 ) { - verboselog( 1, "-> data[ %03x ]: %02x\n", offset, m_write_buffer[ m_byte ] ); - m_data[ offset ] = m_write_buffer[ m_byte ]; + verboselog( 1, "-> data[%03x]: %02x\n", offset, m_write_buffer[m_byte] ); + m_data[offset] = m_write_buffer[m_byte]; } else { @@ -363,8 +367,8 @@ if( offset != -1 ) { - m_shift = m_data[ offset ]; - verboselog( 1, "<- data[ %02x ]: %02x\n", offset, m_shift ); + m_shift = m_data[offset]; + verboselog( 1, "<- data[%02x]: %02x\n", offset, m_shift ); } else { @@ -429,7 +433,7 @@ break; case STATE_LOAD_PASSWORD: - /* todo: this will be the 0xc0 command, but it's not handled as a command yet. */ + /* TODO: this will be the 0xc0 command, but it's not handled as a command yet. */ verboselog( 1, "goto start\n" ); break; @@ -468,10 +472,10 @@ void x76f100_device::nvram_default() { - m_response_to_reset[ 0 ] = 0x19; - m_response_to_reset[ 1 ] = 0x00; - m_response_to_reset[ 2 ] = 0xaa; - m_response_to_reset[ 3 ] = 0x55, + m_response_to_reset[0] = 0x19; + m_response_to_reset[1] = 0x00; + m_response_to_reset[2] = 0xaa; + m_response_to_reset[3] = 0x55, memset( m_write_password, 0, sizeof( m_write_password ) ); memset( m_read_password, 0, sizeof( m_read_password ) ); @@ -500,20 +504,42 @@ bool x76f100_device::nvram_read( util::read_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.read( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.read( m_write_password, sizeof( m_write_password ), actual ) && actual == sizeof( m_write_password ); - result = result && !file.read( m_read_password, sizeof( m_read_password ), actual ) && actual == sizeof( m_read_password ); - result = result && !file.read( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); - return result; + + std::tie( err, actual ) = read( file, m_response_to_reset, sizeof( m_response_to_reset ) ); + if( err || ( sizeof( m_response_to_reset ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_write_password, sizeof( m_write_password ) ); + if( err || ( sizeof( m_write_password ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_read_password, sizeof( m_read_password ) ); + if( err || ( sizeof( m_read_password ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_data, sizeof( m_data ) ); + if( err || ( sizeof( m_data ) != actual ) ) + return false; + + return true; } bool x76f100_device::nvram_write( util::write_stream &file ) { + std::error_condition err; size_t actual; - bool result = !file.write( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.write( m_write_password, sizeof( m_write_password ), actual ) && actual == sizeof( m_write_password ); - result = result && !file.write( m_read_password, sizeof( m_read_password ), actual ) && actual == sizeof( m_read_password ); - result = result && !file.write( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); - return result; + + std::tie( err, actual ) = write( file, m_response_to_reset, sizeof( m_response_to_reset ) ); + if ( err ) + return false; + std::tie( err, actual ) = write( file, m_write_password, sizeof( m_write_password ) ); + if ( err ) + return false; + std::tie( err, actual ) = write( file, m_read_password, sizeof( m_read_password ) ); + if ( err ) + return false; + std::tie( err, actual ) = write( file, m_data, sizeof( m_data ) ); + if ( err ) + return false; + + return true; } diff -Nru mame-0.263+dfsg.1/src/devices/machine/x76f100.h mame-0.264+dfsg.1/src/devices/machine/x76f100.h --- mame-0.263+dfsg.1/src/devices/machine/x76f100.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/machine/x76f100.h 2024-03-25 14:00:46.000000000 +0000 @@ -17,7 +17,7 @@ { public: // construction/destruction - x76f100_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + x76f100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); void write_cs(int state); void write_rst(int state); @@ -26,14 +26,14 @@ int read_sda(); protected: - // device-level overrides + // device_t implementation virtual void device_start() override; virtual void device_reset() override; - // device_nvram_interface overrides + // device_nvram_interface implementation virtual void nvram_default() override; - virtual bool nvram_read( util::read_stream &file ) override; - virtual bool nvram_write( util::write_stream &file ) override; + virtual bool nvram_read(util::read_stream &file) override; + virtual bool nvram_write(util::write_stream &file) override; private: inline void verboselog(int n_level, const char *s_fmt, ...) ATTR_PRINTF(3,4); @@ -77,11 +77,11 @@ int m_command; int m_password_retry_counter; bool m_is_password_accepted; - uint8_t m_write_buffer[ 8 ]; - uint8_t m_response_to_reset[ 4 ]; - uint8_t m_write_password[ 8 ]; - uint8_t m_read_password[ 8 ]; - uint8_t m_data[ 112 ]; + uint8_t m_write_buffer[8]; + uint8_t m_response_to_reset[4]; + uint8_t m_write_password[8]; + uint8_t m_read_password[8]; + uint8_t m_data[112]; }; // device type definition diff -Nru mame-0.263+dfsg.1/src/devices/sound/cf61909.cpp mame-0.264+dfsg.1/src/devices/sound/cf61909.cpp --- mame-0.263+dfsg.1/src/devices/sound/cf61909.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/cf61909.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,161 @@ +// license: BSD-3-Clause +// copyright-holders: Devin Acker + +/*************************************************************************** + Texas Instruments CF61909 "DEVO" + + This is the sound and mapper ASIC used in the Jaminator. + It generates 8 channels of PCM at ~44.5 kHz, and also handles all + ROM access and clock generation for the 8039 MCU. + +***************************************************************************/ + +#include "emu.h" +#include "cf61909.h" + +#include + +DEFINE_DEVICE_TYPE(CF61909, cf61909_device, "cf61909", "Texas Instruments CF61909 (DEVO)") + +cf61909_device::cf61909_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, CF61909, tag, owner, clock) + , device_sound_interface(mconfig, *this) + , device_rom_interface(mconfig, *this) + , m_sample_clock(*this, "sample_clock") +{ +} + +/**************************************************************************/ +void cf61909_device::device_add_mconfig(machine_config &config) +{ + // DEVO outputs a brief low pulse every 4 samples (~11.127 kHz), which the Jaminator MCU uses + // for syncing to the sample rate when updating sound registers + CLOCK(config, m_sample_clock, DERIVED_CLOCK(1, CLOCKS_PER_SAMPLE * 4)); + m_sample_clock->set_duty_cycle(1.0 - (16.0 / CLOCKS_PER_SAMPLE)); +} + +/**************************************************************************/ +void cf61909_device::device_start() +{ + m_stream = stream_alloc(0, 1, clock() / CLOCKS_PER_SAMPLE); + + save_item(NAME(m_data_offset)); + + save_item(STRUCT_MEMBER(m_voice, m_regs)); + save_item(STRUCT_MEMBER(m_voice, m_start)); + save_item(STRUCT_MEMBER(m_voice, m_loop)); + save_item(STRUCT_MEMBER(m_voice, m_pos)); + save_item(STRUCT_MEMBER(m_voice, m_pitch)); + save_item(STRUCT_MEMBER(m_voice, m_pitch_counter)); + save_item(STRUCT_MEMBER(m_voice, m_volume)); +} + +/**************************************************************************/ +void cf61909_device::device_reset() +{ + std::fill(m_voice.begin(), m_voice.end(), voice_t()); + + m_data_offset = 0; +} + +/**************************************************************************/ +void cf61909_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock() / CLOCKS_PER_SAMPLE); +} + +/**************************************************************************/ +void cf61909_device::rom_bank_pre_change() +{ + m_stream->update(); +} + +/**************************************************************************/ +u8 cf61909_device::read(offs_t offset) +{ + return read_byte(m_data_offset | (offset & 0xff)); +} + +/**************************************************************************/ +void cf61909_device::write(offs_t offset, u8 data) +{ + voice_t &voice = m_voice[BIT(offset, 4, 3)]; + const u8 reg = offset & 0xf; + + m_stream->update(); + voice.m_regs[reg] = data; + + switch (reg) + { + case 0x1: // position lsb + voice.m_pos = (voice.m_regs[0x2] << 8) | data; + break; + + case 0x2: // pitch / position msb + break; + + case 0x3: // pitch lsb + voice.m_pitch = (voice.m_regs[0x2] << 8) | data; + break; + + case 0x4: // volume low nibble + voice.m_volume = (voice.m_regs[0xc] << 4) | (data & 0xf); + break; + + case 0x5: // program bank (TODO) + break; + + case 0x6: // data bank + m_data_offset = (data & 0x7f) << 8; + if (BIT(data, 7)) + m_data_offset |= 0x20000; // cartridge memory + break; + + case 0x9: // sample start lsb + voice.m_start = (voice.m_regs[0xa] << 10) | (data << 2); + break; + + case 0xa: // sample start / loop msb + break; + + case 0xb: // sample loop lsb + voice.m_loop = (voice.m_regs[0xa] << 8) | data; + break; + + case 0xc: // volume high nibble + break; + + default: + logerror("%s: unknown register write %02x = %02x\n", machine().describe_context(), offset & 0xff, data); + break; + } +} + +/**************************************************************************/ +void cf61909_device::sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) +{ + for (int i = 0; i < outputs[0].samples(); i++) + { + s32 sample = 0; + + for (voice_t &voice : m_voice) + { + if (!voice.m_pitch) continue; + + s16 data = read_byte(voice.m_start + voice.m_pos); + if (!data) + { + voice.m_pos += voice.m_loop; + data = read_byte(voice.m_start + voice.m_pos); + } + sample += (data - 0x80) * voice.m_volume; + + voice.m_pitch_counter += voice.m_pitch; + voice.m_pos += (voice.m_pitch_counter >> 14); + voice.m_pitch_counter &= 0x3fff; + } + + // Jaminator patent shows 10-bit sampling, assume that's actually true + outputs[0].put_int_clamp(i, sample >> 9, 1 << 9); + } +} diff -Nru mame-0.263+dfsg.1/src/devices/sound/cf61909.h mame-0.264+dfsg.1/src/devices/sound/cf61909.h --- mame-0.263+dfsg.1/src/devices/sound/cf61909.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/cf61909.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,63 @@ +// license: BSD-3-Clause +// copyright-holders: Devin Acker + +#ifndef MAME_SOUND_CF61909_H +#define MAME_SOUND_CF61909_H + +#pragma once + +#include "machine/clock.h" +#include "dirom.h" + +#include + + +class cf61909_device : public device_t, public device_sound_interface, public device_rom_interface<18> +{ +public: + cf61909_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + + u8 read(offs_t offset); + void write(offs_t offset, u8 data); + + int sync_r() { return m_sample_clock->signal_r(); } + +protected: + virtual void device_add_mconfig(machine_config &config) override; + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_clock_changed() override; + + virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; + virtual void rom_bank_pre_change() override; + +private: + /* + * Jaminator patent specifies 11.127 kHz sample rate, but the real thing sounds like it has 4x + * oversampling. The sync clock output (m_sample_clock) seems to fluctuate quite a bit, but + * 11.127 kHz is pretty close to average. + */ + static constexpr unsigned CLOCKS_PER_SAMPLE = 247; // based on 11 MHz clock + + struct voice_t + { + u8 m_regs[16] = {0}; + u32 m_start = 0; + u16 m_loop = 0; + u16 m_pos = 0; + u16 m_pitch = 0; + u16 m_pitch_counter = 0; + u8 m_volume = 0; + }; + std::array m_voice; + + u32 m_data_offset; + + required_device m_sample_clock; + sound_stream *m_stream; +}; + +DECLARE_DEVICE_TYPE(CF61909, cf61909_device) + +#endif // MAME_SOUND_CF61909_H diff -Nru mame-0.263+dfsg.1/src/devices/sound/okim6258.cpp mame-0.264+dfsg.1/src/devices/sound/okim6258.cpp --- mame-0.263+dfsg.1/src/devices/sound/okim6258.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/okim6258.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2,15 +2,15 @@ // copyright-holders:Barry Rodewald /********************************************************************************************** * - * OKI MSM6258 ADPCM + * OKI MSM6258 ADPCM Speech Processor * * TODO: - * 3-bit ADPCM support - * Recording? + * - 3-bit ADPCM support + * - Use okiadpcm.* helper? + * - Recording? * **********************************************************************************************/ - #include "emu.h" #include "okim6258.h" @@ -46,19 +46,19 @@ // okim6258_device - constructor //------------------------------------------------- -okim6258_device::okim6258_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, OKIM6258, tag, owner, clock), - device_sound_interface(mconfig, *this), - m_status(0), - m_start_divider(0), - m_divider(512), - m_adpcm_type(0), - m_data_in(0), - m_nibble_shift(0), - m_stream(nullptr), - m_output_bits(0), - m_signal(0), - m_step(0) +okim6258_device::okim6258_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, OKIM6258, tag, owner, clock), + device_sound_interface(mconfig, *this), + m_status(0), + m_start_divider(0), + m_divider(512), + m_adpcm_type(0), + m_data_in(0), + m_nibble_shift(0), + m_stream(nullptr), + m_output_bits(0), + m_signal(0), + m_step(0) { } @@ -93,7 +93,7 @@ for (nib = 0; nib < 16; nib++) { diff_lookup[step*16 + nib] = nbl2bit[nib][0] * - (stepval * nbl2bit[nib][1] + + (stepval * nbl2bit[nib][1] + stepval/2 * nbl2bit[nib][2] + stepval/4 * nbl2bit[nib][3] + stepval/8); @@ -119,7 +119,13 @@ m_signal = -2; m_step = 0; - state_save_register(); + // register for savestates + save_item(NAME(m_status)); + save_item(NAME(m_divider)); + save_item(NAME(m_data_in)); + save_item(NAME(m_nibble_shift)); + save_item(NAME(m_signal)); + save_item(NAME(m_step)); } @@ -171,25 +177,6 @@ } } - - -/********************************************************************************************** - - state save support for MAME - -***********************************************************************************************/ - -void okim6258_device::state_save_register() -{ - save_item(NAME(m_status)); - save_item(NAME(m_divider)); - save_item(NAME(m_data_in)); - save_item(NAME(m_nibble_shift)); - save_item(NAME(m_signal)); - save_item(NAME(m_step)); -} - - int16_t okim6258_device::clock_adpcm(uint8_t nibble) { int32_t max = (1 << (m_output_bits - 1)) - 1; @@ -217,7 +204,7 @@ /********************************************************************************************** - okim6258::set_divider -- set the master clock divider + set_divider -- set the master clock divider ***********************************************************************************************/ @@ -230,7 +217,7 @@ /********************************************************************************************** - okim6258::set_clock -- set the master clock + set_clock -- set the master clock ***********************************************************************************************/ @@ -242,7 +229,7 @@ /********************************************************************************************** - okim6258::get_vclk -- get the VCLK/sampling frequency + get_vclk -- get the VCLK/sampling frequency ***********************************************************************************************/ @@ -254,7 +241,7 @@ /********************************************************************************************** - okim6258_status_r -- read the status port of an OKIM6258-compatible chip + status_r -- read the status port of an OKIM6258-compatible chip ***********************************************************************************************/ @@ -268,9 +255,10 @@ /********************************************************************************************** - okim6258_data_w -- write to the control port of an OKIM6258-compatible chip + data_w -- write to the control port of an OKIM6258-compatible chip ***********************************************************************************************/ + void okim6258_device::data_w(uint8_t data) { /* update the stream */ @@ -283,7 +271,7 @@ /********************************************************************************************** - okim6258_ctrl_w -- write to the control port of an OKIM6258-compatible chip + ctrl_w -- write to the control port of an OKIM6258-compatible chip ***********************************************************************************************/ diff -Nru mame-0.263+dfsg.1/src/devices/sound/okim6258.h mame-0.264+dfsg.1/src/devices/sound/okim6258.h --- mame-0.263+dfsg.1/src/devices/sound/okim6258.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/okim6258.h 2024-03-25 14:00:46.000000000 +0000 @@ -50,20 +50,18 @@ virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; private: - void state_save_register(); int16_t clock_adpcm(uint8_t nibble); uint8_t m_status; uint32_t m_start_divider; - uint32_t m_divider; /* master clock divider */ - uint8_t m_adpcm_type; /* 3/4 bit ADPCM select */ - uint8_t m_data_in; /* ADPCM data-in register */ - uint8_t m_nibble_shift; /* nibble select */ - sound_stream *m_stream; /* which stream are we playing on? */ + uint32_t m_divider; // master clock divider + uint8_t m_adpcm_type; // 3/4 bit ADPCM select + uint8_t m_data_in; // ADPCM data-in register + uint8_t m_nibble_shift; // nibble select + sound_stream *m_stream; // which stream are we playing on? - uint8_t m_output_bits; /* D/A precision is 10-bits but 12-bit data can be - output serially to an external DAC */ + uint8_t m_output_bits; // D/A precision is 10-bits but 12-bit data can be output serially to an external DAC int32_t m_signal; int32_t m_step; diff -Nru mame-0.263+dfsg.1/src/devices/sound/okim6588.cpp mame-0.264+dfsg.1/src/devices/sound/okim6588.cpp --- mame-0.263+dfsg.1/src/devices/sound/okim6588.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/okim6588.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,232 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + +OKI MSM6588 ADPCM Recorder + +It has similar functionality to MSM6258. + +TODO: +- it only supports MCU mode EXT playback, nothing else emulated yet +- status register read (eg. BUSY flag) + +*/ + +#include "emu.h" +#include "okim6588.h" + + +DEFINE_DEVICE_TYPE(OKIM6588, okim6588_device, "okim6588", "OKI MSM6588 ADPCM Recorder") + +//------------------------------------------------- +// constructor +//------------------------------------------------- + +okim6588_device::okim6588_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, OKIM6588, tag, owner, clock), + device_sound_interface(mconfig, *this), + m_write_mon(*this), + m_chip_mode(CHIP_MODE_STANDALONE) +{ } + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +// allow save_item on a non-fundamental type +ALLOW_SAVE_TYPE(okim6588_device::chip_mode); +ALLOW_SAVE_TYPE(okim6588_device::command_state); +ALLOW_SAVE_TYPE(okim6588_device::run_state); + +void okim6588_device::device_start() +{ + // initialize + m_stream = stream_alloc(0, 1, clock() / 128); + + m_adpcm_timer = timer_alloc(FUNC(okim6588_device::clock_adpcm), this); + m_mon_timer = timer_alloc(FUNC(okim6588_device::set_mon), this); + + m_command_state = COMMAND_READY; + m_run_state = RUN_STOP; + m_adpcm_data = 0; + + m_vds_bit = (m_chip_mode == CHIP_MODE_MCU) ? 1 : 0; + m_samp_fdiv = 512; + m_rec_mode = false; + + // register for savestates + save_item(NAME(m_chip_mode)); + save_item(NAME(m_command_state)); + save_item(NAME(m_run_state)); + save_item(NAME(m_adpcm_data)); + save_item(NAME(m_adpcm.m_signal)); + save_item(NAME(m_adpcm.m_step)); + save_item(NAME(m_rec_mode)); + save_item(NAME(m_samp_fdiv)); + save_item(NAME(m_vds_bit)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void okim6588_device::device_reset() +{ + m_command_state = COMMAND_READY; + m_run_state = RUN_STOP; + reset_adpcm(); + + m_adpcm_timer->adjust(attotime::never); + m_mon_timer->adjust(attotime::never); + m_write_mon(0); +} + + +//------------------------------------------------- +// internal handlers +//------------------------------------------------- + +void okim6588_device::sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) +{ + // simply fill the buffer with the current sample + outputs[0].fill(m_adpcm.output() / 2048.0); +} + +TIMER_CALLBACK_MEMBER(okim6588_device::clock_adpcm) +{ + switch (m_run_state) + { + case RUN_STOP: + reset_adpcm(); + break; + + case RUN_PLAY_EXT: + // strobe MON + m_write_mon(1); + m_mon_timer->adjust(attotime::from_ticks(m_samp_fdiv / 4, clock()), 0); + m_command_state = COMMAND_EXT; + + m_stream->update(); + get_adpcm_sample(m_adpcm_data); + break; + + default: + break; + } + + if (m_run_state != RUN_STOP && m_run_state != RUN_PAUSE) + m_adpcm_timer->adjust(attotime::from_ticks(m_samp_fdiv, clock())); +} + +TIMER_CALLBACK_MEMBER(okim6588_device::set_mon) +{ + m_write_mon(param ? 1 : 0); +} + +s16 okim6588_device::get_adpcm_sample(u8 data) +{ + // 4-bit or 3-bit input + if (m_vds_bit) + return m_adpcm.clock(data & 0xf); + else + return m_adpcm.clock((data & 0xc) | (data >> 1 & 1)); +} + +void okim6588_device::reset_adpcm() +{ + if (machine().time() > attotime::zero) + m_stream->update(); + + m_adpcm_data = 0; + m_adpcm.reset(); +} + + +//------------------------------------------------- +// public handlers +//------------------------------------------------- + +u8 okim6588_device::data_r() +{ + if (m_chip_mode != CHIP_MODE_MCU) + return 0; + + return 0; +} + +void okim6588_device::data_w(u8 data) +{ + if (m_chip_mode != CHIP_MODE_MCU) + return; + + data &= 0xf; + + switch (m_command_state) + { + case COMMAND_READY: + switch (data & 0xf) + { + // NOP + case 0x0: + break; + + // PLAY/REC + case 0x2: case 0x3: + m_rec_mode = bool(data & 1); + break; + + // STOP + case 0x5: + m_run_state = RUN_STOP; + break; + + // SAMP + case 0x6: + m_command_state = COMMAND_SAMP; + break; + + // VDS + case 0xc: + m_command_state = COMMAND_VDS; + break; + + // EXT + case 0xb: + m_run_state = m_rec_mode ? RUN_RECORD_EXT : RUN_PLAY_EXT; + reset_adpcm(); + + // minimum delay is 1 sample + m_adpcm_timer->adjust(attotime::from_ticks(m_samp_fdiv, clock())); + m_command_state = COMMAND_EXT; + break; + + default: + break; + } + break; + + case COMMAND_SAMP: + { + static const u16 div[4] = { 1024, 768, 640, 512 }; + m_samp_fdiv = div[data & 3]; + m_command_state = COMMAND_READY; + break; + } + + case COMMAND_EXT: + m_adpcm_data = data; + m_command_state = COMMAND_READY; + break; + + case COMMAND_VDS: + m_vds_bit = BIT(data, 2); + m_command_state = COMMAND_READY; + break; + + default: + // shouldn't get here + break; + } +} diff -Nru mame-0.263+dfsg.1/src/devices/sound/okim6588.h mame-0.264+dfsg.1/src/devices/sound/okim6588.h --- mame-0.263+dfsg.1/src/devices/sound/okim6588.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/okim6588.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,88 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + OKI MSM6588 ADPCM Recorder + +*/ + +#ifndef MAME_SOUND_OKIM6588_H +#define MAME_SOUND_OKIM6588_H + +#pragma once + +#include "sound/okiadpcm.h" + + +class okim6588_device : public device_t, public device_sound_interface +{ +public: + okim6588_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // configuration helpers + auto write_mon() { return m_write_mon.bind(); } + void set_mcum_pin(int state) { m_chip_mode = state ? CHIP_MODE_MCU : CHIP_MODE_STANDALONE; } + + // D0-D3 (MCU mode) + void data_w(u8 data); + u8 data_r(); + +protected: + // device_t implementation + virtual void device_start() override; + virtual void device_reset() override; + + virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; + +private: + enum chip_mode : u8 + { + CHIP_MODE_STANDALONE = 0, + CHIP_MODE_MCU + }; + + enum command_state : u8 + { + COMMAND_READY = 0, + COMMAND_SAMP, + COMMAND_EXT, + COMMAND_VDS + }; + + enum run_state : u8 + { + RUN_STOP = 0, + RUN_PAUSE, + RUN_PLAY_SERIAL, + RUN_PLAY_EXT, + RUN_RECORD_SERIAL, + RUN_RECORD_EXT, + }; + + devcb_write_line m_write_mon; + + chip_mode m_chip_mode; + command_state m_command_state; + run_state m_run_state; + + sound_stream *m_stream; + + u8 m_adpcm_data; + oki_adpcm_state m_adpcm; + bool m_rec_mode; + u16 m_samp_fdiv; + u8 m_vds_bit; + + emu_timer *m_adpcm_timer; + emu_timer *m_mon_timer; + + TIMER_CALLBACK_MEMBER(clock_adpcm); + TIMER_CALLBACK_MEMBER(set_mon); + s16 get_adpcm_sample(u8 data); + void reset_adpcm(); +}; + + +DECLARE_DEVICE_TYPE(OKIM6588, okim6588_device) + +#endif // MAME_SOUND_OKIM6588_H diff -Nru mame-0.263+dfsg.1/src/devices/sound/rolandpcm.cpp mame-0.264+dfsg.1/src/devices/sound/rolandpcm.cpp --- mame-0.263+dfsg.1/src/devices/sound/rolandpcm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/rolandpcm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -243,7 +243,7 @@ } break; case 0x1F: - m_sel_chn = data; + m_sel_chn = data & 0x1F; break; default: logerror("Writing unknown reg %02X = %02X\n", offset, data); @@ -353,7 +353,7 @@ int16_t val; int16_t sign; uint8_t shift; - int16_t result; + int16_t result; if (data < 0) { diff -Nru mame-0.263+dfsg.1/src/devices/sound/rolandpcm.h mame-0.264+dfsg.1/src/devices/sound/rolandpcm.h --- mame-0.263+dfsg.1/src/devices/sound/rolandpcm.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/rolandpcm.h 2024-03-25 14:00:46.000000000 +0000 @@ -46,6 +46,7 @@ uint32_t start = 0; // start address (18.14 fixed point) uint16_t end = 0; // end offset (high word) uint16_t loop = 0; // loop offset (high word) + // work variables bool enable = false; int8_t play_dir = 0; // playing direction, -1 [backwards] / 0 [stopped] / +1 [forwards] diff -Nru mame-0.263+dfsg.1/src/devices/sound/sp0250.cpp mame-0.264+dfsg.1/src/devices/sound/sp0250.cpp --- mame-0.263+dfsg.1/src/devices/sound/sp0250.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/sp0250.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,11 +109,6 @@ load_values(); } -TIMER_CALLBACK_MEMBER(sp0250_device::delayed_stream_update) -{ - m_stream->update(); -} - static uint16_t sp0250_ga(uint8_t v) { return (v & 0x1f) << (v>>5); diff -Nru mame-0.263+dfsg.1/src/devices/sound/sp0250.h mame-0.264+dfsg.1/src/devices/sound/sp0250.h --- mame-0.263+dfsg.1/src/devices/sound/sp0250.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/sp0250.h 2024-03-25 14:00:46.000000000 +0000 @@ -23,8 +23,7 @@ // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; - - TIMER_CALLBACK_MEMBER(delayed_stream_update); + TIMER_CALLBACK_MEMBER(delayed_stream_update) { m_stream->update(); } private: // internal helpers diff -Nru mame-0.263+dfsg.1/src/devices/sound/sp0256.cpp mame-0.264+dfsg.1/src/devices/sound/sp0256.cpp --- mame-0.263+dfsg.1/src/devices/sound/sp0256.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/sp0256.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -55,10 +55,10 @@ , device_sound_interface(mconfig, *this) , m_rom(*this, DEVICE_SELF) , m_stream(nullptr) + , m_stream_timer(nullptr) , m_drq_cb(*this) , m_sby_cb(*this) , m_scratch() - , m_lrq_timer(nullptr) { } @@ -70,8 +70,17 @@ { m_drq_cb(1); m_sby_cb(1); + m_sby_line = 1; - m_stream = stream_alloc(0, 1, clock() / CLOCK_DIVIDER); + int sample_rate = clock() / CLOCK_DIVIDER; + m_stream = stream_alloc(0, 1, sample_rate); + + // if callbacks are used, update the stream at sample rate frequency to ensure they get picked up in a timely matter + if (!m_drq_cb.isunset() || !m_sby_cb.isunset()) + { + m_stream_timer = timer_alloc(FUNC(sp0256_device::delayed_stream_update), this); + m_stream_timer->adjust(attotime::from_hz(sample_rate), 0, attotime::from_hz(sample_rate)); + } /* -------------------------------------------------------------------- */ /* Configure our internal variables. */ @@ -79,7 +88,7 @@ m_filt.rng = 1; /* -------------------------------------------------------------------- */ - /* Allocate a scratch buffer for generating ~10kHz samples. */ + /* Allocate a scratch buffer for generating ~10kHz samples. */ /* -------------------------------------------------------------------- */ m_scratch = std::make_unique(SCBUF_SIZE); save_pointer(NAME(m_scratch), SCBUF_SIZE); @@ -91,7 +100,7 @@ /* -------------------------------------------------------------------- */ m_halted = 1; m_filt.rpt = -1; - m_lrq = 0x8000; + m_lrq = 1; m_page = 0x1000 << 3; m_silent = 1; @@ -103,8 +112,6 @@ // TODO: because of this, check if the bitrev functions are even used anywhere else // bitrevbuff(m_rom, 0, 0xffff); - m_lrq_timer = timer_alloc(FUNC(sp0256_device::set_lrq_timer_proc), this); - // save device variables save_item(NAME(m_sby_line)); save_item(NAME(m_cur_len)); @@ -123,6 +130,7 @@ save_item(NAME(m_fifo_tail)); save_item(NAME(m_fifo_bitp)); save_item(NAME(m_fifo)); + // save filter variables save_item(NAME(m_filt.rpt)); save_item(NAME(m_filt.cnt)); @@ -143,6 +151,9 @@ void sp0256_device::device_reset() { + if (machine().time() > attotime::zero) + m_stream->update(); + // reset FIFO and SP0256 m_fifo_head = m_fifo_tail = m_fifo_bitp = 0; @@ -150,10 +161,10 @@ m_halted = 1; m_filt.rpt = -1; m_filt.rng = 1; - m_lrq = 0x8000; - m_ald = 0x0000; - m_pc = 0x0000; - m_stack = 0x0000; + m_lrq = 1; + m_ald = 0; + m_pc = 0; + m_stack = 0; m_fifo_sel = 0; m_mode = 0; m_page = 0x1000 << 3; @@ -161,9 +172,6 @@ m_sby_line = 0; m_drq_cb(1); SET_SBY(1); - - m_lrq = 0; - m_lrq_timer->adjust(attotime::from_ticks(50, m_clock)); } @@ -727,7 +735,7 @@ /* ======================================================================== */ /* SP0256_GETB -- Get up to 8 bits at the current PC. */ /* ======================================================================== */ -uint32_t sp0256_device::getb( int len ) +uint32_t sp0256_device::getb(int len) { uint32_t data; uint32_t d0, d1; @@ -756,7 +764,8 @@ m_fifo_tail++; m_fifo_bitp -= 10; } - } else + } + else { /* ---------------------------------------------------------------- */ /* Figure out which ROMs are being fetched into, and grab two */ @@ -789,8 +798,8 @@ /* ======================================================================== */ void sp0256_device::micro() { - uint8_t immed4; - uint8_t opcode; + uint8_t immed4; + uint8_t opcode; uint16_t cr; int ctrl_xfer; int repeat; @@ -810,7 +819,7 @@ m_pc = m_ald | (0x1000 << 3); m_fifo_sel = 0; m_halted = 0; - m_lrq = 0x8000; + m_lrq = 1; m_ald = 0; for (i = 0; i < 16; i++) m_filt.r[i] = 0; @@ -823,7 +832,7 @@ if (m_halted) { m_filt.rpt = 1; - m_lrq = 0x8000; + m_lrq = 1; m_ald = 0; for (i = 0; i < 16; i++) m_filt.r[i] = 0; @@ -864,10 +873,12 @@ if (immed4) /* SETPAGE */ { m_page = bitrev32(immed4) >> 13; - } else + } + /* -------------------------------------------------------- */ /* Otherwise, this is an RTS / HLT. */ /* -------------------------------------------------------- */ + else { uint32_t btrg; @@ -887,7 +898,8 @@ m_halted = 1; m_pc = 0; ctrl_xfer = 1; - } else + } + else { m_pc = btrg; ctrl_xfer = 1; @@ -904,7 +916,7 @@ case 0xE: case 0xD: { - int btrg; + uint32_t btrg; /* -------------------------------------------------------- */ /* Figure out our branch target. */ @@ -1140,6 +1152,8 @@ void sp0256_device::ald_w(uint8_t data) { + m_stream->update(); + /* ---------------------------------------------------------------- */ /* Drop writes to the ALD register if we're busy. */ /* ---------------------------------------------------------------- */ @@ -1155,66 +1169,59 @@ /* get the new PC address. */ /* ---------------------------------------------------------------- */ m_lrq = 0; - m_ald = (0xff & data) << 4; + m_ald = data << 4; m_drq_cb(0); SET_SBY(0); - - return; } int sp0256_device::lrq_r() { - // force stream update m_stream->update(); - - return m_lrq == 0x8000; + return m_lrq; } int sp0256_device::sby_r() { - // TODO: force stream update?? - + m_stream->update(); return m_sby_line; } uint16_t sp0256_device::spb640_r(offs_t offset) { + m_stream->update(); + offset &= 1; + /* -------------------------------------------------------------------- */ /* Offset 0 returns the SP0256 LRQ status on bit 15. */ /* -------------------------------------------------------------------- */ if (offset == 0) { - return m_lrq; + return m_lrq << 15; } /* -------------------------------------------------------------------- */ /* Offset 1 returns the SPB640 FIFO full status on bit 15. */ /* -------------------------------------------------------------------- */ - if (offset == 1) + else { return (m_fifo_head - m_fifo_tail) >= 64 ? 0x8000 : 0; } - - /* -------------------------------------------------------------------- */ - /* Just return 255 for all other addresses in our range. */ - /* -------------------------------------------------------------------- */ - return 0x00ff; } void sp0256_device::spb640_w(offs_t offset, uint16_t data) { + m_stream->update(); + offset &= 1; + if (offset == 0) { ald_w(data & 0xff); - return; } - - if (offset == 1) + else { /* ---------------------------------------------------------------- */ /* If Bit 10 is set, reset the FIFO, and SP0256. */ /* ---------------------------------------------------------------- */ - if (data & 0x400) { m_fifo_head = m_fifo_tail = m_fifo_bitp = 0; @@ -1234,13 +1241,10 @@ /* ---------------------------------------------------------------- */ /* FIFO up the lower 10 bits of the data. */ /* ---------------------------------------------------------------- */ - LOG("spb640: WR_FIFO %.3X %d.%d %d\n", data & 0x3ff, m_fifo_tail, m_fifo_bitp, m_fifo_head); m_fifo[m_fifo_head++ & 63] = data & 0x3ff; - - return; } } @@ -1251,11 +1255,6 @@ } -TIMER_CALLBACK_MEMBER(sp0256_device::set_lrq_timer_proc) -{ - m_lrq = 0x8000; -} - //------------------------------------------------- // sound_stream_update - handle a stream update //------------------------------------------------- @@ -1264,7 +1263,6 @@ { auto &output = outputs[0]; int output_index = 0; - int length, did_samp/*, old_idx*/; while (output_index < output.samples()) { @@ -1272,7 +1270,6 @@ /* First, drain as much of our scratch buffer as we can into the */ /* sound buffer. */ /* ---------------------------------------------------------------- */ - while (m_sc_tail != m_sc_head) { output.put_int(output_index++, m_scratch[m_sc_tail++ & SCBUF_MASK], 32768); @@ -1288,14 +1285,13 @@ if (output_index > output.samples()) break; - length = output.samples() - output_index; + int length = output.samples() - output_index; /* ---------------------------------------------------------------- */ /* Process the current set of filter coefficients as long as the */ /* repeat count holds up and we have room in our scratch buffer. */ /* ---------------------------------------------------------------- */ - did_samp = 0; - //old_idx = m_sc_head; + int did_samp = 0; if (length > 0) do { int do_samp; @@ -1322,7 +1318,7 @@ for (int x = 0; x < do_samp; x++) m_scratch[y++ & SCBUF_MASK] = 0; m_sc_head += do_samp; - did_samp += do_samp; + did_samp += do_samp; } else { diff -Nru mame-0.263+dfsg.1/src/devices/sound/sp0256.h mame-0.264+dfsg.1/src/devices/sound/sp0256.h --- mame-0.263+dfsg.1/src/devices/sound/sp0256.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/sp0256.h 2024-03-25 14:00:46.000000000 +0000 @@ -51,7 +51,6 @@ uint16_t spb640_r(offs_t offset); void spb640_w(offs_t offset, uint16_t data); - TIMER_CALLBACK_MEMBER(set_lrq_timer_proc); void set_clock(int clock); void bitrevbuff(uint8_t *buffer, unsigned int start, unsigned int length); @@ -62,6 +61,7 @@ // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; + TIMER_CALLBACK_MEMBER(delayed_stream_update) { m_stream->update(); } private: struct lpc12_t @@ -96,6 +96,7 @@ required_region_ptr m_rom; // 64K ROM. sound_stream *m_stream; // MAME core sound stream + emu_timer *m_stream_timer; // For forcing stream update when callbacks are used devcb_write_line m_drq_cb; // Data request callback devcb_write_line m_sby_cb; // Standby callback @@ -122,8 +123,6 @@ uint32_t m_fifo_tail; // FIFO tail pointer (where data comes from). uint32_t m_fifo_bitp; // FIFO bit-pointer (for partial decles). uint16_t m_fifo[64]; // The 64-decle FIFO. - - emu_timer *m_lrq_timer; }; DECLARE_DEVICE_TYPE(SP0256, sp0256_device) diff -Nru mame-0.263+dfsg.1/src/devices/sound/swx00.cpp mame-0.264+dfsg.1/src/devices/sound/swx00.cpp --- mame-0.263+dfsg.1/src/devices/sound/swx00.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/swx00.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,310 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// Yamaha SWX00, rompler/dsp/cpu combo, audio support + +#include "emu.h" +#include "swx00.h" + + +DEFINE_DEVICE_TYPE(SWX00_SOUND, swx00_sound_device, "swx00_sound", "Yamaha SWX00 (sound subsystem)") + +swx00_sound_device::swx00_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SWX00_SOUND, tag, owner, clock), + device_sound_interface(mconfig, *this), + device_rom_interface(mconfig, *this) +{ +} + +void swx00_sound_device::device_add_mconfig(machine_config &config) +{ +} + +void swx00_sound_device::device_start() +{ + save_item(NAME(m_sample_start)); + save_item(NAME(m_sample_end)); + save_item(NAME(m_sample_address)); + + save_item(NAME(m_glo_pan)); + save_item(NAME(m_rev_dry)); + save_item(NAME(m_cho_var)); + + save_item(NAME(m_attack)); + save_item(NAME(m_release)); + + save_item(NAME(m_keyon)); + save_item(NAME(m_state_sel)); + + save_item(NAME(m_dsp_offsets)); + save_item(NAME(m_dsp_values)); + + save_item(NAME(m_rom_address)); + save_item(NAME(m_rom_read_status)); +} + +void swx00_sound_device::device_reset() +{ + std::fill(m_sample_start.begin(), m_sample_start.end(), 0); + std::fill(m_sample_end.begin(), m_sample_end.end(), 0); + std::fill(m_sample_address.begin(), m_sample_address.end(), 0); + + std::fill(m_glo_pan.begin(), m_glo_pan.end(), 0); + std::fill(m_rev_dry.begin(), m_rev_dry.end(), 0); + std::fill(m_cho_var.begin(), m_cho_var.end(), 0); + + std::fill(m_attack.begin(), m_attack.end(), 0); + std::fill(m_release.begin(), m_release.end(), 0); + + std::fill(m_dsp_offsets.begin(), m_dsp_offsets.end(), 0); + std::fill(m_dsp_values.begin(), m_dsp_values.end(), 0); + + m_keyon = 0; + m_state_sel = 0; + m_rom_address = 0; + m_rom_read_status = 0; +} + +void swx00_sound_device::sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) +{ +} + +void swx00_sound_device::map(address_map &map) +{ + map(0x000, 0x7ff).rw(FUNC(swx00_sound_device::snd_r), FUNC(swx00_sound_device::snd_w)); + + map(0x000, 0x000).rw(FUNC(swx00_sound_device::state_r), FUNC(swx00_sound_device::state_sel_w)); + + map(0x008, 0x00b).w(FUNC(swx00_sound_device::keyon_w)); + map(0x00c, 0x00c).w(FUNC(swx00_sound_device::keyon_commit_w)); + + map(0x110, 0x110).w(FUNC(swx00_sound_device::dsp_offh_w)); + map(0x120, 0x120).w(FUNC(swx00_sound_device::dsp_valh_w)); + + rchan(map, 0x05).rw(FUNC(swx00_sound_device::sample_start_r), FUNC(swx00_sound_device::sample_start_w)); + + map(0x180, 0x1ff).w(FUNC(swx00_sound_device::dsp_offl_w)); + map(0x200, 0x31f).w(FUNC(swx00_sound_device::dsp_vall_w)); // 06-0b + + rchan(map, 0x13).rw(FUNC(swx00_sound_device::glo_pan_r), FUNC(swx00_sound_device::glo_pan_w)); + rchan(map, 0x14).rw(FUNC(swx00_sound_device::attack_r), FUNC(swx00_sound_device::attack_w)); + rchan(map, 0x15).rw(FUNC(swx00_sound_device::release_r), FUNC(swx00_sound_device::release_w)); + rchan(map, 0x16).rw(FUNC(swx00_sound_device::rev_dry_r), FUNC(swx00_sound_device::rev_dry_w)); + rchan(map, 0x17).rw(FUNC(swx00_sound_device::cho_var_r), FUNC(swx00_sound_device::cho_var_w)); + rchan(map, 0x18).rw(FUNC(swx00_sound_device::sample_address_h_r), FUNC(swx00_sound_device::sample_address_h_w)); + rchan(map, 0x19).rw(FUNC(swx00_sound_device::sample_address_l_r), FUNC(swx00_sound_device::sample_address_l_w)); + rchan(map, 0x1a).rw(FUNC(swx00_sound_device::sample_pitch_r), FUNC(swx00_sound_device::sample_pitch_w)); + rchan(map, 0x1b).rw(FUNC(swx00_sound_device::sample_end_r), FUNC(swx00_sound_device::sample_end_w)); + + map(0x808, 0x809).w(FUNC(swx00_sound_device::rom_read_adrh_w)); + map(0x80a, 0x80b).w(FUNC(swx00_sound_device::rom_read_adrl_w)); + map(0x80c, 0x80d).r(FUNC(swx00_sound_device::rom_read_status_r)); + map(0x80e, 0x80f).rw(FUNC(swx00_sound_device::rom_read_r), FUNC(swx00_sound_device::rom_read_w)); +} + +u16 swx00_sound_device::snd_r(offs_t offset) +{ + u32 chan = offset & 0x1f; + u32 slot = offset >> 5; + logerror("snd_r %03x %02x.%02x\n", offset*2, chan, slot); + return 0; +} + +void swx00_sound_device::snd_w(offs_t offset, u16 data, u16 mem_mask) +{ + u32 chan = offset & 0x1f; + u32 slot = offset >> 5; + if(slot == 0x10 || slot == 0x11) + return; + logerror("snd_w %03x %02x.%02x %04x @ %04x\n", offset*2, chan, slot, data, mem_mask); +} + +void swx00_sound_device::rom_read_adrh_w(offs_t, u16 data, u16 mem_mask) +{ + m_rom_address = (m_rom_address & ~(mem_mask << 16)) | ((data & mem_mask) << 16); +} + +void swx00_sound_device::rom_read_adrl_w(offs_t, u16 data, u16 mem_mask) +{ + m_rom_address = (m_rom_address & ~mem_mask) | (data & mem_mask); + m_rom_read_status = 1; +} + +u16 swx00_sound_device::rom_read_status_r() +{ + return m_rom_read_status; +} + +u16 swx00_sound_device::rom_read_r() +{ + m_rom_read_status = 0; + return read_word(m_rom_address); +} + +void swx00_sound_device::rom_read_w(u16) +{ + m_rom_read_status = 0; +} + +u16 swx00_sound_device::sample_start_r(offs_t chan) +{ + return m_sample_start[chan]; +} + +void swx00_sound_device::sample_start_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_sample_start[chan]); + if(ACCESSING_BITS_0_7) + logerror("sample_start[%02x] = %04x\n", chan, m_sample_start[chan]); +} + +u16 swx00_sound_device::sample_end_r(offs_t chan) +{ + return m_sample_end[chan]; +} + +void swx00_sound_device::sample_end_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_sample_end[chan]); + if(ACCESSING_BITS_0_7) + logerror("sample_end[%02x] = %04x\n", chan, m_sample_end[chan]); +} + +u16 swx00_sound_device::sample_pitch_r(offs_t chan) +{ + return m_sample_pitch[chan]; +} + +void swx00_sound_device::sample_pitch_w(offs_t chan, u16 data, u16 mem_mask) +{ + u16 old = m_sample_pitch[chan]; + COMBINE_DATA(&m_sample_pitch[chan]); + if(ACCESSING_BITS_0_7 && m_sample_pitch[chan] != old) + logerror("sample_pitch[%02x] = %04x\n", chan, m_sample_pitch[chan]); +} + +u16 swx00_sound_device::sample_address_h_r(offs_t chan) +{ + return m_sample_address[chan] >> 16; +} + +u16 swx00_sound_device::sample_address_l_r(offs_t chan) +{ + return m_sample_address[chan]; +} + +void swx00_sound_device::sample_address_h_w(offs_t chan, u16 data, u16 mem_mask) +{ + m_sample_address[chan] = (m_sample_address[chan] & ~(mem_mask << 16)) | ((data & mem_mask) << 16); +} + +void swx00_sound_device::sample_address_l_w(offs_t chan, u16 data, u16 mem_mask) +{ + m_sample_address[chan] = (m_sample_address[chan] & ~mem_mask) | (data & mem_mask); + if(ACCESSING_BITS_0_7) + logerror("sample_address[%02x] = %08x\n", chan, m_sample_address[chan]); +} + +u16 swx00_sound_device::glo_pan_r(offs_t chan) +{ + return m_glo_pan[chan]; +} + +void swx00_sound_device::glo_pan_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_glo_pan[chan]); + logerror("%02x: glo=%02x panl=%x panr=%x\n", chan, m_glo_pan[chan] >> 8, (m_glo_pan[chan] >> 4) & 0xf, m_glo_pan[chan] & 0xf); +} + +u16 swx00_sound_device::rev_dry_r(offs_t chan) +{ + return m_rev_dry[chan]; +} + +void swx00_sound_device::rev_dry_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_rev_dry[chan]); + logerror("%02x: rev=%02x dry=%02x\n", chan, m_rev_dry[chan] >> 8, m_rev_dry[chan] & 0xff); +} + +u16 swx00_sound_device::cho_var_r(offs_t chan) +{ + return m_cho_var[chan]; +} + +void swx00_sound_device::cho_var_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_cho_var[chan]); + logerror("%02x: cho=%02x var=%02x\n", chan, m_cho_var[chan] >> 8, m_cho_var[chan] & 0xff); +} + +void swx00_sound_device::keyon_w(offs_t offset, u8 data) +{ + u32 shift = 24 - 8*offset; + m_keyon = (m_keyon & ~(0xff << shift)) | (data << shift); +} + +void swx00_sound_device::keyon_commit_w(u8) +{ + logerror("keyon commit %08x\n", m_keyon); + m_keyon = 0; +} + +u16 swx00_sound_device::attack_r(offs_t chan) +{ + return m_attack[chan]; +} + +void swx00_sound_device::attack_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_attack[chan]); + if(ACCESSING_BITS_0_7) + logerror("%02x: attack %02x.%02x\n", chan, m_attack[chan] >> 8, m_attack[chan] & 0xff); +} + +u16 swx00_sound_device::release_r(offs_t chan) +{ + return m_release[chan]; +} + +void swx00_sound_device::release_w(offs_t chan, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_release[chan]); + if(ACCESSING_BITS_0_7) + logerror("%02x: release %02x.%02x\n", chan, m_release[chan] >> 8, m_release[chan] & 0xff); +} + +void swx00_sound_device::state_sel_w(u8 data) +{ + m_state_sel = data; +} + +u8 swx00_sound_device::state_r() +{ + return 0; +} + +void swx00_sound_device::dsp_valh_w(u8 data) +{ + m_dsp_valh = data; +} + +void swx00_sound_device::dsp_vall_w(offs_t reg, u8 data) +{ + m_dsp_values[reg] = ((m_dsp_valh << 8) | data) & 0x3ff; + // logerror("dsp value[%03x] = %03x\n", reg, m_dsp_values[reg]); +} + +void swx00_sound_device::dsp_offh_w(u8 data) +{ + m_dsp_offh = data; +} + +void swx00_sound_device::dsp_offl_w(offs_t reg, u8 data) +{ + if(reg & 1) { + m_dsp_offsets[reg >> 1] = (m_dsp_offh << 16) | (m_dsp_offsets[reg >> 1] & 0xff00) | data; + // logerror("dsp offset[%02x] = %06x\n", reg >> 1, m_dsp_offsets[reg >> 1]); + } else + m_dsp_offsets[reg >> 1] = (m_dsp_offh << 16) | (data << 8) | (m_dsp_offsets[reg >> 1] & 0xff); +} diff -Nru mame-0.263+dfsg.1/src/devices/sound/swx00.h mame-0.264+dfsg.1/src/devices/sound/swx00.h --- mame-0.263+dfsg.1/src/devices/sound/swx00.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/sound/swx00.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// Yamaha SWX00, rompler/dsp/cpu combo, audio support + +#ifndef DEVICES_SOUND_SWX00_H +#define DEVICES_SOUND_SWX00_H + +#pragma once + +#include "meg.h" +#include "dirom.h" + +class swx00_sound_device : public device_t, public device_sound_interface, public device_rom_interface<24, 1, -1, ENDIANNESS_BIG> +{ +public: + swx00_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + void map(address_map &map); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + std::array m_sample_start; + std::array m_sample_end; + std::array m_sample_address; + std::array m_sample_pitch; + + std::array m_attack; + std::array m_release; + + std::array m_glo_pan; + std::array m_rev_dry; + std::array m_cho_var; + + std::array m_dsp_offsets; + std::array m_dsp_values; + + u32 m_keyon; + u32 m_rom_address; + u16 m_rom_read_status; + u8 m_state_sel; + u8 m_dsp_offh, m_dsp_valh; + + // Generic catch-all + u16 snd_r(offs_t offset); + void snd_w(offs_t offset, u16 data, u16 mem_mask); + + inline auto &rchan(address_map &map, int idx) { + return map(idx*0x40, idx*0x40+1).select(0x3e); + } + + u16 sample_start_r(offs_t chan); + void sample_start_w(offs_t chan, u16 data, u16 mem_mask); + u16 sample_end_r(offs_t chan); + void sample_end_w(offs_t chan, u16 data, u16 mem_mask); + u16 sample_address_h_r(offs_t chan); + u16 sample_address_l_r(offs_t chan); + void sample_address_h_w(offs_t chan, u16 data, u16 mem_mask); + void sample_address_l_w(offs_t chan, u16 data, u16 mem_mask); + u16 sample_pitch_r(offs_t chan); + void sample_pitch_w(offs_t chan, u16 data, u16 mem_mask); + + u16 glo_pan_r(offs_t chan); + void glo_pan_w(offs_t chan, u16 data, u16 mem_mask); + u16 rev_dry_r(offs_t chan); + void rev_dry_w(offs_t chan, u16 data, u16 mem_mask); + u16 cho_var_r(offs_t chan); + void cho_var_w(offs_t chan, u16 data, u16 mem_mask); + + u16 attack_r(offs_t chan); + void attack_w(offs_t chan, u16 data, u16 mem_mask); + u16 release_r(offs_t chan); + void release_w(offs_t chan, u16 data, u16 mem_mask); + + void keyon_w(offs_t offset, u8 data); + void keyon_commit_w(u8); + + void dsp_offh_w(u8 data); + void dsp_offl_w(offs_t reg, u8 data); + void dsp_valh_w(u8 data); + void dsp_vall_w(offs_t reg, u8 data); + + void rom_read_adrh_w(offs_t, u16 data, u16 mem_mask); + void rom_read_adrl_w(offs_t, u16 data, u16 mem_mask); + u16 rom_read_status_r(); + u16 rom_read_r(); + void rom_read_w(u16); + + void state_sel_w(u8 data); + u8 state_r(); +}; + +DECLARE_DEVICE_TYPE(SWX00_SOUND, swx00_sound_device) + +#endif diff -Nru mame-0.263+dfsg.1/src/devices/video/clgd546x_laguna.cpp mame-0.264+dfsg.1/src/devices/video/clgd546x_laguna.cpp --- mame-0.263+dfsg.1/src/devices/video/clgd546x_laguna.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/clgd546x_laguna.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,216 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese - -#include "emu.h" -#include "clgd546x_laguna.h" - -#include "screen.h" - -#define LOG_WARN (1U << 1) -#define LOG_TODO (1U << 2) // log unimplemented registers - -#define VERBOSE (LOG_GENERAL | LOG_WARN | LOG_TODO) -//#define LOG_OUTPUT_FUNC osd_printf_info -#include "logmacro.h" - -#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) -#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) - -DEFINE_DEVICE_TYPE(CIRRUS_GD5465_LAGUNA3D, cirrus_gd5465_laguna3d_device, "clgd5465_laguna", "Cirrus Logic GD-5465 \"Laguna 3D\"") - -cirrus_gd5465_laguna3d_device::cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, CIRRUS_GD5465_LAGUNA3D, tag, owner, clock) - , m_svga(*this, "svga") - , m_vga_rom(*this, "vga_rom") -{ - // device ID 0x1013 Cirrus Logic - // 0x00dx for Laguna revs - // subvendor ID: Returns values from ROM 0x7ff8-0x7ffb - set_ids_agp(0x101300d6, 0x00, 0x10130000); - // TODO: class can be 0x80 (other display controller) with P18 pin. -} - -/* - Cirrus Logic CL-GD5464 Laguna3D -// DSystems Wizar3D PCI graphics card - Chip: CL-GD5464-HC-A - ROM: DSystems Wizar3D 144a.10H - RAM: 2MB, 4MB, 8MB - Connector: DB15 - VESA feature connector -ROM_START( clgd5464 ) - ROM_REGION32_LE( 0x08000, "vga_rom", ROMREGION_ERASEFF ) - ROM_LOAD("dsystems_wizard3d.vbi", 0x00000, 0x08000, CRC(df9f1570), SHA1(4e611f4039b851fd4237d450e38c9d764920a747) ) -ROM_END - -*/ - -ROM_START( gd5465 ) - // Chaintech GA-5465AS AGP graphics card - Chip: CL-GD5465 - ROM: CL-GD546x Laguna PCI VGA BIOS Version 1.62c - RAM: 4MB, 8MB - OSC: 14.3C7Y - Connector: DB15 - VESA feature connector - ROM_REGION32_LE( 0x8000, "vga_rom", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS( 0, "chaintech", "Chaintech GA-5465AS 1.62c" ) - ROMX_LOAD( "chaintech.vbi", 0x0000, 0x8000, CRC(8afa1afb) SHA1(251a953d442dc34738f80371cfbd0fd9f1097635), ROM_BIOS(0) ) -ROM_END - -const tiny_rom_entry *cirrus_gd5465_laguna3d_device::device_rom_region() const -{ - return ROM_NAME(gd5465); -} - -void cirrus_gd5465_laguna3d_device::device_add_mconfig(machine_config &config) -{ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); - screen.set_screen_update(m_svga, FUNC(cirrus_gd5446_device::screen_update)); - - // TODO: bump to GD5465 - CIRRUS_GD5446(config, m_svga, 0); - m_svga->set_screen("screen"); - // FIXME: shared RAM - // in 4 and 8 MB versions - m_svga->set_vram_size(8*1024*1024); -} - -void cirrus_gd5465_laguna3d_device::device_start() -{ - pci_device::device_start(); - - add_map( 32*1024, M_MEM, FUNC(cirrus_gd5465_laguna3d_device::mmio_map)); - add_map( 32*1024*1024, M_MEM, FUNC(cirrus_gd5465_laguna3d_device::vram_aperture_map)); - - add_rom((u8 *)m_vga_rom->base(), 0x8000); - expansion_rom_base = 0xc0000; - - // INTA# - intr_pin = 1; - save_item(NAME(m_vga_legacy_enable)); - - // TODO: fast back-to-back -} - -void cirrus_gd5465_laguna3d_device::device_reset() -{ - pci_device::device_reset(); - - // TODO: to be checked - command = 0x0000; - status = 0x0000; - - m_vga_legacy_enable = true; - remap_cb(); -} - -void cirrus_gd5465_laguna3d_device::config_map(address_map &map) -{ - pci_device::config_map(map); - // TODO: AGP CAPPTR -// map(0xf8, 0xf8) PCI VGA Shadow Register -// map(0xfc, 0xfc) PCI Vendor Specific Control Register -} - -void cirrus_gd5465_laguna3d_device::mmio_map(address_map &map) -{ - -} - -void cirrus_gd5465_laguna3d_device::vram_aperture_map(address_map &map) -{ - -} - -// TODO: this should really be a subclass of VGA -void cirrus_gd5465_laguna3d_device::legacy_memory_map(address_map &map) -{ - map(0xa0000, 0xbffff).rw(FUNC(cirrus_gd5465_laguna3d_device::vram_r), FUNC(cirrus_gd5465_laguna3d_device::vram_w)); -} - -void cirrus_gd5465_laguna3d_device::legacy_io_map(address_map &map) -{ - map(0, 0x02f).m(m_svga, FUNC(cirrus_gd5446_device::io_map)); -} - -uint8_t cirrus_gd5465_laguna3d_device::vram_r(offs_t offset) -{ - return downcast(m_svga.target())->mem_r(offset); -} - -void cirrus_gd5465_laguna3d_device::vram_w(offs_t offset, uint8_t data) -{ - downcast(m_svga.target())->mem_w(offset, data); -} - -void cirrus_gd5465_laguna3d_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, - uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) -{ - if (m_vga_legacy_enable) - { - memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(cirrus_gd5465_laguna3d_device::vram_r)), write8sm_delegate(*this, FUNC(cirrus_gd5465_laguna3d_device::vram_w))); - - io_space->install_device(0x03b0, 0x03df, *this, &cirrus_gd5465_laguna3d_device::legacy_io_map); - //memory_space->install_rom(0xc0000, 0xcffff, (void *)expansion_rom); - } -} - -/* - Cirrus Logic CL-GD54M30 - PCI -ROM_START( clgd54m30 ) - ROM_REGION(0x10000, "clgd54m30", 0) - // Chip: CL-GD54M30-I-QC-A, ROM: 32KB, RAM: 1MB, 2MB, Connector: DB15, VESA veature connector - ROM_SYSTEM_BIOS(0, "version_1.00d", "VGA BIOS Version 1.00d") - ROMX_LOAD("korea.bin", 0x00000, 0x10000, CRC(0870507b) SHA1(b3873cb8834767250fcb7043918a35b1b895b0b1), ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "stlab_ver_1.00d", "STlab Version 1.00d") - ROMX_LOAD("gd54m30stlab.bin", 0x08000, 0x8000, CRC(72116f4e) SHA1(4618640aa0f07586ebab02260fc58aa3035114fb), ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2, "clgd54m30_ver1.00d", "CL-GD54M30 Ver.1.00d") - ROMX("gd54m30.bin", 0x08000, 0x000, CRC(45a1d9d0) SHA1(0e8a88ff354699bfb75a1de807f2187ff9910c67), ROM_BIOS(2) ) -ROM_END - -*/ - -/* - Cirrus Logic CL-GD543x - PCI cards - -// PCI card CL543XPCI Ver 4.0 - ROM: CL-GD543x PCI VGA BIOS Version 1.10B - RAM: 1MB, 2MB or 4MB - Chip: CL-GD5430-0C-C - OSC: 14.318 MHz - Connector: DB15 -// VESA feature connector - Jumpers: IRQ9 enable/disable, Green control -ROM_START( clgd543x_pci ) - ROM_REGION(0x08000, "clgd543x_pci", 0) - ROM_SYSTEM_BIOS(0, "pci_version_1.10b", "PCI VGA BIOS Version 1.10B") - ROMX_LOAD("cl543x_pci_rev4.bin", 0x00000, 0x8000, CRC(553171a3) SHA1(b72edc318710c46c9cb280e9b1b3c9f8a34844f2), ROM_BIOS(0) ) - ROM_IGNORE( 0x8000 ) - ROM_SYSTEM_BIOS(1, "pci_version_1.00e", "PCI VGA BIOS Version 1.00e") - ROMX_LOAD("cirrus5434.bin", 0x00000, 0x8000, CRC(bc271648) SHA1(08afd4468c4c1a1630a200de1007b1671f109b3c), ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2, "pci_version_1.22", "PCI VGA BIOS Version 1.22") - ROMX_LOAD("gd5434pci.bin", 0x00000, 0x8000, CRC(fa76dabf) SHA1(0310ef02df941e7d35e1d832400e2e4dd07d6309), ROM_BIOS(2) ) - ROM_SYSTEM_BIOS(3, "pci_ver_1.10b_jap", "PCI VGA BIOS Version 1.10B Japan chip") - ROMX_LOAD("japan.bin", 0x00000, 0x8000, CRC(46fe9efa) SHA1(58712b00faf102509c4129c0babeb98df2b6e042), ROM_BIOS(3) ) - ROM_SYSTEM_BIOS(4, "gd5434pciv124", "CL-GD543x PCI VGA BIOS Version 1.24") - ROMX_LOAD("1.24.bin", 0x00000,0x8000, CRC(174fa427) SHA1(3e490f3cc3af33dbfac6ff3ddac5e90bdc895646), ROM_BIOS(4) ) -ROM_END - -*/ - -/* - Cirrus Logic VL-GD5436 - PCI cards - -//Chip: CL-GD5436-I-QC-A - ROM: CL-GD5436 VL/PCI VGA BIOS Version 1.00b - RAM: 1MB, up to 4MB - Connector: DB15 - VESA connector - OSC: 14.31818MHz -// Jumpers: JG1 Green Control, IRQ9 enable/disable -ROM_START( clgd5436 ) - ROM_REGION(0x08000, "clgd5436", 0) - ROM_LOAD("5436.vbi", 0x00000, 0x08000, CRC(7737d03e) SHA1(e4d0b4e7262887dc5a6473ea8909fdc13a6a02c1) ) -ROM_END - -*/ - -/* - Cirrus Logic CL-GD5440 - PCI cards - -// Chip: Cirrus Logic CL-GD5440-J-QC-B - ROM: CL-GD5440 VGA BIOS Version 1.07 - RAM: 1MB, max. 2MB - OSC:14.31818MHz - Connector: DB15 - VESA connector -ROM_START( clgd5440 ) - ROM_REGION(0x10000, "clgd5440", 0) - ROM_LOAD("bios.bin", 0x00000, 0x10000, CRC(f0d3d0b4) SHA1(620b0727a20b127f5f32576ec54fbc6f9f437ad3) ) -ROM_END -*/ - -/* - Cirrus Logic CL-GD5446 - PCI cards -// Chip:CL-GD5446-HC-A - ROM: CL-GD5436/46 PCI VGA BIOS Version 1.25 - RAM: 1MB, 2MB, 4MB - OSC: 14.31818MHz - Connector: DB15 - VESA feature connector -ROM_START( clgd5446 ) - ROM_REGION(0x10000, "clgd5446", 0) - ROM_LOAD("5446bv.vbi", 0x00000, 0x10000, CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a) ) -ROM_END - -*/ diff -Nru mame-0.263+dfsg.1/src/devices/video/clgd546x_laguna.h mame-0.264+dfsg.1/src/devices/video/clgd546x_laguna.h --- mame-0.263+dfsg.1/src/devices/video/clgd546x_laguna.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/clgd546x_laguna.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese -#ifndef MAME_VIDEO_CLGD546X_LAGUNA_H -#define MAME_VIDEO_CLGD546X_LAGUNA_H - -#pragma once - -#include "machine/pci.h" -#include "video/pc_vga_cirrus.h" - -class cirrus_gd5465_laguna3d_device : public pci_device -{ -public: - cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - void legacy_memory_map(address_map &map); - void legacy_io_map(address_map &map); - -protected: - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_add_mconfig(machine_config &config) override; - - virtual const tiny_rom_entry *device_rom_region() const override; - - virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, - uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; - - virtual void config_map(address_map &map) override; - - virtual void mmio_map(address_map &map); - virtual void vram_aperture_map(address_map &map); -private: - required_device m_svga; - required_memory_region m_vga_rom; - - u8 vram_r(offs_t offset); - void vram_w(offs_t offset, uint8_t data); - -// u32 unmap_log_r(offs_t offset, u32 mem_mask = ~0); -// void unmap_log_w(offs_t offset, u32 data, u32 mem_mask = ~0); - - bool m_vga_legacy_enable = false; -}; - -DECLARE_DEVICE_TYPE(CIRRUS_GD5465_LAGUNA3D, cirrus_gd5465_laguna3d_device) - -#endif // MAME_VIDEO_CLGD546X_LAGUNA_H diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12.cpp mame-0.264+dfsg.1/src/devices/video/epic12.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,998 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Luca Elia, MetalliC -// emulation of Altera Cyclone EP1C12 FPGA programmed as a blitter - -#include "emu.h" -#include "epic12.h" - -#include "screen.h" - -#define LOG_DEBUG (1U << 1) - -//#define VERBOSE (LOG_DEBUG) -#include "logmacro.h" - -#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) - - -DEFINE_DEVICE_TYPE(EPIC12, epic12_device, "epic12", "EPIC12 Blitter") - -static constexpr int EP1C_VRAM_CLK_NANOSEC = 13; -static constexpr int EP1C_SRAM_CLK_NANOSEC = 20; -static constexpr int EP1C_VRAM_H_LINE_PERIOD_NANOSEC = 63600; -static constexpr int EP1C_VRAM_H_LINE_DURATION_NANOSEC = 2160; -static constexpr int EP1C_FRAME_DURATION_NANOSEC = 16666666; -static constexpr int EP1C_DRAW_OPERATION_SIZE_BYTES = 20; -static constexpr int EP1C_CLIP_OPERATION_SIZE_BYTES = 2; - -// When looking at VRAM viewer in Special mode in Muchi Muchi Pork, draws 32 pixels outside of -// the "clip area" is visible. This is likely why the frame buffers will have at least a 32 pixel offset -// from the VRAM borders or other buffers in all games. -static constexpr int EP1C_CLIP_MARGIN = 32; - -epic12_device::epic12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, EPIC12, tag, owner, clock) - , device_video_interface(mconfig, *this) - , m_ram16(nullptr), m_gfx_size(0), m_bitmaps(nullptr), m_use_ram(nullptr) - , m_main_ramsize(0), m_main_rammask(0), m_ram16_copy(nullptr), m_work_queue(nullptr) - , m_maincpu(*this, finder_base::DUMMY_TAG) - , m_port_r_cb(*this, 0) -{ - m_blitter_request = nullptr; - m_blitter_delay_timer = nullptr; - m_blitter_busy = 0; - m_gfx_addr = 0; - m_gfx_scroll_x = 0; - m_gfx_scroll_y = 0; - m_gfx_clip_x = 0; - m_gfx_clip_y = 0; - m_gfx_addr_shadowcopy = 0; - m_gfx_clip_x_shadowcopy = 0; - m_gfx_clip_y_shadowcopy = 0; - m_blit_delay_ns = 0; - m_blit_idle_op_bytes = 0; -} - -TIMER_CALLBACK_MEMBER(epic12_device::blitter_delay_callback) -{ - m_blitter_busy = 0; -} - - -void epic12_device::device_start() -{ - m_gfx_size = 0x2000 * 0x1000; - m_bitmaps = std::make_unique(0x2000, 0x1000); - m_clip = m_bitmaps->cliprect(); - m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); - -#if DEBUG_VRAM_VIEWER - m_debug_vram_view_en = false; - m_prev_screen_width = m_curr_screen_width = screen().width(); - m_prev_screen_height = m_curr_screen_height = screen().height(); - m_prev_screen_visarea = m_curr_screen_visarea = screen().visible_area(); -#endif - - m_ram16_copy = std::make_unique(m_main_ramsize / 2); - - m_blitter_delay_timer = timer_alloc(FUNC(epic12_device::blitter_delay_callback), this); - m_blitter_delay_timer->adjust(attotime::never); - - m_firmware_pos = 0; - m_firmware.clear(); - m_firmware.resize(290405, 0); - m_firmware_port = 0; - m_firmware_version = -1; - - save_item(NAME(m_gfx_addr)); - save_item(NAME(m_gfx_scroll_x)); - save_item(NAME(m_gfx_scroll_y)); - save_item(NAME(m_gfx_clip_x)); - save_item(NAME(m_gfx_clip_y)); - save_item(NAME(m_gfx_addr_shadowcopy)); - save_item(NAME(m_gfx_clip_x_shadowcopy)); - save_item(NAME(m_gfx_clip_y_shadowcopy)); - save_pointer(NAME(m_ram16_copy), m_main_ramsize/2); - save_item(NAME(*m_bitmaps)); - save_item(NAME(m_firmware_pos)); - save_item(NAME(m_firmware_port)); - save_item(NAME(m_firmware)); - save_item(NAME(m_firmware_version)); - save_item(NAME(m_blit_delay_ns)); - save_item(NAME(m_blit_idle_op_bytes)); -} - -void epic12_device::device_reset() -{ - m_use_ram = m_ram16_copy.get(); - m_work_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_HIGH_FREQ); - - // cache table to avoid divides in blit code, also pre-clamped - for (int y = 0; y < 0x40; y++) - { - for (int x = 0; x < 0x20; x++) - { - colrtable[x][y] = std::min((x * y) / 0x1f, 0x1f); - colrtable_rev[x ^ 0x1f][y] = std::min((x * y) / 0x1f, 0x1f); - } - } - - // preclamped add table - for (int y = 0; y < 0x20; y++) - { - for (int x = 0; x < 0x20; x++) - { - colrtable_add[x][y] = std::min((x + y), 0x1f); - } - } - - m_blitter_busy = 0; -} - -// todo, get these into the device class without ruining performance -u8 epic12_device::colrtable[0x20][0x40]; -u8 epic12_device::colrtable_rev[0x20][0x40]; -u8 epic12_device::colrtable_add[0x20][0x20]; - -inline u16 epic12_device::READ_NEXT_WORD(offs_t *addr) -{ -// u16 data = space.read_word(*addr); // going through the memory system is 'more correct' but noticeably slower - const u16 data = m_use_ram[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)]; - - *addr += 2; - - return data; -} - -inline u16 epic12_device::COPY_NEXT_WORD(address_space &space, offs_t *addr) -{ -// u16 data = space.read_word(*addr); // going through the memory system is 'more correct' but noticeably slower - const u16 data = m_ram16[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)]; - m_ram16_copy[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)] = data; - - *addr += 2; - - return data; -} - -/* - Upload command - This command uploads gfx data to VRAM, from Main CPU RAM. - - Offset Bits Description - fedcba98 76543210 - 00 0010---- -------- 0x2 for upload - ----0000 00000000 Fixed for upload? - 02 00000000 00000000 "" - 04 10011001 10011001 "" - 06 10011001 10011001 "" - 08 ---xxxxx xxxxxxxx Destination X start position - 0a ----xxxx xxxxxxxx Destination Y start position - 0c ---xxxxx xxxxxxxx Source Width - 0e ----xxxx xxxxxxxx Source Height - 10...10 + (Width * Height * 2) Source GFX data (ARGB1555 format) -*/ - -inline void epic12_device::gfx_upload_shadow_copy(address_space &space, offs_t *addr) -{ - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - - const u32 dimx = (COPY_NEXT_WORD(space, addr) & 0x1fff) + 1; - const u32 dimy = (COPY_NEXT_WORD(space, addr) & 0x0fff) + 1; - - for (u32 y = 0; y < dimy; y++) - { - for (u32 x = 0; x < dimx; x++) - { - COPY_NEXT_WORD(space, addr); - } - } - - // Time spent on uploads is mostly due to Main RAM accesses. - // The Blitter will send BREQ requests to the SH-3, to access Main RAM - // and then write it to VRAM. - // The number of bytes to read are the sum of a 16b fixed header and the pixel - // data (2 byte per pixel). RAM accesses are 32bit, so divide by four for clocks. - // - // TODO: There's additional overhead to these request thats are not included. The BREQ - // assertion also puts CPU into WAIT, if it needs uncached RAM accesses. - int num_sram_clk = (16 + dimx * dimy * 2 ) / 4; - m_blit_delay_ns += num_sram_clk * EP1C_SRAM_CLK_NANOSEC; - m_blit_idle_op_bytes = 0; -} - -inline void epic12_device::gfx_upload(offs_t *addr) -{ - // 0x20000000 - READ_NEXT_WORD(addr); - READ_NEXT_WORD(addr); - - // 0x99999999 - READ_NEXT_WORD(addr); - READ_NEXT_WORD(addr); - - u32 dst_x_start = READ_NEXT_WORD(addr); - u32 dst_y_start = READ_NEXT_WORD(addr); - - u32 dst_p = 0; - dst_x_start &= 0x1fff; - dst_y_start &= 0x0fff; - - const u32 dimx = (READ_NEXT_WORD(addr) & 0x1fff) + 1; - const u32 dimy = (READ_NEXT_WORD(addr) & 0x0fff) + 1; - - logerror("GFX COPY: DST %02X,%02X,%03X DIM %02X,%03X\n", dst_p,dst_x_start,dst_y_start, dimx,dimy); - - for (u32 y = 0; y < dimy; y++) - { - u32 *dst = &m_bitmaps->pix(dst_y_start + y, 0); - dst += dst_x_start; - - for (u32 x = 0; x < dimx; x++) - { - const u16 pendat = READ_NEXT_WORD(addr); - // real hw would upload the gfxword directly, but our VRAM is 32-bit, so convert it. - //dst[dst_x_start + x] = pendat; - *dst++ = ((pendat & 0x8000) << 14) | ((pendat & 0x7c00) << 9) | ((pendat & 0x03e0) << 6) | ((pendat & 0x001f) << 3); // --t- ---- rrrr r--- gggg g--- bbbb b--- format - //dst[dst_x_start + x] = ((pendat & 0x8000) << 14) | ((pendat & 0x7c00) << 6) | ((pendat & 0x03e0) << 3) | ((pendat & 0x001f) << 0); // --t- ---- ---r rrrr ---g gggg ---b bbbb format - } - } -} - -#define draw_params m_bitmaps.get(), &m_clip, &m_bitmaps->pix(0,0),src_x,src_y, x,y, dimx,dimy, flipy, s_alpha, d_alpha, &tint_clr - - -const epic12_device::blitfunction epic12_device::f0_ti1_tr1_blit_funcs[64] = -{ - epic12_device::draw_sprite_f0_ti1_tr1_s0_d0, epic12_device::draw_sprite_f0_ti1_tr1_s1_d0, epic12_device::draw_sprite_f0_ti1_tr1_s2_d0, epic12_device::draw_sprite_f0_ti1_tr1_s3_d0, epic12_device::draw_sprite_f0_ti1_tr1_s4_d0, epic12_device::draw_sprite_f0_ti1_tr1_s5_d0, epic12_device::draw_sprite_f0_ti1_tr1_s6_d0, epic12_device::draw_sprite_f0_ti1_tr1_s7_d0, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d1, epic12_device::draw_sprite_f0_ti1_tr1_s1_d1, epic12_device::draw_sprite_f0_ti1_tr1_s2_d1, epic12_device::draw_sprite_f0_ti1_tr1_s3_d1, epic12_device::draw_sprite_f0_ti1_tr1_s4_d1, epic12_device::draw_sprite_f0_ti1_tr1_s5_d1, epic12_device::draw_sprite_f0_ti1_tr1_s6_d1, epic12_device::draw_sprite_f0_ti1_tr1_s7_d1, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d2, epic12_device::draw_sprite_f0_ti1_tr1_s1_d2, epic12_device::draw_sprite_f0_ti1_tr1_s2_d2, epic12_device::draw_sprite_f0_ti1_tr1_s3_d2, epic12_device::draw_sprite_f0_ti1_tr1_s4_d2, epic12_device::draw_sprite_f0_ti1_tr1_s5_d2, epic12_device::draw_sprite_f0_ti1_tr1_s6_d2, epic12_device::draw_sprite_f0_ti1_tr1_s7_d2, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d3, epic12_device::draw_sprite_f0_ti1_tr1_s1_d3, epic12_device::draw_sprite_f0_ti1_tr1_s2_d3, epic12_device::draw_sprite_f0_ti1_tr1_s3_d3, epic12_device::draw_sprite_f0_ti1_tr1_s4_d3, epic12_device::draw_sprite_f0_ti1_tr1_s5_d3, epic12_device::draw_sprite_f0_ti1_tr1_s6_d3, epic12_device::draw_sprite_f0_ti1_tr1_s7_d3, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d4, epic12_device::draw_sprite_f0_ti1_tr1_s1_d4, epic12_device::draw_sprite_f0_ti1_tr1_s2_d4, epic12_device::draw_sprite_f0_ti1_tr1_s3_d4, epic12_device::draw_sprite_f0_ti1_tr1_s4_d4, epic12_device::draw_sprite_f0_ti1_tr1_s5_d4, epic12_device::draw_sprite_f0_ti1_tr1_s6_d4, epic12_device::draw_sprite_f0_ti1_tr1_s7_d4, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d5, epic12_device::draw_sprite_f0_ti1_tr1_s1_d5, epic12_device::draw_sprite_f0_ti1_tr1_s2_d5, epic12_device::draw_sprite_f0_ti1_tr1_s3_d5, epic12_device::draw_sprite_f0_ti1_tr1_s4_d5, epic12_device::draw_sprite_f0_ti1_tr1_s5_d5, epic12_device::draw_sprite_f0_ti1_tr1_s6_d5, epic12_device::draw_sprite_f0_ti1_tr1_s7_d5, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d6, epic12_device::draw_sprite_f0_ti1_tr1_s1_d6, epic12_device::draw_sprite_f0_ti1_tr1_s2_d6, epic12_device::draw_sprite_f0_ti1_tr1_s3_d6, epic12_device::draw_sprite_f0_ti1_tr1_s4_d6, epic12_device::draw_sprite_f0_ti1_tr1_s5_d6, epic12_device::draw_sprite_f0_ti1_tr1_s6_d6, epic12_device::draw_sprite_f0_ti1_tr1_s7_d6, - epic12_device::draw_sprite_f0_ti1_tr1_s0_d7, epic12_device::draw_sprite_f0_ti1_tr1_s1_d7, epic12_device::draw_sprite_f0_ti1_tr1_s2_d7, epic12_device::draw_sprite_f0_ti1_tr1_s3_d7, epic12_device::draw_sprite_f0_ti1_tr1_s4_d7, epic12_device::draw_sprite_f0_ti1_tr1_s5_d7, epic12_device::draw_sprite_f0_ti1_tr1_s6_d7, epic12_device::draw_sprite_f0_ti1_tr1_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f0_ti1_tr0_blit_funcs[64] = -{ - epic12_device::draw_sprite_f0_ti1_tr0_s0_d0, epic12_device::draw_sprite_f0_ti1_tr0_s1_d0, epic12_device::draw_sprite_f0_ti1_tr0_s2_d0, epic12_device::draw_sprite_f0_ti1_tr0_s3_d0, epic12_device::draw_sprite_f0_ti1_tr0_s4_d0, epic12_device::draw_sprite_f0_ti1_tr0_s5_d0, epic12_device::draw_sprite_f0_ti1_tr0_s6_d0, epic12_device::draw_sprite_f0_ti1_tr0_s7_d0, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d1, epic12_device::draw_sprite_f0_ti1_tr0_s1_d1, epic12_device::draw_sprite_f0_ti1_tr0_s2_d1, epic12_device::draw_sprite_f0_ti1_tr0_s3_d1, epic12_device::draw_sprite_f0_ti1_tr0_s4_d1, epic12_device::draw_sprite_f0_ti1_tr0_s5_d1, epic12_device::draw_sprite_f0_ti1_tr0_s6_d1, epic12_device::draw_sprite_f0_ti1_tr0_s7_d1, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d2, epic12_device::draw_sprite_f0_ti1_tr0_s1_d2, epic12_device::draw_sprite_f0_ti1_tr0_s2_d2, epic12_device::draw_sprite_f0_ti1_tr0_s3_d2, epic12_device::draw_sprite_f0_ti1_tr0_s4_d2, epic12_device::draw_sprite_f0_ti1_tr0_s5_d2, epic12_device::draw_sprite_f0_ti1_tr0_s6_d2, epic12_device::draw_sprite_f0_ti1_tr0_s7_d2, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d3, epic12_device::draw_sprite_f0_ti1_tr0_s1_d3, epic12_device::draw_sprite_f0_ti1_tr0_s2_d3, epic12_device::draw_sprite_f0_ti1_tr0_s3_d3, epic12_device::draw_sprite_f0_ti1_tr0_s4_d3, epic12_device::draw_sprite_f0_ti1_tr0_s5_d3, epic12_device::draw_sprite_f0_ti1_tr0_s6_d3, epic12_device::draw_sprite_f0_ti1_tr0_s7_d3, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d4, epic12_device::draw_sprite_f0_ti1_tr0_s1_d4, epic12_device::draw_sprite_f0_ti1_tr0_s2_d4, epic12_device::draw_sprite_f0_ti1_tr0_s3_d4, epic12_device::draw_sprite_f0_ti1_tr0_s4_d4, epic12_device::draw_sprite_f0_ti1_tr0_s5_d4, epic12_device::draw_sprite_f0_ti1_tr0_s6_d4, epic12_device::draw_sprite_f0_ti1_tr0_s7_d4, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d5, epic12_device::draw_sprite_f0_ti1_tr0_s1_d5, epic12_device::draw_sprite_f0_ti1_tr0_s2_d5, epic12_device::draw_sprite_f0_ti1_tr0_s3_d5, epic12_device::draw_sprite_f0_ti1_tr0_s4_d5, epic12_device::draw_sprite_f0_ti1_tr0_s5_d5, epic12_device::draw_sprite_f0_ti1_tr0_s6_d5, epic12_device::draw_sprite_f0_ti1_tr0_s7_d5, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d6, epic12_device::draw_sprite_f0_ti1_tr0_s1_d6, epic12_device::draw_sprite_f0_ti1_tr0_s2_d6, epic12_device::draw_sprite_f0_ti1_tr0_s3_d6, epic12_device::draw_sprite_f0_ti1_tr0_s4_d6, epic12_device::draw_sprite_f0_ti1_tr0_s5_d6, epic12_device::draw_sprite_f0_ti1_tr0_s6_d6, epic12_device::draw_sprite_f0_ti1_tr0_s7_d6, - epic12_device::draw_sprite_f0_ti1_tr0_s0_d7, epic12_device::draw_sprite_f0_ti1_tr0_s1_d7, epic12_device::draw_sprite_f0_ti1_tr0_s2_d7, epic12_device::draw_sprite_f0_ti1_tr0_s3_d7, epic12_device::draw_sprite_f0_ti1_tr0_s4_d7, epic12_device::draw_sprite_f0_ti1_tr0_s5_d7, epic12_device::draw_sprite_f0_ti1_tr0_s6_d7, epic12_device::draw_sprite_f0_ti1_tr0_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f1_ti1_tr1_blit_funcs[64] = -{ - epic12_device::draw_sprite_f1_ti1_tr1_s0_d0, epic12_device::draw_sprite_f1_ti1_tr1_s1_d0, epic12_device::draw_sprite_f1_ti1_tr1_s2_d0, epic12_device::draw_sprite_f1_ti1_tr1_s3_d0, epic12_device::draw_sprite_f1_ti1_tr1_s4_d0, epic12_device::draw_sprite_f1_ti1_tr1_s5_d0, epic12_device::draw_sprite_f1_ti1_tr1_s6_d0, epic12_device::draw_sprite_f1_ti1_tr1_s7_d0, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d1, epic12_device::draw_sprite_f1_ti1_tr1_s1_d1, epic12_device::draw_sprite_f1_ti1_tr1_s2_d1, epic12_device::draw_sprite_f1_ti1_tr1_s3_d1, epic12_device::draw_sprite_f1_ti1_tr1_s4_d1, epic12_device::draw_sprite_f1_ti1_tr1_s5_d1, epic12_device::draw_sprite_f1_ti1_tr1_s6_d1, epic12_device::draw_sprite_f1_ti1_tr1_s7_d1, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d2, epic12_device::draw_sprite_f1_ti1_tr1_s1_d2, epic12_device::draw_sprite_f1_ti1_tr1_s2_d2, epic12_device::draw_sprite_f1_ti1_tr1_s3_d2, epic12_device::draw_sprite_f1_ti1_tr1_s4_d2, epic12_device::draw_sprite_f1_ti1_tr1_s5_d2, epic12_device::draw_sprite_f1_ti1_tr1_s6_d2, epic12_device::draw_sprite_f1_ti1_tr1_s7_d2, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d3, epic12_device::draw_sprite_f1_ti1_tr1_s1_d3, epic12_device::draw_sprite_f1_ti1_tr1_s2_d3, epic12_device::draw_sprite_f1_ti1_tr1_s3_d3, epic12_device::draw_sprite_f1_ti1_tr1_s4_d3, epic12_device::draw_sprite_f1_ti1_tr1_s5_d3, epic12_device::draw_sprite_f1_ti1_tr1_s6_d3, epic12_device::draw_sprite_f1_ti1_tr1_s7_d3, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d4, epic12_device::draw_sprite_f1_ti1_tr1_s1_d4, epic12_device::draw_sprite_f1_ti1_tr1_s2_d4, epic12_device::draw_sprite_f1_ti1_tr1_s3_d4, epic12_device::draw_sprite_f1_ti1_tr1_s4_d4, epic12_device::draw_sprite_f1_ti1_tr1_s5_d4, epic12_device::draw_sprite_f1_ti1_tr1_s6_d4, epic12_device::draw_sprite_f1_ti1_tr1_s7_d4, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d5, epic12_device::draw_sprite_f1_ti1_tr1_s1_d5, epic12_device::draw_sprite_f1_ti1_tr1_s2_d5, epic12_device::draw_sprite_f1_ti1_tr1_s3_d5, epic12_device::draw_sprite_f1_ti1_tr1_s4_d5, epic12_device::draw_sprite_f1_ti1_tr1_s5_d5, epic12_device::draw_sprite_f1_ti1_tr1_s6_d5, epic12_device::draw_sprite_f1_ti1_tr1_s7_d5, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d6, epic12_device::draw_sprite_f1_ti1_tr1_s1_d6, epic12_device::draw_sprite_f1_ti1_tr1_s2_d6, epic12_device::draw_sprite_f1_ti1_tr1_s3_d6, epic12_device::draw_sprite_f1_ti1_tr1_s4_d6, epic12_device::draw_sprite_f1_ti1_tr1_s5_d6, epic12_device::draw_sprite_f1_ti1_tr1_s6_d6, epic12_device::draw_sprite_f1_ti1_tr1_s7_d6, - epic12_device::draw_sprite_f1_ti1_tr1_s0_d7, epic12_device::draw_sprite_f1_ti1_tr1_s1_d7, epic12_device::draw_sprite_f1_ti1_tr1_s2_d7, epic12_device::draw_sprite_f1_ti1_tr1_s3_d7, epic12_device::draw_sprite_f1_ti1_tr1_s4_d7, epic12_device::draw_sprite_f1_ti1_tr1_s5_d7, epic12_device::draw_sprite_f1_ti1_tr1_s6_d7, epic12_device::draw_sprite_f1_ti1_tr1_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f1_ti1_tr0_blit_funcs[64] = -{ - epic12_device::draw_sprite_f1_ti1_tr0_s0_d0, epic12_device::draw_sprite_f1_ti1_tr0_s1_d0, epic12_device::draw_sprite_f1_ti1_tr0_s2_d0, epic12_device::draw_sprite_f1_ti1_tr0_s3_d0, epic12_device::draw_sprite_f1_ti1_tr0_s4_d0, epic12_device::draw_sprite_f1_ti1_tr0_s5_d0, epic12_device::draw_sprite_f1_ti1_tr0_s6_d0, epic12_device::draw_sprite_f1_ti1_tr0_s7_d0, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d1, epic12_device::draw_sprite_f1_ti1_tr0_s1_d1, epic12_device::draw_sprite_f1_ti1_tr0_s2_d1, epic12_device::draw_sprite_f1_ti1_tr0_s3_d1, epic12_device::draw_sprite_f1_ti1_tr0_s4_d1, epic12_device::draw_sprite_f1_ti1_tr0_s5_d1, epic12_device::draw_sprite_f1_ti1_tr0_s6_d1, epic12_device::draw_sprite_f1_ti1_tr0_s7_d1, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d2, epic12_device::draw_sprite_f1_ti1_tr0_s1_d2, epic12_device::draw_sprite_f1_ti1_tr0_s2_d2, epic12_device::draw_sprite_f1_ti1_tr0_s3_d2, epic12_device::draw_sprite_f1_ti1_tr0_s4_d2, epic12_device::draw_sprite_f1_ti1_tr0_s5_d2, epic12_device::draw_sprite_f1_ti1_tr0_s6_d2, epic12_device::draw_sprite_f1_ti1_tr0_s7_d2, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d3, epic12_device::draw_sprite_f1_ti1_tr0_s1_d3, epic12_device::draw_sprite_f1_ti1_tr0_s2_d3, epic12_device::draw_sprite_f1_ti1_tr0_s3_d3, epic12_device::draw_sprite_f1_ti1_tr0_s4_d3, epic12_device::draw_sprite_f1_ti1_tr0_s5_d3, epic12_device::draw_sprite_f1_ti1_tr0_s6_d3, epic12_device::draw_sprite_f1_ti1_tr0_s7_d3, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d4, epic12_device::draw_sprite_f1_ti1_tr0_s1_d4, epic12_device::draw_sprite_f1_ti1_tr0_s2_d4, epic12_device::draw_sprite_f1_ti1_tr0_s3_d4, epic12_device::draw_sprite_f1_ti1_tr0_s4_d4, epic12_device::draw_sprite_f1_ti1_tr0_s5_d4, epic12_device::draw_sprite_f1_ti1_tr0_s6_d4, epic12_device::draw_sprite_f1_ti1_tr0_s7_d4, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d5, epic12_device::draw_sprite_f1_ti1_tr0_s1_d5, epic12_device::draw_sprite_f1_ti1_tr0_s2_d5, epic12_device::draw_sprite_f1_ti1_tr0_s3_d5, epic12_device::draw_sprite_f1_ti1_tr0_s4_d5, epic12_device::draw_sprite_f1_ti1_tr0_s5_d5, epic12_device::draw_sprite_f1_ti1_tr0_s6_d5, epic12_device::draw_sprite_f1_ti1_tr0_s7_d5, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d6, epic12_device::draw_sprite_f1_ti1_tr0_s1_d6, epic12_device::draw_sprite_f1_ti1_tr0_s2_d6, epic12_device::draw_sprite_f1_ti1_tr0_s3_d6, epic12_device::draw_sprite_f1_ti1_tr0_s4_d6, epic12_device::draw_sprite_f1_ti1_tr0_s5_d6, epic12_device::draw_sprite_f1_ti1_tr0_s6_d6, epic12_device::draw_sprite_f1_ti1_tr0_s7_d6, - epic12_device::draw_sprite_f1_ti1_tr0_s0_d7, epic12_device::draw_sprite_f1_ti1_tr0_s1_d7, epic12_device::draw_sprite_f1_ti1_tr0_s2_d7, epic12_device::draw_sprite_f1_ti1_tr0_s3_d7, epic12_device::draw_sprite_f1_ti1_tr0_s4_d7, epic12_device::draw_sprite_f1_ti1_tr0_s5_d7, epic12_device::draw_sprite_f1_ti1_tr0_s6_d7, epic12_device::draw_sprite_f1_ti1_tr0_s7_d7, -}; - - -const epic12_device::blitfunction epic12_device::f0_ti0_tr1_blit_funcs[64] = -{ - epic12_device::draw_sprite_f0_ti0_tr1_s0_d0, epic12_device::draw_sprite_f0_ti0_tr1_s1_d0, epic12_device::draw_sprite_f0_ti0_tr1_s2_d0, epic12_device::draw_sprite_f0_ti0_tr1_s3_d0, epic12_device::draw_sprite_f0_ti0_tr1_s4_d0, epic12_device::draw_sprite_f0_ti0_tr1_s5_d0, epic12_device::draw_sprite_f0_ti0_tr1_s6_d0, epic12_device::draw_sprite_f0_ti0_tr1_s7_d0, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d1, epic12_device::draw_sprite_f0_ti0_tr1_s1_d1, epic12_device::draw_sprite_f0_ti0_tr1_s2_d1, epic12_device::draw_sprite_f0_ti0_tr1_s3_d1, epic12_device::draw_sprite_f0_ti0_tr1_s4_d1, epic12_device::draw_sprite_f0_ti0_tr1_s5_d1, epic12_device::draw_sprite_f0_ti0_tr1_s6_d1, epic12_device::draw_sprite_f0_ti0_tr1_s7_d1, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d2, epic12_device::draw_sprite_f0_ti0_tr1_s1_d2, epic12_device::draw_sprite_f0_ti0_tr1_s2_d2, epic12_device::draw_sprite_f0_ti0_tr1_s3_d2, epic12_device::draw_sprite_f0_ti0_tr1_s4_d2, epic12_device::draw_sprite_f0_ti0_tr1_s5_d2, epic12_device::draw_sprite_f0_ti0_tr1_s6_d2, epic12_device::draw_sprite_f0_ti0_tr1_s7_d2, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d3, epic12_device::draw_sprite_f0_ti0_tr1_s1_d3, epic12_device::draw_sprite_f0_ti0_tr1_s2_d3, epic12_device::draw_sprite_f0_ti0_tr1_s3_d3, epic12_device::draw_sprite_f0_ti0_tr1_s4_d3, epic12_device::draw_sprite_f0_ti0_tr1_s5_d3, epic12_device::draw_sprite_f0_ti0_tr1_s6_d3, epic12_device::draw_sprite_f0_ti0_tr1_s7_d3, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d4, epic12_device::draw_sprite_f0_ti0_tr1_s1_d4, epic12_device::draw_sprite_f0_ti0_tr1_s2_d4, epic12_device::draw_sprite_f0_ti0_tr1_s3_d4, epic12_device::draw_sprite_f0_ti0_tr1_s4_d4, epic12_device::draw_sprite_f0_ti0_tr1_s5_d4, epic12_device::draw_sprite_f0_ti0_tr1_s6_d4, epic12_device::draw_sprite_f0_ti0_tr1_s7_d4, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d5, epic12_device::draw_sprite_f0_ti0_tr1_s1_d5, epic12_device::draw_sprite_f0_ti0_tr1_s2_d5, epic12_device::draw_sprite_f0_ti0_tr1_s3_d5, epic12_device::draw_sprite_f0_ti0_tr1_s4_d5, epic12_device::draw_sprite_f0_ti0_tr1_s5_d5, epic12_device::draw_sprite_f0_ti0_tr1_s6_d5, epic12_device::draw_sprite_f0_ti0_tr1_s7_d5, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d6, epic12_device::draw_sprite_f0_ti0_tr1_s1_d6, epic12_device::draw_sprite_f0_ti0_tr1_s2_d6, epic12_device::draw_sprite_f0_ti0_tr1_s3_d6, epic12_device::draw_sprite_f0_ti0_tr1_s4_d6, epic12_device::draw_sprite_f0_ti0_tr1_s5_d6, epic12_device::draw_sprite_f0_ti0_tr1_s6_d6, epic12_device::draw_sprite_f0_ti0_tr1_s7_d6, - epic12_device::draw_sprite_f0_ti0_tr1_s0_d7, epic12_device::draw_sprite_f0_ti0_tr1_s1_d7, epic12_device::draw_sprite_f0_ti0_tr1_s2_d7, epic12_device::draw_sprite_f0_ti0_tr1_s3_d7, epic12_device::draw_sprite_f0_ti0_tr1_s4_d7, epic12_device::draw_sprite_f0_ti0_tr1_s5_d7, epic12_device::draw_sprite_f0_ti0_tr1_s6_d7, epic12_device::draw_sprite_f0_ti0_tr1_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f0_ti0_tr0_blit_funcs[64] = -{ - epic12_device::draw_sprite_f0_ti0_tr0_s0_d0, epic12_device::draw_sprite_f0_ti0_tr0_s1_d0, epic12_device::draw_sprite_f0_ti0_tr0_s2_d0, epic12_device::draw_sprite_f0_ti0_tr0_s3_d0, epic12_device::draw_sprite_f0_ti0_tr0_s4_d0, epic12_device::draw_sprite_f0_ti0_tr0_s5_d0, epic12_device::draw_sprite_f0_ti0_tr0_s6_d0, epic12_device::draw_sprite_f0_ti0_tr0_s7_d0, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d1, epic12_device::draw_sprite_f0_ti0_tr0_s1_d1, epic12_device::draw_sprite_f0_ti0_tr0_s2_d1, epic12_device::draw_sprite_f0_ti0_tr0_s3_d1, epic12_device::draw_sprite_f0_ti0_tr0_s4_d1, epic12_device::draw_sprite_f0_ti0_tr0_s5_d1, epic12_device::draw_sprite_f0_ti0_tr0_s6_d1, epic12_device::draw_sprite_f0_ti0_tr0_s7_d1, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d2, epic12_device::draw_sprite_f0_ti0_tr0_s1_d2, epic12_device::draw_sprite_f0_ti0_tr0_s2_d2, epic12_device::draw_sprite_f0_ti0_tr0_s3_d2, epic12_device::draw_sprite_f0_ti0_tr0_s4_d2, epic12_device::draw_sprite_f0_ti0_tr0_s5_d2, epic12_device::draw_sprite_f0_ti0_tr0_s6_d2, epic12_device::draw_sprite_f0_ti0_tr0_s7_d2, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d3, epic12_device::draw_sprite_f0_ti0_tr0_s1_d3, epic12_device::draw_sprite_f0_ti0_tr0_s2_d3, epic12_device::draw_sprite_f0_ti0_tr0_s3_d3, epic12_device::draw_sprite_f0_ti0_tr0_s4_d3, epic12_device::draw_sprite_f0_ti0_tr0_s5_d3, epic12_device::draw_sprite_f0_ti0_tr0_s6_d3, epic12_device::draw_sprite_f0_ti0_tr0_s7_d3, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d4, epic12_device::draw_sprite_f0_ti0_tr0_s1_d4, epic12_device::draw_sprite_f0_ti0_tr0_s2_d4, epic12_device::draw_sprite_f0_ti0_tr0_s3_d4, epic12_device::draw_sprite_f0_ti0_tr0_s4_d4, epic12_device::draw_sprite_f0_ti0_tr0_s5_d4, epic12_device::draw_sprite_f0_ti0_tr0_s6_d4, epic12_device::draw_sprite_f0_ti0_tr0_s7_d4, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d5, epic12_device::draw_sprite_f0_ti0_tr0_s1_d5, epic12_device::draw_sprite_f0_ti0_tr0_s2_d5, epic12_device::draw_sprite_f0_ti0_tr0_s3_d5, epic12_device::draw_sprite_f0_ti0_tr0_s4_d5, epic12_device::draw_sprite_f0_ti0_tr0_s5_d5, epic12_device::draw_sprite_f0_ti0_tr0_s6_d5, epic12_device::draw_sprite_f0_ti0_tr0_s7_d5, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d6, epic12_device::draw_sprite_f0_ti0_tr0_s1_d6, epic12_device::draw_sprite_f0_ti0_tr0_s2_d6, epic12_device::draw_sprite_f0_ti0_tr0_s3_d6, epic12_device::draw_sprite_f0_ti0_tr0_s4_d6, epic12_device::draw_sprite_f0_ti0_tr0_s5_d6, epic12_device::draw_sprite_f0_ti0_tr0_s6_d6, epic12_device::draw_sprite_f0_ti0_tr0_s7_d6, - epic12_device::draw_sprite_f0_ti0_tr0_s0_d7, epic12_device::draw_sprite_f0_ti0_tr0_s1_d7, epic12_device::draw_sprite_f0_ti0_tr0_s2_d7, epic12_device::draw_sprite_f0_ti0_tr0_s3_d7, epic12_device::draw_sprite_f0_ti0_tr0_s4_d7, epic12_device::draw_sprite_f0_ti0_tr0_s5_d7, epic12_device::draw_sprite_f0_ti0_tr0_s6_d7, epic12_device::draw_sprite_f0_ti0_tr0_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f1_ti0_tr1_blit_funcs[64] = -{ - epic12_device::draw_sprite_f1_ti0_tr1_s0_d0, epic12_device::draw_sprite_f1_ti0_tr1_s1_d0, epic12_device::draw_sprite_f1_ti0_tr1_s2_d0, epic12_device::draw_sprite_f1_ti0_tr1_s3_d0, epic12_device::draw_sprite_f1_ti0_tr1_s4_d0, epic12_device::draw_sprite_f1_ti0_tr1_s5_d0, epic12_device::draw_sprite_f1_ti0_tr1_s6_d0, epic12_device::draw_sprite_f1_ti0_tr1_s7_d0, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d1, epic12_device::draw_sprite_f1_ti0_tr1_s1_d1, epic12_device::draw_sprite_f1_ti0_tr1_s2_d1, epic12_device::draw_sprite_f1_ti0_tr1_s3_d1, epic12_device::draw_sprite_f1_ti0_tr1_s4_d1, epic12_device::draw_sprite_f1_ti0_tr1_s5_d1, epic12_device::draw_sprite_f1_ti0_tr1_s6_d1, epic12_device::draw_sprite_f1_ti0_tr1_s7_d1, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d2, epic12_device::draw_sprite_f1_ti0_tr1_s1_d2, epic12_device::draw_sprite_f1_ti0_tr1_s2_d2, epic12_device::draw_sprite_f1_ti0_tr1_s3_d2, epic12_device::draw_sprite_f1_ti0_tr1_s4_d2, epic12_device::draw_sprite_f1_ti0_tr1_s5_d2, epic12_device::draw_sprite_f1_ti0_tr1_s6_d2, epic12_device::draw_sprite_f1_ti0_tr1_s7_d2, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d3, epic12_device::draw_sprite_f1_ti0_tr1_s1_d3, epic12_device::draw_sprite_f1_ti0_tr1_s2_d3, epic12_device::draw_sprite_f1_ti0_tr1_s3_d3, epic12_device::draw_sprite_f1_ti0_tr1_s4_d3, epic12_device::draw_sprite_f1_ti0_tr1_s5_d3, epic12_device::draw_sprite_f1_ti0_tr1_s6_d3, epic12_device::draw_sprite_f1_ti0_tr1_s7_d3, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d4, epic12_device::draw_sprite_f1_ti0_tr1_s1_d4, epic12_device::draw_sprite_f1_ti0_tr1_s2_d4, epic12_device::draw_sprite_f1_ti0_tr1_s3_d4, epic12_device::draw_sprite_f1_ti0_tr1_s4_d4, epic12_device::draw_sprite_f1_ti0_tr1_s5_d4, epic12_device::draw_sprite_f1_ti0_tr1_s6_d4, epic12_device::draw_sprite_f1_ti0_tr1_s7_d4, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d5, epic12_device::draw_sprite_f1_ti0_tr1_s1_d5, epic12_device::draw_sprite_f1_ti0_tr1_s2_d5, epic12_device::draw_sprite_f1_ti0_tr1_s3_d5, epic12_device::draw_sprite_f1_ti0_tr1_s4_d5, epic12_device::draw_sprite_f1_ti0_tr1_s5_d5, epic12_device::draw_sprite_f1_ti0_tr1_s6_d5, epic12_device::draw_sprite_f1_ti0_tr1_s7_d5, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d6, epic12_device::draw_sprite_f1_ti0_tr1_s1_d6, epic12_device::draw_sprite_f1_ti0_tr1_s2_d6, epic12_device::draw_sprite_f1_ti0_tr1_s3_d6, epic12_device::draw_sprite_f1_ti0_tr1_s4_d6, epic12_device::draw_sprite_f1_ti0_tr1_s5_d6, epic12_device::draw_sprite_f1_ti0_tr1_s6_d6, epic12_device::draw_sprite_f1_ti0_tr1_s7_d6, - epic12_device::draw_sprite_f1_ti0_tr1_s0_d7, epic12_device::draw_sprite_f1_ti0_tr1_s1_d7, epic12_device::draw_sprite_f1_ti0_tr1_s2_d7, epic12_device::draw_sprite_f1_ti0_tr1_s3_d7, epic12_device::draw_sprite_f1_ti0_tr1_s4_d7, epic12_device::draw_sprite_f1_ti0_tr1_s5_d7, epic12_device::draw_sprite_f1_ti0_tr1_s6_d7, epic12_device::draw_sprite_f1_ti0_tr1_s7_d7, -}; - -const epic12_device::blitfunction epic12_device::f1_ti0_tr0_blit_funcs[64] = -{ - epic12_device::draw_sprite_f1_ti0_tr0_s0_d0, epic12_device::draw_sprite_f1_ti0_tr0_s1_d0, epic12_device::draw_sprite_f1_ti0_tr0_s2_d0, epic12_device::draw_sprite_f1_ti0_tr0_s3_d0, epic12_device::draw_sprite_f1_ti0_tr0_s4_d0, epic12_device::draw_sprite_f1_ti0_tr0_s5_d0, epic12_device::draw_sprite_f1_ti0_tr0_s6_d0, epic12_device::draw_sprite_f1_ti0_tr0_s7_d0, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d1, epic12_device::draw_sprite_f1_ti0_tr0_s1_d1, epic12_device::draw_sprite_f1_ti0_tr0_s2_d1, epic12_device::draw_sprite_f1_ti0_tr0_s3_d1, epic12_device::draw_sprite_f1_ti0_tr0_s4_d1, epic12_device::draw_sprite_f1_ti0_tr0_s5_d1, epic12_device::draw_sprite_f1_ti0_tr0_s6_d1, epic12_device::draw_sprite_f1_ti0_tr0_s7_d1, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d2, epic12_device::draw_sprite_f1_ti0_tr0_s1_d2, epic12_device::draw_sprite_f1_ti0_tr0_s2_d2, epic12_device::draw_sprite_f1_ti0_tr0_s3_d2, epic12_device::draw_sprite_f1_ti0_tr0_s4_d2, epic12_device::draw_sprite_f1_ti0_tr0_s5_d2, epic12_device::draw_sprite_f1_ti0_tr0_s6_d2, epic12_device::draw_sprite_f1_ti0_tr0_s7_d2, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d3, epic12_device::draw_sprite_f1_ti0_tr0_s1_d3, epic12_device::draw_sprite_f1_ti0_tr0_s2_d3, epic12_device::draw_sprite_f1_ti0_tr0_s3_d3, epic12_device::draw_sprite_f1_ti0_tr0_s4_d3, epic12_device::draw_sprite_f1_ti0_tr0_s5_d3, epic12_device::draw_sprite_f1_ti0_tr0_s6_d3, epic12_device::draw_sprite_f1_ti0_tr0_s7_d3, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d4, epic12_device::draw_sprite_f1_ti0_tr0_s1_d4, epic12_device::draw_sprite_f1_ti0_tr0_s2_d4, epic12_device::draw_sprite_f1_ti0_tr0_s3_d4, epic12_device::draw_sprite_f1_ti0_tr0_s4_d4, epic12_device::draw_sprite_f1_ti0_tr0_s5_d4, epic12_device::draw_sprite_f1_ti0_tr0_s6_d4, epic12_device::draw_sprite_f1_ti0_tr0_s7_d4, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d5, epic12_device::draw_sprite_f1_ti0_tr0_s1_d5, epic12_device::draw_sprite_f1_ti0_tr0_s2_d5, epic12_device::draw_sprite_f1_ti0_tr0_s3_d5, epic12_device::draw_sprite_f1_ti0_tr0_s4_d5, epic12_device::draw_sprite_f1_ti0_tr0_s5_d5, epic12_device::draw_sprite_f1_ti0_tr0_s6_d5, epic12_device::draw_sprite_f1_ti0_tr0_s7_d5, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d6, epic12_device::draw_sprite_f1_ti0_tr0_s1_d6, epic12_device::draw_sprite_f1_ti0_tr0_s2_d6, epic12_device::draw_sprite_f1_ti0_tr0_s3_d6, epic12_device::draw_sprite_f1_ti0_tr0_s4_d6, epic12_device::draw_sprite_f1_ti0_tr0_s5_d6, epic12_device::draw_sprite_f1_ti0_tr0_s6_d6, epic12_device::draw_sprite_f1_ti0_tr0_s7_d6, - epic12_device::draw_sprite_f1_ti0_tr0_s0_d7, epic12_device::draw_sprite_f1_ti0_tr0_s1_d7, epic12_device::draw_sprite_f1_ti0_tr0_s2_d7, epic12_device::draw_sprite_f1_ti0_tr0_s3_d7, epic12_device::draw_sprite_f1_ti0_tr0_s4_d7, epic12_device::draw_sprite_f1_ti0_tr0_s5_d7, epic12_device::draw_sprite_f1_ti0_tr0_s6_d7, epic12_device::draw_sprite_f1_ti0_tr0_s7_d7, -}; - -/* - Calculate number of VRAM row accesses a draw will perform. - Source data will typically be aligned well with VRAM, but this is not the case for the destination. - As an example, drawing a 64x32 pixel image will usually read from two VRAM rows for source data, - but if the destination start coordinate is (x=10, y=10), each of the 32x32px chunks of source data will - touch 4 rows of destination VRAM, leading to a total of 8 destination VRAM accesses. -*/ -inline u16 calculate_vram_accesses(u16 start_x, u16 start_y, u16 dimx, u16 dimy) -{ - int x_rows = 0; - int num_vram_rows = 0; - for (int x_pixels = dimx; x_pixels > 0; x_pixels -= 32) - { - x_rows++; - if (((start_x & 31) + std::min(32, x_pixels)) > 32) - x_rows++; // Drawing across multiple horizontal VRAM row boundaries. - } - for (int y_pixels = dimy; y_pixels > 0; y_pixels -= 32) - { - num_vram_rows += x_rows; - if (((start_y & 31) + std::min(32, y_pixels)) > 32) - num_vram_rows += x_rows; // Drawing across multiple vertical VRAM row boundaries. - } - return num_vram_rows; -} - -/* - Draw command - This command draws gfx data. - - Offset Bits Description - fedcba98 76543210 - 00 0001---- -------- 0x1 for draw - ----x--- -------- Flip X - -----x-- -------- Flip Y - ------x- -------- Enable Blending - -------x -------- Enable Transparent - -------- -xxx---- Source Blending mode - -------- -----xxx Destination Blending mode - 02 xxxxxxxx -------- Source Alpha value - -------- xxxxxxxx Destination Alpha value - 04 ---xxxxx xxxxxxxx Source X start position - 06 ----xxxx xxxxxxxx Source Y start position - 08 sxxxxxxx xxxxxxxx Destination X start position - 0a sxxxxxxx xxxxxxxx Destination Y start position - 0c ---xxxxx xxxxxxxx Source Width - 0e ----xxxx xxxxxxxx Source Height - 10 -------- xxxxxxxx Source Red multiplication (0x80 = 100%) - 12 xxxxxxxx -------- Source Green multiplication (0x80 = 100%) - -------- xxxxxxxx Source Blue multiplication (0x80 = 100%) - - Blending mode (description from ibara test mode) - 000 +alpha - 001 +source - 010 +destination - 100 -alpha - 101 -source - 110 -destination - others are reserved/disable? -*/ - -inline void epic12_device::gfx_draw_shadow_copy(address_space &space, offs_t *addr) -{ - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - u16 src_x_start = COPY_NEXT_WORD(space, addr); - u16 src_y_start = COPY_NEXT_WORD(space, addr); - u16 dst_x_start = COPY_NEXT_WORD(space, addr); - u16 dst_y_start = COPY_NEXT_WORD(space, addr); - u16 src_dimx = (COPY_NEXT_WORD(space, addr) & 0x1fff) + 1; - u16 src_dimy = (COPY_NEXT_WORD(space, addr) & 0x0fff) + 1; - COPY_NEXT_WORD(space, addr); - COPY_NEXT_WORD(space, addr); - - // Calculate Blitter delay for the Draw operation. - // On real hardware, the Blitter will read operations into a FIFO queue - // by asserting BREQ on the SH3 and then reading from Main RAM. - // Since the reads are done concurrently to executions of operations, its - // ok to estimate the delay all at once instead for emulation purposes. - - u16 dst_x_end = dst_x_start + src_dimx - 1; - u16 dst_y_end = dst_y_start + src_dimy - 1; - - // Sprites fully outside of clipping area should not be drawn. - if (dst_x_start > m_clip.max_x || dst_x_end < m_clip.min_x || dst_y_start > m_clip.max_y || dst_y_end < m_clip.min_y) - { - idle_blitter(EP1C_DRAW_OPERATION_SIZE_BYTES); - return; - } - - // Clip the blitter operations, to have the calculations only respect the area being written. - // It's not 100% clear this is how this is performed, but it is clear that there should be some amount of clipping - // applied here to match the hardware. This way seems most likely, and maps well to the delays seen on hardware. - // One example of this being utilized heavily is the transparent fog in Mushihimesama Futari Stage 1. This is drawn as - // 256x256 sprites, with large parts clipped away. - dst_x_start = std::max(dst_x_start, (u16)m_clip.min_x); - dst_y_start = std::max(dst_y_start, (u16)m_clip.min_y); - dst_x_end = std::min(dst_x_end, (u16)m_clip.max_x); - dst_y_end = std::min(dst_y_end, (u16)m_clip.max_y); - src_dimx = dst_x_end - dst_x_start + 1; - src_dimy = dst_y_end - dst_y_start + 1; - - m_blit_idle_op_bytes = 0; // Blitter no longer idle. - - // VRAM data is laid out in 32x32 pixel rows. Calculate amount of rows accessed. - int src_num_vram_rows = calculate_vram_accesses(src_x_start, src_y_start, src_dimx, src_dimy); - int dst_num_vram_rows = calculate_vram_accesses(dst_x_start, dst_y_start, src_dimx, src_dimy); - - // Since draws are done 4 pixels at the time, extend the draw area to coordinates aligned for this. - // Doing this after VRAM calculations simplify things a bit, and these extensions will never make the - // destination area span additional VRAM rows. - dst_x_start -= dst_x_start & 3; - dst_x_end += (4 - ((dst_x_end + 1) & 3)) & 3; - u16 dst_dimx = dst_x_end - dst_x_start + 1; - u16 dst_dimy = dst_y_end - dst_y_start + 1; - - // Number of VRAM CLK cycles needed to draw a sprite is sum of: - // - Number of pixels read from source divided by 4 (Each CLK reads 4 pixels, since 32bit DDR). - // - Number of pixels read from destination divided by 4. - // - Pixels written to destination divided by 4. - // - VRAM access overhead: - // - 6 CLK of overhead after each read from a source VRAM row. - // - 20 CLK of overhead between read and write of each destination VRAM row. - // - 11 CLK of overhead after each write to a destination VRAM row. - // - 12 CLK of additional overhead per sprite at the end of writing. - // Note: Details are from https://buffis.com/docs/CV1000_Blitter_Research_by_buffi.pdf - // There may be mistakes. - u32 num_vram_clk = src_dimx * src_dimy / 4 + dst_dimx * dst_dimy / 2 + src_num_vram_rows * 6 + dst_num_vram_rows * (20 + 11) + 12; - m_blit_delay_ns += num_vram_clk * EP1C_VRAM_CLK_NANOSEC; -} - -inline void epic12_device::gfx_draw(offs_t *addr) -{ - clr_t tint_clr; - bool tinted = false; - - const u16 attr = READ_NEXT_WORD(addr); - const u16 alpha = READ_NEXT_WORD(addr); - u16 src_x = READ_NEXT_WORD(addr); - u16 src_y = READ_NEXT_WORD(addr); - const u16 dst_x_start = READ_NEXT_WORD(addr); - const u16 dst_y_start = READ_NEXT_WORD(addr); - const u16 w = READ_NEXT_WORD(addr); - const u16 h = READ_NEXT_WORD(addr); - const u16 tint_r = READ_NEXT_WORD(addr); - const u16 tint_gb = READ_NEXT_WORD(addr); - - // 0: +alpha - // 1: +source - // 2: +dest - // 3: * - // 4: -alpha - // 5: -source - // 6: -dest - // 7: * - - const u8 d_mode = attr & 0x0007; - const u8 s_mode = (attr & 0x0070) >> 4; - - const bool trans = attr & 0x0100; - bool blend = attr & 0x0200; - - const bool flipy = attr & 0x0400; - const bool flipx = attr & 0x0800; - - const u8 d_alpha = ((alpha & 0x00ff) ) >> 3; - const u8 s_alpha = ((alpha & 0xff00) >> 8) >> 3; - -// int src_p = 0; - src_x = src_x & 0x1fff; - src_y = src_y & 0x0fff; - - - const int x = (dst_x_start & 0x7fff) - (dst_x_start & 0x8000); - const int y = (dst_y_start & 0x7fff) - (dst_y_start & 0x8000); - - const int dimx = (w & 0x1fff) + 1; - const int dimy = (h & 0x0fff) + 1; - - // convert parameters to clr - - tint_to_clr(tint_r & 0x00ff, (tint_gb >> 8) & 0xff, tint_gb & 0xff, &tint_clr); - - /* interestingly this gets set to 0x20 for 'normal' not 0x1f */ - - if (tint_clr.r != 0x20) - tinted = true; - - if (tint_clr.g != 0x20) - tinted = true; - - if (tint_clr.b != 0x20) - tinted = true; - - // surprisingly frequent, need to verify if it produces a worthwhile speedup tho. - if ((s_mode == 0 && s_alpha == 0x1f) && (d_mode == 4 && d_alpha == 0x1f)) - blend = false; - - if (tinted) - { - if (!flipx) - { - if (trans) - { - if (!blend) - { - draw_sprite_f0_ti1_tr1_plain(draw_params); - } - else - { - f0_ti1_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - else - { - if (!blend) - { - draw_sprite_f0_ti1_tr0_plain(draw_params); - } - else - { - f0_ti1_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - } - else // flipx - { - if (trans) - { - if (!blend) - { - draw_sprite_f1_ti1_tr1_plain(draw_params); - } - else - { - f1_ti1_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - else - { - if (!blend) - { - draw_sprite_f1_ti1_tr0_plain(draw_params); - } - else - { - f1_ti1_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - } - } - else - { - if (blend == 0 && tinted == 0) - { - if (!flipx) - { - if (trans) - { - draw_sprite_f0_ti0_tr1_simple(draw_params); - } - else - { - draw_sprite_f0_ti0_tr0_simple(draw_params); - } - } - else - { - if (trans) - { - draw_sprite_f1_ti0_tr1_simple(draw_params); - } - else - { - draw_sprite_f1_ti0_tr0_simple(draw_params); - } - - } - - return; - } - - //printf("smode %d dmode %d\n", s_mode, d_mode); - - if (!flipx) - { - if (trans) - { - if (!blend) - { - draw_sprite_f0_ti0_plain(draw_params); - } - else - { - f0_ti0_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - else - { - if (!blend) - { - draw_sprite_f0_ti0_tr0_plain(draw_params); - } - else - { - f0_ti0_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - } - else // flipx - { - if (trans) - { - if (!blend) - { - draw_sprite_f1_ti0_plain(draw_params); - } - else - { - f1_ti0_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - else - { - if (!blend) - { - draw_sprite_f1_ti0_tr0_plain(draw_params); - } - else - { - f1_ti0_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); - } - } - } - } - -} - - -void epic12_device::gfx_create_shadow_copy(address_space &space) -{ - offs_t addr = m_gfx_addr & 0x1fffffff; - - m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, - m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); - while (1) - { - // request commands from main CPU RAM - const u16 data = COPY_NEXT_WORD(space, &addr); - - switch (data & 0xf000) - { - case 0x0000: - case 0xf000: - return; - - case 0xc000: - if (COPY_NEXT_WORD(space, &addr)) // cliptype - m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, - m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); - else - m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); - idle_blitter(EP1C_CLIP_OPERATION_SIZE_BYTES); - break; - - case 0x2000: - addr -= 2; - gfx_upload_shadow_copy(space, &addr); - break; - - case 0x1000: - addr -= 2; - gfx_draw_shadow_copy(space, &addr); - break; - - default: - popmessage("GFX op = %04X", data); - return; - } - } -} - - -void epic12_device::gfx_exec(void) -{ - offs_t addr = m_gfx_addr_shadowcopy & 0x1fffffff; - m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, - m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); - -// logerror("GFX EXEC: %08X\n", addr); - - while (1) - { - // request commands from main CPU RAM - const u16 data = READ_NEXT_WORD(&addr); - - switch (data & 0xf000) - { - case 0x0000: - case 0xf000: - return; - - case 0xc000: - if (READ_NEXT_WORD(&addr)) // cliptype - m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, - m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); - else - m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); - break; - - case 0x2000: - addr -= 2; - gfx_upload(&addr); - break; - - case 0x1000: - addr -= 2; - gfx_draw(&addr); - break; - - default: - popmessage("GFX op = %04X", data); - return; - } - } -} - -void *epic12_device::blit_request_callback(void *param, int threadid) -{ - epic12_device *object = reinterpret_cast(param); - object->gfx_exec(); - return nullptr; -} - - -u32 epic12_device::gfx_ready_r() -{ - return m_blitter_busy ? 0x00000000 : 0x00000010; -} - -void epic12_device::gfx_exec_w(address_space &space, offs_t offset, u32 data, u32 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - if (data & 1) - { - // make sure we've not already got a request running - if (m_blitter_request) - { - int result; - do - { - result = osd_work_item_wait(m_blitter_request, 1000); - } while (result == 0); - osd_work_item_release(m_blitter_request); - } - - m_gfx_clip_x_shadowcopy = m_gfx_clip_x; - m_gfx_clip_y_shadowcopy = m_gfx_clip_y; - - // Create a copy of the blit list so we can safely thread it. - // Copying the Blitter operations will also estimate the delay needed for processing. - m_blit_delay_ns = 0; - gfx_create_shadow_copy(space); - - // Every EP1C_VRAM_H_LINE_PERIOD_NANOSEC, the Blitter will block other operations, due - // to fetching a horizontal line from VRAM for output. - m_blit_delay_ns += std::floor( m_blit_delay_ns / EP1C_VRAM_H_LINE_PERIOD_NANOSEC ) * EP1C_VRAM_H_LINE_DURATION_NANOSEC; - - // Check if Blitter takes longer than a frame to render. - // In practice, there's a bit less time than this to allow for lack of slowdown but - // for debugging purposes this is an ok approximation. - if (m_blit_delay_ns > EP1C_FRAME_DURATION_NANOSEC) - LOGDBG("Blitter delay! Blit duration %lld ns.\n", m_blit_delay_ns); - - m_blitter_busy = 1; - m_blitter_delay_timer->adjust(attotime::from_nsec(m_blit_delay_ns)); - - m_gfx_addr_shadowcopy = m_gfx_addr; - m_blitter_request = osd_work_item_queue(m_work_queue, blit_request_callback, (void*)this, 0); - } - } -} - -void epic12_device::draw_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - if (m_blitter_request) - { - int result; - do - { - result = osd_work_item_wait(m_blitter_request, 1000); - } while (result == 0); - osd_work_item_release(m_blitter_request); - } - - bitmap.fill(0, cliprect); - -#if DEBUG_VRAM_VIEWER - int curr_width = m_curr_screen_width; - int curr_height = m_curr_screen_height; - rectangle curr_visarea = m_curr_screen_visarea; - - if (machine().input().code_pressed_once(KEYCODE_T)) m_debug_vram_view_en = !m_debug_vram_view_en; - if (m_debug_vram_view_en) - { - curr_width = 8192; - curr_height = 4096; - curr_visarea.set(0, curr_width - 1, 0, curr_height - 1); - } - if ((m_prev_screen_height != curr_height) || (m_prev_screen_width != curr_width)) - { - screen().configure(curr_width, curr_height, curr_visarea, screen().refresh_attoseconds()); - m_prev_screen_height = curr_height; - m_prev_screen_width = curr_width; - } -#endif - - int scroll_x = -m_gfx_scroll_x; - int scroll_y = -m_gfx_scroll_y; - - -#if DEBUG_VRAM_VIEWER - if (m_debug_vram_view_en) - copybitmap(bitmap, *m_bitmaps, 0, 0, 0, 0, cliprect); - else -#endif - copyscrollbitmap(bitmap, *m_bitmaps, 1, &scroll_x, 1, &scroll_y, cliprect); -} - - -u32 epic12_device::blitter_r(offs_t offset, u32 mem_mask) -{ - switch (offset * 4) - { - case 0x10: - return gfx_ready_r(); - - case 0x24: - return 0xffffffff; - - case 0x28: - return 0xffffffff; - - case 0x50: - return m_port_r_cb(); - - default: - logerror("unknownblitter_r %08x %08x\n", offset*4, mem_mask); - break; - - } - return 0; -} - -void epic12_device::blitter_w(address_space &space, offs_t offset, u32 data, u32 mem_mask) -{ - switch (offset * 4) - { - case 0x04: - gfx_exec_w(space, offset, data, mem_mask); - break; - - case 0x08: - COMBINE_DATA(&m_gfx_addr); - break; - - case 0x14: - COMBINE_DATA(&m_gfx_scroll_x); - break; - - case 0x18: - COMBINE_DATA(&m_gfx_scroll_y); - break; - - case 0x24: // Some sort of handshake at start of IRQ's. - case 0x28: // Related to coins entered. - case 0x30: // Contrast (test menu). - case 0x34: // Brightness (test menu). - case 0x38: // V offset (test menu). - case 0x3c: // H offset (test menu). - break; - - case 0x40: - COMBINE_DATA(&m_gfx_clip_x); - break; - - case 0x44: - COMBINE_DATA(&m_gfx_clip_y); - break; - - } -} - -void epic12_device::install_handlers(int addr1, int addr2) -{ - address_space &space = m_maincpu->space(AS_PROGRAM); - - read32s_delegate read(*this); - write32_delegate write(*this); - - read = read32s_delegate(*this, FUNC(epic12_device::blitter_r)); - write = write32_delegate(*this, FUNC(epic12_device::blitter_w)); - - space.install_read_handler(addr1, addr2, std::move(read), 0xffffffffffffffffU); - space.install_write_handler(addr1, addr2, std::move(write), 0xffffffffffffffffU); -} - -u64 epic12_device::fpga_r() -{ - return 0xff; -} - -void epic12_device::fpga_w(offs_t offset, u64 data, u64 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - // data & 0x08 = CE - // data & 0x10 = CLK - // data & 0x20 = DATA - - if ((data & 0x08) && !(m_firmware_port & 0x10) && (data & 0x10)) - { - if (m_firmware_pos < 2323240 && (data & 0x20)) - m_firmware[m_firmware_pos >> 3] |= 1 << (m_firmware_pos & 7); - m_firmware_pos++; - } - - m_firmware_port = data; - - if (m_firmware_pos == 2323240) - { - u8 checksum = 0; - for(u8 c : m_firmware) - checksum += c; - - switch (checksum) - { - case 0x03: m_firmware_version = FW_A; break; - case 0x3e: m_firmware_version = FW_B; break; - case 0xf9: m_firmware_version = FW_C; break; - case 0xe1: m_firmware_version = FW_D; break; - default: m_firmware_version = -1; break; - } - - if (m_firmware_version < 0) - logerror("Unrecognized firmware version\n"); - else - logerror("Detected firmware version %c\n", 'A' + m_firmware_version); - } - } -} diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12.h mame-0.264+dfsg.1/src/devices/video/epic12.h --- mame-0.263+dfsg.1/src/devices/video/epic12.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,893 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Luca Elia, MetalliC -/* emulation of Altera Cyclone EPIC12 FPGA programmed as a blitter */ -#ifndef MAME_VIDEO_EPIC12_H -#define MAME_VIDEO_EPIC12_H - -#pragma once - -#define DEBUG_VRAM_VIEWER 0 // VRAM viewer for debug - -class epic12_device : public device_t, public device_video_interface -{ -public: - epic12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - - template void set_cpu(T &&maintag) { m_maincpu.set_tag(std::forward(maintag)); } - auto port_r_callback() { return m_port_r_cb.bind(); } - void set_rambase(u16* rambase) { m_ram16 = rambase; } - - inline u16 READ_NEXT_WORD(offs_t *addr); - - void set_mainramsize(size_t ramsize) - { - m_main_ramsize = ramsize; - m_main_rammask = ramsize - 1; - } - - static void *blit_request_callback(void *param, int threadid); - - u64 fpga_r(); - void fpga_w(offs_t offset, u64 data, u64 mem_mask = ~0); - - void draw_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect); - - u16* m_ram16; - u32 m_gfx_addr; - u32 m_gfx_scroll_x, m_gfx_scroll_y; - u32 m_gfx_clip_x, m_gfx_clip_y; - - int m_gfx_size; - std::unique_ptr m_bitmaps; - rectangle m_clip; - - u16* m_use_ram; - size_t m_main_ramsize; // type D has double the main ram - size_t m_main_rammask; - - void install_handlers(int addr1, int addr2); - - u32 blitter_r(offs_t offset, u32 mem_mask = ~0); - void blitter_w(address_space &space, offs_t offset, u32 data, u32 mem_mask = ~0); - u32 m_gfx_addr_shadowcopy; - u32 m_gfx_clip_x_shadowcopy, m_gfx_clip_y_shadowcopy; - std::unique_ptr m_ram16_copy; - inline void gfx_upload_shadow_copy(address_space &space, offs_t *addr); - inline void gfx_create_shadow_copy(address_space &space); - inline u16 COPY_NEXT_WORD(address_space &space, offs_t *addr); - inline void gfx_draw_shadow_copy(address_space &space, offs_t *addr); - inline void gfx_upload(offs_t *addr); - inline void gfx_draw(offs_t *addr); - void gfx_exec(void); - u32 gfx_ready_r(); - void gfx_exec_w(address_space &space, offs_t offset, u32 data, u32 mem_mask = ~0); - -protected: - // Number of bytes that are read each time Blitter fetches operations from SRAM. - static inline constexpr int OPERATION_CHUNK_SIZE_BYTES = 64; - - // Approximate time it takes to fetch a chunk of operations. - // This is composed of the time that the Blitter holds the Bus Request (BREQ) signal - // of the SH-3, as well as the overhead between requests. - static inline constexpr int OPERATION_READ_CHUNK_INTERVAL_NS = 700; - - // The firmware versions - enum { - // Used by ibara & mushisama - FW_A, // Byte checksum 03 - - // Used by espgal2 - FW_B, // Byte checksum 3e - - // Used by espgal2a, mushitama and mushisamb - FW_C, // Byte checksum f9 - - // Used by everything else - FW_D, // Byte checksum e1 - }; - - struct clr_t - { - // clr_t to r5g5b5 - u32 to_pen() const - { - // --t- ---- rrrr r--- gggg g--- bbbb b--- format - return (r << (16 + 3)) | (g << (8 + 3)) | (b << 3); - - // --t- ---- ---r rrrr ---g gggg ---b bbbb format - //return (r << 16) | (g << 8) | b; - } - - - void add_with_clr_mul_fixed(const clr_t &clr0, u8 mulfixed_val, const clr_t &mulfixed_clr0) - { - r = colrtable_add[clr0.r][colrtable[mulfixed_clr0.r][mulfixed_val]]; - g = colrtable_add[clr0.g][colrtable[mulfixed_clr0.g][mulfixed_val]]; - b = colrtable_add[clr0.b][colrtable[mulfixed_clr0.b][mulfixed_val]]; - } - - void add_with_clr_mul_3param(const clr_t &clr0, const clr_t &clr1, const clr_t &clr2) - { - r = colrtable_add[clr0.r][colrtable[clr2.r][clr1.r]]; - g = colrtable_add[clr0.g][colrtable[clr2.g][clr1.g]]; - b = colrtable_add[clr0.b][colrtable[clr2.b][clr1.b]]; - } - - void add_with_clr_square(const clr_t &clr0, const clr_t &clr1) - { - r = colrtable_add[clr0.r][colrtable[clr1.r][clr1.r]]; - g = colrtable_add[clr0.r][colrtable[clr1.g][clr1.g]]; - b = colrtable_add[clr0.r][colrtable[clr1.b][clr1.b]]; - } - - void add_with_clr_mul_fixed_rev(const clr_t &clr0, u8 val, const clr_t &clr1) - { - r = colrtable_add[clr0.r][colrtable_rev[val][clr1.r]]; - g = colrtable_add[clr0.g][colrtable_rev[val][clr1.g]]; - b = colrtable_add[clr0.b][colrtable_rev[val][clr1.b]]; - } - - void add_with_clr_mul_rev_3param(const clr_t &clr0, const clr_t &clr1, const clr_t &clr2) - { - r = colrtable_add[clr0.r][colrtable_rev[clr2.r][clr1.r]]; - g = colrtable_add[clr0.g][colrtable_rev[clr2.g][clr1.g]]; - b = colrtable_add[clr0.b][colrtable_rev[clr2.b][clr1.b]]; - } - - void add_with_clr_mul_rev_square(const clr_t &clr0, const clr_t &clr1) - { - r = colrtable_add[clr0.r][colrtable_rev[(clr1.r)][(clr1.r)]]; - g = colrtable_add[clr0.g][colrtable_rev[(clr1.g)][(clr1.g)]]; - b = colrtable_add[clr0.b][colrtable_rev[(clr1.b)][(clr1.b)]]; - } - - - void add(const clr_t &clr0, const clr_t &clr1) - { - //r = clr0.r + clr1.r; - //g = clr0.g + clr1.g; - //b = clr0.b + clr1.b; - - // use pre-clamped lookup table - r = colrtable_add[clr0.r][clr1.r]; - g = colrtable_add[clr0.g][clr1.g]; - b = colrtable_add[clr0.b][clr1.b]; - } - - - void mul(const clr_t &clr1) - { - r = colrtable[r][clr1.r]; - g = colrtable[g][clr1.g]; - b = colrtable[b][clr1.b]; - } - - void square(const clr_t &clr1) - { - r = colrtable[clr1.r][clr1.r]; - g = colrtable[clr1.g][clr1.g]; - b = colrtable[clr1.b][clr1.b]; - } - - void mul_3param(const clr_t &clr1, const clr_t &clr2) - { - r = colrtable[clr2.r][clr1.r]; - g = colrtable[clr2.g][clr1.g]; - b = colrtable[clr2.b][clr1.b]; - } - - void mul_rev(const clr_t &clr1) - { - r = colrtable_rev[r][clr1.r]; - g = colrtable_rev[g][clr1.g]; - b = colrtable_rev[b][clr1.b]; - } - - void mul_rev_square(const clr_t &clr1) - { - r = colrtable_rev[clr1.r][clr1.r]; - g = colrtable_rev[clr1.g][clr1.g]; - b = colrtable_rev[clr1.b][clr1.b]; - } - - - void mul_rev_3param(const clr_t &clr1, const clr_t &clr2) - { - r = colrtable_rev[clr2.r][clr1.r]; - g = colrtable_rev[clr2.g][clr1.g]; - b = colrtable_rev[clr2.b][clr1.b]; - } - - void mul_fixed(u8 val, const clr_t &clr0) - { - r = colrtable[val][clr0.r]; - g = colrtable[val][clr0.g]; - b = colrtable[val][clr0.b]; - } - - void mul_fixed_rev(u8 val, const clr_t &clr0) - { - r = colrtable_rev[val][clr0.r]; - g = colrtable_rev[val][clr0.g]; - b = colrtable_rev[val][clr0.b]; - } - - void copy(const clr_t &clr0) - { - r = clr0.r; - g = clr0.g; - b = clr0.b; - } - -#ifdef LSB_FIRST - u8 b, g, r, t; -#else - u8 t, r, g, b; -#endif - }; - - union colour_t - { - clr_t trgb; - u32 data; - }; - - typedef void (*blitfunction)( - bitmap_rgb32 *, - const rectangle *, - u32 *gfx, - int src_x, - int src_y, - const int dst_x_start, - const int dst_y_start, - int dimx, - int dimy, - const bool flipy, - const u8 s_alpha, - const u8 d_alpha, - //int tint, - const clr_t *); - - -#define BLIT_FUNCTION static void -#define BLIT_PARAMS bitmap_rgb32 *bitmap, const rectangle *clip, u32 *gfx, int src_x, int src_y, const int dst_x_start, const int dst_y_start, int dimx, int dimy, const bool flipy, const u8 s_alpha, const u8 d_alpha, const clr_t *tint_clr - - BLIT_FUNCTION draw_sprite_f0_ti0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f1_ti0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_plain(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d0(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d1(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d2(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d3(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d4(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d5(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d6(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d7(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d7(BLIT_PARAMS); - - BLIT_FUNCTION draw_sprite_f0_ti0_tr1_simple(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f0_ti0_tr0_simple(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr1_simple(BLIT_PARAMS); - BLIT_FUNCTION draw_sprite_f1_ti0_tr0_simple(BLIT_PARAMS); - - static inline void pen_to_clr(u32 pen, clr_t *clr) - { - // --t- ---- rrrr r--- gggg g--- bbbb b--- format - clr->r = (pen >> (16+3));// & 0x1f; - clr->g = (pen >> (8+3));// & 0x1f; - clr->b = (pen >> 3);// & 0x1f; - - // --t- ---- ---r rrrr ---g gggg ---b bbbb format - // clr->r = (pen >> 16) & 0x1f; - // clr->g = (pen >> 8) & 0x1f; - // clr->b = (pen >> 0) & 0x1f; - - }; - - // convert separate r,g,b biases (0..80..ff) to clr_t (-1f..0..1f) - void tint_to_clr(u8 r, u8 g, u8 b, clr_t *clr) - { - clr->r = r>>2; - clr->g = g>>2; - clr->b = b>>2; - }; - - // (1|s|d) * s_factor * s + (1|s|d) * d_factor * d - // 0: +alpha - // 1: +source - // 2: +dest - // 3: * - // 4: -alpha - // 5: -source - // 6: -dest - // 7: * - - virtual void device_start() override; - virtual void device_reset() override; - - // Called when a Blitter operation does not cause any draws/uploads to be performed. - // If multiple draws in a row are performed outside of an active clipping area, - // the Blitter will be reading operations from SRAM in 64 byte chunks, but not - // actually performing any work. - // This will still be visible from the CPU as Blitter being busy, until the - // operation list has exited. - // - // TODO: Having 64 bytes of non-drawing operations in a row will only cause the Blitter - // to idle if the operations are read from the same 64 byte chunk (and not split between two). - // More proper handling of this would be to change the reads from SRAM to be done 64 bytes at the time - // into a FIFO, but that's a fair amount of work. - void idle_blitter(u8 operation_size_bytes) - { - m_blit_idle_op_bytes += operation_size_bytes; - if (m_blit_idle_op_bytes >= OPERATION_CHUNK_SIZE_BYTES) - { - m_blit_idle_op_bytes -= OPERATION_CHUNK_SIZE_BYTES; - m_blit_delay_ns += OPERATION_READ_CHUNK_INTERVAL_NS; - } - } - - TIMER_CALLBACK_MEMBER(blitter_delay_callback); - - osd_work_queue *m_work_queue; - osd_work_item *m_blitter_request; - - // blit timing - emu_timer *m_blitter_delay_timer; - int m_blitter_busy; - u64 m_blit_delay_ns; - u16 m_blit_idle_op_bytes; - - // fpga firmware - std::vector m_firmware; - int m_firmware_pos; - u8 m_firmware_port; - int m_firmware_version; - - // debug vram viewer -#ifdef DEBUG_VRAM_VIEWER - bool m_debug_vram_view_en; - int m_prev_screen_width; - int m_prev_screen_height; - rectangle m_prev_screen_visarea; - int m_curr_screen_width; - int m_curr_screen_height; - rectangle m_curr_screen_visarea; -#endif - - static u8 colrtable[0x20][0x40]; - static u8 colrtable_rev[0x20][0x40]; - static u8 colrtable_add[0x20][0x20]; - - static const blitfunction f0_ti1_tr1_blit_funcs[64]; - static const blitfunction f0_ti1_tr0_blit_funcs[64]; - static const blitfunction f1_ti1_tr1_blit_funcs[64]; - static const blitfunction f1_ti1_tr0_blit_funcs[64]; - static const blitfunction f0_ti0_tr1_blit_funcs[64]; - static const blitfunction f0_ti0_tr0_blit_funcs[64]; - static const blitfunction f1_ti0_tr1_blit_funcs[64]; - static const blitfunction f1_ti0_tr0_blit_funcs[64]; - - // internal states - required_device m_maincpu; - devcb_read32 m_port_r_cb; -}; - - -DECLARE_DEVICE_TYPE(EPIC12, epic12_device) - -#endif // MAME_VIDEO_EPIC12_H diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit0.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit0.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit0.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit0.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* Non-Flipped, Non-Tinted, Transparent */ -#define FLIPX 0 -#define TINT 0 -#define TRANSPARENT 1 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f0_ti0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit1.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit1.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit1.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* Non-Flipped, Non-Tinted, Non-Transparent */ -#define FLIPX 0 -#define TINT 0 -#define TRANSPARENT 0 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit2.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit2.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit2.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* X-Flipped, Non-Tinted, Transparent */ -#define FLIPX 1 -#define TINT 0 -#define TRANSPARENT 1 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f1_ti0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit3.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit3.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit3.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* X-Flipped, Non-Tinted, Non-Transparent */ -#define FLIPX 1 -#define TINT 0 -#define TRANSPARENT 0 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit4.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit4.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit4.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit4.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* Non-Flipped, Tinted, Transparent */ -#define FLIPX 0 -#define TINT 1 -#define TRANSPARENT 1 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit5.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit5.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit5.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit5.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* Non-Flipped, Tinted, Non-Transparent */ -#define FLIPX 0 -#define TINT 1 -#define TRANSPARENT 0 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit6.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit6.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit6.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit6.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* X-Flipped, Tinted, Transparent */ -#define FLIPX 1 -#define TINT 1 -#define TRANSPARENT 1 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit7.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit7.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit7.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit7.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,559 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -#include "emu.h" - -#define REALLY_SIMPLE 0 -/* X-Flipped, Tinted, Non-Transparent */ -#define FLIPX 1 -#define TINT 1 -#define TRANSPARENT 0 - -#include "epic12.h" - -/* Special Case */ -#define BLENDED 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_plain -#include "epic12in.hxx" -#undef FUNCNAME -#undef BLENDED - -/* Regular Cases*/ -#define BLENDED 1 - -#define _SMODE 0 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 0 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d0 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/////// - - -#define _SMODE 0 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 1 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d1 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -//// - - -#define _SMODE 0 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 2 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d2 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 3 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d3 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 4 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d4 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 5 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d5 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - -#define _SMODE 0 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 6 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d6 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -/// - - -#define _SMODE 0 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 1 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 2 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 3 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 4 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 5 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 6 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#define _SMODE 7 -#define _DMODE 7 -#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d7 -#include "epic12in.hxx" -#undef FUNCNAME -#undef _SMODE -#undef _DMODE - -#undef BLENDED - -#undef FLIPX -#undef TINT -#undef TRANSPARENT -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12_blit8.cpp mame-0.264+dfsg.1/src/devices/video/epic12_blit8.cpp --- mame-0.263+dfsg.1/src/devices/video/epic12_blit8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12_blit8.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/* Special case 'Really Simple' blitters, no blending, no tinting etc.*/ - -#include "emu.h" -#include "epic12.h" - - -#define REALLY_SIMPLE 1 -#define BLENDED 0 - -#define TRANSPARENT 1 -#define FLIPX 0 -#define FUNCNAME draw_sprite_f0_ti0_tr1_simple -#include "epic12in.hxx" -#undef FUNCNAME -#undef FLIPX - -#define FLIPX 1 -#define FUNCNAME draw_sprite_f1_ti0_tr1_simple -#include "epic12in.hxx" -#undef FUNCNAME -#undef FLIPX -#undef TRANSPARENT - - -#define TRANSPARENT 0 -#define FLIPX 0 -#define FUNCNAME draw_sprite_f0_ti0_tr0_simple -#include "epic12in.hxx" -#undef FUNCNAME -#undef FLIPX - -#define FLIPX 1 -#define FUNCNAME draw_sprite_f1_ti0_tr0_simple -#include "epic12in.hxx" -#undef FUNCNAME -#undef FLIPX -#undef TRANSPARENT - -#undef BLENDED -#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12in.hxx mame-0.264+dfsg.1/src/devices/video/epic12in.hxx --- mame-0.263+dfsg.1/src/devices/video/epic12in.hxx 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12in.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/* blitter function */ - -void epic12_device::FUNCNAME(BLIT_PARAMS) -{ - int yf; - -#if REALLY_SIMPLE == 0 - colour_t s_clr; -#endif - -#if BLENDED == 1 - colour_t d_clr; - -#if _SMODE == 2 -#if _DMODE != 0 - colour_t clr0; -#endif -#elif _SMODE == 0 -#if _DMODE != 0 -#if _DMODE != 5 -#if _DMODE != 1 - colour_t clr0; -#endif -#endif -#endif -#else - colour_t clr0; -#endif - -#endif - -#if REALLY_SIMPLE == 1 -#if TRANSPARENT == 1 - u32 pen; -#endif -#else - u32 pen; -#endif - u32 *bmp; - -#if FLIPX == 1 - src_x += (dimx-1); -#endif - - if (flipy) { yf = -1; src_y += (dimy-1); } - else { yf = +1; } - - int starty = 0; - const int dst_y_end = dst_y_start + dimy; - - if (dst_y_start < clip->min_y) - starty = clip->min_y - dst_y_start; - - if (dst_y_end > clip->max_y) - dimy -= (dst_y_end-1) - clip->max_y; - - // check things are safe to draw (note, if the source would wrap round an edge of the 0x2000*0x1000 vram we don't draw.. not sure what the hw does anyway) - // ddpdfk triggers this on boss explosions so it needs fixing -#if FLIPX == 1 - if ((src_x & 0x1fff) < ((src_x-(dimx-1)) & 0x1fff)) - { - // popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx); - return; - } -#else - if ((src_x & 0x1fff) > ((src_x+(dimx-1)) & 0x1fff)) - { - // popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx); - return; - } -#endif - - int startx = 0; - const int dst_x_end = dst_x_start + dimx; - - if (dst_x_start < clip->min_x) - startx = clip->min_x - dst_x_start; - - if (dst_x_end > clip->max_x) - dimx -= (dst_x_end-1) - clip->max_x; - -#if BLENDED == 1 -#if _SMODE == 0 -#if _DMODE == 0 - const u8* salpha_table = colrtable[s_alpha]; - const u8* dalpha_table = colrtable[d_alpha]; -#endif - -#if _DMODE == 5 - const u8* salpha_table = colrtable[s_alpha]; -#endif -#if _DMODE == 1 - const u8* salpha_table = colrtable[s_alpha]; -#endif - -#endif - -#if _SMODE == 2 -#if _DMODE == 0 - const u8* dalpha_table = colrtable[d_alpha]; -#endif -#endif -#endif - - for (int y = starty; y < dimy; y++) - { - bmp = &bitmap->pix(dst_y_start + y, dst_x_start+startx); - const int ysrc_index = ((src_y + yf * y) & 0x0fff) * 0x2000; - u32* gfx2 = gfx + ysrc_index; - - #if FLIPX == 1 - gfx2 += (src_x - startx); - #else - gfx2 += (src_x + startx); - #endif - -#if 1 - const u32* end = bmp + (dimx - startx); -#else - // maybe we can do some SSE type optimizations on larger blocks? right now this just results in more code and slower compiling tho. - - const int width = dimx-startx; - const u32* end = bmp+(width); - - if (width<0) return; - - int bigblocks = width>>3; - - while (bigblocks) - { - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - #include "epic12pixel.hxx" - - bigblocks--; - } -#endif - while (bmp < end) - { - #include "epic12pixel.hxx" - } - - } - -// g_profiler.stop(); -} - -#undef LOOP_INCREMENTS diff -Nru mame-0.263+dfsg.1/src/devices/video/epic12pixel.hxx mame-0.264+dfsg.1/src/devices/video/epic12pixel.hxx --- mame-0.263+dfsg.1/src/devices/video/epic12pixel.hxx 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/epic12pixel.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,193 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/* This is the inner-most loop code (per-pixel) and thus the most performance sensitive part */ - -#if FLIPX == 1 -#define LOOP_INCREMENTS \ - bmp++; \ - gfx2--; -#else - -#define LOOP_INCREMENTS \ - bmp++; \ - gfx2++; -#endif - - -/*************** REALLY SIMPLE INNER LOOP, NON-BLENDED, NON-TINTED, SIMPLEST CASE ****************/ -#if REALLY_SIMPLE == 1 - -#if TRANSPARENT == 1 - pen = *gfx2; - if (pen & 0x20000000) - { - *bmp = pen; -#else - *bmp = *gfx2; -#endif - -/*************** REGULAR INNER LOOPS ****************/ -#else // NOT REALLY_SIMPLE - - pen = *gfx2; - -#if TRANSPARENT == 1 - if (pen & 0x20000000) - { -#endif - - // convert source to clr - pen_to_clr(pen, &s_clr.trgb); - //s_clr.data = (pen >> 3); // using the union is actually significantly slower than our pen_to_clr to function! - // source * intesity and clamp - -#if TINT == 1 - s_clr.trgb.mul(*tint_clr); -#endif - - #if BLENDED == 1 - - // convert destination to clr - pen_to_clr(*bmp, &d_clr.trgb); - //d_clr.data = *bmp >> 3; // using the union is actually significantly slower than our pen_to_clr to function! - #if _SMODE == 0 - //g_profiler.start(PROFILER_USER7); - - #if _DMODE == 0 - //g_profiler.start(PROFILER_USER1); - // this is used extensively in the games (ingame, futari title screens etc.) - - s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][dalpha_table[(d_clr.trgb.r)]]; - s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][dalpha_table[(d_clr.trgb.g)]]; - s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][dalpha_table[(d_clr.trgb.b)]]; - #elif _DMODE == 1 - //g_profiler.start(PROFILER_USER2); - // futari ~7% - s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][colrtable[(s_clr.trgb.r)][(d_clr.trgb.r)]]; - s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][colrtable[(s_clr.trgb.g)][(d_clr.trgb.g)]]; - s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][colrtable[(s_clr.trgb.b)][(d_clr.trgb.b)]]; - #elif _DMODE == 2 - //g_profiler.start(PROFILER_USER3); - clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); - s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 3 - //g_profiler.start(PROFILER_USER4); - clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - - #elif _DMODE == 4 - //g_profiler.start(PROFILER_USER5); - clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); - s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); - #elif _DMODE == 5 - // futari black character select ~13% - //g_profiler.start(PROFILER_USER6); - s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][colrtable_rev[(s_clr.trgb.r)][(d_clr.trgb.r)]]; - s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][colrtable_rev[(s_clr.trgb.g)][(d_clr.trgb.g)]]; - s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][colrtable_rev[(s_clr.trgb.b)][(d_clr.trgb.b)]]; - - #elif _DMODE == 6 - //g_profiler.start(PROFILER_USER7); - clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); - s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 7 - //g_profiler.start(PROFILER_USER8); - clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - #endif - - //g_profiler.stop(); - #elif _SMODE == 1 - //g_profiler.start(PROFILER_USER6); - clr0.trgb.square(s_clr.trgb); - - #elif _SMODE == 2 - // g_profiler.start(PROFILER_USER4); - #if _DMODE == 0 - // this is used heavily on espgal2 highscore screen (~28%) optimized to avoid use of temp clr0 variable - s_clr.trgb.r = colrtable_add[colrtable[(d_clr.trgb.r)][(s_clr.trgb.r)]][dalpha_table[(d_clr.trgb.r)]]; - s_clr.trgb.g = colrtable_add[colrtable[(d_clr.trgb.g)][(s_clr.trgb.g)]][dalpha_table[(d_clr.trgb.g)]]; - s_clr.trgb.b = colrtable_add[colrtable[(d_clr.trgb.b)][(s_clr.trgb.b)]][dalpha_table[(d_clr.trgb.b)]]; - #elif _DMODE == 1 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add_with_clr_mul_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); - #elif _DMODE == 2 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 3 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - - #elif _DMODE == 4 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); - #elif _DMODE == 5 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add_with_clr_mul_rev_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); - #elif _DMODE == 6 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 7 - clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - #endif - //g_profiler.stop(); - - #elif _SMODE == 3 - //g_profiler.start(PROFILER_USER1); - clr0.trgb.copy(s_clr.trgb); - - #elif _SMODE == 4 - //g_profiler.start(PROFILER_USER2); - clr0.trgb.mul_fixed_rev(s_alpha, s_clr.trgb); - #elif _SMODE == 5 - //g_profiler.start(PROFILER_USER3); - clr0.trgb.mul_rev_square(s_clr.trgb); - #elif _SMODE == 6 - //g_profiler.start(PROFILER_USER4); - clr0.trgb.mul_rev_3param(s_clr.trgb, d_clr.trgb); - #elif _SMODE == 7 - //g_profiler.start(PROFILER_USER5); - clr0.trgb.copy(s_clr.trgb); - #endif - - -// smode 0/2 cases are already split up and handled above. -#if _SMODE != 2 -#if _SMODE != 0 - - #if _DMODE == 0 - s_clr.trgb.add_with_clr_mul_fixed(clr0.trgb, d_alpha, d_clr.trgb); - #elif _DMODE == 1 - s_clr.trgb.add_with_clr_mul_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); - #elif _DMODE == 2 - s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 3 - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - - #elif _DMODE == 4 - s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); - #elif _DMODE == 5 - s_clr.trgb.add_with_clr_mul_rev_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); - #elif _DMODE == 6 - s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); - #elif _DMODE == 7 - s_clr.trgb.add(clr0.trgb, d_clr.trgb); - #endif - - //g_profiler.stop(); -#endif -#endif - - #endif - - // write result - *bmp = s_clr.trgb.to_pen() | (pen & 0x20000000); - //*bmp = (s_clr.data << 3) | (pen & 0x20000000); // using the union is actually significantly slower than our to_pen function! - -#endif // END NOT REALLY SIMPLE - -#if TRANSPARENT == 1 - } -#endif - LOOP_INCREMENTS diff -Nru mame-0.263+dfsg.1/src/devices/video/hd61603.cpp mame-0.264+dfsg.1/src/devices/video/hd61603.cpp --- mame-0.263+dfsg.1/src/devices/video/hd61603.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/hd61603.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,7 +14,7 @@ */ #include "emu.h" -#include "video/hd61603.h" +#include "hd61603.h" DEFINE_DEVICE_TYPE(HD61603, hd61603_device, "hd61603", "Hitachi HD61603 LCD Driver") diff -Nru mame-0.263+dfsg.1/src/devices/video/hd61603.h mame-0.264+dfsg.1/src/devices/video/hd61603.h --- mame-0.263+dfsg.1/src/devices/video/hd61603.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/hd61603.h 2024-03-25 14:00:46.000000000 +0000 @@ -45,7 +45,7 @@ void data_w(u8 data); protected: - // device-level overrides + // device_t implementation virtual void device_start() override; virtual void device_reset() override; diff -Nru mame-0.263+dfsg.1/src/devices/video/hlcd0515.cpp mame-0.264+dfsg.1/src/devices/video/hlcd0515.cpp --- mame-0.263+dfsg.1/src/devices/video/hlcd0515.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/hlcd0515.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,9 @@ */ #include "emu.h" -#include "video/hlcd0515.h" +#include "hlcd0515.h" + +#include DEFINE_DEVICE_TYPE(HLCD0515, hlcd0515_device, "hlcd0515", "Hughes HLCD 0515 LCD Driver") @@ -110,6 +112,7 @@ bool hlcd0515_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; // misc internal registers @@ -121,13 +124,16 @@ buf[4] = m_rowout; buf[5] = m_rowsel; - if (file.write(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + std::tie(err, actual) = write(file, &buf, sizeof(buf)); + if (err) return false; // shift register and RAM - if (file.write(&m_buffer, sizeof(m_buffer), actual) || (sizeof(m_buffer) != actual)) + std::tie(err, actual) = write(file, &m_buffer, sizeof(m_buffer)); + if (err) return false; - if (file.write(&m_ram, sizeof(m_ram), actual) || (sizeof(m_ram) != actual)) + std::tie(err, actual) = write(file, &m_ram, sizeof(m_ram)); + if (err) return false; return true; @@ -135,11 +141,13 @@ bool hlcd0515_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; // misc internal registers u8 buf[6]; - if (file.read(&buf, sizeof(buf), actual) || (sizeof(buf) != actual)) + std::tie(err, actual) = read(file, &buf, sizeof(buf)); + if (err || (sizeof(buf) != actual)) return false; m_count = buf[0]; @@ -150,9 +158,11 @@ m_rowsel = buf[5] & 7; // shift register and RAM - if (file.read(&m_buffer, sizeof(m_buffer), actual) || (sizeof(m_buffer) != actual)) + std::tie(err, actual) = read(file, &m_buffer, sizeof(m_buffer)); + if (err || (sizeof(m_buffer) != actual)) return false; - if (file.read(&m_ram, sizeof(m_ram), actual) || (sizeof(m_ram) != actual)) + std::tie(err, actual) = read(file, &m_ram, sizeof(m_ram)); + if (err || (sizeof(m_ram) != actual)) return false; return true; diff -Nru mame-0.263+dfsg.1/src/devices/video/i8244.cpp mame-0.264+dfsg.1/src/devices/video/i8244.cpp --- mame-0.263+dfsg.1/src/devices/video/i8244.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/i8244.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -448,6 +448,7 @@ if (colx & m_vdc.s.collision) m_collision_status |= 0x40; } + // check if an already drawn object would collide with us if (m_vdc.s.collision & 0x40) { @@ -553,7 +554,7 @@ } -void i8244_device::char_pixel(u8 index, int x, int y, u8 pixel, u16 color, bitmap_ind16 &bitmap, const rectangle &cliprect) +void i8244_device::major_pixel(u8 index, int x, int y, u8 pixel, u16 color, bitmap_ind16 &bitmap, const rectangle &cliprect) { for (int px = x; px < x + 2; px++) { @@ -614,7 +615,7 @@ u16 color = 8 + ((m_vdc.s.quad[i].single[j].color >> 1) & 0x07); for (int cx = 0; cx < 8; cx++, x += 2) - char_pixel(4 * j + 16 * i + 0x40, x, scanline, BIT(m_charset[offset & 0x1ff], cx ^ 7), color, bitmap, cliprect); + major_pixel(4 * j + 16 * i + 0x40, x, scanline, BIT(m_charset[offset & 0x1ff], cx ^ 7), color, bitmap, cliprect); } } } @@ -636,7 +637,7 @@ int x = (m_vdc.s.foreground[i].x + 5) * 2; u16 color = 8 + ((m_vdc.s.foreground[i].color >> 1) & 0x07); for (int cx = 0; cx < 8; cx++, x += 2) - char_pixel(4 * i + 0x10, x, scanline, BIT(m_charset[offset & 0x1ff], cx ^ 7), color, bitmap, cliprect); + major_pixel(4 * i + 0x10, x, scanline, BIT(m_charset[offset & 0x1ff], cx ^ 7), color, bitmap, cliprect); } } } diff -Nru mame-0.263+dfsg.1/src/devices/video/i8244.h mame-0.264+dfsg.1/src/devices/video/i8244.h --- mame-0.263+dfsg.1/src/devices/video/i8244.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/i8244.h 2024-03-25 14:00:46.000000000 +0000 @@ -129,7 +129,7 @@ void draw_grid(int scanline, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_major(int scanline, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_minor(int scanline, bitmap_ind16 &bitmap, const rectangle &cliprect); - void char_pixel(u8 index, int x, int y, u8 pixel, u16 color, bitmap_ind16 &bitmap, const rectangle &cliprect); + void major_pixel(u8 index, int x, int y, u8 pixel, u16 color, bitmap_ind16 &bitmap, const rectangle &cliprect); // callbacks devcb_write_line m_irq_func; diff -Nru mame-0.263+dfsg.1/src/devices/video/lc7580.cpp mame-0.264+dfsg.1/src/devices/video/lc7580.cpp --- mame-0.263+dfsg.1/src/devices/video/lc7580.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/lc7580.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,6 +16,8 @@ #include "emu.h" #include "video/lc7580.h" +#include + DEFINE_DEVICE_TYPE(LC7580, lc7580_device, "lc7580", "Sanyo LC7580 LCD Driver") DEFINE_DEVICE_TYPE(LC7582, lc7582_device, "lc7582", "Sanyo LC7582 LCD Driver") @@ -72,11 +74,14 @@ bool lc7580_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - if (file.write(&m_shift, sizeof(m_shift), actual) || (sizeof(m_shift) != actual)) + std::tie(err, actual) = write(file, &m_shift, sizeof(m_shift)); + if (err) return false; - if (file.write(&m_latch, sizeof(m_latch), actual) || (sizeof(m_latch) != actual)) + std::tie(err, actual) = write(file, &m_latch, sizeof(m_latch)); + if (err) return false; return true; @@ -84,11 +89,14 @@ bool lc7580_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - if (file.read(&m_shift, sizeof(m_shift), actual) || (sizeof(m_shift) != actual)) + std::tie(err, actual) = read(file, &m_shift, sizeof(m_shift)); + if (err || (sizeof(m_shift) != actual)) return false; - if (file.read(&m_latch, sizeof(m_latch), actual) || (sizeof(m_latch) != actual)) + std::tie(err, actual) = read(file, &m_latch, sizeof(m_latch)); + if (err || (sizeof(m_latch) != actual)) return false; return true; @@ -126,7 +134,7 @@ state = (state) ? 1 : 0; // clock shift register - if (!state && m_clk) + if (state && !m_clk) m_shift = m_shift >> 1 | u64(m_data) << 55; m_clk = state; diff -Nru mame-0.263+dfsg.1/src/devices/video/lc7985.h mame-0.264+dfsg.1/src/devices/video/lc7985.h --- mame-0.263+dfsg.1/src/devices/video/lc7985.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/lc7985.h 2024-03-25 14:00:46.000000000 +0000 @@ -33,7 +33,7 @@ private: optional_region_ptr m_cgrom_region; // internal chargen ROM - u8 m_render_buffer[16*40]; + u8 m_render_buffer[16*80]; u8 m_ddram[80]; u8 m_cgram[64]; const u8 *m_cgrom; diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,11 +83,9 @@ #define GRAPHIC_MODE (vga.gc.alpha_dis) /* else text mode */ #define EGA_COLUMNS (vga.crtc.horz_disp_end+1) -#define EGA_START_ADDRESS (vga.crtc.start_addr) #define EGA_LINE_LENGTH (vga.crtc.offset<<1) #define VGA_COLUMNS (vga.crtc.horz_disp_end+1) -#define VGA_START_ADDRESS (vga.crtc.start_addr) #define VGA_LINE_LENGTH (vga.crtc.offset<<3) #define VGA_CH_WIDTH ((vga.sequencer.data[1]&1)?8:9) @@ -101,7 +99,6 @@ // Special values for SVGA Trident - Mode Vesa 110h #define TLINES (LINES) #define TGA_COLUMNS (EGA_COLUMNS) -#define TGA_START_ADDRESS (vga.crtc.start_addr<<2) #define TGA_LINE_LENGTH (vga.crtc.offset<<3) @@ -1356,7 +1353,7 @@ int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); int pel_shift = (vga.attribute.pel_shift & 7); - for (int addr=EGA_START_ADDRESS, line=0; lineadjust( screen().time_until_pos(vga.crtc.vert_blank_start + vga.crtc.vert_blank_end) ); } @@ -1896,7 +1893,7 @@ // } uint8_t start_shift = (!(vga.sequencer.data[4] & 0x08) || svga.ignore_chain4) ? 2 : 0; - for (int addr = VGA_START_ADDRESS << start_shift, line=0; line> vga.gc.rotate_count) | (val << (8 - vga.gc.rotate_count)); } inline uint8_t vga_logical_op(uint8_t data, uint8_t plane, uint8_t mask) @@ -296,6 +299,8 @@ address_space_config m_atc_space_config; bool m_ioas = false; +private: + uint32_t start_addr(); }; diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_ati.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_ati.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_ati.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_ati.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,7 +12,7 @@ #define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__) -DEFINE_DEVICE_TYPE(ATI_VGA, ati_vga_device, "ati_vga", "ATi VGA") +DEFINE_DEVICE_TYPE(ATI_VGA, ati_vga_device, "ati_vga", "ATi VGA i/f") ati_vga_device::ati_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : ati_vga_device(mconfig, ATI_VGA, tag, owner, clock) diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_cirrus.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_cirrus.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_cirrus.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_cirrus.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,78 +21,61 @@ #define LOG_REG (1U << 1) #define LOG_BLIT (1U << 2) #define LOG_HDAC (1U << 3) // log hidden DAC +#define LOG_BANK (1U << 4) // log offset registers -#define VERBOSE (LOG_GENERAL | LOG_HDAC) +#define VERBOSE (LOG_GENERAL | LOG_HDAC | LOG_REG) //#define LOG_OUTPUT_FUNC osd_printf_info #include "logmacro.h" -// TODO: remove these macros -//#define TEXT_LINES (LINES_HELPER) -#define LINES (vga.crtc.vert_disp_end+1) -#define TEXT_LINES (vga.crtc.vert_disp_end+1) -#define GRAPHIC_MODE (vga.gc.alpha_dis) /* else text mode */ +DEFINE_DEVICE_TYPE(CIRRUS_GD5428_VGA, cirrus_gd5428_vga_device, "clgd5428", "Cirrus Logic GD5428 VGA i/f") +DEFINE_DEVICE_TYPE(CIRRUS_GD5430_VGA, cirrus_gd5430_vga_device, "clgd5430", "Cirrus Logic GD5430 VGA i/f") +DEFINE_DEVICE_TYPE(CIRRUS_GD5446_VGA, cirrus_gd5446_vga_device, "clgd5446", "Cirrus Logic GD5446 VGA i/f") -#define EGA_COLUMNS (vga.crtc.horz_disp_end+1) -#define EGA_START_ADDRESS (vga.crtc.start_addr) -#define EGA_LINE_LENGTH (vga.crtc.offset<<1) -#define VGA_COLUMNS (vga.crtc.horz_disp_end+1) -#define VGA_START_ADDRESS (vga.crtc.start_addr) -#define VGA_LINE_LENGTH (vga.crtc.offset<<3) -#define IBM8514_LINE_LENGTH (m_vga->offset()) - -#define VGA_CH_WIDTH ((vga.sequencer.data[1]&1)?8:9) - -#define TEXT_COLUMNS (vga.crtc.horz_disp_end+1) -#define TEXT_START_ADDRESS (vga.crtc.start_addr<<3) -#define TEXT_LINE_LENGTH (vga.crtc.offset<<1) - -#define TEXT_COPY_9COLUMN(ch) (((ch & 0xe0) == 0xc0)&&(vga.attribute.data[0x10]&4)) - -DEFINE_DEVICE_TYPE(CIRRUS_GD5428, cirrus_gd5428_device, "clgd5428", "Cirrus Logic GD5428") -DEFINE_DEVICE_TYPE(CIRRUS_GD5430, cirrus_gd5430_device, "clgd5430", "Cirrus Logic GD5430") -DEFINE_DEVICE_TYPE(CIRRUS_GD5446, cirrus_gd5446_device, "clgd5446", "Cirrus Logic GD5446") - - -cirrus_gd5428_device::cirrus_gd5428_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : cirrus_gd5428_device(mconfig, CIRRUS_GD5428, tag, owner, clock) +cirrus_gd5428_vga_device::cirrus_gd5428_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : cirrus_gd5428_vga_device(mconfig, CIRRUS_GD5428_VGA, tag, owner, clock) { - m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_device::crtc_map), this)); - m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_device::gc_map), this)); - m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_device::sequencer_map), this)); + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_vga_device::crtc_map), this)); + m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_vga_device::gc_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5428_vga_device::sequencer_map), this)); } -cirrus_gd5428_device::cirrus_gd5428_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) +cirrus_gd5428_vga_device::cirrus_gd5428_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, type, tag, owner, clock) { } -cirrus_gd5430_device::cirrus_gd5430_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : cirrus_gd5428_device(mconfig, CIRRUS_GD5430, tag, owner, clock) +cirrus_gd5430_vga_device::cirrus_gd5430_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : cirrus_gd5430_vga_device(mconfig, CIRRUS_GD5430_VGA, tag, owner, clock) +{ + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::crtc_map), this)); + m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::gc_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::sequencer_map), this)); +} + +cirrus_gd5430_vga_device::cirrus_gd5430_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : cirrus_gd5428_vga_device(mconfig, type, tag, owner, clock) { - m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_device::crtc_map), this)); - m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_device::gc_map), this)); - m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_device::sequencer_map), this)); } -cirrus_gd5446_device::cirrus_gd5446_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : cirrus_gd5428_device(mconfig, CIRRUS_GD5446, tag, owner, clock) +cirrus_gd5446_vga_device::cirrus_gd5446_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : cirrus_gd5430_vga_device(mconfig, CIRRUS_GD5446_VGA, tag, owner, clock) { - m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_device::crtc_map), this)); - m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_device::gc_map), this)); - m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_device::sequencer_map), this)); + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_vga_device::crtc_map), this)); + m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_vga_device::gc_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_vga_device::sequencer_map), this)); } -void cirrus_gd5428_device::io_3cx_map(address_map &map) +void cirrus_gd5428_vga_device::io_3cx_map(address_map &map) { svga_device::io_3cx_map(map); - map(0x06, 0x06).rw(FUNC(cirrus_gd5428_device::ramdac_hidden_mask_r), FUNC(cirrus_gd5428_device::ramdac_hidden_mask_w)); - map(0x09, 0x09).rw(FUNC(cirrus_gd5428_device::ramdac_overlay_r), FUNC(cirrus_gd5428_device::ramdac_overlay_w)); + map(0x06, 0x06).rw(FUNC(cirrus_gd5428_vga_device::ramdac_hidden_mask_r), FUNC(cirrus_gd5428_vga_device::ramdac_hidden_mask_w)); + map(0x09, 0x09).rw(FUNC(cirrus_gd5428_vga_device::ramdac_overlay_r), FUNC(cirrus_gd5428_vga_device::ramdac_overlay_w)); } -u8 cirrus_gd5428_device::ramdac_hidden_mask_r(offs_t offset) +u8 cirrus_gd5428_vga_device::ramdac_hidden_mask_r(offs_t offset) { if (!machine().side_effects_disabled()) m_hidden_dac_phase ++; @@ -110,7 +93,7 @@ return vga_device::ramdac_mask_r(0); } -void cirrus_gd5428_device::ramdac_hidden_mask_w(offs_t offset, u8 data) +void cirrus_gd5428_vga_device::ramdac_hidden_mask_w(offs_t offset, u8 data) { if (m_hidden_dac_phase >= 4) { @@ -126,7 +109,7 @@ vga_device::ramdac_mask_w(0, data); } -u8 cirrus_gd5428_device::ramdac_overlay_r(offs_t offset) +u8 cirrus_gd5428_vga_device::ramdac_overlay_r(offs_t offset) { if(!m_ext_palette_enabled) return vga_device::ramdac_data_r(0); @@ -157,7 +140,7 @@ return res; } -void cirrus_gd5428_device::ramdac_overlay_w(offs_t offset, u8 data) +void cirrus_gd5428_vga_device::ramdac_overlay_w(offs_t offset, u8 data) { if(!m_ext_palette_enabled) { @@ -187,7 +170,7 @@ } } -void cirrus_gd5428_device::crtc_map(address_map &map) +void cirrus_gd5428_vga_device::crtc_map(address_map &map) { svga_device::crtc_map(map); // VGA Vertical Blank end @@ -207,6 +190,7 @@ return m_cr19; }), NAME([this] (offs_t offset, u8 data) { + LOGMASKED(LOG_REG, "CR19: Interlace End %02x\n", data); m_cr19 = data; }) ); @@ -215,6 +199,7 @@ return m_cr1a; }), NAME([this] (offs_t offset, u8 data) { + LOGMASKED(LOG_REG, "CR1A: Interlace Control %02x\n", data); m_cr1a = data; vga.crtc.horz_blank_end = (vga.crtc.horz_blank_end & 0xff3f) | ((data & 0x30) << 2); vga.crtc.vert_blank_end = (vga.crtc.vert_blank_end & 0xfcff) | ((data & 0xc0) << 2); @@ -226,6 +211,7 @@ return m_cr1b; }), NAME([this] (offs_t offset, u8 data) { + LOGMASKED(LOG_REG, "CR1B: Extended Display Controls %02x\n", data); m_cr1b = data; vga.crtc.start_addr_latch &= ~0x070000; vga.crtc.start_addr_latch |= ((data & 0x01) << 16); @@ -234,16 +220,16 @@ cirrus_define_video_mode(); }) ); - // TODO: CR1D for GD543x - //vga.crtc.start_addr_latch = (vga.crtc.start_addr_latch & 0xf7ffff) | ((data & 0x01) << 16); +// map(0x25, 0x25) PSR Part Status (r/o, "factory testing and internal tracking only") map(0x27, 0x27).lr8( NAME([this] (offs_t offset) { + LOGMASKED(LOG_REG, "CR27: Read ID\n"); return m_chip_id; }) ); } -void cirrus_gd5428_device::gc_map(address_map &map) +void cirrus_gd5428_vga_device::gc_map(address_map &map) { svga_device::gc_map(map); map(0x00, 0x00).lrw8( @@ -287,24 +273,14 @@ vga.gc.write_mode = data & 3; }) ); - // Offset register 0 - map(0x09, 0x09).lrw8( + // Offset register 0/1 + map(0x09, 0x0a).lrw8( NAME([this](offs_t offset) { - return gc_bank_0; + return gc_bank[offset]; }), NAME([this](offs_t offset, u8 data) { - gc_bank_0 = data; - LOG("CL: Offset register 0 set to %i\n", data); - }) - ); - // Offset register 1 - map(0x0a, 0x0a).lrw8( - NAME([this](offs_t offset) { - return gc_bank_1; - }), - NAME([this](offs_t offset, u8 data) { - gc_bank_1 = data; - LOG("CL: Offset register 1 set to %i\n", data); + gc_bank[offset] = data; + LOGMASKED(LOG_BANK, "GR%d: Offset register %d set to %02x\n", offset + 9, offset, data); }) ); // Graphics controller mode extensions @@ -515,7 +491,7 @@ ); } -void cirrus_gd5428_device::sequencer_map(address_map &map) +void cirrus_gd5428_vga_device::sequencer_map(address_map &map) { svga_device::sequencer_map(map); map(0x02, 0x02).lrw8( @@ -644,7 +620,7 @@ ); } -void cirrus_gd5428_device::device_start() +void cirrus_gd5428_vga_device::device_start() { zero(); @@ -665,31 +641,32 @@ save_item(NAME(m_chip_id)); save_item(NAME(m_hidden_dac_phase)); save_item(NAME(m_hidden_dac_mode)); + save_pointer(NAME(gc_bank), 2); - m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this); + m_vblank_timer = timer_alloc(FUNC(cirrus_gd5428_vga_device::vblank_timer_cb), this); m_chip_id = 0x98; // GD5428 - Rev 0 } -void cirrus_gd5430_device::device_start() +void cirrus_gd5430_vga_device::device_start() { - cirrus_gd5428_device::device_start(); + cirrus_gd5428_vga_device::device_start(); m_chip_id = 0xa0; // GD5430 - Rev 0 } -void cirrus_gd5446_device::device_start() +void cirrus_gd5446_vga_device::device_start() { - cirrus_gd5428_device::device_start(); + cirrus_gd5428_vga_device::device_start(); m_chip_id = 0x80 | 0x39; // GD5446 } -void cirrus_gd5428_device::device_reset() +void cirrus_gd5428_vga_device::device_reset() { vga_device::device_reset(); gc_locked = true; gc_mode_ext = 0; - gc_bank_0 = gc_bank_1 = 0; + gc_bank[0] = gc_bank[1] = 0; m_lock_reg = 0; m_blt_status = 0; m_cursor_attr = 0x00; // disable hardware cursor and extra palette @@ -709,12 +686,11 @@ m_hidden_dac_mode = 0; } -uint32_t cirrus_gd5428_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t cirrus_gd5428_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { uint32_t ptr = (vga.svga_intf.vram_size - 0x4000); // cursor patterns are stored in the last 16kB of VRAM svga_device::screen_update(screen, bitmap, cliprect); - /*uint8_t cur_mode =*/ pc_vga_choosevideomode(); if(m_cursor_attr & 0x01) // hardware cursor enabled { // draw hardware graphics cursor @@ -783,7 +759,7 @@ return 0; } -void cirrus_gd5428_device::cirrus_define_video_mode() +void cirrus_gd5428_vga_device::cirrus_define_video_mode() { uint8_t divisor = 1; float clock; @@ -854,24 +830,39 @@ case 0x00: break; case 0x02: clock /= 2; break; // Clock / 2 for 16-bit data case 0x04: clock /= 3; break; // Clock / 3 for 24-bit data - case 0x06: divisor = 2; break; // Clock rate for 16-bit data + case 0x06: + // Clock rate for 16-bit data = VCLK + // TODO: verify clock, may just be clock / 2 again? + //divisor = 2; + break; } } recompute_params_clock(divisor, (int)clock); } -uint16_t cirrus_gd5428_device::offset() +uint16_t cirrus_gd5428_vga_device::offset() { - uint16_t off = vga_device::offset(); - // TODO: check true enable condition if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) - off <<= 2; -// popmessage("Offset: %04x %s %s ** -- actual: %04x",vga.crtc.offset,vga.crtc.dw?"DW":"--",vga.crtc.word_mode?"BYTE":"WORD",off); - return off; + return vga.crtc.offset << 3; + return svga_device::offset(); } -void cirrus_gd5428_device::start_bitblt() +uint32_t cirrus_gd5428_vga_device::latch_start_addr() +{ + if (svga.rgb24_en || svga.rgb32_en) + return vga.crtc.start_addr_latch >> 1; + + // FIXME: need to explicitly return earlier because rgb8_en is '1' in tandem with these + if (svga.rgb15_en || svga.rgb16_en) + return vga.crtc.start_addr_latch; + + if (svga.rgb8_en) + return vga.crtc.start_addr_latch << 2; + return vga.crtc.start_addr_latch; +} + +void cirrus_gd5428_vga_device::start_bitblt() { uint32_t x,y; @@ -952,7 +943,7 @@ m_blt_status &= ~0x02; } -void cirrus_gd5428_device::start_reverse_bitblt() +void cirrus_gd5428_vga_device::start_reverse_bitblt() { uint32_t x,y; @@ -1027,7 +1018,7 @@ m_blt_status &= ~0x02; } -void cirrus_gd5428_device::start_system_bitblt() +void cirrus_gd5428_vga_device::start_system_bitblt() { LOGMASKED(LOG_BLIT, "CL: BitBLT from system memory started: Src: %06x Dst: %06x Width: %i Height %i ROP: %02x Mode: %02x\n",m_blt_source,m_blt_dest,m_blt_width,m_blt_height,m_blt_rop,m_blt_mode); m_blt_system_transfer = true; @@ -1040,7 +1031,7 @@ } // non colour-expanded BitBLTs from system memory must be doubleword sized, extra bytes are ignored -void cirrus_gd5428_device::blit_dword() +void cirrus_gd5428_vga_device::blit_dword() { // TODO: add support for reverse direction uint8_t x,pixel; @@ -1067,7 +1058,7 @@ } // colour-expanded BitBLTs from system memory are on a byte boundary, unused bits are ignored -void cirrus_gd5428_device::blit_byte() +void cirrus_gd5428_vga_device::blit_byte() { // TODO: add support for reverse direction uint8_t x,pixel; @@ -1097,7 +1088,7 @@ } } -void cirrus_gd5428_device::copy_pixel(uint8_t src, uint8_t dst) +void cirrus_gd5428_vga_device::copy_pixel(uint8_t src, uint8_t dst) { uint8_t res = src; @@ -1133,7 +1124,7 @@ vga.memory[m_blt_dest_current % vga.svga_intf.vram_size] = res; } -uint8_t cirrus_gd5428_device::vga_latch_write(int offs, uint8_t data) +uint8_t cirrus_gd5428_vga_device::vga_latch_write(int offs, uint8_t data) { uint8_t res = 0; uint8_t mode_mask = (gc_mode_ext & 0x04) ? 0x07 : 0x03; @@ -1158,19 +1149,25 @@ return res; } -uint8_t cirrus_gd5428_device::mem_r(offs_t offset) +// 0xa0000-0xa7fff offset 0 +// 0xa8000-0xaffff offset 1 (if enabled with GRB bit 0) +// notice that "offset" in this context doesn't mean pitch like everything else in the +// (S)VGA realm but it's really intended as a window bank base here. +uint8_t cirrus_gd5428_vga_device::offset_select(offs_t offset) +{ + const uint8_t sa15 = BIT(offset, 15); + return gc_bank[sa15 & BIT(gc_mode_ext, 0)]; +} + +uint8_t cirrus_gd5428_vga_device::mem_r(offs_t offset) { uint32_t addr; - uint8_t bank; uint8_t cur_mode = pc_vga_choosevideomode(); if(gc_locked || offset >= 0x10000 || cur_mode == TEXT_MODE || cur_mode == SCREEN_OFF) return vga_device::mem_r(offset); - if(offset >= 0x8000 && offset < 0x10000 && (gc_mode_ext & 0x01)) // if accessing bank 1 (if enabled) - bank = gc_bank_1; - else - bank = gc_bank_0; + const uint8_t bank = offset_select(offset); if(gc_mode_ext & 0x20) // 16kB bank granularity addr = bank * 0x4000; @@ -1179,7 +1176,6 @@ // Is the display address adjusted automatically when not using Chain-4 addressing? // The GD542x BIOS doesn't do it, but Virtual Pool expects it. - if(!(vga.sequencer.data[4] & 0x8)) addr <<= 2; @@ -1291,10 +1287,9 @@ } } -void cirrus_gd5428_device::mem_w(offs_t offset, uint8_t data) +void cirrus_gd5428_vga_device::mem_w(offs_t offset, uint8_t data) { uint32_t addr; - uint8_t bank; uint8_t cur_mode = pc_vga_choosevideomode(); if(m_blt_system_transfer) @@ -1326,10 +1321,7 @@ return; } - if(offset >= 0x8000 && offset < 0x10000 && (gc_mode_ext & 0x01)) // if accessing bank 1 (if enabled) - bank = gc_bank_1; - else - bank = gc_bank_0; + const uint8_t bank = offset_select(offset); if(gc_mode_ext & 0x20) // 16kB bank granularity addr = bank * 0x4000; @@ -1475,3 +1467,52 @@ } } } + +/* + * CL-GD5430 overrides + */ + +void cirrus_gd5430_vga_device::crtc_map(address_map &map) +{ + cirrus_gd5428_vga_device::crtc_map(map); + map(0x1d, 0x1d).lrw8( + NAME([this] (offs_t offset) { + return m_cr1d; + }), + NAME([this] (offs_t offset, u8 data) { + LOGMASKED(LOG_REG, "CR1D: Overlay Extended Control %02x\n", data); + m_cr1d = data; + // TODO: '34/'36 onward + vga.crtc.start_addr_latch = (vga.crtc.start_addr_latch & 0xf7ffff) | (BIT(data, 7) << 19); + }) + ); +} + +void cirrus_gd5430_vga_device::gc_map(address_map &map) +{ + cirrus_gd5428_vga_device::gc_map(map); +} + +void cirrus_gd5430_vga_device::sequencer_map(address_map &map) +{ + cirrus_gd5428_vga_device::sequencer_map(map); +} + +/* + * CL-GD5446 overrides + */ + +void cirrus_gd5446_vga_device::crtc_map(address_map &map) +{ + cirrus_gd5430_vga_device::crtc_map(map); +} + +void cirrus_gd5446_vga_device::gc_map(address_map &map) +{ + cirrus_gd5430_vga_device::gc_map(map); +} + +void cirrus_gd5446_vga_device::sequencer_map(address_map &map) +{ + cirrus_gd5430_vga_device::sequencer_map(map); +} diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_cirrus.h mame-0.264+dfsg.1/src/devices/video/pc_vga_cirrus.h --- mame-0.263+dfsg.1/src/devices/video/pc_vga_cirrus.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_cirrus.h 2024-03-25 14:00:46.000000000 +0000 @@ -12,11 +12,11 @@ #include "video/pc_vga.h" -class cirrus_gd5428_device : public svga_device +class cirrus_gd5428_vga_device : public svga_device { public: // construction/destruction - cirrus_gd5428_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + cirrus_gd5428_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual uint8_t mem_r(offs_t offset) override; virtual void mem_w(offs_t offset, uint8_t data) override; @@ -24,12 +24,13 @@ virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; protected: - cirrus_gd5428_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + cirrus_gd5428_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides virtual void device_start() override; virtual void device_reset() override; virtual uint16_t offset() override; + virtual uint32_t latch_start_addr() override; virtual void io_3cx_map(address_map &map) override; @@ -41,52 +42,51 @@ u8 m_hidden_dac_phase = 0; uint8_t m_chip_id; - uint8_t gc_mode_ext; - uint8_t gc_bank_0; - uint8_t gc_bank_1; - bool gc_locked; - uint8_t m_lock_reg; - uint8_t m_gr10; // high byte of background colour (in 15/16bpp) - uint8_t m_gr11; // high byte of foreground colour (in 15/16bpp) - - uint8_t m_cr19; - uint8_t m_cr1a; - uint8_t m_cr1b; + uint8_t gc_mode_ext = 0; + uint8_t gc_bank[2]{}; + bool gc_locked = false; + uint8_t m_lock_reg = 0; + uint8_t m_gr10 = 0; // high byte of background colour (in 15/16bpp) + uint8_t m_gr11 = 0; // high byte of foreground colour (in 15/16bpp) + + uint8_t m_cr19 = 0; + uint8_t m_cr1a = 0; + uint8_t m_cr1b = 0; // hardware cursor - uint16_t m_cursor_x; - uint16_t m_cursor_y; - uint16_t m_cursor_addr; - uint8_t m_cursor_attr; - bool m_ext_palette_enabled; + uint16_t m_cursor_x = 0; + uint16_t m_cursor_y = 0; + uint16_t m_cursor_addr = 0; + uint8_t m_cursor_attr = 0; + bool m_ext_palette_enabled = false; struct { uint8_t red, green, blue; } m_ext_palette[16]; // extra palette, colour 0 is cursor background, colour 15 is cursor foreground, colour 2 is overscan border colour // BitBLT engine - uint8_t m_blt_status; - uint8_t m_blt_rop; - uint8_t m_blt_mode; - uint32_t m_blt_source; - uint32_t m_blt_dest; - uint16_t m_blt_source_pitch; - uint16_t m_blt_dest_pitch; - uint16_t m_blt_height; - uint16_t m_blt_width; - uint32_t m_blt_source_current; - uint32_t m_blt_dest_current; - uint16_t m_blt_trans_colour; - uint16_t m_blt_trans_colour_mask; - - bool m_blt_system_transfer; // blit from system memory - uint8_t m_blt_system_count; - uint32_t m_blt_system_buffer; - uint16_t m_blt_pixel_count; - uint16_t m_blt_scan_count; - - uint8_t m_scratchpad1; - uint8_t m_scratchpad2; - uint8_t m_scratchpad3; - uint8_t m_vclk_num[4]; - uint8_t m_vclk_denom[4]; + uint8_t m_blt_status = 0; + uint8_t m_blt_rop = 0; + uint8_t m_blt_mode = 0; + uint32_t m_blt_source = 0; + uint32_t m_blt_dest = 0; + uint16_t m_blt_source_pitch = 0; + uint16_t m_blt_dest_pitch = 0; + uint16_t m_blt_height = 0; + uint16_t m_blt_width = 0; + uint32_t m_blt_source_current = 0; + uint32_t m_blt_dest_current = 0; + uint16_t m_blt_trans_colour = 0; + uint16_t m_blt_trans_colour_mask = 0; + + bool m_blt_system_transfer = false; // blit from system memory + uint8_t m_blt_system_count = 0; + uint32_t m_blt_system_buffer = 0; + uint16_t m_blt_pixel_count = 0; + uint16_t m_blt_scan_count = 0; + + uint8_t m_scratchpad1 = 0; + uint8_t m_scratchpad2 = 0; + uint8_t m_scratchpad3 = 0; + uint8_t m_vclk_num[4]{}; + uint8_t m_vclk_denom[4]{}; virtual uint8_t vga_latch_write(int offs, uint8_t data) override; @@ -94,6 +94,10 @@ virtual void gc_map(address_map &map) override; virtual void sequencer_map(address_map &map) override; + virtual bool get_interlace_mode() override { return BIT(m_cr1a, 0); } + + uint8_t offset_select(offs_t offset); + private: void cirrus_define_video_mode(); @@ -105,28 +109,40 @@ void copy_pixel(uint8_t src, uint8_t dst); }; -class cirrus_gd5430_device : public cirrus_gd5428_device +class cirrus_gd5430_vga_device : public cirrus_gd5428_vga_device { public: - cirrus_gd5430_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + cirrus_gd5430_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: + cirrus_gd5430_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; + + virtual void crtc_map(address_map &map) override; + virtual void gc_map(address_map &map) override; + virtual void sequencer_map(address_map &map) override; +private: + uint8_t m_cr1d = 0; }; -class cirrus_gd5446_device : public cirrus_gd5428_device +class cirrus_gd5446_vga_device : public cirrus_gd5430_vga_device { public: - cirrus_gd5446_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + cirrus_gd5446_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual void device_start() override; + + virtual void crtc_map(address_map &map) override; + virtual void gc_map(address_map &map) override; + virtual void sequencer_map(address_map &map) override; }; // device type definition -DECLARE_DEVICE_TYPE(CIRRUS_GD5428, cirrus_gd5428_device) -DECLARE_DEVICE_TYPE(CIRRUS_GD5430, cirrus_gd5430_device) -DECLARE_DEVICE_TYPE(CIRRUS_GD5446, cirrus_gd5446_device) +DECLARE_DEVICE_TYPE(CIRRUS_GD5428_VGA, cirrus_gd5428_vga_device) +DECLARE_DEVICE_TYPE(CIRRUS_GD5430_VGA, cirrus_gd5430_vga_device) +DECLARE_DEVICE_TYPE(CIRRUS_GD5446_VGA, cirrus_gd5446_vga_device) #endif // MAME_VIDEO_PC_VGA_CIRRUS_H diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_matrox.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_matrox.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_matrox.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_matrox.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -6,7 +6,7 @@ #define DEBUG_VRAM_VIEWER 0 -DEFINE_DEVICE_TYPE(MATROX_VGA, matrox_vga_device, "matrox_vga", "Matrox MGA2064W VGA") +DEFINE_DEVICE_TYPE(MATROX_VGA, matrox_vga_device, "matrox_vga", "Matrox MGA2064W VGA i/f") matrox_vga_device::matrox_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, MATROX_VGA, tag, owner, clock) @@ -673,13 +673,15 @@ return svga_device::offset(); } -uint32_t matrox_vga_device::start_addr() +uint32_t matrox_vga_device::latch_start_addr() { - // TODO: fails VBEtest scrolling tests -// if (m_mgamode) -// return (vga.crtc.start_addr << 4); + // TODO: fails SDD scrolling tests + // Looks like it can latch per byte in SVGA modes, which contradicts what's in pc_vga + // drawing functions. + //if (m_mgamode) + // return (vga.crtc.start_addr << 4); - return svga_device::start_addr(); + return vga.crtc.start_addr_latch; } u16 matrox_vga_device::line_compare_mask() diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_matrox.h mame-0.264+dfsg.1/src/devices/video/pc_vga_matrox.h --- mame-0.263+dfsg.1/src/devices/video/pc_vga_matrox.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_matrox.h 2024-03-25 14:00:46.000000000 +0000 @@ -43,7 +43,7 @@ virtual void device_reset() override; virtual uint16_t offset() override; - virtual uint32_t start_addr() override; + virtual uint32_t latch_start_addr() override; virtual void recompute_params() override; virtual void palette_update() override; diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_mediagx.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_mediagx.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_mediagx.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_mediagx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,57 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +MediaGX VGA virtual interface + +TODO: +- Currently cheat around software VGA, MediaGX notoriously triggers SMI for every access to + VGA legacy ranges, which is horrible both for emulation purposes and for performance. +- A good benchmark about fixing pc_vga infrastructure: + it connects thru a VGA connector anyway & it has VGA features (DDC, HW cursor, BitBLT) + +**************************************************************************************************/ + +#include "emu.h" +#include "pc_vga_mediagx.h" + +#include "screen.h" + +#define VERBOSE (LOG_GENERAL) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(MEDIAGX_VGA, mediagx_vga_device, "mediagx_vga", "MediaGX Virtual VGA i/f") + +mediagx_vga_device::mediagx_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : svga_device(mconfig, MEDIAGX_VGA, tag, owner, clock) +{ + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(mediagx_vga_device::crtc_map), this)); +} + +void mediagx_vga_device::device_start() +{ + svga_device::device_start(); +} + +void mediagx_vga_device::device_reset() +{ + svga_device::device_reset(); +} + +void mediagx_vga_device::crtc_map(address_map &map) +{ + svga_device::crtc_map(map); + // astropc.cpp read this at boot, DDC? + map(0x3e, 0x3e).lr8(NAME([] () { return 0xff; })); +} + +uint8_t mediagx_vga_device::mem_r(offs_t offset) +{ + return svga_device::mem_r(offset); +} + +void mediagx_vga_device::mem_w(offs_t offset, uint8_t data) +{ + svga_device::mem_w(offset, data); +} diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_mediagx.h mame-0.264+dfsg.1/src/devices/video/pc_vga_mediagx.h --- mame-0.263+dfsg.1/src/devices/video/pc_vga_mediagx.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_mediagx.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,37 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese + +#ifndef MAME_VIDEO_PC_VGA_MEDIAGX_H +#define MAME_VIDEO_PC_VGA_MEDIAGX_H + +#pragma once + +#include "video/pc_vga.h" + +#include "screen.h" + + +class mediagx_vga_device : public svga_device +{ +public: + static constexpr feature_type imperfect_features() { return feature::GRAPHICS; } + + mediagx_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + virtual uint8_t mem_r(offs_t offset) override; + virtual void mem_w(offs_t offset, uint8_t data) override; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual void crtc_map(address_map &map) override; + +// virtual ioport_constructor device_input_ports() const override; + +private: +}; + +DECLARE_DEVICE_TYPE(MEDIAGX_VGA, mediagx_vga_device) + +#endif // MAME_VIDEO_PC_VGA_MEDIAGX_H diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_oak.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_oak.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_oak.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_oak.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -13,7 +13,7 @@ #define LOGBANK(...) LOGMASKED(LOG_BANK, __VA_ARGS__) -DEFINE_DEVICE_TYPE(OTI111, oak_oti111_vga_device, "oti111_vga", "Oak Technologies Spitfire 64111") +DEFINE_DEVICE_TYPE(OTI111, oak_oti111_vga_device, "oti111_vga", "Oak Technologies Spitfire 64111 i/f") oak_oti111_vga_device::oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, OTI111, tag, owner, clock) @@ -357,12 +357,9 @@ uint16_t oak_oti111_vga_device::offset() { - uint16_t off = svga_device::offset(); - if (m_oak_gfx_mode) return vga.crtc.offset << 4; - else - return off; + return svga_device::offset(); } u8 oak_oti111_vga_device::mem_r(offs_t offset) diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_paradise.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_paradise.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_paradise.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_paradise.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -44,12 +44,12 @@ #define LOGLOCKED(...) LOGMASKED(LOG_LOCKED, __VA_ARGS__) -DEFINE_DEVICE_TYPE(PVGA1A, pvga1a_vga_device, "pvga1a_vga", "Paradise Systems PVGA1A") -DEFINE_DEVICE_TYPE(WD90C00, wd90c00_vga_device, "wd90c00_vga", "Western Digital WD90C00 \"PVGA1B\" VGA Controller") -DEFINE_DEVICE_TYPE(WD90C11A, wd90c11a_vga_device, "wd90c11a_vga", "Western Digital WD90C11A \"PVGA1C\" VGA Controller") -DEFINE_DEVICE_TYPE(WD90C30, wd90c30_vga_device, "wd90c30_vga", "Western Digital WD90C30 \"PVGA1D\" VGA Controller") -DEFINE_DEVICE_TYPE(WD90C31, wd90c31_vga_device, "wd90c31_vga", "Western Digital WD90C31 VGA Controller") -DEFINE_DEVICE_TYPE(WD90C33, wd90c33_vga_device, "wd90c33_vga", "Western Digital WD90C33 VGA Controller") +DEFINE_DEVICE_TYPE(PVGA1A, pvga1a_vga_device, "pvga1a_vga", "Paradise Systems PVGA1A i/f") +DEFINE_DEVICE_TYPE(WD90C00, wd90c00_vga_device, "wd90c00_vga", "Western Digital WD90C00 \"PVGA1B\" VGA i/f") +DEFINE_DEVICE_TYPE(WD90C11A, wd90c11a_vga_device, "wd90c11a_vga", "Western Digital WD90C11A \"PVGA1C\" VGA i/f") +DEFINE_DEVICE_TYPE(WD90C30, wd90c30_vga_device, "wd90c30_vga", "Western Digital WD90C30 \"PVGA1D\" VGA i/f") +DEFINE_DEVICE_TYPE(WD90C31, wd90c31_vga_device, "wd90c31_vga", "Western Digital WD90C31 VGA i/f") +DEFINE_DEVICE_TYPE(WD90C33, wd90c33_vga_device, "wd90c33_vga", "Western Digital WD90C33 VGA i/f") pvga1a_vga_device::pvga1a_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_s3.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_s3.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_s3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_s3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,39 +21,41 @@ MACH8_DRAWING_SCAN }; +DEFINE_DEVICE_TYPE(S3_VISION864_VGA, s3vision864_vga_device, "s3_86c864_vga", "S3 86c864 Vision864 VGA i/f") +DEFINE_DEVICE_TYPE(S3_VISION964_VGA, s3vision964_vga_device, "s3_86c964_vga", "S3 86c964 Vision964 VGA i/f") +DEFINE_DEVICE_TYPE(S3_VISION968_VGA, s3vision968_vga_device, "s3_86c968_vga", "S3 86c968 Vision968 VGA i/f") +DEFINE_DEVICE_TYPE(S3_TRIO64_VGA, s3trio64_vga_device, "s3_86c764_vga", "S3 86c764 Trio64 VGA i/f") -DEFINE_DEVICE_TYPE(S3_VGA, s3_vga_device, "s3_vga", "S3 Graphics VGA") - -s3_vga_device::s3_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : s3_vga_device(mconfig, S3_VGA, tag, owner, clock) +s3vision864_vga_device::s3vision864_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : s3vision864_vga_device(mconfig, S3_VISION864_VGA, tag, owner, clock) { - } -s3_vga_device::s3_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) +s3vision864_vga_device::s3vision864_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, type, tag, owner, clock) { - m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(s3_vga_device::crtc_map), this)); - m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(s3_vga_device::sequencer_map), this)); + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(s3vision864_vga_device::crtc_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(s3vision864_vga_device::sequencer_map), this)); } -void s3_vga_device::device_add_mconfig(machine_config &config) +void s3vision864_vga_device::device_add_mconfig(machine_config &config) { IBM8514A(config, "8514a", 0).set_vga_owner(); } -TIMER_CALLBACK_MEMBER(s3_vga_device::vblank_timer_cb) +uint32_t s3vision864_vga_device::latch_start_addr() { - // not sure if this is correct, but XF86_S3 seems to expect the viewport scrolling to be faster if(s3.memory_config & 0x08) - vga.crtc.start_addr = vga.crtc.start_addr_latch << 2; - else - vga.crtc.start_addr = vga.crtc.start_addr_latch; - vga.attribute.pel_shift = vga.attribute.pel_shift_latch; - m_vblank_timer->adjust( screen().time_until_pos(vga.crtc.vert_blank_start + vga.crtc.vert_blank_end) ); + { + // - SDD scrolling test expects a << 2 for 8bpp and no shift for anything else + // - Slackware 3.x XF86_S3 expect a << 2 shift (to be confirmed) + // - przonegd expect no shift (RGB16) + return vga.crtc.start_addr_latch << (svga.rgb8_en ? 2 : 0); + } + return vga.crtc.start_addr_latch; } -void s3_vga_device::device_start() +void s3vision864_vga_device::device_start() { svga_device::device_start(); memset(&s3, 0, sizeof(s3)); @@ -65,38 +67,36 @@ s3.cursor_bg[x] = 0x00; } m_8514 = subdevice("8514a"); - // set device ID - s3.id_high = 0x88; // CR2D - s3.id_low = 0x11; // CR2E - s3.revision = 0x00; // CR2F - s3.id_cr30 = 0xe1; // CR30 + + s3.id_high = s3.id_low = s3.revision = 0; // + s3.id_cr30 = 0xc1; } -void s3_vga_device::device_reset() +void s3vision864_vga_device::device_reset() { vga_device::device_reset(); // Power-on strapping bits. Sampled at reset, but can be modified later. // These are just assumed defaults. + // TODO: expose as configuration option (PD pins) s3.strapping = 0x000f0b1e; s3.sr10 = 0x42; s3.sr11 = 0x41; } -u16 s3_vga_device::line_compare_mask() +u16 s3vision864_vga_device::line_compare_mask() { // TODO: pinpoint condition return svga.rgb8_en ? 0x7ff : 0x3ff; } -uint16_t s3_vga_device::offset() +uint16_t s3vision864_vga_device::offset() { - //popmessage("Offset: %04x %s %s %s",vga.crtc.offset,vga.crtc.dw?"DW":"--",vga.crtc.word_mode?"BYTE":"WORD",(s3.memory_config & 0x08)?"31":"--"); if(s3.memory_config & 0x08) return vga.crtc.offset << 3; return vga_device::offset(); } -void s3_vga_device::s3_define_video_mode() +void s3vision864_vga_device::s3_define_video_mode() { int divisor = 1; int xtal = ((vga.miscellaneous_output & 0xc) ? XTAL(28'636'363) : XTAL(25'174'800)).value(); @@ -115,17 +115,32 @@ svga.rgb15_en = 0; svga.rgb16_en = 0; svga.rgb32_en = 0; + // FIXME: vision864 has only first 7 modes switch((s3.ext_misc_ctrl_2) >> 4) { + // 0001 Mode 8: 2x 8-bit 1 VCLK/2 pixels case 0x01: svga.rgb8_en = 1; break; + // 0010 Mode 1: 15-bit 2 VCLK/pixel + case 0x02: svga.rgb15_en = 1; break; + // 0011 Mode 9: 15-bit 1 VCLK/pixel case 0x03: svga.rgb15_en = 1; divisor = 2; break; + // 0100 Mode 2: 24-bit 3 VCLK/pixel + case 0x04: svga.rgb24_en = 1; break; + // 0101 Mode 10: 16-bit 1 VCLK/pixel case 0x05: svga.rgb16_en = 1; divisor = 2; break; + // 0110 Mode 3: 16-bit 2 VCLK/pixel + case 0x06: svga.rgb16_en = 1; break; + // 0111 Mode 11: 24/32-bit 2 VCLK/pixel + case 0x07: svga.rgb32_en = 1; divisor = 4; break; case 0x0d: svga.rgb32_en = 1; divisor = 1; break; - default: fatalerror("TODO: S3 colour mode not implemented %02x\n",((s3.ext_misc_ctrl_2) >> 4)); + default: + popmessage("pc_vga_s3: PA16B-COLOR-MODE %02x\n",((s3.ext_misc_ctrl_2) >> 4)); + break; } } else { + // 0000: Mode 0 8-bit 1 VCLK/pixel svga.rgb8_en = (s3.memory_config & 8) >> 3; svga.rgb15_en = 0; svga.rgb16_en = 0; @@ -134,7 +149,7 @@ recompute_params_clock(divisor, xtal); } -void s3_vga_device::refresh_pitch_offset() +void s3vision864_vga_device::refresh_pitch_offset() { // bit 2 = bit 8 of offset register, but only if bits 4-5 of CR51 are 00h. vga.crtc.offset &= 0xff; @@ -144,7 +159,7 @@ vga.crtc.offset |= (s3.cr51 & 0x30) << 4; } -void s3_vga_device::crtc_map(address_map &map) +void s3vision864_vga_device::crtc_map(address_map &map) { svga_device::crtc_map(map); map(0x2d, 0x2d).lr8( @@ -180,6 +195,7 @@ s3_define_video_mode(); }) ); + // TODO: CR32, CR33 & CR34 (backward compatibility) map(0x35, 0x35).lrw8( NAME([this] (offs_t offset) { return s3.crt_reg_lock; @@ -213,6 +229,7 @@ return (s3.strapping & 0x0000ff00) >> 8; // enable chipset, 64k BIOS size, internal DCLK/MCLK }), NAME([this] (offs_t offset, u8 data) { + // TODO: monitor ID at 7-5 (PD15-13) if(s3.reg_lock2 == 0xa5) { s3.strapping = (s3.strapping & 0xffff00ff) | (data << 8); @@ -516,6 +533,7 @@ s3.extended_dac_ctrl = data; }) ); + // TODO: bits 7-4 (w/o?) for GPIO map(0x5c, 0x5c).lr8( NAME([this] (offs_t offset) { u8 res = 0; @@ -645,9 +663,10 @@ ); } -void s3_vga_device::sequencer_map(address_map &map) +void s3vision864_vga_device::sequencer_map(address_map &map) { svga_device::sequencer_map(map); + // TODO: SR8 (unlocks SRD) // Memory CLK PLL map(0x10, 0x10).lrw8( NAME([this] (offs_t offset) { return s3.sr10; }), @@ -700,7 +719,7 @@ ); } -uint8_t s3_vga_device::mem_r(offs_t offset) +uint8_t s3vision864_vga_device::mem_r(offs_t offset) { if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb32_en) { @@ -734,7 +753,7 @@ return 0xff; } -void s3_vga_device::mem_w(offs_t offset, uint8_t data) +void s3vision864_vga_device::mem_w(offs_t offset, uint8_t data) { ibm8514a_device* dev = get_8514(); // bit 4 of CR53 enables memory-mapped I/O @@ -1004,7 +1023,7 @@ } -uint32_t s3_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t s3vision864_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { svga_device::screen_update(screen, bitmap, cliprect); @@ -1127,3 +1146,76 @@ } return 0; } + +/****************** + * + * Vision 964 + * + *****************/ + +s3vision964_vga_device::s3vision964_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : s3vision964_vga_device(mconfig, S3_VISION964_VGA, tag, owner, clock) +{ +} + +s3vision964_vga_device::s3vision964_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : s3vision864_vga_device(mconfig, type, tag, owner, clock) +{ +} + +void s3vision964_vga_device::device_start() +{ + s3vision864_vga_device::device_start(); + s3.id_high = s3.id_low = s3.revision = 0; // + s3.id_cr30 = 0xd0; // CR30, assume rev 0 +} + +/****************** + * + * Vision968 + * + *****************/ + +s3vision968_vga_device::s3vision968_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : s3vision968_vga_device(mconfig, S3_VISION968_VGA, tag, owner, clock) +{ +} + +s3vision968_vga_device::s3vision968_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : s3vision964_vga_device(mconfig, type, tag, owner, clock) +{ +} + +void s3vision968_vga_device::device_start() +{ + s3vision964_vga_device::device_start(); + s3.id_high = 0x88; // CR2D + s3.id_low = 0xf0; // CR2E + s3.revision = 0x00; // CR2F + s3.id_cr30 = 0xe1; // CR30 +} + +/****************** + * + * Trio 64 + * + *****************/ + +s3trio64_vga_device::s3trio64_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : s3trio64_vga_device(mconfig, S3_TRIO64_VGA, tag, owner, clock) +{ +} + +s3trio64_vga_device::s3trio64_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : s3vision968_vga_device(mconfig, type, tag, owner, clock) +{ +} + +void s3trio64_vga_device::device_start() +{ + s3vision968_vga_device::device_start(); + s3.id_high = 0x88; // CR2D + s3.id_low = 0x11; // CR2E + s3.revision = 0x00; // CR2F + s3.id_cr30 = 0xe1; // CR30 +} diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_s3.h mame-0.264+dfsg.1/src/devices/video/pc_vga_s3.h --- mame-0.263+dfsg.1/src/devices/video/pc_vga_s3.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_s3.h 2024-03-25 14:00:46.000000000 +0000 @@ -10,24 +10,21 @@ #include "screen.h" - -class s3_vga_device : public svga_device +class s3vision864_vga_device : public svga_device { public: // construction/destruction - s3_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + s3vision864_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual uint8_t mem_r(offs_t offset) override; virtual void mem_w(offs_t offset, uint8_t data) override; virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; - virtual TIMER_CALLBACK_MEMBER(vblank_timer_cb) override; - ibm8514a_device* get_8514() { return m_8514; } protected: - s3_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + s3vision864_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides virtual void device_start() override; @@ -36,6 +33,7 @@ virtual void crtc_map(address_map &map) override; virtual void sequencer_map(address_map &map) override; + virtual uint32_t latch_start_addr() override; virtual u16 line_compare_mask() override; @@ -97,7 +95,40 @@ void refresh_pitch_offset(); }; +class s3vision964_vga_device : public s3vision864_vga_device +{ +public: + s3vision964_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + s3vision964_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; +}; + +class s3vision968_vga_device : public s3vision964_vga_device +{ +public: + s3vision968_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + s3vision968_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; +}; + +class s3trio64_vga_device : public s3vision968_vga_device +{ +public: + s3trio64_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + s3trio64_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; +}; + // device type definition -DECLARE_DEVICE_TYPE(S3_VGA, s3_vga_device) +DECLARE_DEVICE_TYPE(S3_VISION864_VGA, s3vision864_vga_device) +DECLARE_DEVICE_TYPE(S3_VISION964_VGA, s3vision964_vga_device) +DECLARE_DEVICE_TYPE(S3_VISION968_VGA, s3vision968_vga_device) +DECLARE_DEVICE_TYPE(S3_TRIO64_VGA, s3trio64_vga_device) #endif // MAME_VIDEO_PC_VGA_S3_H diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_sis.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_sis.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_sis.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_sis.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,16 +34,28 @@ // TODO: later variant of 5598 // (definitely doesn't have dual segment mode for instance) -DEFINE_DEVICE_TYPE(SIS630_SVGA, sis630_svga_device, "sis630_svga", "SiS 630 SVGA") +DEFINE_DEVICE_TYPE(SIS6236_VGA, sis6236_vga_device, "sis6236_vga", "SiS 6236 VGA i/f") +DEFINE_DEVICE_TYPE(SIS630_VGA, sis630_vga_device, "sis630_vga", "SiS 630 VGA i/f") -sis630_svga_device::sis630_svga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : svga_device(mconfig, SIS630_SVGA, tag, owner, clock) +sis6236_vga_device::sis6236_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : sis6236_vga_device(mconfig, SIS6236_VGA, tag, owner, clock) { - m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(sis630_svga_device::crtc_map), this)); - m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(sis630_svga_device::sequencer_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(sis6236_vga_device::sequencer_map), this)); } -void sis630_svga_device::device_start() +sis6236_vga_device::sis6236_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : svga_device(mconfig, type, tag, owner, clock) +{ +} + +sis630_vga_device::sis630_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : sis6236_vga_device(mconfig, SIS630_VGA, tag, owner, clock) +{ + m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(sis630_vga_device::crtc_map), this)); + m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(sis630_vga_device::sequencer_map), this)); +} + +void sis6236_vga_device::device_start() { svga_device::device_start(); zero(); @@ -52,11 +64,12 @@ vga.crtc.maximum_scan_line = 1; // copy over interfaces - vga.svga_intf.vram_size = 64*1024*1024; - //vga.memory = std::make_unique(vga.svga_intf.vram_size); + vga.memory = std::make_unique(vga.svga_intf.vram_size); + memset(&vga.memory[0], 0, vga.svga_intf.vram_size); + } -void sis630_svga_device::device_reset() +void sis6236_vga_device::device_reset() { svga_device::device_reset(); @@ -64,7 +77,7 @@ //m_dual_seg_mode = false; } -void sis630_svga_device::io_3cx_map(address_map &map) +void sis6236_vga_device::io_3cx_map(address_map &map) { svga_device::io_3cx_map(map); // TODO: for '630 it's always with dual segment enabled? @@ -89,45 +102,7 @@ ); } -// Page 144 -void sis630_svga_device::crtc_map(address_map &map) -{ - svga_device::crtc_map(map); - // CR19/CR1A Extended Signature Read-Back 0/1 - // CR1B CRT horizontal counter (r/o) - // CR1C CRT vertical counter (r/o) - // CR1D CRT overflow counter (r/o) - // CR1E Extended Signature Read-Back 2 - // CR26 Attribute Controller Index read-back - // TODO: is this an undocumented VGA or a SiS extension? - map(0x26, 0x26).lr8( - NAME([this] (offs_t offset) { return vga.attribute.index; }) - ); - // TODO: very preliminary, this section is undocumented in '630 doc - map(0x30, 0xff).lrw8( - NAME([this] (offs_t offset) { - return vga.crtc.data[offset]; - }), - NAME([this] (offs_t offset, u8 data) { - // TODO: if one of these is 0xff then it enables a single port transfer to $b8000 - // Older style MMIO? - vga.crtc.data[offset] = data; - }) - ); - // make sure '301 CRT2 is not enabled for now - // TODO: BeMAME (0.36b5) under BeOS 5.0 detects a secondary monitor by default anyway - map(0x30, 0x30).lr8( - NAME([] (offs_t offset) { return 0; }) - ); - map(0x31, 0x31).lr8( - NAME([] (offs_t offset) { return 0x60; }) - ); - map(0x32, 0x32).lr8( - NAME([] (offs_t offset) { return 0x20; }) - ); -} - -void sis630_svga_device::sequencer_map(address_map &map) +void sis6236_vga_device::sequencer_map(address_map &map) { svga_device::sequencer_map(map); // extended ID register @@ -175,11 +150,11 @@ ); map(0x07, 0x07).lrw8( NAME([this] (offs_t offset) { - return m_ext_misc_ctrl_0; + return m_ext_misc_ctrl[0]; }), NAME([this] (offs_t offset, u8 data) { LOG("SR07: Extended Misc. Control 0 %02x\n", data); - m_ext_misc_ctrl_0 = data; + m_ext_misc_ctrl[0] = data; std::tie(svga.rgb24_en, svga.rgb32_en) = flush_true_color_mode(); }) ); @@ -189,6 +164,217 @@ return m_ext_vert_overflow; }), NAME([this] (offs_t offset, u8 data) { + LOG("SR0A: Extended CRT Overflow %02x\n", data); + m_ext_vert_overflow = data; + vga.crtc.offset = (vga.crtc.offset & 0x00ff) | ((data & 0xf0) << 4); + vga.crtc.vert_retrace_start = (vga.crtc.vert_retrace_start & 0x03ff) | ((data & 0x08) << 7); + vga.crtc.vert_blank_start = (vga.crtc.vert_blank_start & 0x03ff) | ((data & 0x04) << 8); + vga.crtc.vert_disp_end = (vga.crtc.vert_disp_end & 0x03ff) | ((data & 0x02) << 9); + vga.crtc.vert_total = (vga.crtc.vert_total & 0x03ff) | ((data & 0x01) << 10); + recompute_params(); + }) + ); + map(0x0b, 0x0c).lrw8( + NAME([this] (offs_t offset) { + return m_ext_misc_ctrl[offset + 1]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR%02X: Extended Misc. Control %d %02x\n", offset + 0xb, offset + 1, data); + m_ext_misc_ctrl[offset + 1] = data; + }) + ); + //map(0x0e, 0x0f) Ext. Config Status (r/o) + map(0x0f, 0x10).lrw8( + NAME([this] (offs_t offset) { + return m_ext_scratch[offset]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR%02X: Extended Scratch %d %02x\n", offset + 0xf, offset, data); + m_ext_scratch[offset] = data; + }) + ); + //map(0x11, 0x11) DDC register + //map(0x12, 0x12) Ext. Horizontal Overflow + //map(0x13, 0x13) Ext. Clock Generator / 25MHz/28MHz Video Clock + //map(0x14, 0x16) HW Cursor Color 0 + //map(0x17, 0x19) HW Cursor Color 1 + //map(0x1a, 0x1b) HW Cursor Horizontal Start 0/1 + //map(0x1c, 0x1c) HW Cursor Horizontal Preset + //map(0x1d, 0x1e) HW Cursor Vertical Start 0/1 + //map(0x1f, 0x1f) HW Cursor Vertical Preset + //map(0x20, 0x21) Linear Addressing Base Address 0/1 + //map(0x22, 0x22) Standby/Suspend Timer + map(0x23, 0x23).lrw8( + NAME([this] (offs_t offset) { + return m_ext_misc_ctrl[3]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR23: Extended Misc. Control 3 %02x\n", data); + m_ext_misc_ctrl[3] = data; + }) + ); + //map(0x24, 0x24) + map(0x25, 0x25).lrw8( + NAME([this] (offs_t offset) { + return m_ext_scratch[2]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR25: Extended Scratch 2 %02x\n", data); + m_ext_scratch[2] = data; + }) + ); + //map(0x26, 0x27) Graphics Engine 0/1 + //map(0x28, 0x29) Internal Memory Clock + //map(0x2a, 0x2b) Internal Video Clock / 25MHz/28MHz Video Clock 0/1 + //map(0x2c, 0x2c) Turbo Queue Base Address + //map(0x2d, 0x2d) Memory Start Controller + //map(0x2e, 0x2e) + //map(0x2f, 0x2f) DRAM Frame Buffer Size + //map(0x30, 0x32) Fast Page Flip Starting Address + map(0x33, 0x35).lrw8( + NAME([this] (offs_t offset) { + return m_ext_misc_ctrl[offset + 4]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR%02X: Extended Misc. Control %d %02x\n", offset + 0x33, offset + 4, data); + m_ext_misc_ctrl[offset + 4] = data; + }) + ); + map(0x36, 0x37).lrw8( + NAME([this] (offs_t offset) { + return m_ext_scratch[offset + 3]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR%02X: Extended Scratch %d %02x\n", offset + 0x36, offset + 3, data); + m_ext_scratch[offset + 3] = data; + }) + ); + map(0x38, 0x39).lrw8( + NAME([this] (offs_t offset) { + return m_ext_misc_ctrl[offset + 7]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR%02X: Extended Misc. Control %d %02x\n", offset + 0x38, offset + 7, data); + m_ext_misc_ctrl[offset + 7] = data; + }) + ); + //map(0x3a, 0x3a) MPEG Turbo Queue Base Address + //map(0x3b, 0x3b) Clock Generator Control + map(0x3c, 0x3c).lrw8( + NAME([this] (offs_t offset) { + return m_ext_misc_ctrl[9]; + }), + NAME([this] (offs_t offset, u8 data) { + LOG("SR3C: Extended Misc. Control 9 %02x\n", data); + m_ext_misc_ctrl[9] = data; + }) + ); +} + +std::tuple sis6236_vga_device::flush_true_color_mode() +{ + // punt if extended or true color is off + if ((m_ramdac_mode & 0x12) != 0x12) + return std::make_tuple(0, 0); + + const u8 res = (m_ext_misc_ctrl[0] & 4) >> 2; + + return std::make_tuple(res, res ^ 1); +} + +void sis6236_vga_device::recompute_params() +{ + u8 xtal_select = (vga.miscellaneous_output & 0x0c) >> 2; + int xtal; + + switch(xtal_select & 3) + { + case 0: xtal = XTAL(25'174'800).value(); break; + case 1: xtal = XTAL(28'636'363).value(); break; + // TODO: stub, barely enough to make BeOS 5 to set ~60 Hz for 640x480x16 + case 2: + default: + xtal = XTAL(25'174'800).value(); + break; + } + + recompute_params_clock(1, xtal); +} + +uint16_t sis6236_vga_device::offset() +{ + if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) + return vga.crtc.offset << 3; + return svga_device::offset(); +} + +uint8_t sis6236_vga_device::mem_r(offs_t offset) +{ + if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) + return svga_device::mem_linear_r(offset + svga.bank_r * 0x10000); + return svga_device::mem_r(offset); +} + +void sis6236_vga_device::mem_w(offs_t offset, uint8_t data) +{ + if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) + { + svga_device::mem_linear_w(offset + svga.bank_w * 0x10000, data); + return; + } + svga_device::mem_w(offset, data); +} + +/* + * SiS630 overrides + */ + +// Page 144 +void sis630_vga_device::crtc_map(address_map &map) +{ + sis6236_vga_device::crtc_map(map); + // CR19/CR1A Extended Signature Read-Back 0/1 + // CR1B CRT horizontal counter (r/o) + // CR1C CRT vertical counter (r/o) + // CR1D CRT overflow counter (r/o) + // CR1E Extended Signature Read-Back 2 + // CR26 Attribute Controller Index read-back + // TODO: is this an undocumented VGA or a SiS extension? + map(0x26, 0x26).lr8( + NAME([this] (offs_t offset) { return vga.attribute.index; }) + ); + // TODO: very preliminary, this section is undocumented in '630 doc + map(0x30, 0xff).lrw8( + NAME([this] (offs_t offset) { + return vga.crtc.data[offset]; + }), + NAME([this] (offs_t offset, u8 data) { + // TODO: if one of these is 0xff then it enables a single port transfer to $b8000 + // Older style MMIO? + vga.crtc.data[offset] = data; + }) + ); + // make sure '301 CRT2 is not enabled for now + // TODO: BeMAME (0.36b5) under BeOS 5.0 detects a secondary monitor by default anyway + map(0x30, 0x30).lr8( + NAME([] (offs_t offset) { return 0; }) + ); + map(0x31, 0x31).lr8( + NAME([] (offs_t offset) { return 0x60; }) + ); + map(0x32, 0x32).lr8( + NAME([] (offs_t offset) { return 0x20; }) + ); +} + +void sis630_vga_device::sequencer_map(address_map &map) +{ + sis6236_vga_device::sequencer_map(map); + map(0x0a, 0x0a).lrw8( + NAME([this] (offs_t offset) { + return m_ext_vert_overflow; + }), + NAME([this] (offs_t offset, u8 data) { LOG("SR0A: Extended Vertical Overflow %02x\n", data); m_ext_vert_overflow = data; vga.crtc.vert_retrace_end = (vga.crtc.vert_retrace_end & 0xf) | ((data & 0x20) >> 1); @@ -336,57 +522,3 @@ //map(0x3c, 0x3c) Synchronous reset //map(0x3d, 0x3d) Test enable } - -std::tuple sis630_svga_device::flush_true_color_mode() -{ - // punt if extended or true color is off - if ((m_ramdac_mode & 0x12) != 0x12) - return std::make_tuple(0, 0); - - const u8 res = (m_ext_misc_ctrl_0 & 4) >> 2; - - return std::make_tuple(res, res ^ 1); -} - -void sis630_svga_device::recompute_params() -{ - u8 xtal_select = (vga.miscellaneous_output & 0x0c) >> 2; - int xtal; - - switch(xtal_select & 3) - { - case 0: xtal = XTAL(25'174'800).value(); break; - case 1: xtal = XTAL(28'636'363).value(); break; - // TODO: stub, barely enough to make BeOS 5 to set ~60 Hz for 640x480x16 - case 2: - default: - xtal = XTAL(25'174'800).value(); - break; - } - - recompute_params_clock(1, xtal); -} - -uint16_t sis630_svga_device::offset() -{ - if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) - return vga.crtc.offset << 3; - return svga_device::offset(); -} - -uint8_t sis630_svga_device::mem_r(offs_t offset) -{ - if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) - return svga_device::mem_linear_r(offset + svga.bank_r * 0x10000); - return svga_device::mem_r(offset); -} - -void sis630_svga_device::mem_w(offs_t offset, uint8_t data) -{ - if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb24_en || svga.rgb32_en) - { - svga_device::mem_linear_w(offset + svga.bank_w * 0x10000, data); - return; - } - svga_device::mem_w(offset, data); -} diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_sis.h mame-0.264+dfsg.1/src/devices/video/pc_vga_sis.h --- mame-0.263+dfsg.1/src/devices/video/pc_vga_sis.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_sis.h 2024-03-25 14:00:46.000000000 +0000 @@ -8,28 +8,31 @@ #include "video/pc_vga.h" -class sis630_svga_device : public svga_device +class sis6236_vga_device : public svga_device { public: - sis630_svga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + sis6236_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual uint8_t mem_r(offs_t offset) override; virtual void mem_w(offs_t offset, uint8_t data) override; protected: + sis6236_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + virtual void device_start() override; virtual void device_reset() override; virtual void io_3cx_map(address_map &map) override; - virtual void crtc_map(address_map &map) override; virtual void sequencer_map(address_map &map) override; virtual uint16_t offset() override; virtual void recompute_params() override; u8 m_ramdac_mode = 0; - u8 m_ext_misc_ctrl_0 = 0; + u8 m_ext_misc_ctrl[10]{}; + //u16 m_ext_config_status = 0; + u8 m_ext_scratch[5]{}; u8 m_ext_vert_overflow = 0; u8 m_ext_horz_overflow[2]{}; u8 m_bus_width = 0; @@ -43,6 +46,20 @@ // bool m_dual_seg_mode = false; }; -DECLARE_DEVICE_TYPE(SIS630_SVGA, sis630_svga_device) +class sis630_vga_device : public sis6236_vga_device +{ +public: + sis630_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: +// virtual void device_start() override; +// virtual void device_reset() override; + + virtual void crtc_map(address_map &map) override; + virtual void sequencer_map(address_map &map) override; +}; + +DECLARE_DEVICE_TYPE(SIS6236_VGA, sis6236_vga_device) +DECLARE_DEVICE_TYPE(SIS630_VGA, sis630_vga_device) #endif // MAME_VIDEO_PC_VGA_SIS_H diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_trident.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_trident.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_trident.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_trident.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -41,8 +41,8 @@ #define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) #define LOGCRTC(...) LOGMASKED(LOG_CRTC, __VA_ARGS__) -DEFINE_DEVICE_TYPE(TRIDENT_VGA, tgui9860_device, "trident_vga", "Trident TGUI9860") -DEFINE_DEVICE_TYPE(TVGA9000_VGA, tvga9000_device, "tvga9000_vga", "Trident TVGA9000") +DEFINE_DEVICE_TYPE(TRIDENT_VGA, tgui9860_device, "trident_vga", "Trident TGUI9860 VGA i/f") +DEFINE_DEVICE_TYPE(TVGA9000_VGA, tvga9000_device, "tvga9000_vga", "Trident TVGA9000 VGA i/f") trident_vga_device::trident_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, type, tag, owner, clock) @@ -574,7 +574,7 @@ save_pointer(tri.accel_pattern,"Pattern Data", 0x80); save_pointer(tri.lutdac_reg,"LUTDAC registers", 0x100); - m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this); + m_vblank_timer = timer_alloc(FUNC(trident_vga_device::vblank_timer_cb), this); svga.ignore_chain4 = true; memset(&tri, 0, sizeof(tri)); } @@ -812,12 +812,10 @@ uint16_t trident_vga_device::offset() { - uint16_t off = svga_device::offset(); - + // don't know if this is right, but Eggs Playing Chicken switches off doubleword mode, but expects the same offset length if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb32_en) - return vga.crtc.offset << 3; // don't know if this is right, but Eggs Playing Chicken switches off doubleword mode, but expects the same offset length - else - return off; + return vga.crtc.offset << 3; + return svga_device::offset(); } int trident_vga_device::calculate_clock() diff -Nru mame-0.263+dfsg.1/src/devices/video/pc_vga_tseng.cpp mame-0.264+dfsg.1/src/devices/video/pc_vga_tseng.cpp --- mame-0.263+dfsg.1/src/devices/video/pc_vga_tseng.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/pc_vga_tseng.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -19,7 +19,7 @@ // TODO: refactor this macro #define GRAPHIC_MODE (vga.gc.alpha_dis) /* else text mode */ -DEFINE_DEVICE_TYPE(TSENG_VGA, tseng_vga_device, "tseng_vga", "Tseng Labs ET4000AX SVGA") +DEFINE_DEVICE_TYPE(TSENG_VGA, tseng_vga_device, "tseng_vga", "Tseng Labs ET4000AX VGA i/f") tseng_vga_device::tseng_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, TSENG_VGA, tag, owner, clock) diff -Nru mame-0.263+dfsg.1/src/devices/video/s3virge.cpp mame-0.264+dfsg.1/src/devices/video/s3virge.cpp --- mame-0.263+dfsg.1/src/devices/video/s3virge.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/s3virge.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -59,7 +59,7 @@ } s3virge_vga_device::s3virge_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : s3_vga_device(mconfig, type, tag, owner, clock) + : s3trio64_vga_device(mconfig, type, tag, owner, clock) , m_linear_config_changed_cb(*this) { } @@ -102,7 +102,7 @@ save_item(vga.sequencer.data,"Sequencer Registers"); save_item(vga.attribute.data,"Attribute Registers"); - m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this); + m_vblank_timer = timer_alloc(FUNC(s3virge_vga_device::vblank_timer_cb), this); m_draw_timer = timer_alloc(FUNC(s3virge_vga_device::draw_step_tick), this); memset(&s3, 0, sizeof(s3)); @@ -154,7 +154,7 @@ void s3virge_vga_device::device_reset() { - s3_vga_device::device_reset(); + s3trio64_vga_device::device_reset(); // Power-on strapping bits. Sampled at reset, but can be modified later. // These are just assumed defaults. s3.strapping = 0x000f0912; @@ -188,15 +188,15 @@ uint16_t s3virge_vga_device::offset() { // win98se expects 24bpp packed mode with x6 boundaries - // this breaks VBETest, which detects these VESA modes as 32bpp. + // this breaks SDD, which detects these VESA modes as 32bpp. if(svga.rgb24_en) return vga.crtc.offset * 6; - return s3_vga_device::offset(); + return s3trio64_vga_device::offset(); } void s3virge_vga_device::crtc_map(address_map &map) { - s3_vga_device::crtc_map(map); + s3trio64_vga_device::crtc_map(map); // TODO: verify these overrides map(0x3a, 0x3a).lw8( NAME([this] (offs_t offset, u8 data) { diff -Nru mame-0.263+dfsg.1/src/devices/video/s3virge.h mame-0.264+dfsg.1/src/devices/video/s3virge.h --- mame-0.263+dfsg.1/src/devices/video/s3virge.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/s3virge.h 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ // ======================> s3virge_vga_device -class s3virge_vga_device : public s3_vga_device +class s3virge_vga_device : public s3trio64_vga_device { public: // construction/destruction diff -Nru mame-0.263+dfsg.1/src/devices/video/scn2674.cpp mame-0.264+dfsg.1/src/devices/video/scn2674.cpp --- mame-0.263+dfsg.1/src/devices/video/scn2674.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/scn2674.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -49,7 +49,7 @@ , m_mbc_char_cb(*this, 0) , m_mbc_attr_cb(*this, 0) , m_IR_pointer(0) - , m_screen1_address(0), m_screen2_address(0) + , m_screen1_address(0), m_screen2_address(0), m_screen2_address_start(0) , m_cursor_address(0) , m_irq_register(0), m_status_register(0), m_irq_mask(0) , m_gfx_enabled(false) @@ -121,6 +121,7 @@ save_item(NAME(m_linecounter)); save_item(NAME(m_screen1_address)); save_item(NAME(m_screen2_address)); + save_item(NAME(m_screen2_address_start)); save_item(NAME(m_cursor_address)); save_item(NAME(m_IR_pointer)); save_item(NAME(m_irq_register)); @@ -174,6 +175,7 @@ { m_screen1_address = 0; m_screen2_address = 0; + m_screen2_address_start = 0; m_cursor_address = 0; m_irq_register = 0; m_status_register = 0; @@ -975,6 +977,7 @@ } else m_screen2_address = (m_screen2_address & 0x3f00) | data; + m_screen2_address_start = m_screen2_address; } void scn2672_device::write_screen2_address(bool msb, uint8_t data) @@ -1197,6 +1200,7 @@ m_irq_register |= 0x10; m_intr_cb(ASSERT_LINE); } + m_screen2_address = m_screen2_address_start; } uint32_t scn2674_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) diff -Nru mame-0.263+dfsg.1/src/devices/video/scn2674.h mame-0.264+dfsg.1/src/devices/video/scn2674.h --- mame-0.263+dfsg.1/src/devices/video/scn2674.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/scn2674.h 2024-03-25 14:00:46.000000000 +0000 @@ -62,6 +62,7 @@ uint8_t m_IR_pointer; uint16_t m_screen1_address; uint16_t m_screen2_address; + uint16_t m_screen2_address_start; uint16_t m_cursor_address; uint8_t m_irq_register; uint8_t m_status_register; diff -Nru mame-0.263+dfsg.1/src/devices/video/sn74s262.cpp mame-0.264+dfsg.1/src/devices/video/sn74s262.cpp --- mame-0.263+dfsg.1/src/devices/video/sn74s262.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/sn74s262.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -50,7 +50,7 @@ ROM_START( sn74s262 ) ROM_REGION( 0xa00, "chargen", 0 ) - ROM_LOAD( "sn74s262", 0x000, 0xa00, NO_DUMP ) + ROM_LOAD( "sn74s262", 0x000, 0x500, BAD_DUMP CRC(6896d319) SHA1(1234558418a5c7a9823d54a93d0c7f63bd8a490a) ) // created by hand ROM_END diff -Nru mame-0.263+dfsg.1/src/devices/video/voodoo_pci.cpp mame-0.264+dfsg.1/src/devices/video/voodoo_pci.cpp --- mame-0.263+dfsg.1/src/devices/video/voodoo_pci.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/devices/video/voodoo_pci.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -122,13 +122,25 @@ void voodoo_2_pci_device::device_start() { - // FIXME: proper PCI values (check manual) + // TODO: straps class code from fb_addr_a[6] (if =1 then 0x040000) set_ids(0x121a0002, 0x02, 0x038000, 0x000000); voodoo_pci_device::device_start(); add_map(16 * 1024 * 1024, M_MEM | M_PREF, *m_voodoo, FUNC(voodoo_2_device::core_map)); bank_infos[0].adr = 0xff000000; + + command = 0; + command_mask = 2; + // FIXME: straps from fb_addr_b[1] (AGP) / fb_addr_a[8] + // (fast back-to-back & fast/medium DEVSEL#) + //status = 0x0280; + status = 0; + + // reported with default 0 + intr_line = 0; + // INTA# + intr_pin = 1; } void voodoo_banshee_pci_device::device_start() diff -Nru mame-0.263+dfsg.1/src/emu/debug/debugcmd.cpp mame-0.264+dfsg.1/src/emu/debug/debugcmd.cpp --- mame-0.263+dfsg.1/src/emu/debug/debugcmd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/debug/debugcmd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -469,10 +469,14 @@ mini_printf - safe printf to a buffer -------------------------------------------------*/ -bool debugger_commands::mini_printf(std::ostream &stream, std::string_view format, int params, u64 *param) +bool debugger_commands::mini_printf(std::ostream &stream, const std::vector ¶ms) { + std::string_view const format(params[0]); auto f = format.begin(); + int param = 1; + u64 number; + // parse the string looking for % signs while (f != format.end()) { @@ -495,21 +499,48 @@ // formatting else if (c == '%') { + bool left_justify = false; + bool zero_fill = false; int width = 0; - int zerofill = 0; + int precision = 0; - // parse out the width - while (f != format.end() && *f >= '0' && *f <= '9') + // parse optional left justification flag + if (f != format.end() && *f == '-') { - c = *f++; - if (c == '0' && width == 0) - zerofill = 1; - width = width * 10 + (c - '0'); + left_justify = true; + f++; + } + + // parse optional zero fill flag + if (f != format.end() && *f == '0') + { + zero_fill = true; + f++; + } + + // parse optional width + while (f != format.end() && isdigit(*f)) + width = width * 10 + (*f++ - '0'); + if (f == format.end()) + break; + + // apply left justification + if (left_justify) + width = -width; + + if ((c = *f++) == '.') + { + // parse optional precision + while (f != format.end() && isdigit(*f)) + precision = precision * 10 + (*f++ - '0'); + + // get the format + if (f != format.end()) + c = *f++; + else + break; } - if (f == format.end()) break; - // get the format - c = *f++; switch (c) { case '%': @@ -517,70 +548,89 @@ break; case 'X': + if (param < params.size() && m_console.validate_number_parameter(params[param++], number)) + util::stream_format(stream, zero_fill ? "%0*X" : "%*X", width, number); + else + { + m_console.printf("Not enough parameters for format!\n"); + return false; + } + break; case 'x': - if (params == 0) + if (param < params.size() && m_console.validate_number_parameter(params[param++], number)) + util::stream_format(stream, zero_fill ? "%0*x" : "%*x", width, number); + else { m_console.printf("Not enough parameters for format!\n"); return false; } - if (u32(*param >> 32) != 0) - util::stream_format(stream, zerofill ? "%0*X" : "%*X", (width <= 8) ? 1 : width - 8, u32(*param >> 32)); - else if (width > 8) - util::stream_format(stream, zerofill ? "%0*X" : "%*X", width - 8, 0); - util::stream_format(stream, zerofill ? "%0*X" : "%*X", (width < 8) ? width : 8, u32(*param)); - param++; - params--; break; case 'O': case 'o': - if (params == 0) + if (param < params.size() && m_console.validate_number_parameter(params[param++], number)) + util::stream_format(stream, zero_fill ? "%0*o" : "%*o", width, number); + else { m_console.printf("Not enough parameters for format!\n"); return false; } - if (u32(*param >> 60) != 0) - { - util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width <= 20) ? 1 : width - 20, u32(*param >> 60)); - util::stream_format(stream, "%0*o", 10, u32(BIT(*param, 30, 30))); - } - else - { - if (width > 20) - util::stream_format(stream, zerofill ? "%0*o" : "%*o", width - 20, 0); - if (u32(BIT(*param, 30, 30)) != 0) - util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width <= 10) ? 1 : width - 10, u32(BIT(*param, 30, 30))); - else if (width > 10) - util::stream_format(stream, zerofill ? "%0*o" : "%*o", width - 10, 0); - } - util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width < 10) ? width : 10, u32(BIT(*param, 0, 30))); - param++; - params--; break; case 'D': case 'd': - if (params == 0) + if (param < params.size() && m_console.validate_number_parameter(params[param++], number)) + util::stream_format(stream, zero_fill ? "%0*d" : "%*d", width, number); + else { m_console.printf("Not enough parameters for format!\n"); return false; } - util::stream_format(stream, zerofill ? "%0*d" : "%*d", width, u32(*param)); - param++; - params--; break; + case 'C': case 'c': - if (params == 0) + if (param < params.size() && m_console.validate_number_parameter(params[param++], number)) + stream << char(number); + else { m_console.printf("Not enough parameters for format!\n"); return false; } - stream << char(*param); - param++; - params--; break; + case 's': + { + address_space *space; + if (param < params.size() && m_console.validate_target_address_parameter(params[param++], -1, space, number)) + { + address_space *tspace; + std::string s; + + for (u32 address = u32(number), taddress; space->device().memory().translate(space->spacenum(), device_memory_interface::TR_READ, taddress = address, tspace); address++) + { + u8 const data = tspace->read_byte(taddress); + + if (!data) + break; + + s += data; + + if (precision == 1) + break; + else if (precision) + precision--; + } + + util::stream_format(stream, "%*s", width, s); + } + else + { + m_console.printf("Not enough parameters for format!\n"); + return false; + } + } + break; } } @@ -630,15 +680,9 @@ void debugger_commands::execute_printf(const std::vector ¶ms) { - /* validate the other parameters */ - u64 values[MAX_COMMAND_PARAMS]; - for (int i = 1; i < params.size(); i++) - if (!m_console.validate_number_parameter(params[i], values[i])) - return; - /* then do a printf */ std::ostringstream buffer; - if (mini_printf(buffer, params[0], params.size() - 1, &values[1])) + if (mini_printf(buffer, params)) m_console.printf("%s\n", std::move(buffer).str()); } @@ -649,15 +693,9 @@ void debugger_commands::execute_logerror(const std::vector ¶ms) { - /* validate the other parameters */ - u64 values[MAX_COMMAND_PARAMS]; - for (int i = 1; i < params.size(); i++) - if (!m_console.validate_number_parameter(params[i], values[i])) - return; - /* then do a printf */ std::ostringstream buffer; - if (mini_printf(buffer, params[0], params.size() - 1, &values[1])) + if (mini_printf(buffer, params)) m_machine.logerror("%s", std::move(buffer).str()); } @@ -668,15 +706,9 @@ void debugger_commands::execute_tracelog(const std::vector ¶ms) { - /* validate the other parameters */ - u64 values[MAX_COMMAND_PARAMS]; - for (int i = 1; i < params.size(); i++) - if (!m_console.validate_number_parameter(params[i], values[i])) - return; - /* then do a printf */ std::ostringstream buffer; - if (mini_printf(buffer, params[0], params.size() - 1, &values[1])) + if (mini_printf(buffer, params)) m_console.get_visible_cpu()->debug()->trace_printf("%s", std::move(buffer).str()); } @@ -689,7 +721,6 @@ { // build a format string appropriate for the parameters and validate them std::stringstream format; - u64 values[MAX_COMMAND_PARAMS]; for (int i = 0; i < params.size(); i++) { // find this symbol @@ -704,15 +735,15 @@ util::stream_format(format, "%s=%s ", params[i], sym->format().empty() ? "%16X" : sym->format()); - - // validate the parameter - if (!m_console.validate_number_parameter(params[i], values[i])) - return; } + // build parameters for printf + std::vector printf_params(params); + printf_params.insert(printf_params.begin(), format.str()); + // then do a printf std::ostringstream buffer; - if (mini_printf(buffer, format.str(), params.size(), values)) + if (mini_printf(buffer, printf_params)) m_console.get_visible_cpu()->debug()->trace_printf("%s", std::move(buffer).str()); } diff -Nru mame-0.263+dfsg.1/src/emu/debug/debugcmd.h mame-0.264+dfsg.1/src/emu/debug/debugcmd.h --- mame-0.263+dfsg.1/src/emu/debug/debugcmd.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/debug/debugcmd.h 2024-03-25 14:00:46.000000000 +0000 @@ -73,7 +73,7 @@ u64 global_get(global_entry *global); void global_set(global_entry *global, u64 value); - bool mini_printf(std::ostream &stream, std::string_view format, int params, u64 *param); + bool mini_printf(std::ostream &stream, const std::vector ¶ms); template void execute_index_command(std::vector const ¶ms, T &&apply, char const *unused_message); diff -Nru mame-0.263+dfsg.1/src/emu/debug/debugcpu.cpp mame-0.264+dfsg.1/src/emu/debug/debugcpu.cpp --- mame-0.263+dfsg.1/src/emu/debug/debugcpu.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/debug/debugcpu.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -25,7 +25,6 @@ #include "uiinput.h" #include "corestr.h" -#include "coreutil.h" #include "osdepend.h" #include "xmlfile.h" @@ -1727,7 +1726,7 @@ buffer.data_get(pc, dasmresult & util::disasm_interface::LENGTHMASK, true, opbuf); // return a CRC of the exact count of opcode bytes - return core_crc32(0, &opbuf[0], opbuf.size()); + return util::crc32_creator::simple(&opbuf[0], opbuf.size()); } diff -Nru mame-0.263+dfsg.1/src/emu/debug/debughlp.cpp mame-0.264+dfsg.1/src/emu/debug/debughlp.cpp --- mame-0.263+dfsg.1/src/emu/debug/debughlp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/debug/debughlp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -359,16 +359,20 @@ "The printf command performs a C-style printf to the debugger console. Only a very limited set of " "formatting options are available:\n" "\n" - " %[0][]d -- prints as a decimal value with optional digit count and zero-fill\n" - " %[0][]x -- prints as a hexadecimal value with optional digit count and zero-fill\n" + " %c -- 8-bit character\n" + " %[-][0][]d -- decimal number with optional left justification, zero fill and minimum width\n" + " %[-][0][]o -- octal number with optional left justification, zero fill and minimum width\n" + " %[-][0][]x -- lowercase hexadecimal number with optional left justification, zero fill and minimum width\n" + " %[-][0][]X -- uppercase hexadecimal number with optional left justification, zero fill and minimum width\n" + " %[-][][.[]]s -- null-terminated string of 8-bit characters with optional left justification, minimum and maximum width\n" "\n" - "All remaining formatting options are ignored. Use %% together to output a % character. Multiple " - "lines can be printed by embedding a \\n in the text.\n" + "All remaining formatting options are ignored. Use %% to output a % character. Multiple lines can be " + "printed by embedding a \\n in the text.\n" "\n" "Examples:\n" "\n" "printf \"PC=%04X\",pc\n" - " Prints PC= where is displayed in hexadecimal with 4 digits with zero-fill.\n" + " Prints PC= where is displayed in uppercase hexadecimal with 4 digits and zero fill.\n" "\n" "printf \"A=%d, B=%d\\nC=%d\",a,b,a+b\n" " Prints A=, B= on one line, and C= on a second line.\n" @@ -379,18 +383,12 @@ " logerror [,[,...]]\n" "\n" "The logerror command performs a C-style printf to the error log. Only a very limited set of " - "formatting options are available:\n" - "\n" - " %[0][]d -- logs as a decimal value with optional digit count and zero-fill\n" - " %[0][]x -- logs as a hexadecimal value with optional digit count and zero-fill\n" - "\n" - "All remaining formatting options are ignored. Use %% together to output a % character. Multiple " - "lines can be printed by embedding a \\n in the text.\n" + "formatting options are available. See the 'printf' help for details.\n" "\n" "Examples:\n" "\n" - "logerror \"PC=%04X\",pc\n" - " Logs PC= where is displayed in hexadecimal with 4 digits with zero-fill.\n" + "logerror \"PC=%04x\",pc\n" + " Logs PC= where is displayed in lowercase hexadecimal with 4 digits and zero fill.\n" "\n" "logerror \"A=%d, B=%d\\nC=%d\",a,b,a+b\n" " Logs A=, B= on one line, and C= on a second line.\n" diff -Nru mame-0.263+dfsg.1/src/emu/diimage.h mame-0.264+dfsg.1/src/emu/diimage.h --- mame-0.263+dfsg.1/src/emu/diimage.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/diimage.h 2024-03-25 14:00:46.000000000 +0000 @@ -148,15 +148,13 @@ u32 fread(void *buffer, u32 length) { check_for_file(); - size_t actual; - m_file->read(buffer, length, actual); + auto const [err, actual] = read(*m_file, buffer, length); return actual; } u32 fwrite(const void *buffer, u32 length) { check_for_file(); - size_t actual; - m_file->write(buffer, length, actual); + auto const [err, actual] = write(*m_file, buffer, length); return actual; } std::error_condition fseek(s64 offset, int whence) @@ -172,10 +170,6 @@ return result; } - // allocate and read into buffers - u32 fread(std::unique_ptr &ptr, u32 length) { ptr = std::make_unique(length); return fread(ptr.get(), length); } - u32 fread(std::unique_ptr &ptr, u32 length, offs_t offset) { ptr = std::make_unique(length); return fread(ptr.get() + offset, length - offset); } - // access to software list item information const software_info *software_entry() const noexcept; const software_part *part_entry() const noexcept { return m_software_part_ptr; } diff -Nru mame-0.263+dfsg.1/src/emu/dinetwork.cpp mame-0.264+dfsg.1/src/emu/dinetwork.cpp --- mame-0.263+dfsg.1/src/emu/dinetwork.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/dinetwork.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3,16 +3,21 @@ #include "emu.h" #include "dinetwork.h" + #include "osdnet.h" +#include + + device_network_interface::device_network_interface(const machine_config &mconfig, device_t &device, u32 bandwidth, u32 mtu) : device_interface(device, "network") + , m_poll_timer(nullptr) + , m_send_timer(nullptr) + , m_recv_timer(nullptr) { - m_promisc = false; // Convert to Mibps to Bps m_bandwidth = bandwidth << (20 - 3); m_mtu = mtu; - memset(m_mac, 0, 6); m_intf = -1; m_loopback_control = false; } @@ -21,15 +26,23 @@ { } -void device_network_interface::interface_pre_start() +void device_network_interface::interface_post_start() { + m_poll_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_network_interface::poll_device), this)); m_send_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_network_interface::send_complete), this)); m_recv_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_network_interface::recv_complete), this)); + + device().save_item(NAME(m_loopback_control)); } -void device_network_interface::interface_post_start() +void device_network_interface::interface_post_load() { - device().save_item(NAME(m_loopback_control)); + if (!m_dev) + m_poll_timer->reset(); + else if (!m_loopback_control && !m_recv_timer->enabled()) + start_net_device(); + else + stop_net_device(); } int device_network_interface::send(u8 *buf, int len, int fcs) @@ -65,6 +78,25 @@ return result; } +TIMER_CALLBACK_MEMBER(device_network_interface::poll_device) +{ + m_dev->poll(); +} + +void device_network_interface::start_net_device() +{ + // Set device polling time to transfer time for one MTU + m_dev->start(); + const attotime interval = attotime::from_hz(m_bandwidth / m_mtu); + m_poll_timer->adjust(attotime::zero, 0, interval); +} + +void device_network_interface::stop_net_device() +{ + m_poll_timer->reset(); + m_dev->stop(); +} + TIMER_CALLBACK_MEMBER(device_network_interface::send_complete) { send_complete_cb(param); @@ -85,7 +117,7 @@ { // stop receiving more data from the network if (m_dev) - m_dev->stop(); + stop_net_device(); // schedule receive complete callback m_recv_timer->adjust(attotime::from_ticks(len, m_bandwidth), result); @@ -98,28 +130,36 @@ // start receiving data from the network again if (m_dev && !m_loopback_control) - m_dev->start(); + start_net_device(); } void device_network_interface::set_promisc(bool promisc) { m_promisc = promisc; - if(m_dev) m_dev->set_promisc(promisc); + if (m_dev) + m_dev->set_promisc(promisc); } void device_network_interface::set_mac(const u8 *mac) { - memcpy(m_mac, mac, 6); - if(m_dev) m_dev->set_mac(m_mac); + std::copy_n(mac, std::size(m_mac), std::begin(m_mac)); + if (m_dev) + m_dev->set_mac(&m_mac[0]); } void device_network_interface::set_interface(int id) { - if(m_dev) - m_dev->stop(); - // Set device polling time to transfer time for one mtu - m_dev.reset(open_netdev(id, this, (int)(m_bandwidth / m_mtu))); - if(!m_dev) { + if (m_dev) + stop_net_device(); + + m_dev.reset(open_netdev(id, *this)); + if (m_dev) + { + if (!m_loopback_control) + start_net_device(); + } + else + { device().logerror("Network interface %d not found\n", id); id = -1; } @@ -136,8 +176,8 @@ if (m_dev) { if (loopback) - m_dev->stop(); + stop_net_device(); else if (!m_recv_timer->enabled()) - m_dev->start(); + start_net_device(); } } diff -Nru mame-0.263+dfsg.1/src/emu/dinetwork.h mame-0.264+dfsg.1/src/emu/dinetwork.h --- mame-0.263+dfsg.1/src/emu/dinetwork.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/dinetwork.h 2024-03-25 14:00:46.000000000 +0000 @@ -3,30 +3,31 @@ #ifndef MAME_EMU_DINETWORK_H #define MAME_EMU_DINETWORK_H -class osd_netdev; +#include "interface/nethandler.h" -class device_network_interface : public device_interface + +class osd_network_device; + +class device_network_interface : public device_interface, public osd::network_handler { public: device_network_interface(const machine_config &mconfig, device_t &device, u32 bandwidth, u32 mtu = 1500); virtual ~device_network_interface(); - void interface_pre_start() override; - void interface_post_start() override; + void interface_post_start() override ATTR_COLD; + void interface_post_load() override ATTR_COLD; - void set_interface(int id); + void set_interface(int id) ATTR_COLD; void set_promisc(bool promisc); void set_mac(const u8 *mac); void set_loopback(bool loopback); - const char *get_mac() const { return m_mac; } - bool get_promisc() const { return m_promisc; } int get_interface() const { return m_intf; } int send(u8 *buf, int len, int fcs = 0); // TODO: de-virtualise this when existing devices implement delayed receive - virtual void recv_cb(u8 *buf, int len); + virtual void recv_cb(u8 *buf, int len) override; // delayed transmit/receive handlers virtual void send_complete_cb(int result) {} @@ -34,19 +35,25 @@ virtual void recv_complete_cb(int result) {} protected: - TIMER_CALLBACK_MEMBER(send_complete); - TIMER_CALLBACK_MEMBER(recv_complete); + bool has_net_device() const noexcept { return bool(m_dev); } - bool m_promisc; - char m_mac[6]; // bandwidth in bytes per second u32 m_bandwidth; // maximum transmission unit, used for device polling time u32 m_mtu; - std::unique_ptr m_dev; int m_intf; bool m_loopback_control; +private: + TIMER_CALLBACK_MEMBER(poll_device); + TIMER_CALLBACK_MEMBER(send_complete); + TIMER_CALLBACK_MEMBER(recv_complete); + + void start_net_device(); + void stop_net_device(); + + std::unique_ptr m_dev; + emu_timer *m_poll_timer; emu_timer *m_send_timer; emu_timer *m_recv_timer; }; diff -Nru mame-0.263+dfsg.1/src/emu/dirom.h mame-0.264+dfsg.1/src/emu/dirom.h --- mame-0.263+dfsg.1/src/emu/dirom.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/dirom.h 2024-03-25 14:00:46.000000000 +0000 @@ -22,6 +22,7 @@ template void set_map(T &&... args) { set_addrmap(0, std::forward(args)...); } template void set_device_rom_tag(T &&tag) { m_rom_region.set_tag(std::forward(tag)); } + template void set_space(T &&tag, int spacenum) { m_rom_space.set_tag(tag, spacenum); } u8 read_byte(offs_t addr) { return m_rom_cache.read_byte(addr); } u16 read_word(offs_t addr) { return m_rom_cache.read_word(addr); } @@ -40,6 +41,7 @@ private: optional_memory_region m_rom_region; + optional_address_space m_rom_space; address_space_config m_rom_config; typename memory_access::cache m_rom_cache; diff -Nru mame-0.263+dfsg.1/src/emu/dirom.ipp mame-0.264+dfsg.1/src/emu/dirom.ipp --- mame-0.263+dfsg.1/src/emu/dirom.ipp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/dirom.ipp 2024-03-25 14:00:46.000000000 +0000 @@ -9,6 +9,7 @@ device_rom_interface::device_rom_interface(const machine_config &mconfig, device_t &device) : device_memory_interface(mconfig, device), m_rom_region(device, DEVICE_SELF), + m_rom_space(device, finder_base::DUMMY_TAG, -1), m_rom_config("rom", Endian, 8 << DataWidth, AddrWidth, AddrShift), m_bank(device, "bank"), m_cur_bank(-1) @@ -109,6 +110,11 @@ { device_memory_interface::interface_pre_start(); + if(m_rom_space.spacenum() != -1) { + m_rom_space->cache(m_rom_cache); + return; + } + if(!has_space(0)) return; diff -Nru mame-0.263+dfsg.1/src/emu/diserial.cpp mame-0.264+dfsg.1/src/emu/diserial.cpp --- mame-0.263+dfsg.1/src/emu/diserial.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/diserial.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -226,8 +226,10 @@ { LOGMASKED(LOG_RX, "Receiver is synchronized\n"); if (m_rcv_clock && !(m_rcv_rate.is_never())) - // make start delay just a bit longer to make sure we are called after the sender - m_rcv_clock->adjust(((m_rcv_rate*3)/2), 0, m_rcv_rate); + { + // make start delay half a cycle longer to make sure we are called after the sender + m_rcv_clock->adjust(m_rcv_rate*2, 0, m_rcv_rate); + } else if (m_start_bit_hack_for_external_clocks) m_rcv_bit_count_received--; } diff -Nru mame-0.263+dfsg.1/src/emu/emufwd.h mame-0.264+dfsg.1/src/emu/emufwd.h --- mame-0.263+dfsg.1/src/emu/emufwd.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/emufwd.h 2024-03-25 14:00:46.000000000 +0000 @@ -38,7 +38,6 @@ // declared in osdepend.h class osd_font; class osd_interface; -class osd_midi_device; diff -Nru mame-0.263+dfsg.1/src/emu/fileio.cpp mame-0.264+dfsg.1/src/emu/fileio.cpp --- mame-0.263+dfsg.1/src/emu/fileio.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/fileio.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,6 +14,8 @@ #include "util/path.h" #include "util/unzip.h" +#include + //#define VERBOSE 1 #define LOG_OUTPUT_FUNC osd_printf_verbose #include "logmacro.h" @@ -531,9 +533,10 @@ return 0; // read the data if we can + std::error_condition err; size_t actual = 0; if (m_file) - m_file->read(buffer, length, actual); + std::tie(err, actual) = util::read(*m_file, buffer, length); return actual; } @@ -601,9 +604,10 @@ { // FIXME: need better interface to report errors // write the data if we can + std::error_condition err; size_t actual = 0; if (m_file) - m_file->write(buffer, length, actual); + std::tie(err, actual) = util::write(*m_file, buffer, length); return actual; } diff -Nru mame-0.263+dfsg.1/src/emu/ioport.cpp mame-0.264+dfsg.1/src/emu/ioport.cpp --- mame-0.263+dfsg.1/src/emu/ioport.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/ioport.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2946,9 +2946,13 @@ return result = Type(0); // read the value; if we fail, end playback - size_t read; - m_playback_stream->read(&result, sizeof(result), read); - if (sizeof(result) != read) + auto const [err, actual] = read(*m_playback_stream, &result, sizeof(result)); + if (err) + { + playback_end("Read error"); + return result = Type(0); + } + else if (sizeof(result) != actual) { playback_end("End of file"); return result = Type(0); @@ -3132,9 +3136,8 @@ value = little_endianize_int16(value); // write the value; if we fail, end recording - size_t written; - if (m_record_stream->write(&value, sizeof(value), written) || (sizeof(value) != written)) - record_end("Out of space"); + if (write(*m_record_stream, &value, sizeof(value)).first) + record_end("Write error"); } template<> diff -Nru mame-0.263+dfsg.1/src/emu/machine.cpp mame-0.264+dfsg.1/src/emu/machine.cpp --- mame-0.263+dfsg.1/src/emu/machine.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/machine.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -890,10 +890,6 @@ // handle the result switch (saverr) { - case STATERR_ILLEGAL_REGISTRATIONS: - popmessage("Error: Unable to %s state %s %s due to illegal registrations. See error.log for details.", opname, preposname, m_saveload_pending_file); - break; - case STATERR_INVALID_HEADER: popmessage("Error: Unable to %s state %s %s due to an invalid header. Make sure the save state is correct for this system.", opname, preposname, m_saveload_pending_file); break; diff -Nru mame-0.263+dfsg.1/src/emu/network.cpp mame-0.264+dfsg.1/src/emu/network.cpp --- mame-0.263+dfsg.1/src/emu/network.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/network.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -87,9 +87,9 @@ { node->set_attribute("tag", network.device().tag()); node->set_attribute_int("interface", network.get_interface()); - const char *mac = network.get_mac(); + const std::array &mac = network.get_mac(); char mac_addr[6 * 3]; - sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", u8(mac[0]), u8(mac[1]), u8(mac[2]), u8(mac[3]), u8(mac[4]), u8(mac[5])); + sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); node->set_attribute("mac", mac_addr); } } diff -Nru mame-0.263+dfsg.1/src/emu/render.cpp mame-0.264+dfsg.1/src/emu/render.cpp --- mame-0.263+dfsg.1/src/emu/render.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/render.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2119,11 +2119,10 @@ size_t decompressed = 0; do { - size_t actual; - std::error_condition const err = inflater->read( + auto const [err, actual] = read( + *inflater, &tempout[decompressed], - layout_data.decompressed_size - decompressed, - actual); + layout_data.decompressed_size - decompressed); decompressed += actual; if (err) { diff -Nru mame-0.263+dfsg.1/src/emu/rendfont.cpp mame-0.264+dfsg.1/src/emu/rendfont.cpp --- mame-0.263+dfsg.1/src/emu/rendfont.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/rendfont.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,6 @@ #include "render.h" #include "corestr.h" -#include "coreutil.h" #include "multibyte.h" #include "path.h" @@ -129,13 +128,12 @@ bool read(util::read_stream &f) { - std::size_t actual(0); - return !f.read(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + auto const [err, actual] = util::read(f, m_data, sizeof(m_data)); + return !err && (actual == sizeof(m_data)); } bool write(util::write_stream &f) { - std::size_t actual(0); - return !f.write(m_data, sizeof(m_data), actual) && actual == sizeof(m_data); + return !util::write(f, m_data, sizeof(m_data)).first; } bool check_magic() const @@ -760,7 +758,8 @@ bounds.min_y = 0; // compute x1,y1 from there based on the bitmap size - bounds.set_width(float(gl.bmwidth) * scale * aspect); + float width = float(gl.bmwidth) * scale * aspect; + bounds.set_width(width < 0.5f ? 0 : std::max(int(width), 1)); bounds.set_height(float(m_height) * scale); // if the bitmap isn't big enough, bail @@ -884,7 +883,7 @@ m_rawdata.clear(); return false; } - u32 const hash(core_crc32(0, reinterpret_cast(&m_rawdata[0]), bytes)); + u32 const hash(util::crc32_creator::simple(&m_rawdata[0], bytes)); // create the cached filename, changing the 'F' to a 'C' on the extension std::string cachedname(filename, 0, filename.length() - ((4U < filename.length()) && core_filename_ends_with(filename, ".bdf") ? 4 : 0)); @@ -1346,6 +1345,11 @@ // now read the rest of the data u64 const remaining(filesize - filepos); + if (remaining > std::numeric_limits::max()) + { + osd_printf_error("render_font::load_cached: BDC file is too large to read into memory\n"); + return false; + } try { m_rawdata.resize(std::size_t(remaining)); @@ -1353,18 +1357,14 @@ catch (...) { osd_printf_error("render_font::load_cached: allocation error\n"); + return false; } - for (u64 bytes_read = 0; remaining > bytes_read; ) + auto const [err, bytes] = read(file, &m_rawdata[0], remaining); + if (err || (bytes != remaining)) { - u32 const chunk((std::min)(u64(std::numeric_limits::max()), remaining)); - std::size_t bytes(0); - if (file.read(&m_rawdata[bytes_read], chunk, bytes) || bytes != chunk) - { - osd_printf_error("render_font::load_cached: error reading BDC data\n"); - m_rawdata.clear(); - return false; - } - bytes_read += chunk; + osd_printf_error("render_font::load_cached: error reading BDC data\n"); + m_rawdata.clear(); + return false; } // extract the data from the data @@ -1446,11 +1446,11 @@ hdr.set_y_offset(m_yoffs); hdr.set_default_character(m_defchar); if (!hdr.write(file)) - throw emu_fatalerror("Error writing cached file"); + throw emu_fatalerror("Error writing cached font file"); } u64 table_offs; if (file.tell(table_offs)) - throw emu_fatalerror("Error writing cached file"); + throw emu_fatalerror("Error writing cached font file"); // allocate an array to hold the character data std::vector chartable(std::size_t(numchars) * bdc_table_entry::size(), 0); @@ -1459,9 +1459,8 @@ std::vector tempbuffer(65536); // write the empty table to the beginning of the file - std::size_t bytes_written(0); - if (file.write(&chartable[0], chartable.size(), bytes_written) || bytes_written != chartable.size()) - throw emu_fatalerror("Error writing cached file"); + if (write(file, &chartable[0], chartable.size()).first) + throw emu_fatalerror("Error writing cached font file"); // loop over all characters bdc_table_entry table_entry(chartable.empty() ? nullptr : &chartable[0]); @@ -1503,8 +1502,8 @@ *dest++ = accum; // write the data - if (file.write(&tempbuffer[0], dest - &tempbuffer[0], bytes_written) || bytes_written != dest - &tempbuffer[0]) - throw emu_fatalerror("Error writing cached file"); + if (write(file, &tempbuffer[0], dest - &tempbuffer[0]).first) + throw emu_fatalerror("Error writing cached font file"); // free the bitmap and texture m_manager.texture_free(gl.texture); @@ -1529,15 +1528,8 @@ LOG("render_font::save_cached: writing character table\n"); if (file.seek(table_offs, SEEK_SET)) return false; - u8 const *bytes(&chartable[0]); - for (u64 remaining = chartable.size(); remaining; ) - { - u32 const chunk((std::min)(std::numeric_limits::max(), remaining)); - if (file.write(bytes, chunk, bytes_written) || chunk != bytes_written) - throw emu_fatalerror("Error writing cached file"); - bytes += chunk; - remaining -= chunk; - } + if (write(file, &chartable[0], chartable.size()).first) + throw emu_fatalerror("Error writing cached font file"); } // no trouble? @@ -1588,6 +1580,11 @@ // now read the rest of the data u64 const remaining(filesize - filepos); + if (remaining > std::numeric_limits::max()) + { + osd_printf_error("render_font::render_font_command_glyph: BDC file is too large to read into memory\n"); + return; + } try { m_rawdata_cmd.resize(std::size_t(remaining)); @@ -1595,18 +1592,14 @@ catch (...) { osd_printf_error("render_font::render_font_command_glyph: allocation error\n"); + return; } - for (u64 bytes_read = 0; remaining > bytes_read; ) + auto const [err, bytes] = read(*file, &m_rawdata_cmd[0], remaining); + if (err || (bytes != remaining)) { - u32 const chunk((std::min)(u64(std::numeric_limits::max()), remaining)); - std::size_t bytes(0); - if (file->read(&m_rawdata_cmd[bytes_read], chunk, bytes) || bytes != chunk) - { - osd_printf_error("render_font::render_font_command_glyph: error reading BDC data\n"); - m_rawdata_cmd.clear(); - return; - } - bytes_read += chunk; + osd_printf_error("render_font::render_font_command_glyph: error reading BDC data\n"); + m_rawdata_cmd.clear(); + return; } // extract the data from the data diff -Nru mame-0.263+dfsg.1/src/emu/rendlay.cpp mame-0.264+dfsg.1/src/emu/rendlay.cpp --- mame-0.263+dfsg.1/src/emu/rendlay.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/rendlay.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1790,10 +1790,10 @@ { u8 const *const src(reinterpret_cast(dst)); rgb_t const d( - u8((float(src[3]) * c.a) + 0.5), - u8((float(src[0]) * c.r) + 0.5), - u8((float(src[1]) * c.g) + 0.5), - u8((float(src[2]) * c.b) + 0.5)); + u8((float(src[3]) * c.a) + 0.5F), + u8((float(src[0]) * c.r) + 0.5F), + u8((float(src[1]) * c.g) + 0.5F), + u8((float(src[2]) * c.b) + 0.5F)); *dst = d; havealpha = havealpha || (d.a() < 255U); } @@ -2069,17 +2069,12 @@ return; } svgbuf[len] = '\0'; - for (char *ptr = svgbuf.get(); len; ) + size_t actual; + std::tie(filerr, actual) = read(file, svgbuf.get(), len); + if (filerr || (actual < len)) { - size_t read; - filerr = file.read(ptr, size_t(len), read); - if (filerr || !read) - { - osd_printf_warning("Error reading component image '%s'\n", m_imagefile); - return; - } - ptr += read; - len -= read; + osd_printf_warning("Error reading component image '%s'\n", m_imagefile); + return; } parse_svg(svgbuf.get()); } @@ -2303,17 +2298,13 @@ if ((x >= minfill) && (x <= maxfill)) { if (255 <= a) - { dst = std::fill_n(dst, maxfill - x + 1, f); - x = maxfill; - } else - { while (x++ <= maxfill) alpha_blend(*dst++, a, r, g, b, inva); - --x; - } + --dst; + x = maxfill; } else { @@ -2415,17 +2406,13 @@ if ((x >= minfill) && (x <= maxfill)) { if (255 <= a) - { dst = std::fill_n(dst, maxfill - x + 1, f); - x = maxfill; - } else - { while (x++ <= maxfill) alpha_blend(*dst++, a, r, g, b, inva); - --x; - } + --dst; + x = maxfill; } else { diff -Nru mame-0.263+dfsg.1/src/emu/rendutil.cpp mame-0.264+dfsg.1/src/emu/rendutil.cpp --- mame-0.263+dfsg.1/src/emu/rendutil.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/rendutil.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -41,8 +41,7 @@ { jpeg_corefile_source &src = *static_cast(cinfo->src); - size_t nbytes; - src.infile->read(src.buffer, INPUT_BUF_SIZE, nbytes); // TODO: check error return + auto [err, nbytes] = read(*src.infile, src.buffer, INPUT_BUF_SIZE); // TODO: check error return if (0 >= nbytes) { diff -Nru mame-0.263+dfsg.1/src/emu/save.cpp mame-0.264+dfsg.1/src/emu/save.cpp --- mame-0.263+dfsg.1/src/emu/save.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/save.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -27,7 +27,6 @@ #include "main.h" -#include "util/coreutil.h" #include "util/ioprocs.h" #include "util/ioprocsfilter.h" @@ -68,7 +67,6 @@ save_manager::save_manager(running_machine &machine) : m_machine(machine) , m_reg_allowed(true) - , m_illegal_regs(0) { m_rewind = std::make_unique(*this); } @@ -187,9 +185,7 @@ if (!m_reg_allowed) { machine().logerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name); - if (machine().system().flags & machine_flags::SUPPORTS_SAVE) - fatalerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name); - m_illegal_regs++; + fatalerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name); return; } @@ -219,8 +215,8 @@ // seek to the beginning and read the header file.seek(0, SEEK_SET); u8 header[HEADER_SIZE]; - size_t actual(0); - if (file.read(header, sizeof(header), actual) || actual != sizeof(header)) + auto const [err, actual] = read(file, header, sizeof(header)); + if (err || (actual != sizeof(header))) { if (errormsg != nullptr) (*errormsg)("Could not read %s save file header", emulator_info::get_appname()); @@ -267,9 +263,8 @@ [] (size_t total_size) { return true; }, [&writer] (const void *data, size_t size) { - size_t written; - std::error_condition filerr = writer->write(data, size, written); - return !filerr && (size == written); + auto const [filerr, written] = write(*writer, data, size); + return !filerr; }, [&file, &writer] () { @@ -300,9 +295,8 @@ [] (size_t total_size) { return true; }, [&reader] (void *data, size_t size) { - std::size_t read; - std::error_condition filerr = reader->read(data, size, read); - return !filerr && (read == size); + auto const [filerr, actual] = read(*reader, data, size); + return !filerr && (actual == size); }, [&file, &reader] () { @@ -408,10 +402,6 @@ template inline save_error save_manager::do_write(T check_space, U write_block, V start_header, W start_data) { - // if we have illegal registrations, return an error - if (m_illegal_regs > 0) - return STATERR_ILLEGAL_REGISTRATIONS; - // check for sufficient space size_t total_size = HEADER_SIZE; for (const auto &entry : m_entry_list) @@ -455,10 +445,6 @@ template inline save_error save_manager::do_read(T check_length, U read_block, V start_header, W start_data) { - // if we have illegal registrations, return an error - if (m_illegal_regs > 0) - return STATERR_ILLEGAL_REGISTRATIONS; - // check for sufficient space size_t total_size = HEADER_SIZE; for (const auto &entry : m_entry_list) @@ -508,11 +494,11 @@ u32 save_manager::signature() const { // iterate over entries - u32 crc = 0; + util::crc32_creator crc; for (auto &entry : m_entry_list) { // add the entry name to the CRC - crc = core_crc32(crc, (u8 *)entry->m_name.c_str(), entry->m_name.length()); + crc.append(entry->m_name.data(), entry->m_name.length()); // add the type and size to the CRC u32 temp[4]; @@ -520,9 +506,9 @@ temp[1] = little_endianize_int32(entry->m_typecount); temp[2] = little_endianize_int32(entry->m_blockcount); temp[3] = little_endianize_int32(entry->m_stride); - crc = core_crc32(crc, (u8 *)&temp[0], sizeof(temp)); + crc.append(&temp[0], sizeof(temp)); } - return crc; + return crc.finish(); } @@ -663,10 +649,6 @@ // initialize m_data.seekg(0); - // if we have illegal registrations, return an error - if (m_save.m_illegal_regs > 0) - return STATERR_ILLEGAL_REGISTRATIONS; - // get the save manager to load state return m_save.read_stream(m_data); } @@ -916,11 +898,6 @@ switch (error) { // internal saveload failures - case STATERR_ILLEGAL_REGISTRATIONS: - m_save.machine().logerror("Rewind error: Unable to %s state due to illegal registrations.", opname); - m_save.machine().popmessage("Rewind error occured. See error.log for details."); - break; - case STATERR_INVALID_HEADER: m_save.machine().logerror("Rewind error: Unable to %s state due to an invalid header. " "Make sure the save state is correct for this machine.\n", opname); diff -Nru mame-0.263+dfsg.1/src/emu/save.h mame-0.264+dfsg.1/src/emu/save.h --- mame-0.263+dfsg.1/src/emu/save.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/save.h 2024-03-25 14:00:46.000000000 +0000 @@ -34,7 +34,6 @@ { STATERR_NONE, STATERR_NOT_FOUND, - STATERR_ILLEGAL_REGISTRATIONS, STATERR_INVALID_HEADER, STATERR_READ_ERROR, STATERR_WRITE_ERROR, @@ -334,7 +333,6 @@ running_machine & m_machine; // reference to our machine std::unique_ptr m_rewind; // rewinder bool m_reg_allowed; // are registrations allowed? - s32 m_illegal_regs; // number of illegal registrations std::vector> m_entry_list; // list of registered entries std::vector> m_ramstate_list; // list of ram states diff -Nru mame-0.263+dfsg.1/src/emu/softlist.cpp mame-0.264+dfsg.1/src/emu/softlist.cpp --- mame-0.263+dfsg.1/src/emu/softlist.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/softlist.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -286,8 +286,7 @@ char buffer[1024]; for (bool done = false; !done; ) { - size_t length; - file.read(buffer, sizeof(buffer), length); // TODO: better error handling + auto const [err, length] = read(file, buffer, sizeof(buffer)); // TODO: better error handling if (!length) done = true; if (XML_Parse(m_parser, buffer, length, done) == XML_STATUS_ERROR) diff -Nru mame-0.263+dfsg.1/src/emu/xtal.cpp mame-0.264+dfsg.1/src/emu/xtal.cpp --- mame-0.263+dfsg.1/src/emu/xtal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/emu/xtal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -228,6 +228,7 @@ 13'495'200, /* 13.4952_MHz_XTAL Used on Shadow Force pcb and maybe other Technos pcbs? */ 13'500'000, /* 13.5_MHz_XTAL Microbee */ 13'516'800, /* 13.5168_MHz_XTAL Kontron KDT6 */ + 13'560'000, /* 13.560_MHz_XTAL Tong Zi Maque */ 13'608'000, /* 13.608_MHz_XTAL TeleVideo 910 & 925 */ 13'824'000, /* 13.824_MHz_XTAL Robotron PC-1715 display circuit */ 13'977'600, /* 13.9776_MHz_XTAL Kaypro II dot clock */ @@ -280,6 +281,7 @@ 16'572'000, /* 16.572_MHz_XTAL Micro-Term ACT-5A */ 16'588'800, /* 16.5888_MHz_XTAL SM 7238 */ 16'666'600, /* 16.6666_MHz_XTAL Firebeat GCU */ + 16'667'000, /* 16.667_MHz_XTAL Visual XDS-19P */ 16'669'800, /* 16.6698_MHz_XTAL Qume QVT-102 */ 16'670'000, /* 16.67_MHz_XTAL - */ 16'777'216, /* 16.777216_MHz_XTAL Nintendo Game Boy Advance */ @@ -287,6 +289,7 @@ 17'010'000, /* 17.01_MHz_XTAL Epic 14E */ 17'064'000, /* 17.064_MHz_XTAL Memorex 1377 */ 17'074'800, /* 17.0748_MHz_XTAL SWTPC 8212 */ + 17'320'000, /* 17.320_MHz_XTAL Visual 50 */ 17'350'000, /* 17.35_MHz_XTAL ITT Courier 1700 */ 17'360'000, /* 17.36_MHz_XTAL OMTI Series 10 SCSI controller */ 17'430'000, /* 17.43_MHz_XTAL Videx Videoterm */ diff -Nru mame-0.263+dfsg.1/src/frontend/mame/ui/icorender.cpp mame-0.264+dfsg.1/src/frontend/mame/ui/icorender.cpp --- mame-0.263+dfsg.1/src/frontend/mame/ui/icorender.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/frontend/mame/ui/icorender.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include // need to set LOG_OUTPUT_FUNC or LOG_OUTPUT_STREAM because there's no logerror outside devices #define LOG_OUTPUT_FUNC osd_printf_verbose @@ -182,7 +183,7 @@ icon_dir_entry_t dir; err = fp.seek(sizeof(icon_dir_t) + (sizeof(icon_dir_entry_t) * index), SEEK_SET); if (!err) - err = fp.read(&dir, sizeof(dir), actual); + std::tie(err, actual) = read(fp, &dir, sizeof(dir)); if (err || (sizeof(dir) != actual)) { LOG("Failed to read ICO file directory entry %u\n", index); @@ -215,7 +216,7 @@ icon_dir_t header; err = fp.seek(0, SEEK_SET); if (!err) - err = fp.read(&header, sizeof(header), actual); + std::tie(err, actual) = read(fp, &header, sizeof(header)); if (err || (sizeof(header) != actual)) { LOG("Failed to read ICO file header\n"); @@ -278,53 +279,65 @@ { // read and check the icon file header - logs a message on error int const count(images_in_ico(fp)); - if (0 <= count) + if (0 > count) + { + bitmap.reset(); + return; + } + + // now load all the directory entries + size_t const dir_bytes(sizeof(icon_dir_entry_t) * count); + std::unique_ptr dir(new (std::nothrow) icon_dir_entry_t [count]); + std::unique_ptr index(new (std::nothrow) unsigned [count]); + if (count) { - // now load all the directory entries - size_t const dir_bytes(sizeof(icon_dir_entry_t) * count); - std::unique_ptr dir(new (std::nothrow) icon_dir_entry_t [count]); - std::unique_ptr index(new (std::nothrow) unsigned [count]); - size_t actual; - if (count && (!dir || !index || fp.read(dir.get(), dir_bytes, actual) || (dir_bytes != actual))) + if (!dir || !index) { - LOG("Failed to read ICO file directory entries\n"); + LOG("Failed to allocate memory for ICO file directory entries\n"); + bitmap.reset(); + return; } - else + auto const [err, actual] = read(fp, dir.get(), dir_bytes); + if (err || (dir_bytes != actual)) { - // byteswap and sort by (pixels, depth) - for (int i = 0; count > i; ++i) - { - dir[i].byteswap(); - index[i] = i; - } - std::stable_sort( - index.get(), - index.get() + count, - [&dir] (unsigned x, unsigned y) - { - unsigned const x_pixels(dir[x].get_width() * dir[x].get_height()); - unsigned const y_pixels(dir[y].get_width() * dir[y].get_height()); - if (x_pixels > y_pixels) - return true; - else if (x_pixels < y_pixels) - return false; - else - return dir[x].bpp > dir[y].bpp; - }); + LOG("Failed to read ICO file directory entries\n"); + bitmap.reset(); + return; + } + } - // walk down until something works - for (int i = 0; count > i; ++i) + // byteswap and sort by (pixels, depth) + for (int i = 0; count > i; ++i) + { + dir[i].byteswap(); + index[i] = i; + } + std::stable_sort( + index.get(), + index.get() + count, + [&dir] (unsigned x, unsigned y) { - LOG( - "Try loading ICO file entry %u: %u*%u, %u bits per pixel\n", - index[i], - dir[index[i]].get_width(), - dir[index[i]].get_height(), - dir[index[i]].bpp); - if (load_ico_image(fp, index[i], dir[index[i]], bitmap)) - return; - } - } + unsigned const x_pixels(dir[x].get_width() * dir[x].get_height()); + unsigned const y_pixels(dir[y].get_width() * dir[y].get_height()); + if (x_pixels > y_pixels) + return true; + else if (x_pixels < y_pixels) + return false; + else + return dir[x].bpp > dir[y].bpp; + }); + + // walk down until something works + for (int i = 0; count > i; ++i) + { + LOG( + "Try loading ICO file entry %u: %u*%u, %u bits per pixel\n", + index[i], + dir[index[i]].get_width(), + dir[index[i]].get_height(), + dir[index[i]].bpp); + if (load_ico_image(fp, index[i], dir[index[i]], bitmap)) + return; } bitmap.reset(); } diff -Nru mame-0.263+dfsg.1/src/frontend/mame/ui/miscmenu.cpp mame-0.264+dfsg.1/src/frontend/mame/ui/miscmenu.cpp --- mame-0.263+dfsg.1/src/frontend/mame/ui/miscmenu.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/frontend/mame/ui/miscmenu.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -200,19 +200,21 @@ } else if (ev->iptkey == IPT_UI_LEFT || ev->iptkey == IPT_UI_RIGHT) { + // FIXME: this conflates presumably arbitrary interface ID numbers with 0-based indices device_network_interface *const network = (device_network_interface *)ev->itemref; + auto const &interfaces = get_netdev_list(); int curr = network->get_interface(); if (ev->iptkey == IPT_UI_LEFT) curr--; else curr++; if (curr == -2) - curr = netdev_count() - 1; + curr = interfaces.size() - 1; network->set_interface(curr); curr = network->get_interface(); const char *title = nullptr; - for (auto &entry : get_netdev_list()) + for (auto &entry : interfaces) { if (entry->id == curr) { diff -Nru mame-0.263+dfsg.1/src/lib/formats/abc800i_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/abc800i_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/abc800i_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/abc800i_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,11 +89,10 @@ int abc800i_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[1]; - size_t actual; - io.read_at(0x810, h, 1, actual); + auto const [err, actual] = read_at(io, 0x810, h, 1); // start of directory - if (h[0] == 0x03) + if (!err && (actual == 1) && (h[0] == 0x03)) return FIFID_SIGN; return 0; diff -Nru mame-0.263+dfsg.1/src/lib/formats/acorn_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/acorn_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/acorn_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/acorn_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,6 +16,7 @@ #include "multibyte.h" #include +#include acorn_ssd_format::acorn_ssd_format() : wd177x_format(formats) @@ -45,25 +46,24 @@ if (io.length(size)) return -1; - for (int i=0; formats[i].form_factor; i++) + for (int i = 0; formats[i].form_factor; i++) { - size_t actual; const format &f = formats[i]; if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) continue; // test for Torch CPN - test pattern at sector &0018 - io.read_at(0x32800, cat, 8, actual); + read_at(io, 0x32800, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd", 8) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; // test for HADFS - test pattern at sector 70 - io.read_at(0x04610, cat, 8, actual); + read_at(io, 0x04610, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "\x00\x28\x43\x29\x4a\x47\x48\x00", 8) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; // test for Kenda SD - offset &0962 = 0 SD/1 DD, offset &0963 = disk size blocks / 4 (block size = 1K, ie. 0x400 bytes), reserved tracks = 3, ie. 0x1e00 bytes, soft stagger = 2 sectors, ie. 0x200 bytes - io.read_at(0x0960, cat, 8, actual); + read_at(io, 0x0960, cat, 8); // FIXME: check for errors and premature EOF if (cat[2] == 0 && ((uint64_t)cat[3] * 4 * 0x400 + 0x2000) == size && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) { // valid blocks for single sided @@ -75,7 +75,7 @@ } // read sector count from side 0 catalogue - io.read_at(0x100, cat, 8, actual); + read_at(io, 0x100, cat, 8); // FIXME: check for errors and premature EOF sectors0 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("ssd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : ""); @@ -84,11 +84,11 @@ if (f.head_count == 2) { // read sector count from side 2 catalogue - io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x100, cat, 8, actual); // sequential + read_at(io, (uint64_t)compute_track_size(f) * f.track_count + 0x100, cat, 8); // sequential sectors2 = get_u16be(&cat[6]) & 0x3ff; // exception case for Acorn CP/M System Disc 1 - io.read_at(0x367ec, cat, 8, actual); + read_at(io, 0x367ec, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "/M ", 4) == 0) sectors2 = get_u16be(&cat[6]) & 0x3ff; @@ -192,39 +192,38 @@ for (int i = 0; formats[i].form_factor; i++) { - size_t actual; const format &f = formats[i]; if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) continue; // test for Torch CPN - test pattern at sector &0018 - io.read_at(0x1200, cat, 8, actual); + read_at(io, 0x1200, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd", 8) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; // test for HADFS - test pattern at sector 70 - io.read_at(0x08c10, cat, 8, actual); + read_at(io, 0x08c10, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "\x00\x28\x43\x29\x4a\x47\x48\x00", 8) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; // test for FLEX - from System Information Record - io.read_at(0x0226, cat, 2, actual); + read_at(io, 0x0226, cat, 2); // FIXME: check for errors and premature EOF if ((memcmp(cat, "\x4f\x14", 2) == 0 || memcmp(cat, "\x4f\x0a", 2) == 0) && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; // read sector count from side 0 catalogue - io.read_at(0x100, cat, 8, actual); + read_at(io, 0x100, cat, 8); // FIXME: check for errors and premature EOF sectors0 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("dsd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : ""); if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) { // read sector count from side 2 catalogue - io.read_at(0xb00, cat, 8, actual); // interleaved + read_at(io, 0xb00, cat, 8); // interleaved sectors2 = get_u16be(&cat[6]) & 0x3ff; // exception case for Acorn CP/M System Disc 1 - io.read_at(0x97ec, cat, 8, actual); + read_at(io, 0x97ec, cat, 8); // FIXME: check for errors and premature EOF if (memcmp(cat, "/M ", 4) == 0) sectors2 = get_u16be(&cat[6]) & 0x3ff; @@ -295,12 +294,11 @@ int opus_ddos_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { - size_t actual; uint8_t cat[8]; uint32_t sectors0, sectors2; // read sector count from side 0 catalogue - io.read_at(0x1000, cat, 8, actual); + read_at(io, 0x1000, cat, 8); // FIXME: check for errors and premature EOF sectors0 = get_u16be(&cat[1]); LOG_FORMATS("ddos: sector count 0: %d %s\n", sectors0, sectors0 % 18 != 0 ? "invalid" : ""); @@ -319,7 +317,7 @@ if (f.head_count == 2) { // read sector count from side 2 catalogue - io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x1000, cat, 8, actual); // sequential + read_at(io, (uint64_t)compute_track_size(f) * f.track_count + 0x1000, cat, 8); // sequential sectors2 = get_u16be(&cat[1]); LOG_FORMATS("ddos: sector count 2: %d %s\n", sectors2, sectors2 % 18 != 0 ? "invalid" : ""); } @@ -393,25 +391,30 @@ int acorn_adfs_old_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { + std::error_condition err; size_t actual; uint8_t map[3]; uint32_t sectors; uint8_t oldmap[4]; // read sector count from free space map - io.read_at(0xfc, map, 3, actual); + std::tie(err, actual) = read_at(io, 0xfc, map, 3); + if (err || (3 != actual)) + return -1; sectors = get_u24le(map); LOG_FORMATS("adfs_o: sector count %d %s\n", sectors, sectors % 16 != 0 ? "invalid" : ""); // read map identifier - io.read_at(0x201, oldmap, 4, actual); + std::tie(err, actual) = read_at(io, 0x201, oldmap, 4); + if (err || (4 != actual)) + return -1; LOG_FORMATS("adfs_o: map identifier %s %s\n", oldmap, memcmp(oldmap, "Hugo", 4) != 0 ? "invalid" : ""); uint64_t size; if (io.length(size)) return -1; - for (int i=0; formats[i].form_factor; i++) + for (int i = 0; formats[i].form_factor; i++) { const format &f = formats[i]; if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) @@ -429,7 +432,7 @@ { int type = find_size(io, form_factor, variants); - if(type != -1) + if (type != -1) return FIFID_STRUCT | FIFID_SIZE; return 0; @@ -491,14 +494,19 @@ int acorn_adfs_new_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { + std::error_condition err; size_t actual; uint8_t dform[4]; uint8_t eform[4]; // read map identifiers for D and E formats - io.read_at(0x401, dform, 4, actual); + std::tie(err, actual) = read_at(io, 0x401, dform, 4); + if (err || (4 != actual)) + return -1; LOG_FORMATS("adfs_n: map identifier (D format) %s %s\n", dform, (memcmp(dform, "Hugo", 4) != 0 && memcmp(dform, "Nick", 4) != 0) ? "invalid" : ""); - io.read_at(0x801, eform, 4, actual); + std::tie(err, actual) = read_at(io, 0x801, eform, 4); + if (err || (4 != actual)) + return -1; LOG_FORMATS("adfs_n: map identifier (E format) %s %s\n", eform, memcmp(eform, "Nick", 4) != 0 ? "invalid" : ""); uint64_t size; @@ -585,12 +593,14 @@ if (size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) { // read media type ID from FAT - Acorn DOS = 0xfd - size_t actual; uint8_t type; - io.read_at(0, &type, 1, actual); - LOG_FORMATS("dos: 800k media type id %02X %s\n", type, type != 0xfd ? "invalid" : ""); - if (type == 0xfd) - return i; + auto const [err, actual] = read_at(io, 0, &type, 1); + if (!err && (1 == actual)) + { + LOG_FORMATS("dos: 800k media type id %02X %s\n", type, type != 0xfd ? "invalid" : ""); + if (type == 0xfd) + return i; + } } } return -1; @@ -647,14 +657,14 @@ int opus_ddcpm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { - size_t actual; uint8_t h[8]; - - io.read_at(0, h, 8, actual); + auto const [err, actual] = read_at(io, 0, h, 8); + if (err || (8 != actual)) + return 0; uint64_t size; if (io.length(size)) - return -1; + return 0; if (size == 819200 && memcmp(h, "Slogger ", 8) == 0) return FIFID_SIGN | FIFID_SIZE; @@ -686,8 +696,7 @@ desc_pc_sector sects[10]; uint8_t sectdata[10*512]; - size_t actual; - io.read_at(head * 80 * spt * 512 + track * spt * 512, sectdata, spt * 512, actual); + /*auto const [err, actual] =*/ read_at(io, head * 80 * spt * 512 + track * spt * 512, sectdata, spt * 512); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { @@ -742,7 +751,7 @@ if (io.length(size)) return -1; - for (int i=0; formats[i].form_factor; i++) + for (int i = 0; formats[i].form_factor; i++) { const format &f = formats[i]; if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) @@ -750,9 +759,10 @@ if (size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) { - size_t actual; uint8_t info; - io.read_at(14, &info, 1, actual); + auto const [err, actual] = read_at(io, 14, &info, 1); + if (err || (actual != 1)) + return -1; if (f.head_count == (util::BIT(info, 6) ? 2 : 1) && f.track_count == (util::BIT(info, 7) ? 80 : 40)) return i; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/aim_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/aim_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/aim_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/aim_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -72,8 +72,8 @@ bool header = false; // Read track - size_t actual; - io.read_at((heads * track + head) * track_size, &track_data[0], track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (heads * track + head) * track_size, &track_data[0], track_size); + // FIXME: check for error and premature EOF // Find first sector header or index mark for (int offset = 0; offset < track_size; offset += 2) diff -Nru mame-0.263+dfsg.1/src/lib/formats/ami_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ami_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ami_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ami_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -81,8 +81,9 @@ image.set_variant(floppy_image::DSDD); for (int track=0; track < tracks; track++) { for (int side=0; side < 2; side++) { - size_t actual; - io.read_at((track*2 + side)*512*11, sectdata, 512*11, actual); + auto const [err, actual] = read_at(io, (track*2 + side)*512*11, sectdata, 512*11); + if (err || (512*11 != actual)) + return false; generate_track(amiga_11, track, side, sectors, 11, 100000, image); } } @@ -90,8 +91,9 @@ image.set_variant(floppy_image::DSHD); for (int track=0; track < tracks; track++) { for (int side=0; side < 2; side++) { - size_t actual; - io.read_at((track*2 + side)*512*22, sectdata, 512*22, actual); + auto const [err, actual] = read_at(io, (track*2 + side)*512*22, sectdata, 512*22); + if (err || (512*22 != actual)) + return false; generate_track(amiga_22, track, side, sectors, 22, 200000, image); } } @@ -151,8 +153,8 @@ *dest++ = val; } - size_t actual; - io.write_at((track*2 + side) * data_track_size, sectdata, data_track_size, actual); + // FIXME: check for errors + /*auto const [err, actual] =*/ write_at(io, (track*2 + side) * data_track_size, sectdata, data_track_size); } } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/ap2_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ap2_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ap2_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ap2_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,7 @@ static const unsigned char cpm22_block1[8] = { 0xa2, 0x55, 0xa9, 0x00, 0x9d, 0x00, 0x0d, 0xca }; static const unsigned char subnod_block1[8] = { 0x63, 0xaa, 0xf0, 0x76, 0x8d, 0x63, 0xaa, 0x8e }; - size_t actual; - io.read_at(0, sector_data, 256*2, actual); + /*auto const [err, actual] =*/ read_at(io, 0, sector_data, 256*2); // FIXME: check for errors and premature EOF bool prodos_order = false; // check ProDOS boot block @@ -188,8 +187,7 @@ std::vector track_data; uint8_t sector_data[256*16]; - size_t actual; - io.read_at(fpos, sector_data, 256*16, actual); + /*auto const [err, actual] =*/ read_at(io, fpos, sector_data, 256*16); // FIXME: check for errors and premature EOF fpos += 256*16; for(int i=0; i<49; i++) @@ -273,8 +271,8 @@ bool a2_16sect_format::save(util::random_read_write &io, const std::vector &variants, const floppy_image &image) const { - int g_tracks, g_heads; - int visualgrid[16][APPLE2_TRACK_COUNT]; // visualizer grid, cleared/initialized below + int g_tracks, g_heads; + int visualgrid[16][APPLE2_TRACK_COUNT]; // visualizer grid, cleared/initialized below // lenient addr check: if unset, only accept an addr mark if the checksum was good // if set, accept an addr mark if the track and sector values are both sane @@ -294,206 +292,205 @@ #define DATAGOOD 8 // data postamble is good #define DATAPOST 16 - for (auto & elem : visualgrid) { - for (int j = 0; j < APPLE2_TRACK_COUNT; j++) { - elem[j] = 0; - } + for (auto & elem : visualgrid) { + for (int j = 0; j < APPLE2_TRACK_COUNT; j++) { + elem[j] = 0; } - image.get_actual_geometry(g_tracks, g_heads); + } + image.get_actual_geometry(g_tracks, g_heads); - int head = 0; + int head = 0; - int pos_data = 0; + int pos_data = 0; - for(int track=0; track < g_tracks; track++) { - uint8_t sectdata[(256)*16]; - memset(sectdata, 0, sizeof(sectdata)); - int nsect = 16; - #ifdef VERBOSE_SAVE - fprintf(stderr,"DEBUG: a2_16sect_format::save() about to generate bitstream from track %d...", track); - #endif - auto buf = generate_bitstream_from_track(track, head, 3915, image); + for(int track=0; track < g_tracks; track++) { + uint8_t sectdata[(256)*16]; + memset(sectdata, 0, sizeof(sectdata)); + int nsect = 16; + #ifdef VERBOSE_SAVE + fprintf(stderr,"DEBUG: a2_16sect_format::save() about to generate bitstream from track %d...", track); + #endif + auto buf = generate_bitstream_from_track(track, head, 3915, image); + #ifdef VERBOSE_SAVE + fprintf(stderr,"done.\n"); + #endif + int pos = 0; + int wrap = 0; + int hb = 0; + int dosver = 0; // apple dos version; 0 = >=3.3, 1 = <3.3 + for(;;) { + uint8_t v = gb(buf, pos, wrap); + if(v == 0xff) { + hb = 1; + } + else if(hb == 1 && v == 0xd5){ + hb = 2; + } + else if(hb == 2 && v == 0xaa) { + hb = 3; + } + else if(hb == 3 && ((v == 0x96) || (v == 0xab))) { // 0x96 = dos 3.3/16sec, 0xab = dos 3.21 and below/13sec + hb = 4; + if (v == 0xab) dosver = 1; + } + else + hb = 0; + + if(hb == 4) { + uint8_t h[11]; + for(auto & elem : h) + elem = gb(buf, pos, wrap); + //uint8_t v2 = gcr6bw_tb[h[2]]; + uint8_t vl = gcr4_decode(h[0],h[1]); + uint8_t tr = gcr4_decode(h[2],h[3]); + uint8_t se = gcr4_decode(h[4],h[5]); + uint8_t chk = gcr4_decode(h[6],h[7]); #ifdef VERBOSE_SAVE - fprintf(stderr,"done.\n"); + uint32_t post = get_u24be(&h[8]); + printf("Address Mark:\tVolume %d, Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", vl, tr, se, chk, (chk ^ vl ^ tr ^ se)==0?"OK":"BAD", post, (post&0xFFFF00)==0xDEAA00?"OK":"BAD"); #endif - int pos = 0; - int wrap = 0; - int hb = 0; - int dosver = 0; // apple dos version; 0 = >=3.3, 1 = <3.3 - for(;;) { - uint8_t v = gb(buf, pos, wrap); - if(v == 0xff) { + // sanity check + if (tr == track && se < nsect) { + visualgrid[se][track] |= ADDRFOUND; + visualgrid[se][track] |= ((chk ^ vl ^ tr ^ se)==0)?ADDRGOOD:0; +#ifdef LENIENT_ADDR_CHECK + if ((visualgrid[se][track] & ADDRFOUND) == ADDRFOUND) { +#else + if ((visualgrid[se][track] & ADDRGOOD) == ADDRGOOD) { +#endif + int opos = pos; + int owrap = wrap; + hb = 0; + for(int i=0; i<20 && hb != 4; i++) { + v = gb(buf, pos, wrap); + if(v == 0xff) hb = 1; - } - else if(hb == 1 && v == 0xd5){ + else if(hb == 1 && v == 0xd5) hb = 2; - } - else if(hb == 2 && v == 0xaa) { + else if(hb == 2 && v == 0xaa) hb = 3; - } - else if(hb == 3 && ((v == 0x96) || (v == 0xab))) { // 0x96 = dos 3.3/16sec, 0xab = dos 3.21 and below/13sec + else if(hb == 3 && v == 0xad) hb = 4; - if (v == 0xab) dosver = 1; - } else hb = 0; + } + if((hb == 4)&&(dosver == 0)) { + visualgrid[se][track] |= DATAFOUND; + uint8_t *dest; + uint8_t data[0x157]; + uint32_t dpost = 0; + uint8_t c = 0; + + if (m_prodos_order) + { + dest = sectdata+(256)*prodos_skewing[se]; + } + else + { + dest = sectdata+(256)*dos_skewing[se]; + } - if(hb == 4) { - uint8_t h[11]; - for(auto & elem : h) - elem = gb(buf, pos, wrap); - //uint8_t v2 = gcr6bw_tb[h[2]]; - uint8_t vl = gcr4_decode(h[0],h[1]); - uint8_t tr = gcr4_decode(h[2],h[3]); - uint8_t se = gcr4_decode(h[4],h[5]); - uint8_t chk = gcr4_decode(h[6],h[7]); - #ifdef VERBOSE_SAVE - uint32_t post = get_u24be(&h[8]); - printf("Address Mark:\tVolume %d, Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", vl, tr, se, chk, (chk ^ vl ^ tr ^ se)==0?"OK":"BAD", post, (post&0xFFFF00)==0xDEAA00?"OK":"BAD"); - #endif - // sanity check - if (tr == track && se < nsect) { - visualgrid[se][track] |= ADDRFOUND; - visualgrid[se][track] |= ((chk ^ vl ^ tr ^ se)==0)?ADDRGOOD:0; -#ifdef LENIENT_ADDR_CHECK - if ((visualgrid[se][track] & ADDRFOUND) == ADDRFOUND) { -#else - if ((visualgrid[se][track] & ADDRGOOD) == ADDRGOOD) { -#endif - int opos = pos; - int owrap = wrap; - hb = 0; - for(int i=0; i<20 && hb != 4; i++) { - v = gb(buf, pos, wrap); - if(v == 0xff) - hb = 1; - else if(hb == 1 && v == 0xd5) - hb = 2; - else if(hb == 2 && v == 0xaa) - hb = 3; - else if(hb == 3 && v == 0xad) - hb = 4; - else - hb = 0; - } - if((hb == 4)&&(dosver == 0)) { - visualgrid[se][track] |= DATAFOUND; - uint8_t *dest; - uint8_t data[0x157]; - uint32_t dpost = 0; - uint8_t c = 0; - - if (m_prodos_order) - { - dest = sectdata+(256)*prodos_skewing[se]; - } - else - { - dest = sectdata+(256)*dos_skewing[se]; - } - - // first read in sector and decode to 6bit form - for(int i=0; i<0x156; i++) { - data[i] = gcr6bw_tb[gb(buf, pos, wrap)] ^ c; - c = data[i]; - // printf("%02x ", c); - // if (((i&0xf)+1)==0x10) printf("\n"); - } - // read the checksum byte - data[0x156] = gcr6bw_tb[gb(buf,pos,wrap)]; - // now read the postamble bytes - for(int i=0; i<3; i++) { - dpost <<= 8; - dpost |= gb(buf, pos, wrap); - } - // next combine in the upper 2 bits of each byte - uint8_t bit_swap[4] = { 0, 2, 1, 3 }; - for(int i=0; i<0x56; i++) - data[i+0x056] = data[i+0x056]<<2 | bit_swap[data[i]&3]; - for(int i=0; i<0x56; i++) - data[i+0x0ac] = data[i+0x0ac]<<2 | bit_swap[(data[i]>>2)&3]; - for(int i=0; i<0x54; i++) - data[i+0x102] = data[i+0x102]<<2 | bit_swap[(data[i]>>4)&3]; - // now decode it into 256 bytes - // but only write it if the bitfield of the track shows datagood is NOT set. - // if it is set we don't want to overwrite a guaranteed good read with a bad one - // if past read had a bad checksum or bad postamble... + // first read in sector and decode to 6bit form + for(int i=0; i<0x156; i++) { + data[i] = gcr6bw_tb[gb(buf, pos, wrap)] ^ c; + c = data[i]; + // printf("%02x ", c); + // if (((i&0xf)+1)==0x10) printf("\n"); + } + // read the checksum byte + data[0x156] = gcr6bw_tb[gb(buf,pos,wrap)]; + // now read the postamble bytes + for(int i=0; i<3; i++) { + dpost <<= 8; + dpost |= gb(buf, pos, wrap); + } + // next combine in the upper 2 bits of each byte + uint8_t bit_swap[4] = { 0, 2, 1, 3 }; + for(int i=0; i<0x56; i++) + data[i+0x056] = data[i+0x056]<<2 | bit_swap[data[i]&3]; + for(int i=0; i<0x56; i++) + data[i+0x0ac] = data[i+0x0ac]<<2 | bit_swap[(data[i]>>2)&3]; + for(int i=0; i<0x54; i++) + data[i+0x102] = data[i+0x102]<<2 | bit_swap[(data[i]>>4)&3]; + // now decode it into 256 bytes + // but only write it if the bitfield of the track shows datagood is NOT set. + // if it is set we don't want to overwrite a guaranteed good read with a bad one + // if past read had a bad checksum or bad postamble... #ifndef USE_OLD_BEST_SECTOR_PRIORITY - if (((visualgrid[se][track]&DATAGOOD)==0)||((visualgrid[se][track]&DATAPOST)==0)) { - // if the current read is good, and postamble is good, write it in, no matter what. - // if the current read is good and the current postamble is bad, write it in unless the postamble was good before - // if the current read is bad and the current postamble is good and the previous read had neither good, write it in - // if the current read isn't good and neither is the postamble but nothing better - // has been written before, write it anyway. - if ( ((data[0x156] == c) && (dpost&0xFFFF00)==0xDEAA00) || + if (((visualgrid[se][track]&DATAGOOD)==0)||((visualgrid[se][track]&DATAPOST)==0)) { + // if the current read is good, and postamble is good, write it in, no matter what. + // if the current read is good and the current postamble is bad, write it in unless the postamble was good before + // if the current read is bad and the current postamble is good and the previous read had neither good, write it in + // if the current read isn't good and neither is the postamble but nothing better + // has been written before, write it anyway. + if ( ((data[0x156] == c) && (dpost&0xFFFF00)==0xDEAA00) || (((data[0x156] == c) && (dpost&0xFFFF00)!=0xDEAA00) && ((visualgrid[se][track]&DATAPOST)==0)) || (((data[0x156] != c) && (dpost&0xFFFF00)==0xDEAA00) && (((visualgrid[se][track]&DATAGOOD)==0)&&(visualgrid[se][track]&DATAPOST)==0)) || (((data[0x156] != c) && (dpost&0xFFFF00)!=0xDEAA00) && (((visualgrid[se][track]&DATAGOOD)==0)&&(visualgrid[se][track]&DATAPOST)==0)) ) { - for(int i=0x56; i<0x156; i++) { - uint8_t dv = data[i]; - *dest++ = dv; - } - } - } -#else - if ((visualgrid[se][track]&DATAGOOD)==0) { - for(int i=0x56; i<0x156; i++) { - uint8_t dv = data[i]; - *dest++ = dv; - } - } -#endif - // do some checking - #ifdef VERBOSE_SAVE - if ((data[0x156] != c) || (dpost&0xFFFF00)!=0xDEAA00) - fprintf(stderr,"Data Mark:\tChecksum xpctd %d found %d: %s, Postamble %03X: %s\n", data[0x156], c, (data[0x156]==c)?"OK":"BAD", dpost, (dpost&0xFFFF00)==0xDEAA00?"OK":"BAD"); - #endif - if (data[0x156] == c) visualgrid[se][track] |= DATAGOOD; - if ((dpost&0xFFFF00)==0xDEAA00) visualgrid[se][track] |= DATAPOST; - } else if ((hb == 4)&&(dosver == 1)) { - fprintf(stderr,"ERROR: We don't handle dos sectors below 3.3 yet!\n"); - } else { - pos = opos; - wrap = owrap; - } + for(int i=0x56; i<0x156; i++) { + uint8_t dv = data[i]; + *dest++ = dv; } } - hb = 0; + } +#else + if ((visualgrid[se][track]&DATAGOOD)==0) { + for(int i=0x56; i<0x156; i++) { + uint8_t dv = data[i]; + *dest++ = dv; + } + } +#endif + // do some checking + #ifdef VERBOSE_SAVE + if ((data[0x156] != c) || (dpost&0xFFFF00)!=0xDEAA00) + fprintf(stderr,"Data Mark:\tChecksum xpctd %d found %d: %s, Postamble %03X: %s\n", data[0x156], c, (data[0x156]==c)?"OK":"BAD", dpost, (dpost&0xFFFF00)==0xDEAA00?"OK":"BAD"); + #endif + if (data[0x156] == c) visualgrid[se][track] |= DATAGOOD; + if ((dpost&0xFFFF00)==0xDEAA00) visualgrid[se][track] |= DATAPOST; + } else if ((hb == 4)&&(dosver == 1)) { + fprintf(stderr,"ERROR: We don't handle dos sectors below 3.3 yet!\n"); + } else { + pos = opos; + wrap = owrap; } - if(wrap) - break; + } } - for(int i=0; i0) printf("t%d,", track); - uint8_t const *const data = sectdata + (256)*i; - size_t actual; - io.write_at(pos_data, data, 256, actual); - pos_data += 256; - } - //printf("\n"); + hb = 0; + } + if(wrap) + break; } - // display a little table of which sectors decoded ok - #ifdef VERBOSE_SAVE - int total_good = 0; - for (int j = 0; j < APPLE2_TRACK_COUNT; j++) { - printf("T%2d: ",j); - for (int i = 0; i < 16; i++) { - if (visualgrid[i][j] == NOTFOUND) printf("-NF- "); - else { - if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" "); - if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" "); - if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" "); - if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" "); - if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" "); - } + for(int i=0; i0) printf("t%d,", track); + uint8_t const *const data = sectdata + (256)*i; + /*auto const [err, actual] =*/ write_at(io, pos_data, data, 256); // FIXME: check for errors + pos_data += 256; + } + //printf("\n"); + } + // display a little table of which sectors decoded ok + #ifdef VERBOSE_SAVE + int total_good = 0; + for (int j = 0; j < APPLE2_TRACK_COUNT; j++) { + printf("T%2d: ",j); + for (int i = 0; i < 16; i++) { + if (visualgrid[i][j] == NOTFOUND) printf("-NF- "); + else { + if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" "); + if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" "); + if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" "); + if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" "); + if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" "); } - printf("\n"); } - printf("Total Good Sectors: %d\n", total_good); - #endif + printf("\n"); + } + printf("Total Good Sectors: %d\n", total_good); + #endif - return true; + return true; } const a2_16sect_dos_format FLOPPY_A216S_DOS_FORMAT; @@ -796,8 +793,7 @@ for(int i=0; i0) printf("t%d,", track); uint8_t const *const data = sectdata + (256)*i; - size_t actual; - io.write_at(pos_data, data, 256, actual); + /*auto const [err, actual] =*/ write_at(io, pos_data, data, 256); // FIXME: check for errors pos_data += 256; } @@ -978,8 +974,7 @@ for(int i=0; i0) printf("t%d,", track); uint8_t const *const data = sectdata + (256)*i; - size_t actual; - io.write_at(pos_data, data, 256, actual); + /*auto const [err, actual] =*/ write_at(io, pos_data, data, 256); // FIXME: check for errors pos_data += 256; } //printf("\n"); @@ -1049,13 +1044,10 @@ uint8_t nibble[16384], stream[16384]; int npos[16384]; - std::unique_ptr img(new (std::nothrow) uint8_t[2244608]); - if (!img) + auto [err, img, actual] = read_at(io, 0, 2'244'608); // TODO: check for premature EOF + if(err) return false; - size_t actual; - io.read_at(0, img.get(), 2244608, actual); - for(int i=0; i<137; i++) { uint8_t const *const trk = &img[16384*i]; int pos = 0; @@ -1290,8 +1282,7 @@ std::vector nibbles(nibbles_per_track); for (unsigned track = 0; track < nr_tracks; ++track) { - size_t actual; - io.read_at(track * nibbles_per_track, &nibbles[0], nibbles_per_track, actual); + /*auto const [err, actual] =*/ read_at(io, track * nibbles_per_track, &nibbles[0], nibbles_per_track); // FIXME: check for errors and premature EOF auto levels = generate_levels_from_nibbles(nibbles); generate_track_from_levels(track, 0, levels, diff -Nru mame-0.263+dfsg.1/src/lib/formats/ap_dsk35.cpp mame-0.264+dfsg.1/src/lib/formats/ap_dsk35.cpp --- mame-0.263+dfsg.1/src/lib/formats/ap_dsk35.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ap_dsk35.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -142,27 +142,26 @@ return 0; uint8_t h[0x54]; - size_t actual; - io.read_at(0, h, 0x54, actual); - uint32_t dsize = get_u32be(&h[0x40]); - uint32_t tsize = get_u32be(&h[0x44]); + auto const [err, actual] = read_at(io, 0, h, 0x54); + if (err || (0x54 != actual)) + return 0; - uint8_t encoding = h[0x50]; - uint8_t format = h[0x51]; + uint32_t const dsize = get_u32be(&h[0x40]); + uint32_t const tsize = get_u32be(&h[0x44]); + + uint8_t const encoding = h[0x50]; + uint8_t const format = h[0x51]; // if it's a 1.44MB DC42 image, reject it so the generic PC MFM handler picks it up if ((encoding == 0x03) && (format == 0x02)) - { return 0; - } return (size == 0x54+tsize+dsize && h[0] < 64 && h[0x52] == 1 && h[0x53] == 0) ? FIFID_STRUCT : 0; } bool dc42_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint8_t h[0x54]; - io.read_at(0, h, 0x54, actual); + read_at(io, 0, h, 0x54); // FIXME: check for errors and premature EOF int dsize = get_u32be(&h[0x40]); int tsize = get_u32be(&h[0x44]); @@ -218,14 +217,14 @@ sectors[si].sector = i; sectors[si].info = format; if(tsize) { - io.read_at(pos_tag, data, 12, actual); + read_at(io, pos_tag, data, 12); // FIXME: check for errors and premature EOF sectors[si].tag = data; pos_tag += 12; } else { sectors[si].tag = nullptr; } sectors[si].data = data+12; - io.read_at(pos_data, data+12, 512, actual); + read_at(io, pos_data, data+12, 512); // FIXME: check for errors and premature EOF pos_data += 512; si = (si + 2) % ns; if(si == 0) @@ -279,9 +278,8 @@ for(unsigned int i=0; i < sectors.size(); i++) { auto &sdata = sectors[i]; sdata.resize(512+12); - size_t actual; - io.write_at(pos_tag, &sdata[0], 12, actual); - io.write_at(pos_data, &sdata[12], 512, actual); + write_at(io, pos_tag, &sdata[0], 12); // FIXME: check for errors + write_at(io, pos_data, &sdata[12], 512); // FIXME: check for errors pos_tag += 12; pos_data += 512; if(track || head || i) @@ -294,8 +292,7 @@ put_u32be(&h[0x48], dchk); put_u32be(&h[0x4c], tchk); - size_t actual; - io.write_at(0, h, 0x54, actual); + write_at(io, 0, h, 0x54); // FIXME: check for errors return true; } @@ -340,14 +337,13 @@ bool apple_gcr_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; desc_gcr_sector sectors[12]; uint8_t sdata[512*12]; int pos_data = 0; uint8_t header[64]; - io.read_at(0, header, 64, actual); + read_at(io, 0, header, 64); // FIXME: check for errors and premature EOF uint64_t size; if(io.length(size)) @@ -361,7 +357,7 @@ for(int track=0; track < 80; track++) { for(int head=0; head < head_count; head++) { int ns = 12 - (track/16); - io.read_at(pos_data, sdata, 512*ns, actual); + read_at(io, pos_data, sdata, 512*ns); // FIXME: check for errors and premature EOF pos_data += 512*ns; int si = 0; @@ -398,8 +394,7 @@ for(unsigned int i=0; i < sectors.size(); i++) { auto &sdata = sectors[i]; sdata.resize(512+12); - size_t actual; - io.write_at(pos_data, &sdata[12], 512, actual); + /*auto const [err, actual] =*/ write_at(io, pos_data, &sdata[12], 512); // FIXME: check for errors pos_data += 512; } } @@ -438,15 +433,19 @@ int apple_2mg_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t signature[4]; - size_t actual; - io.read_at(0, signature, 4, actual); - if (!strncmp(reinterpret_cast(signature), "2IMG", 4)) + auto const [err, actual] = read_at(io, 0, signature, 4); + if (err || (4 != actual)) + { + return 0; + } + + if (!memcmp(signature, "2IMG", 4)) { return FIFID_SIGN; } // Bernie ][ The Rescue wrote 2MGs with the signature byte-flipped, other fields are valid - if (!strncmp(reinterpret_cast(signature), "GMI2", 4)) + if (!memcmp(signature, "GMI2", 4)) { return FIFID_SIGN; } @@ -456,10 +455,9 @@ bool apple_2mg_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; desc_gcr_sector sectors[12]; uint8_t sdata[512*12], header[64]; - io.read_at(0, header, 64, actual); + read_at(io, 0, header, 64); // FIXME: check for errors and premature EOF uint32_t blocks = get_u32le(&header[0x14]); uint32_t pos_data = get_u32le(&header[0x18]); @@ -471,7 +469,7 @@ for(int track=0; track < 80; track++) { for(int head=0; head < 2; head++) { int ns = 12 - (track/16); - io.read_at(pos_data, sdata, 512*ns, actual); + read_at(io, pos_data, sdata, 512*ns); // FIXME: check for errors and premature EOF pos_data += 512*ns; int si = 0; @@ -494,8 +492,6 @@ bool apple_2mg_format::save(util::random_read_write &io, const std::vector &variants, const floppy_image &image) const { - size_t actual; - uint8_t header[0x40]; int pos_data = 0x40; @@ -516,7 +512,7 @@ header[0x18] = 0x40; // bytes of disk data header[0x1c] = 0x00; header[0x1d] = 0x80; header[0x1e] = 0x0c; // 0xC8000 (819200) - io.write_at(0, header, 0x40, actual); + write_at(io, 0, header, 0x40); // FIXME: check for errors for(int track=0; track < 80; track++) { for(int head=0; head < 2; head++) { @@ -524,7 +520,7 @@ for(unsigned int i=0; i < sectors.size(); i++) { auto &sdata = sectors[i]; sdata.resize(512+12); - io.write_at(pos_data, &sdata[12], 512, actual); + write_at(io, pos_data, &sdata[12], 512); // FIXME: check for errors pos_data += 512; } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/apd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/apd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/apd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/apd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -101,8 +101,9 @@ return 0; std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return 0; int err; std::vector gz_ptr(8); @@ -126,7 +127,7 @@ err = inflateEnd(&d_stream); if (err != Z_OK) return 0; - img = gz_ptr; + img = std::move(gz_ptr); } if (!memcmp(&img[0], APD_HEADER, sizeof(APD_HEADER))) { @@ -143,8 +144,9 @@ return false; std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return false; int err; std::vector gz_ptr; diff -Nru mame-0.263+dfsg.1/src/lib/formats/apridisk.cpp mame-0.264+dfsg.1/src/lib/formats/apridisk.cpp --- mame-0.263+dfsg.1/src/lib/formats/apridisk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/apridisk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -38,8 +38,9 @@ int apridisk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[APR_HEADER_SIZE]; - size_t actual; - io.read_at(0, header, APR_HEADER_SIZE, actual); + auto const [err, actual] = read_at(io, 0, header, APR_HEADER_SIZE); + if (err || (APR_HEADER_SIZE != actual)) + return 0; const char magic[] = "ACT Apricot disk image\x1a\x04"; @@ -64,11 +65,9 @@ while (file_offset < file_size) { - size_t actual; - // read sector header uint8_t sector_header[16]; - io.read_at(file_offset, sector_header, 16, actual); + read_at(io, file_offset, sector_header, 16); // FIXME: check for errors and premature EOF uint32_t type = get_u32le(§or_header[0]); uint16_t compression = get_u16le(§or_header[4]); @@ -103,7 +102,7 @@ case APR_COMPRESSED: { uint8_t comp[3]; - io.read_at(file_offset, comp, 3, actual); + read_at(io, file_offset, comp, 3); // FIXME: check for errors and premature EOF uint16_t length = get_u16le(&comp[0]); if (length != SECTOR_SIZE) @@ -117,7 +116,7 @@ break; case APR_UNCOMPRESSED: - io.read_at(file_offset, data_ptr, SECTOR_SIZE, actual); + read_at(io, file_offset, data_ptr, SECTOR_SIZE); // FIXME: check for errors and premature EOF break; default: diff -Nru mame-0.263+dfsg.1/src/lib/formats/as_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/as_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/as_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/as_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,55 +4,17 @@ // Applesauce solved output formats #include "as_dsk.h" + #include "ioprocs.h" +#include "multibyte.h" #include -as_format::as_format() : floppy_image_format_t() -{ -} -uint32_t as_format::find_tag(const std::vector &data, uint32_t tag) -{ - uint32_t offset = 12; - do { - if(r32(data, offset) == tag) - return offset + 8; - offset += r32(data, offset+4) + 8; - } while(offset < data.size() - 8); - return 0; -} +namespace { -uint32_t as_format::r32(const std::vector &data, uint32_t offset) -{ - return data[offset] | (data[offset+1] << 8) | (data[offset+2] << 16) | (data[offset+3] << 24); -} - -uint16_t as_format::r16(const std::vector &data, uint32_t offset) -{ - return data[offset] | (data[offset+1] << 8); -} - -void as_format::w32(std::vector &data, int offset, uint32_t value) -{ - data[offset] = value; - data[offset+1] = value >> 8; - data[offset+2] = value >> 16; - data[offset+3] = value >> 24; -} - -void as_format::w16(std::vector &data, int offset, uint16_t value) -{ - data[offset] = value; - data[offset+1] = value >> 8; -} - -uint8_t as_format::r8(const std::vector &data, uint32_t offset) -{ - return data[offset]; -} - -uint32_t as_format::crc32r(const uint8_t *data, uint32_t size) +template +uint32_t crc32r(T &&data, uint32_t size) { // Reversed crc32 uint32_t crc = 0xffffffff; @@ -67,15 +29,35 @@ return ~crc; } -bool as_format::load_bitstream_track(const std::vector &img, floppy_image &image, int head, int track, int subtrack, uint8_t idx, uint32_t off_trks, bool may_be_short, bool set_variant) +template +uint32_t find_tag(T &&data, size_t size, uint32_t tag) +{ + uint32_t offset = 12; + do { + if(get_u32le(&data[offset]) == tag) + return offset + 8; + offset += get_u32le(&data[offset+4]) + 8; + } while(offset < (size - 8)); + return 0; +} + +} // anonymous namespace + + +as_format::as_format() : floppy_image_format_t() +{ +} + + +bool as_format::load_bitstream_track(const uint8_t *img, floppy_image &image, int head, int track, int subtrack, uint8_t idx, uint32_t off_trks, bool may_be_short, bool set_variant) { uint32_t trks_off = off_trks + (idx * 8); - uint32_t track_size = r32(img, trks_off + 4); + uint32_t track_size = get_u32le(&img[trks_off + 4]); if (track_size == 0) return false; - uint32_t boff = (uint32_t)r16(img, trks_off + 0) * 512; + uint32_t boff = (uint32_t)get_u16le(&img[trks_off + 0]) * 512; // With 5.25 floppies the end-of-track may be missing // if unformatted. Accept track length down to 95% of @@ -92,15 +74,15 @@ generate_track_from_bitstream(track, head, &img[boff], track_size, image, subtrack, 0xffff); if(set_variant) - image.set_variant(r32(img, trks_off + 4) >= 90000 ? floppy_image::DSHD : floppy_image::DSDD); + image.set_variant(get_u32le(&img[trks_off + 4]) >= 90000 ? floppy_image::DSHD : floppy_image::DSDD); return true; } -void as_format::load_flux_track(const std::vector &img, floppy_image &image, int head, int track, int subtrack, uint8_t fidx, uint32_t off_trks) +void as_format::load_flux_track(const uint8_t *img, floppy_image &image, int head, int track, int subtrack, uint8_t fidx, uint32_t off_trks) { uint32_t trks_off = off_trks + (fidx * 8); - uint32_t boff = (uint32_t)r16(img, trks_off + 0) * 512; - uint32_t track_size = r32(img, trks_off + 4); + uint32_t boff = (uint32_t)get_u16le(&img[trks_off + 0]) * 512; + uint32_t track_size = get_u32le(&img[trks_off + 4]); uint32_t total_ticks = 0; for(uint32_t i=0; i != track_size; i++) @@ -239,13 +221,13 @@ void as_format::save_tracks(std::vector &data, const std::vector &tracks, uint32_t total_blocks, bool has_flux) { - w32(data, 80, 0x50414D54); // TMAP - w32(data, 84, 160); // size + put_u32le(&data[80], 0x50414d54); // TMAP + put_u32le(&data[84], 160); // size uint32_t fstart = 1536 + total_blocks*512; if(has_flux) { - w32(data, fstart, 0x58554c46); - w32(data, fstart+4, 160); + put_u32le(&data[fstart], 0x58554c46); + put_u32le(&data[fstart+4], 160); fstart += 8; } @@ -264,8 +246,8 @@ } } - w32(data, 248, 0x534B5254); // TRKS - w32(data, 252, 1280 + total_blocks*512); // size + put_u32le(&data[248], 0x534b5254); // TRKS + put_u32le(&data[252], 1280 + total_blocks*512); // size uint8_t tid = 0; uint16_t tb = 3; @@ -274,14 +256,14 @@ int size = tracks[i].data.size(); int blocks = (size + 511) / 512; memcpy(data.data() + tb*512, tracks[i].data.data(), size); - w16(data, 256 + tid*8, tb); - w16(data, 256 + tid*8 + 2, blocks); - w32(data, 256 + tid*8 + 4, tracks[i].track_size); + put_u16le(&data[256 + tid*8], tb); + put_u16le(&data[256 + tid*8 + 2], blocks); + put_u32le(&data[256 + tid*8 + 4], tracks[i].track_size); tb += blocks; tid ++; } - w32(data, 8, crc32r(&data[12], data.size() - 12)); + put_u32le(&data[8], crc32r(&data[12], data.size() - 12)); } @@ -316,10 +298,10 @@ int woz_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[8]; - size_t actual; - io.read_at(0, header, 8, actual); - if (!memcmp(header, signature, 8)) return FIFID_SIGN; - if (!memcmp(header, signature2, 8)) return FIFID_SIGN; + auto const [err, actual] = read_at(io, 0, header, 8); + if(err || (8 != actual)) return 0; + if(!memcmp(header, signature, 8)) return FIFID_SIGN; + if(!memcmp(header, signature2, 8)) return FIFID_SIGN; return 0; } @@ -328,9 +310,9 @@ uint64_t image_size; if(io.length(image_size)) return false; - std::vector img(image_size); - size_t actual; - io.read_at(0, &img[0], img.size(), actual); + auto const [err, img, actual] = read_at(io, 0, image_size); + if(err || (actual != image_size)) + return false; // Check signature if((memcmp(&img[0], signature, 8)) && (memcmp(&img[0], signature2, 8))) @@ -340,29 +322,29 @@ if(!memcmp(&img[0], signature2, 8)) woz_vers = 2; // Check integrity - uint32_t crc = crc32r(&img[12], img.size() - 12); - if(crc != r32(img, 8)) + uint32_t crc = crc32r(&img[12], image_size - 12); + if(crc != get_u32le(&img[8])) return false; - uint32_t off_info = find_tag(img, 0x4f464e49); - uint32_t off_tmap = find_tag(img, 0x50414d54); - uint32_t off_trks = find_tag(img, 0x534b5254); -// uint32_t off_writ = find_tag(img, 0x54495257); + uint32_t off_info = find_tag(img, image_size, 0x4f464e49); + uint32_t off_tmap = find_tag(img, image_size, 0x50414d54); + uint32_t off_trks = find_tag(img, image_size, 0x534b5254); +// uint32_t off_writ = find_tag(img, image_size, 0x54495257); if(!off_info || !off_tmap || !off_trks) return false; - uint32_t info_vers = r8(img, off_info + 0); + uint32_t info_vers = img[off_info + 0]; if(info_vers < 1 || info_vers > 3) return false; - uint16_t off_flux = info_vers < 3 ? 0 : r16(img, off_info + 46); - uint16_t flux_size = info_vers < 3 ? 0 : r16(img, off_info + 48); + uint16_t off_flux = (info_vers < 3) ? 0 : get_u16le(&img[off_info + 46]); + uint16_t flux_size = (info_vers < 3) ? 0 : get_u16le(&img[off_info + 48]); if(!flux_size) off_flux = 0; - bool is_35 = r8(img, off_info + 1) == 2; + bool is_35 = img[off_info + 1] == 2; if((form_factor == floppy_image::FF_35 && !is_35) || (form_factor == floppy_image::FF_525 && is_35)) return false; @@ -374,36 +356,36 @@ else image.set_form_variant(floppy_image::FF_525, floppy_image::SSSD); - if (woz_vers == 1) { + if(woz_vers == 1) { for (unsigned int trkid = 0; trkid != limit; trkid++) { int head = is_35 && trkid >= 80 ? 1 : 0; int track = is_35 ? trkid % 80 : trkid / 4; int subtrack = is_35 ? 0 : trkid & 3; - uint8_t idx = r8(img, off_tmap + trkid); + uint8_t idx = img[off_tmap + trkid]; if(idx != 0xff) { uint32_t boff = off_trks + 6656*idx; - if (r16(img, boff + 6648) == 0) + if (get_u16le(&img[boff + 6648]) == 0) return false; - generate_track_from_bitstream(track, head, &img[boff], r16(img, boff + 6648), image, subtrack, r16(img, boff + 6650)); + generate_track_from_bitstream(track, head, &img[boff], get_u16le(&img[boff + 6648]), image, subtrack, get_u16le(&img[boff + 6650])); if(is_35 && !track && head) image.set_variant(floppy_image::DSDD); } } - } else if (woz_vers == 2) { + } else if(woz_vers == 2) { for (unsigned int trkid = 0; trkid != limit; trkid++) { int head = is_35 && trkid & 1 ? 1 : 0; int track = is_35 ? trkid >> 1 : trkid / 4; int subtrack = is_35 ? 0 : trkid & 3; - uint8_t idx = r8(img, off_tmap + trkid); - uint8_t fidx = off_flux ? r8(img, off_flux*512 + 8 + trkid) : 0xff; + uint8_t idx = img[off_tmap + trkid]; + uint8_t fidx = off_flux ? img[off_flux*512 + 8 + trkid] : 0xff; - if(fidx != 0xff) - load_flux_track(img, image, head, track, subtrack, fidx, off_trks); + if(fidx != 0xff) { + load_flux_track(&img[0], image, head, track, subtrack, fidx, off_trks); - else if(idx != 0xff) { - if(!load_bitstream_track(img, image, head, track, subtrack, idx, off_trks, !is_35, is_35 && !track && head)) + } else if(idx != 0xff) { + if(!load_bitstream_track(&img[0], image, head, track, subtrack, idx, off_trks, !is_35, is_35 && !track && head)) return false; } } @@ -445,31 +427,30 @@ memcpy(&data[0], signature2, 8); - w32(data, 12, 0x4F464E49); // INFO - w32(data, 16, 60); // size - data[20] = 3; // chunk version + put_u32le(&data[12], 0x4f464e49); // INFO + put_u32le(&data[16], 60); // size + data[20] = 3; // chunk version data[21] = image.get_form_factor() == floppy_image::FF_525 ? 1 : 2; - data[22] = 0; // not write protected - data[23] = 1; // synchronized, since our internal format is - data[24] = 1; // weak bits are generated, not stored + data[22] = 0; // not write protected + data[23] = 1; // synchronized, since our internal format is + data[24] = 1; // weak bits are generated, not stored data[25] = 'M'; data[26] = 'A'; data[27] = 'M'; data[28] = 'E'; memset(&data[29], ' ', 32-4); data[57] = twosided ? 2 : 1; - data[58] = 0; // boot sector unknown + data[58] = 0; // boot sector unknown data[59] = image.get_form_factor() == floppy_image::FF_525 ? 32 : image.get_variant() == floppy_image::DSHD ? 8 : 16; - w16(data, 60, 0); // compatibility unknown - w16(data, 62, 0); // needed ram unknown - w16(data, 64, max_blocks); - w16(data, 66, has_flux ? total_blocks+3 : 0); - w16(data, 68, max_blocks); + put_u16le(&data[60], 0); // compatibility unknown + put_u16le(&data[62], 0); // needed RAM unknown + put_u16le(&data[64], max_blocks); + put_u16le(&data[66], has_flux ? total_blocks+3 : 0); + put_u16le(&data[68], max_blocks); save_tracks(data, tracks, total_blocks, has_flux); - size_t actual; - io.write_at(0, data.data(), data.size(), actual); + /*auto const [err, actual] =*/ write_at(io, 0, data.data(), data.size()); // FIXME: check for errors return true; } @@ -505,9 +486,9 @@ int moof_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[8]; - size_t actual; - io.read_at(0, header, 8, actual); - if (!memcmp(header, signature, 8)) return FIFID_SIGN; + auto const [err, actual] = read_at(io, 0, header, 8); + if(err || (8 != actual)) return 0; + if(!memcmp(header, signature, 8)) return FIFID_SIGN; return 0; } @@ -516,37 +497,37 @@ uint64_t image_size; if(io.length(image_size)) return false; - std::vector img(image_size); - size_t actual; - io.read_at(0, &img[0], img.size(), actual); + auto const [err, img, actual] = read_at(io, 0, image_size); + if(err || (actual != image_size)) + return false; // Check signature if(memcmp(&img[0], signature, 8)) return false; // Check integrity - uint32_t crc = crc32r(&img[12], img.size() - 12); - if(crc != r32(img, 8)) + uint32_t crc = crc32r(&img[12], image_size - 12); + if(crc != get_u32le(&img[8])) return false; - uint32_t off_info = find_tag(img, 0x4f464e49); - uint32_t off_tmap = find_tag(img, 0x50414d54); - uint32_t off_trks = find_tag(img, 0x534b5254); + uint32_t off_info = find_tag(img, image_size, 0x4f464e49); + uint32_t off_tmap = find_tag(img, image_size, 0x50414d54); + uint32_t off_trks = find_tag(img, image_size, 0x534b5254); if(!off_info || !off_tmap || !off_trks) return false; - uint32_t info_vers = r8(img, off_info + 0); + uint32_t info_vers = img[off_info + 0]; if(info_vers != 1) return false; - uint16_t off_flux = r16(img, off_info + 40); - uint16_t flux_size = r16(img, off_info + 42); + uint16_t off_flux = get_u16le(&img[off_info + 40]); + uint16_t flux_size = get_u16le(&img[off_info + 42]); if(!flux_size) off_flux = 0; - switch(r8(img, off_info + 1)) { + switch(img[off_info + 1]) { case 1: image.set_form_variant(floppy_image::FF_35, floppy_image::SSDD); break; @@ -564,14 +545,14 @@ int head = trkid & 1; int track = trkid >> 1; - uint8_t idx = r8(img, off_tmap + trkid); - uint8_t fidx = off_flux ? r8(img, off_flux*512 + 8 + trkid) : 0xff; + uint8_t idx = img[off_tmap + trkid]; + uint8_t fidx = off_flux ? img[off_flux*512 + 8 + trkid] : 0xff; - if(fidx != 0xff) - load_flux_track(img, image, head, track, 0, fidx, off_trks); + if(fidx != 0xff) { + load_flux_track(&img[0], image, head, track, 0, fidx, off_trks); - else if(idx != 0xff) { - if(!load_bitstream_track(img, image, head, track, 0, idx, off_trks, false, false)) + } else if(idx != 0xff) { + if(!load_bitstream_track(&img[0], image, head, track, 0, idx, off_trks, false, false)) return false; } } @@ -606,27 +587,26 @@ memcpy(&data[0], signature, 8); - w32(data, 12, 0x4F464E49); // INFO - w32(data, 16, 60); // size - data[20] = 1; // chunk version + put_u32le(&data[12], 0x4f464e49); // INFO + put_u32le(&data[16], 60); // size + data[20] = 1; // chunk version data[21] = is_hd ? 3 : twosided ? 2 : 1; // variant - data[22] = 0; // not write protected - data[23] = 1; // synchronized, since our internal format is - data[24] = is_hd ? 8 : 16; // optimal timing + data[22] = 0; // not write protected + data[23] = 1; // synchronized, since our internal format is + data[24] = is_hd ? 8 : 16; // optimal timing data[25] = 'M'; data[26] = 'A'; data[27] = 'M'; data[28] = 'E'; memset(&data[29], ' ', 32-4); - data[57] = 0; // pad - w16(data, 58, max_blocks); - w16(data, 60, has_flux ? total_blocks+3 : 0); - w16(data, 62, max_blocks); + data[57] = 0; // pad + put_u16le(&data[58], max_blocks); + put_u16le(&data[60], has_flux ? total_blocks+3 : 0); + put_u16le(&data[62], max_blocks); save_tracks(data, tracks, total_blocks, has_flux); - size_t actual; - io.write_at(0, data.data(), data.size(), actual); + /*auto const [err, actual] =*/ write_at(io, 0, data.data(), data.size()); // FIXME: check for errors return true; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/as_dsk.h mame-0.264+dfsg.1/src/lib/formats/as_dsk.h --- mame-0.263+dfsg.1/src/lib/formats/as_dsk.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/as_dsk.h 2024-03-25 14:00:46.000000000 +0000 @@ -23,16 +23,8 @@ bool flux = false; }; - static uint32_t r32(const std::vector &data, uint32_t offset); - static uint16_t r16(const std::vector &data, uint32_t offset); - static uint8_t r8(const std::vector &data, uint32_t offset); - static void w32(std::vector &data, int offset, uint32_t value); - static void w16(std::vector &data, int offset, uint16_t value); - static uint32_t crc32r(const uint8_t *data, uint32_t size); - static uint32_t find_tag(const std::vector &data, uint32_t tag); - - static bool load_bitstream_track(const std::vector &img, floppy_image &image, int head, int track, int subtrack, uint8_t idx, uint32_t off_trks, bool may_be_short, bool set_variant); - static void load_flux_track(const std::vector &img, floppy_image &image, int head, int track, int subtrack, uint8_t fidx, uint32_t off_trks); + static bool load_bitstream_track(const uint8_t *img, floppy_image &image, int head, int track, int subtrack, uint8_t idx, uint32_t off_trks, bool may_be_short, bool set_variant); + static void load_flux_track(const uint8_t *img, floppy_image &image, int head, int track, int subtrack, uint8_t fidx, uint32_t off_trks); static tdata analyze_for_save(const floppy_image &image, int head, int track, int subtrack, int speed_zone); static std::pair count_blocks(const std::vector &tracks); diff -Nru mame-0.263+dfsg.1/src/lib/formats/cassimg.cpp mame-0.264+dfsg.1/src/lib/formats/cassimg.cpp --- mame-0.263+dfsg.1/src/lib/formats/cassimg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/cassimg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -366,8 +366,7 @@ void cassette_image::image_read(void *buffer, uint64_t offset, size_t length) { - size_t actual; - m_io->read_at(offset, buffer, length, actual); + /*auto const [err, actual] =*/ read_at(*m_io, offset, buffer, length); // FIXME: check for errors and premature EOF } @@ -383,8 +382,7 @@ void cassette_image::image_write(const void *buffer, uint64_t offset, size_t length) { - size_t actual; - m_io->write_at(offset, buffer, length, actual); + /*auto const [err, actual] =*/ write_at(*m_io, offset, buffer, length); // FIXME: check for errors } diff -Nru mame-0.263+dfsg.1/src/lib/formats/cbm_crt.cpp mame-0.264+dfsg.1/src/lib/formats/cbm_crt.cpp --- mame-0.263+dfsg.1/src/lib/formats/cbm_crt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/cbm_crt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -46,6 +46,8 @@ #include "osdcore.h" // osd_printf_* +#include + //************************************************************************** // MACROS/CONSTANTS @@ -137,8 +139,7 @@ { // read the header cbm_crt_header header; - size_t actual; - std::error_condition err = file.read(&header, CRT_HEADER_LENGTH, actual); + auto const [err, actual] = read(file, &header, CRT_HEADER_LENGTH); if (!err && (CRT_HEADER_LENGTH == actual) && !memcmp(header.signature, CRT_SIGNATURE, 16)) { @@ -157,11 +158,13 @@ bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_size, int *exrom, int *game) { + std::error_condition err; size_t actual; // read the header cbm_crt_header header; - if (file.read(&header, CRT_HEADER_LENGTH, actual)) + std::tie(err, actual) = read(file, &header, CRT_HEADER_LENGTH); + if (err) return false; if ((CRT_HEADER_LENGTH != actual) || (memcmp(header.signature, CRT_SIGNATURE, 16) != 0)) @@ -184,7 +187,8 @@ while (!file.eof()) { cbm_crt_chip chip; - if (file.read(&chip, CRT_CHIP_LENGTH, actual) || (CRT_CHIP_LENGTH != actual)) + std::tie(err, actual) = read(file, &chip, CRT_CHIP_LENGTH); + if (err || (CRT_CHIP_LENGTH != actual)) return false; const uint16_t address = get_u16be(chip.start_address); @@ -228,21 +232,22 @@ while (!file.eof()) { + std::error_condition err; size_t actual; cbm_crt_chip chip; - if (file.read(&chip, CRT_CHIP_LENGTH, actual) || (CRT_CHIP_LENGTH != actual)) + std::tie(err, actual) = read(file, &chip, CRT_CHIP_LENGTH); + if (err || (CRT_CHIP_LENGTH != actual)) return false; const uint16_t address = get_u16be(chip.start_address); const uint16_t size = get_u16be(chip.image_size); - std::error_condition err; switch (address) { - case 0x8000: err = file.read(roml + roml_offset, size, actual); roml_offset += size; break; - case 0xa000: err = file.read(romh + romh_offset, size, actual); romh_offset += size; break; - case 0xe000: err = file.read(romh + romh_offset, size, actual); romh_offset += size; break; + case 0x8000: std::tie(err, actual) = read(file, roml + roml_offset, size); roml_offset += size; break; + case 0xa000: std::tie(err, actual) = read(file, romh + romh_offset, size); romh_offset += size; break; + case 0xe000: std::tie(err, actual) = read(file, romh + romh_offset, size); romh_offset += size; break; // FIXME: surely one needs to report an error or skip over the data if the load address is not recognised? } if (err) // TODO: check size - all bets are off if the address isn't recognised anyway diff -Nru mame-0.263+dfsg.1/src/lib/formats/ccvf_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ccvf_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ccvf_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ccvf_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -50,8 +50,10 @@ int ccvf_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { char h[36]; - size_t actual; - io.read_at(0, h, 36, actual); + auto const [err, actual] = read_at(io, 0, h, 36); + if (err || (36 != actual)) + return 0; + if (!memcmp(h, "Compucolor Virtual Floppy Disk Image", 36)) return FIFID_SIGN; @@ -96,9 +98,9 @@ if (io.length(size)) return false; - std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto [err, img, actual] = read_at(io, 0, size); + if (err || (actual != size)) + return false; std::string ccvf = std::string((const char *)&img[0], size); std::vector bytes(78720); diff -Nru mame-0.263+dfsg.1/src/lib/formats/concept_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/concept_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/concept_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/concept_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,7 @@ int track_size = sector_count*512; for (int track=0; track < track_count; track++) { for (int head=0; head < head_count; head++) { - size_t actual; - io.read_at((track*head_count + head) * track_size, sectdata, track_size, actual); + /*auto const [err, acutal] =*/ read_at(io, (track*head_count + head) * track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(cc_9_desc, track, head, sectors, sector_count, 100000, image); } } @@ -146,8 +145,7 @@ for (int track=0; track < track_count; track++) { for (int head=0; head < head_count; head++) { get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata); - size_t actual; - io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/coupedsk.cpp mame-0.264+dfsg.1/src/lib/formats/coupedsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/coupedsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/coupedsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -94,8 +94,7 @@ int track_size = sector_count*512; for(int head=0; head < 2; head++) { for(int track=0; track < 80; track++) { - size_t actual; - io.read_at((track*2+head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track*2+head)*track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(desc_10, track, head, sectors, sector_count+1, 100000, image); } } @@ -120,8 +119,7 @@ for(int head=0; head < 2; head++) { for(int track=0; track < 80; track++) { get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata); - size_t actual; - io.write_at((track*2+head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, (track*2+head)*track_size, sectdata, track_size); // FIXME: check for errors } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/cp68_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/cp68_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/cp68_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/cp68_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -51,6 +51,9 @@ #include "ioprocs.h" +#include + + namespace { class cp68_formats : public wd177x_format @@ -115,8 +118,8 @@ std::error_condition ec; // Look at the boot sector. - ec = io.read_at(128 * 0, &boot0, sizeof(boot0), actual); - if (ec || actual == 0) + std::tie(ec, actual) = read_at(io, 128 * 0, &boot0, sizeof(boot0)); + if (ec || actual == 0) // FIXME: what's the actual minimum size boot sector to probe? return -1; uint8_t boot0_sector_id = 1; // uint8_t boot1_sector_id = 2; @@ -125,8 +128,7 @@ // set the numbering of the first two sectors. If this is shown to not // be practical in some common cases then a separate format variant // might be needed. - if (boot0[0] == 0xbd && boot0[3] == 0x86) - { + if (boot0[0] == 0xbd && boot0[3] == 0x86) { // Found a 6800 jsr and ldaa, looks like a CP68 6800 boot sector. boot0_sector_id = 0; } @@ -135,8 +137,8 @@ const format &f = cp68_formats::formats[i]; // Look at the system information sector. - ec = io.read_at(f.sector_base_size * 2, &info, sizeof(struct cp68_formats::sysinfo_sector_cp68), actual); - if (ec || actual == 0) + std::tie(ec, actual) = read_at(io, f.sector_base_size * 2, &info, sizeof(struct cp68_formats::sysinfo_sector_cp68)); + if (ec || actual == 0) // FIXME: what's the actual minimum sector size? continue; LOG_FORMATS("CP68 floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / f.sector_base_size, (uint32_t)size % f.sector_base_size, form_factor); diff -Nru mame-0.263+dfsg.1/src/lib/formats/cqm_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/cqm_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/cqm_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/cqm_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -258,8 +258,9 @@ int cqm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[3]; - size_t actual; - io.read_at(0, h, 3, actual); + auto const [err, actual] = read_at(io, 0, h, 3); + if (err || (3 != actual)) + return 0; if (h[0] == 'C' && h[1] == 'Q' && h[2] == 0x14) return FIFID_SIGN; @@ -269,11 +270,10 @@ bool cqm_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; const int max_size = 4*1024*1024; // 4MB ought to be large enough for any floppy std::vector imagebuf(max_size); uint8_t header[CQM_HEADER_SIZE]; - io.read_at(0, header, CQM_HEADER_SIZE, actual); + read_at(io, 0, header, CQM_HEADER_SIZE); // FIXME: check for errors and premature EOF int sector_size = get_u16le(&header[0x03]); int sector_per_track = get_u16le(&header[0x10]); @@ -317,8 +317,9 @@ uint64_t cqm_size; if (io.length(cqm_size)) return false; - std::vector cqmbuf(cqm_size); - io.read_at(0, &cqmbuf[0], cqm_size, actual); + auto const [err, cqmbuf, actual] = read_at(io, 0, cqm_size); + if (err || (actual != cqm_size)) + return false; // decode the RLE data for (int s = 0, pos = CQM_HEADER_SIZE + comment_size; pos < cqm_size; ) diff -Nru mame-0.263+dfsg.1/src/lib/formats/d64_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/d64_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/d64_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/d64_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -127,8 +127,7 @@ void d64_format::get_disk_id(const format &f, util::random_read &io, uint8_t &id1, uint8_t &id2) const { uint8_t id[2]; - size_t actual; - io.read_at(get_disk_id_offset(f), id, 2, actual); + /*auto const [err, actual] =*/ read_at(io, get_disk_id_offset(f), id, 2); // FIXME: check for errors and premature EOF id1 = id[0]; id2 = id[1]; } @@ -238,8 +237,7 @@ img.resize(size); } - size_t actual; - io.read_at(0, &img[0], size, actual); + /*auto const [err, actual] =*/ read_at(io, 0, &img[0], size); // FIXME: check for errors and premature EOF int track_offset = 0, error_offset = f.sector_count*f.sector_base_size; @@ -294,8 +292,7 @@ build_sector_description(f, sectdata, 0, 0, sectors, sector_count); extract_sectors(image, f, sectors, track, head, sector_count); - size_t actual; - io.write_at(offset, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, offset, sectdata, track_size); // FIXME: check for errors } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/d88_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/d88_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/d88_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/d88_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -35,6 +35,8 @@ #include "ioprocs.h" #include "multibyte.h" +#include + #define D88_HEADER_LEN 0x2b0 @@ -411,9 +413,11 @@ return 0; uint8_t h[32]; - size_t actual; - io.read_at(0, h, 32, actual); - if((little_endianize_int32(*(uint32_t *)(h+0x1c)) == size) && + auto const [err, actual] = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return 0; + + if((get_u32le(h+0x1c) == size) && (h[0x1b] == 0x00 || h[0x1b] == 0x10 || h[0x1b] == 0x20 || h[0x1b] == 0x30 || h[0x1b] == 0x40)) return FIFID_SIZE|FIFID_STRUCT; @@ -422,10 +426,13 @@ bool d88_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; uint8_t h[32]; - io.read_at(0, h, 32, actual); + std::tie(err, actual) = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return false; int cell_count = 0; int track_count = 0; @@ -471,7 +478,7 @@ return false; uint32_t track_pos[164]; - io.read_at(32, track_pos, 164*4, actual); + std::tie(err, actual) = read_at(io, 32, track_pos, 164*4); // FIXME: check for errors and premature EOF uint64_t file_size; if(io.length(file_size)) @@ -493,7 +500,7 @@ return true; uint8_t hs[16]; - io.read_at(pos, hs, 16, actual); + std::tie(err, actual) = read_at(io, pos, hs, 16); // FIXME: check for errors and premature EOF pos += 16; uint16_t size = little_endianize_int16(*(uint16_t *)(hs+14)); @@ -520,7 +527,7 @@ if(size) { sects[i].data = sect_data + sdatapos; - io.read_at(pos, sects[i].data, size, actual); + std::tie(err, actual) = read_at(io, pos, sects[i].data, size); // FIXME: check for errors and premature EOF pos += size; sdatapos += size; diff -Nru mame-0.263+dfsg.1/src/lib/formats/dcp_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dcp_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dcp_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dcp_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -54,8 +54,7 @@ int heads, tracks, spt, bps, count_tracks = 0; bool is_hdb = false; - size_t actual; - io.read_at(0, h, 0xa2, actual); + /*auto const [err, actual] =*/ read_at(io, 0, h, 0xa2); // FIXME: check for errors and premature EOF // First byte is the disk format (see below in load() for details) switch (h[0]) @@ -119,12 +118,11 @@ bool dcp_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint8_t h[0xa2]; int heads, tracks, spt, bps; bool is_hdb = false; - io.read_at(0, h, 0xa2, actual); + /*auto const [err, actual] =*/ read_at(io, 0, h, 0xa2); // FIXME: check for errors and premature EOF // First byte is the disk format: switch (h[0]) @@ -221,7 +219,7 @@ for (int track = 0; track < tracks; track++) for (int head = 0; head < heads; head++) { - io.read_at(0xa2 + bps * spt * (track * heads + head), sect_data, bps * spt, actual); + /*auto const [err, actual] =*/ read_at(io, 0xa2 + bps * spt * (track * heads + head), sect_data, bps * spt); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { @@ -241,7 +239,7 @@ else // FIXME: the code below is untested, because no image was found... there might be some silly mistake in the disk geometry! { // Read Head 0 Track 0 is FM with 26 sectors of 128bytes instead of 256 - io.read_at(0xa2, sect_data, 128 * spt, actual); + /*auto const [err, actual] =*/ read_at(io, 0xa2, sect_data, 128 * spt); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { @@ -258,7 +256,7 @@ build_pc_track_fm(0, 0, image, cell_count, spt, sects, calc_default_pc_gap3_size(form_factor, 128)); // Read Head 1 Track 0 is MFM with 26 sectors of 256bytes - io.read_at(0xa2 + 128 * spt, sect_data, bps * spt, actual); + /*auto const [err, actual] =*/ read_at(io, 0xa2 + 128 * spt, sect_data, bps * spt); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { @@ -279,7 +277,7 @@ for (int track = 1; track < tracks; track++) for (int head = 0; head < heads; head++) { - io.read_at(data_offs + bps * spt * ((track - 1) * heads + head), sect_data, bps * spt, actual); + /*auto const [err, actual] =*/ read_at(io, data_offs + bps * spt * ((track - 1) * heads + head), sect_data, bps * spt); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { diff -Nru mame-0.263+dfsg.1/src/lib/formats/dfi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dfi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dfi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dfi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -18,6 +18,8 @@ #include "osdcore.h" // osd_printf_* +#include + #define NUMBER_OF_MULTIREADS 3 // thresholds for brickwall windowing @@ -63,16 +65,23 @@ int dfi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { char sign[4]; - size_t actual; - io.read_at(0, sign, 4, actual); + auto const [err, actual] = read_at(io, 0, sign, 4); + if(err || (4 != actual)) { + return 0; + } return memcmp(sign, "DFE2", 4) ? 0 : FIFID_SIGN; } bool dfi_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; + char sign[4]; - io.read_at(0, sign, 4, actual); + std::tie(err, actual) = read_at(io, 0, sign, 4); + if(err || (4 != actual)) { + return false; + } if(memcmp(sign, "DFER", 4) == 0) { osd_printf_error("dfi_dsk: Old type Discferret image detected; the MAME Discferret decoder will not handle this properly, bailing out!\n"); return false; @@ -89,7 +98,7 @@ [[maybe_unused]] int rpm=360; // drive rpm while(pos < size) { uint8_t h[10]; - io.read_at(pos, h, 10, actual); + std::tie(err, actual) = read_at(io, pos, h, 10); // FIXME: check for errors and premature EOF uint16_t track = get_u16be(&h[0]); uint16_t head = get_u16be(&h[2]); // Ignore sector @@ -105,7 +114,7 @@ data.resize(tsize); pos += 10; // skip the header, we already read it - io.read_at(pos, &data[0], tsize, actual); + std::tie(err, actual) = read_at(io, pos, &data[0], tsize); // FIXME: check for errors and premature EOF pos += tsize; // for next time we read, increment to the beginning of next header int index_time = 0; // what point the last index happened diff -Nru mame-0.263+dfsg.1/src/lib/formats/dim_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dim_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dim_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dim_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -13,6 +13,8 @@ #include "ioprocs.h" #include +#include + dim_format::dim_format() { @@ -36,9 +38,9 @@ int dim_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[16]; - - size_t actual; - io.read_at(0xab, h, 16, actual); + auto const [err, actual] = read_at(io, 0xab, h, 16); + if(err || (16 != actual)) + return 0; if(strncmp((const char *)h, "DIFC HEADER", 11) == 0) return FIFID_SIGN; @@ -48,13 +50,16 @@ bool dim_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; int offset = 0x100; uint8_t h; uint8_t track_total = 77; int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666; - io.read_at(0, &h, 1, actual); + std::tie(err, actual) = read_at(io, 0, &h, 1); + if (err || (1 != actual)) + return false; int spt, gap3, bps, size; switch(h) { @@ -114,7 +119,7 @@ sects[i].deleted = false; sects[i].bad_crc = false; sects[i].data = §_data[sdatapos]; - io.read_at(offset, sects[i].data, bps, actual); + std::tie(err, actual) = read_at(io, offset, sects[i].data, bps); // FIXME: check for errors and premature EOF offset += bps; sdatapos += bps; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/dip_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dip_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dip_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dip_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -72,8 +72,7 @@ for (int track = 0; track < tracks; track++) for (int head = 0; head < heads; head++) { - size_t actual; - io.read_at(0x100 + bps * spt * (track * heads + head), sect_data, bps * spt, actual); + /*auto const [err, actual] =*/ read_at(io, 0x100 + bps * spt * (track * heads + head), sect_data, bps * spt); // FIXME: check for errors and premature EOF for (int i = 0; i < spt; i++) { diff -Nru mame-0.263+dfsg.1/src/lib/formats/dmk_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dmk_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dmk_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dmk_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,7 +8,7 @@ TODO: - Add write/format support. -- Check support on other drivers besides msx. +- Check support on other drivers besides MSX. *********************************************************************/ @@ -18,14 +18,18 @@ #include "ioprocs.h" #include "multibyte.h" +#include + namespace { +constexpr int HEADER_SIZE = 16; + uint32_t wide_fm(uint16_t val) { uint32_t res = 0; for (int i = 15; i >= 0; i--) { - res |= (util::BIT(val, i) << (i*2 + 1)); + res |= (util::BIT(val, i) << (i * 2 + 1)); } return res; } @@ -34,7 +38,7 @@ { uint16_t res = 0xaaaa; // clock for (int i = 7; i >= 0; i--) { - res |= (util::BIT(val, i) << i*2); // data + res |= (util::BIT(val, i) << i * 2); // data } return wide_fm(res); } @@ -72,14 +76,17 @@ if (io.length(size)) return 0; - const int header_size = 16; - uint8_t header[header_size]; + std::error_condition err; size_t actual; - io.read_at(0, header, header_size, actual); - int tracks = header[1]; - int track_size = get_u16le(&header[2]); - int heads = (header[4] & 0x10) ? 1 : 2; + uint8_t header[HEADER_SIZE]; + std::tie(err, actual) = read_at(io, 0, header, HEADER_SIZE); + if (err || (HEADER_SIZE != actual)) + return 0; + + const int tracks_from_header = header[1]; + const int track_size = get_u16le(&header[2]); + const int heads = util::BIT(header[4], 4) ? 1 : 2; // The first header byte must be 00 or FF if (header[0] != 0x00 && header[0] != 0xff) @@ -87,66 +94,73 @@ return 0; } - // Bytes C-F must be zero - if (header[0x0c] != 0 || header[0xd] != 0 || header[0xe] != 0 || header[0xf] != 0) + // Verify reserved/unsupported header bytes + for (int i = 4; i < 0x10; i++) { - return 0; + if (header[i] != 0x00) + return 0; } // Check track size within limits - if (track_size < 0x80 || track_size > 0x3FFF ) - { + if (track_size < 0x80 || track_size > 0x3fff) return 0; - } - if (size == header_size + heads * tracks * track_size) + const int tracks_in_file = (size - HEADER_SIZE) / (heads * track_size); + for (int track = 0; track < tracks_in_file; track++) { - return FIFID_STRUCT|FIFID_SIZE; - } + for (int head = 0; head < heads; head++) + { + // Read track + std::vector track_data(track_size); + std::tie(err, actual) = read_at(io, HEADER_SIZE + (heads * track + head) * track_size, &track_data[0], track_size); + if (err || track_size != actual) + return 0; - return 0; + // Verify idam entries + for (int idam_index = 0; idam_index < 64; idam_index++) + { + const uint16_t idam_entry = get_u16le(&track_data[2 * idam_index]); + if (idam_entry == 0x0000) + continue; + const uint16_t idam_offset = idam_entry & 0x3fff; + if (idam_offset >= track_size) + return 0; + if (track_data[idam_offset] != 0xfe) + return 0; + } + } + } + if (size == HEADER_SIZE + heads * tracks_from_header * track_size) + return FIFID_HINT|FIFID_SIZE; + else + return FIFID_HINT; } bool dmk_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; - const int header_size = 16; - uint8_t header[header_size]; - io.read_at(0, header, header_size, actual); + uint64_t size; + if (io.length(size)) + return false; + + uint8_t header[HEADER_SIZE]; + std::tie(err, actual) = read_at(io, 0, header, HEADER_SIZE); + if (err || (HEADER_SIZE != actual)) + return false; - const int tracks = header[1]; const int track_size = get_u16le(&header[2]); - const int heads = (header[4] & 0x10) ? 1 : 2; - const bool is_sd = (header[4] & 0x40) ? true : false; + const int heads = util::BIT(header[4], 4) ? 1 : 2; + const bool is_sd = util::BIT(header[4], 6); + const int tracks = (size - HEADER_SIZE) / (heads * track_size); - auto variant = floppy_image::SSDD; - if (is_sd) - { - if (heads == 2) - { - variant = floppy_image::DSSD; - } - else - { - variant = floppy_image::SSSD; - } - } - else - { - if (heads == 2) - { - variant = floppy_image::DSDD; - } - else - { - variant = floppy_image::SSDD; - } - } + const auto variant = is_sd ? (heads == 2 ? floppy_image::DSSD : floppy_image::SSSD) + : (heads == 2 ? floppy_image::DSDD : floppy_image::SSDD); image.set_variant(variant); - int fm_stride = is_sd ? 1 : 2; + const int fm_stride = is_sd ? 1 : 2; for (int track = 0; track < tracks; track++) { @@ -155,15 +169,17 @@ int fm_loss = 0; std::vector track_data(track_size); std::vector raw_track_data; - int mark_location[64*2+1]; - uint8_t mark_value[64*2+1]; - bool mark_is_mfm[64*2+1]; + int mark_location[64 * 2 + 1]; + uint8_t mark_value[64 * 2 + 1]; + bool mark_is_mfm[64 * 2 + 1]; int iam_location = -1; // Read track - io.read_at(header_size + (heads * track + head) * track_size, &track_data[0], track_size, actual); + std::tie(err, actual) = read_at(io, HEADER_SIZE + (heads * track + head) * track_size, &track_data[0], track_size); + if (err || track_size != actual) + return false; - for (int i = 0; i < 64*2+1; i++) + for (int i = 0; i < 64 * 2 + 1; i++) { mark_location[i] = -1; mark_value[i] = 0xfe; @@ -174,10 +190,10 @@ // Find IDAM/DAM locations uint16_t track_header_offset = 0; uint16_t track_offset = get_u16le(&track_data[track_header_offset]) & 0x3fff; - bool idam_is_mfm = (track_data[track_header_offset + 1] & 0x80) ? true : false; + bool idam_is_mfm = util::BIT(track_data[track_header_offset + 1], 7); track_header_offset += 2; - while ( track_offset != 0 && track_offset >= 0x83 && track_offset < track_size && track_header_offset < 0x80 ) + while (track_offset != 0 && track_offset >= 0x83 && track_offset < track_size && track_header_offset < 0x80) { // Assume 3 bytes before IDAM pointers are the start of IDAM indicators int mark_offset = idam_is_mfm ? 3 : 0; @@ -188,11 +204,11 @@ int stride = idam_is_mfm ? 1 : fm_stride; // Scan for DAM location - for (int i = track_offset + 10*stride; i < track_offset + 53*stride; i++) + for (int i = track_offset + 10 * stride; i < track_offset + 53 * stride; i++) { if ((track_data[i] >= 0xf8 && track_data[i] <= 0xfb)) { - if (!idam_is_mfm || (track_data[i-1] == 0xa1 && track_data[i-2] == 0xa1)) + if (!idam_is_mfm || get_u16le(&track_data[i - 2]) == 0xa1a1) { mark_location[mark_count] = i - mark_offset; mark_value[mark_count] = track_data[i]; @@ -204,7 +220,7 @@ } } - idam_is_mfm = (track_data[track_header_offset + 1] & 0x80) ? true : false; + idam_is_mfm = util::BIT(track_data[track_header_offset + 1], 7); track_offset = get_u16le(&track_data[track_header_offset]) & 0x3fff; track_header_offset += 2; } @@ -216,10 +232,10 @@ } // Find IAM location - for(int i = mark_location[0] - 1; i >= 3; i--) + for (int i = mark_location[0] - 1; i >= 3; i--) { // It's usually 3 bytes but several dumped tracks seem to contain only 2 bytes - if (track_data[i] == 0xfc && (is_sd || (track_data[i-1] == 0xc2 && track_data[i-2] == 0xc2))) + if (track_data[i] == 0xfc && (is_sd || get_u16le(&track_data[i - 2]) == 0xc2c2)) { iam_location = i - (is_sd ? 0 : 3); break; diff -Nru mame-0.263+dfsg.1/src/lib/formats/ds9_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ds9_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ds9_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ds9_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,7 @@ { for (int head = 0; head < head_count; head++) { - size_t actual; - io.read_at((track * head_count + head) * track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track * head_count + head) * track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(ds9_desc, track, head, sectors, sector_count, 104000, image); } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/dsk_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/dsk_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/dsk_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/dsk_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -311,13 +311,14 @@ int dsk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[16]; - - size_t actual; - io.read_at(0, &header, sizeof(header), actual); - if ( memcmp( header, DSK_FORMAT_HEADER, 8 ) ==0) { + auto const [err, actual] = read_at(io, 0, &header, sizeof(header)); + if (err) { + return 0; + } + if ((8 <= actual) && !memcmp(header, DSK_FORMAT_HEADER, 8)) { return FIFID_SIGN; } - if ( memcmp( header, EXT_FORMAT_HEADER, 16 ) ==0) { + if ((16 <= actual) && !memcmp(header, EXT_FORMAT_HEADER, 16)) { return FIFID_SIGN; } return 0; @@ -356,8 +357,6 @@ bool dsk_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; - uint8_t header[0x100]; bool extendformat = false; @@ -365,7 +364,7 @@ if (io.length(image_size)) return false; - io.read_at(0, &header, sizeof(header), actual); + read_at(io, 0, &header, sizeof(header)); // FIXME: check for errors and premature EOF if ( memcmp( header, EXT_FORMAT_HEADER, 16 ) ==0) { extendformat = true; } @@ -431,7 +430,7 @@ if(track_offsets[(track<<1)+side] >= image_size) continue; track_header tr; - io.read_at(track_offsets[(track<<1)+side], &tr, sizeof(tr), actual); + read_at(io, track_offsets[(track<<1)+side], &tr, sizeof(tr)); // FIXME: check for errors and premature EOF // skip if there are no sectors in this track if (tr.number_of_sector == 0) @@ -441,7 +440,7 @@ int first_sector_code = -1; for(int j=0;j &variants) const { uint8_t h[7]; - size_t actual; - io.read_at(0, h, 7, actual); + auto const [err, actual] = read_at(io, 0, h, 7); // FIXME: should it really be reading six bytes? also check for premature EOF. + if (err) + return false; - if (strncmp((const char *)h, "VFD1.0", 6) == 0) + if (memcmp(h, "VFD1.0", 6) == 0) return FIFID_SIGN; return 0; @@ -92,8 +93,7 @@ for (int sect = 0; sect < 26; sect++) { // read sector map for this sector - size_t actual; - io.read_at(pos, hsec, 0x0c, actual); + /*auto const [err, actual] =*/ read_at(io, pos, hsec, 0x0c); // FIXME: check for errors and premature EOF pos += 0x0c; if (hsec[0] == 0xff) // unformatted/unused sector @@ -125,11 +125,10 @@ cur_sec_map = track * 26 + i; sector_size = 128 << sec_sizes[cur_sec_map]; - size_t actual; if (sec_offs[cur_sec_map] == 0xffffffff) memset(sect_data + cur_pos, fill_vals[cur_sec_map], sector_size); else - io.read_at(sec_offs[cur_sec_map], sect_data + cur_pos, sector_size, actual); + /*auto const [err, actual] =*/ read_at(io, sec_offs[cur_sec_map], sect_data + cur_pos, sector_size); // FIXME: check for errors and premature EOF sects[i].track = tracks[cur_sec_map]; sects[i].head = heads[cur_sec_map]; diff -Nru mame-0.263+dfsg.1/src/lib/formats/fdos_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/fdos_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/fdos_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/fdos_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,9 +39,12 @@ #include "fdos_dsk.h" #include "imageutl.h" -#include "multibyte.h" #include "ioprocs.h" +#include "multibyte.h" + +#include + namespace { @@ -116,7 +119,7 @@ // 00330 2403 DE OB RESTRT LDX PROGX // Should be $BD and $DE respectively // There could be additional variations - ec = io.read_at(0, &boot0, f.sector_base_size, actual); + std::tie(ec, actual) = read_at(io, 0, &boot0, f.sector_base_size); if (ec || actual != f.sector_base_size) return -1; if (boot0[0] != 0xbd && boot0[3] != 0xde) @@ -129,7 +132,7 @@ form_factor); // Directory entries start at Track 2 Sector 0 - ec = io.read_at(2 * f.sector_count * f.sector_base_size, &info, sizeof(struct fdos_formats::dirent_entry_fdos), actual); + std::tie(ec, actual) = read_at(io, 2 * f.sector_count * f.sector_base_size, &info, sizeof(struct fdos_formats::dirent_entry_fdos)); if (ec || actual != sizeof(struct fdos_formats::dirent_entry_fdos)) continue; diff -Nru mame-0.263+dfsg.1/src/lib/formats/flacfile.cpp mame-0.264+dfsg.1/src/lib/formats/flacfile.cpp --- mame-0.263+dfsg.1/src/lib/formats/flacfile.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/flacfile.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,10 +16,27 @@ #include -static constexpr int MAX_CHANNELS = 8; +namespace { +constexpr int MAX_CHANNELS = 8; -static cassette_image::error flacfile_identify(cassette_image *cassette, cassette_image::Options *opts) + +// Copied from cassimg.cpp; put somewhere central? +/********************************************************************* + helper code +*********************************************************************/ +constexpr double map_double(double d, uint64_t low, uint64_t high, uint64_t value) +{ + return d * (value - low) / (high - low); +} + +constexpr size_t waveform_bytes_per_sample(int waveform_flags) +{ + return size_t(1 << ((waveform_flags & 0x06) / 2)); +} + + +cassette_image::error flacfile_identify(cassette_image *cassette, cassette_image::Options *opts) { cassette->get_raw_cassette_image()->seek(0, SEEK_SET); flac_decoder decoder(*cassette->get_raw_cassette_image()); @@ -42,7 +59,7 @@ } -static cassette_image::error flacfile_load(cassette_image *cassette) +cassette_image::error flacfile_load(cassette_image *cassette) { cassette->get_raw_cassette_image()->seek(0, SEEK_SET); flac_decoder decoder(*cassette->get_raw_cassette_image()); @@ -73,10 +90,63 @@ } +cassette_image::error flacfile_save(cassette_image *cassette, const cassette_image::Info *info) +{ + if (info->channels > MAX_CHANNELS) + return cassette_image::error::INVALID_IMAGE; + + cassette->get_raw_cassette_image()->seek(0, SEEK_SET); + flac_encoder encoder; + encoder.set_num_channels(info->channels); + encoder.set_sample_rate(info->sample_frequency); + if (!encoder.reset(*cassette->get_raw_cassette_image())) + return cassette_image::error::INTERNAL; + + size_t samples_saved = 0; + int16_t buffer[MAX_CHANNELS][4096]; + int16_t *buffer_ptr[MAX_CHANNELS]; + const size_t bytes_per_sample = waveform_bytes_per_sample(cassette_image::WAVEFORM_16BIT); + const size_t sample_spacing = bytes_per_sample * info->channels; + const double sample_period = info->sample_count / (double) info->sample_frequency; + + for (int channel = 0; channel < MAX_CHANNELS; channel++) + { + buffer_ptr[channel] = &buffer[channel][0]; + } + + while (samples_saved < info->sample_count) + { + size_t chunk_sample_count = std::min(sizeof(buffer) / sample_spacing, (info->sample_count - samples_saved)); + double chunk_sample_period = map_double(sample_period, 0, info->sample_count, chunk_sample_count); + double chunk_time_index = map_double(sample_period, 0, info->sample_count, samples_saved); + + for (int channel = 0; channel < info->channels; channel++) + { + cassette_image::error err = cassette->get_samples(channel, chunk_time_index, chunk_sample_period, + chunk_sample_count, sample_spacing, &buffer[channel * bytes_per_sample], cassette_image::WAVEFORM_16BIT); + + if (err != cassette_image::error::SUCCESS) + return err; + } + + if (!encoder.encode(buffer_ptr, chunk_sample_count)) + return cassette_image::error::INTERNAL; + + samples_saved += chunk_sample_count; + } + + encoder.finish(); + + return cassette_image::error::SUCCESS; +} + +} // anonymous namespace + + const cassette_image::Format cassette_image::flacfile_format = { "flac", flacfile_identify, flacfile_load, - nullptr + flacfile_save }; diff -Nru mame-0.263+dfsg.1/src/lib/formats/flex_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/flex_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/flex_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/flex_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -91,12 +91,11 @@ return -1; uint8_t boot0[256], boot1[256]; - size_t actual; // Look at the boot sector. // Density, sides, link?? - io.read_at(256 * 0, &boot0, sizeof(boot0), actual); - io.read_at(256 * 1, &boot1, sizeof(boot1), actual); + read_at(io, 256 * 0, &boot0, sizeof(boot0)); // FIXME: check for errors and premature EOF + read_at(io, 256 * 1, &boot1, sizeof(boot1)); // FIXME: check for errors and premature EOF LOG_FORMATS("FLEX floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / 256, (uint32_t)size % 256, form_factor); @@ -129,7 +128,7 @@ if (f.sector_base_size == 128) { // FLEX 1.0: Look at the system information sector. sysinfo_sector_flex10 info; - io.read_at(f.sector_base_size * 2, &info, sizeof(struct sysinfo_sector_flex10), actual); + read_at(io, f.sector_base_size * 2, &info, sizeof(struct sysinfo_sector_flex10)); // FIXME: check for errors and premature EOF LOG_FORMATS("FLEX floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / f.sector_base_size, (uint32_t)size % f.sector_base_size, form_factor); @@ -142,7 +141,7 @@ } else { // FLEX 2+: Look at the system information sector. sysinfo_sector info; - io.read_at(f.sector_base_size * 2, &info, sizeof(struct sysinfo_sector), actual); + read_at(io, f.sector_base_size * 2, &info, sizeof(struct sysinfo_sector)); // FIXME: check for errors and premature EOF LOG_FORMATS("FLEX floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / f.sector_base_size, (uint32_t)size % f.sector_base_size, form_factor); diff -Nru mame-0.263+dfsg.1/src/lib/formats/flopimg.cpp mame-0.264+dfsg.1/src/lib/formats/flopimg.cpp --- mame-0.263+dfsg.1/src/lib/formats/flopimg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/flopimg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -864,7 +864,7 @@ normalize_times(dest, track_size*2); - if(splice >= 0 || splice < track_size) { + if(splice >= 0 && splice < track_size) { int splpos = uint64_t(200000000) * splice / track_size; image.set_write_splice_position(track, head, splpos, subtrack); } diff -Nru mame-0.263+dfsg.1/src/lib/formats/flopimg_legacy.cpp mame-0.264+dfsg.1/src/lib/formats/flopimg_legacy.cpp --- mame-0.263+dfsg.1/src/lib/formats/flopimg_legacy.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/flopimg_legacy.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -349,16 +349,14 @@ void floppy_image_read(floppy_image_legacy *floppy, void *buffer, uint64_t offset, size_t length) { - size_t actual; - floppy->io->read_at(offset, buffer, length, actual); + /*auto const [err, actual] =*/ read_at(*floppy->io, offset, buffer, length); // FIXME: check for errors and premature EOF } void floppy_image_write(floppy_image_legacy *floppy, const void *buffer, uint64_t offset, size_t length) { - size_t actual; - floppy->io->write_at(offset, buffer, length, actual); + /*auto const [err, actual] =*/ write_at(*floppy->io, offset, buffer, length); // FIXME: check for errors } @@ -371,8 +369,7 @@ while (length) { size_t const block = std::min(sizeof(buffer), length); - size_t actual; - floppy->io->write_at(offset, buffer, block, actual); + /*auto const [err, actual] =*/ write_at(*floppy->io, offset, buffer, block); // FIXME: check for errors offset += block; length -= block; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/fsd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/fsd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/fsd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/fsd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -91,9 +91,11 @@ int fsd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[3]; - - size_t actual; - io.read_at(0, h, 3, actual); + auto const [err, actual] = read_at(io, 0, h, 3); + if (err || (3 != actual)) { + LOG_FORMATS("fsd: read error\n"); + return 0; + } if (memcmp(h, "FSD", 3) == 0) { return FIFID_SIGN; } @@ -111,9 +113,9 @@ uint64_t size; if(io.length(size)) return false; - std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [err, img, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return false; uint64_t pos; std::string title; diff -Nru mame-0.263+dfsg.1/src/lib/formats/g64_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/g64_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/g64_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/g64_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -36,9 +36,10 @@ int g64_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { char h[8]; + auto const [err, actual] = read_at(io, 0, h, 8); + if (err || (8 != actual)) + return 0; - size_t actual; - io.read_at(0, h, 8, actual); if (!memcmp(h, G64_FORMAT_HEADER, 8)) return FIFID_SIGN; @@ -51,9 +52,9 @@ if (io.length(size)) return false; - std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [err, img, actual] = read_at(io, 0, size); + if (err || (actual != size)) + return false; if (img[POS_VERSION]) { @@ -124,7 +125,6 @@ { uint8_t const zerofill[] = { 0x00, 0x00, 0x00, 0x00 }; std::vector const prefill(TRACK_LENGTH, 0xff); - size_t actual; int tracks, heads; image.get_actual_geometry(tracks, heads); @@ -132,7 +132,7 @@ // write header uint8_t header[] = { 'G', 'C', 'R', '-', '1', '5', '4', '1', 0x00, static_cast(tracks), TRACK_LENGTH & 0xff, TRACK_LENGTH >> 8 }; - io.write_at(POS_SIGNATURE, header, sizeof(header), actual); + write_at(io, POS_SIGNATURE, header, sizeof(header)); // FIXME: check for errors // write tracks for (int head = 0; head < heads; head++) { @@ -145,8 +145,8 @@ uint32_t const spos = tpos + (tracks * 4); uint32_t const dpos = POS_TRACK_OFFSET + (tracks * 4 * 2) + (tracks_written * TRACK_LENGTH); - io.write_at(tpos, zerofill, 4, actual); - io.write_at(spos, zerofill, 4, actual); + write_at(io, tpos, zerofill, 4); // FIXME: check for errors + write_at(io, spos, zerofill, 4); // FIXME: check for errors if (image.get_buffer(track, head).size() <= 1) continue; @@ -178,11 +178,11 @@ put_u32le(speed_offset, speed_zone); put_u16le(track_length, packed.size()); - io.write_at(tpos, track_offset, 4, actual); - io.write_at(spos, speed_offset, 4, actual); - io.write_at(dpos, prefill.data(), TRACK_LENGTH, actual); - io.write_at(dpos, track_length, 2, actual); - io.write_at(dpos + 2, packed.data(), packed.size(), actual); + write_at(io, tpos, track_offset, 4); // FIXME: check for errors + write_at(io, spos, speed_offset, 4); // FIXME: check for errors + write_at(io, dpos, prefill.data(), TRACK_LENGTH); // FIXME: check for errors + write_at(io, dpos, track_length, 2); // FIXME: check for errors + write_at(io, dpos + 2, packed.data(), packed.size()); // FIXME: check for errors tracks_written++; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/hpi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/hpi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/hpi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/hpi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -162,9 +162,10 @@ image.set_variant(heads == 2 ? floppy_image::DSDD : floppy_image::SSDD); // Suck in the whole image - std::vector image_data(size); - size_t actual; - io.read_at(0, image_data.data(), size, actual); + auto const [err, image_data, actual] = read_at(io, 0, size); + if (err || (actual != size)) { + return false; + } // Get interleave factor from image unsigned il = (unsigned)image_data[ IL_OFFSET ] * 256 + image_data[ IL_OFFSET + 1 ]; @@ -209,8 +210,7 @@ while (get_next_sector(bitstream , pos , track_no , head_no , sector_no , sector_data)) { if (track_no == cyl && head_no == head && sector_no < HPI_SECTORS) { unsigned offset_in_image = chs_to_lba(cyl, head, sector_no, heads) * HPI_SECTOR_SIZE; - size_t actual; - io.write_at(offset_in_image, sector_data, HPI_SECTOR_SIZE, actual); + /*auto const [err, actual] =*/ write_at(io, offset_in_image, sector_data, HPI_SECTOR_SIZE); // FIXME: check for errors } } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/hti_tape.cpp mame-0.264+dfsg.1/src/lib/formats/hti_tape.cpp --- mame-0.263+dfsg.1/src/lib/formats/hti_tape.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/hti_tape.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,8 @@ #include "ioprocs.h" #include "multibyte.h" +#include + static constexpr uint32_t OLD_FILE_MAGIC = 0x5441434f; // Magic value at start of old-format image file: "TACO" static constexpr uint32_t FILE_MAGIC_DELTA = 0x48544930; // Magic value at start of delta-modulation image file: "HTI0" @@ -54,10 +56,12 @@ return false; } - size_t actual; - uint8_t tmp[ 4 ]; + uint8_t tmp[4]; + auto const [err, actual] = read(io, tmp, 4); + if (err || (4 != actual)) { + return false; + } - io.read(tmp, 4, actual); auto magic = get_u32be(tmp); if (((m_img_format == HTI_DELTA_MOD_16_BITS || m_img_format == HTI_DELTA_MOD_17_BITS) && magic != FILE_MAGIC_DELTA && magic != OLD_FILE_MAGIC) || (m_img_format == HTI_MANCHESTER_MOD && magic != FILE_MAGIC_MANCHESTER)) { @@ -65,7 +69,7 @@ } for (unsigned i = 0; i < no_of_tracks(); i++) { - tape_track_t& track = m_tracks[ i ]; + tape_track_t &track = m_tracks[i]; if (!load_track(io, track, magic == OLD_FILE_MAGIC)) { clear_tape(); return false; @@ -77,17 +81,16 @@ void hti_format_t::save_tape(util::random_read_write &io) { - io.seek(0, SEEK_SET); + io.seek(0, SEEK_SET); // FIXME: check for errors - size_t actual; - uint8_t tmp[ 4 ]; + uint8_t tmp[4]; put_u32be(tmp, m_img_format == HTI_MANCHESTER_MOD ? FILE_MAGIC_MANCHESTER : FILE_MAGIC_DELTA); - io.write(tmp, 4, actual); + write(io, tmp, 4); // FIXME: check for errors for (unsigned i = 0; i < no_of_tracks(); i++) { - const tape_track_t& track = m_tracks[ i ]; - tape_pos_t next_pos = (tape_pos_t)-1; + const tape_track_t &track = m_tracks[i]; + tape_pos_t next_pos = tape_pos_t(-1); unsigned n_words = 0; tape_track_t::const_iterator it_start; for (tape_track_t::const_iterator it = track.cbegin(); it != track.cend(); ++it) { @@ -102,20 +105,20 @@ dump_sequence(io, it_start, n_words); // End of track put_u32le(tmp, (uint32_t)-1); - io.write(tmp, 4, actual); + write(io, tmp, 4); // FIXME: check for errors } } void hti_format_t::clear_tape() { - for (tape_track_t& track : m_tracks) { + for (tape_track_t &track : m_tracks) { track.clear(); } } hti_format_t::tape_pos_t hti_format_t::word_length(tape_word_t w) const { - unsigned zeros , ones; + unsigned zeros, ones; // pop count of w ones = (w & 0x5555) + ((w >> 1) & 0x5555); @@ -128,7 +131,7 @@ return zeros * bit_length(false) + ones * bit_length(true); } -hti_format_t::tape_pos_t hti_format_t::farthest_end(const track_iterator_t& it , bool forward) const +hti_format_t::tape_pos_t hti_format_t::farthest_end(const track_iterator_t &it, bool forward) const { if (forward) { return word_end_pos(it); @@ -137,7 +140,7 @@ } } -bool hti_format_t::pos_offset(tape_pos_t& pos , bool forward , tape_pos_t offset) +bool hti_format_t::pos_offset(tape_pos_t &pos, bool forward, tape_pos_t offset) { if (offset == 0) { return true; @@ -161,7 +164,7 @@ } } -hti_format_t::tape_pos_t hti_format_t::next_hole(tape_pos_t pos , bool forward) +hti_format_t::tape_pos_t hti_format_t::next_hole(tape_pos_t pos, bool forward) { if (forward) { for (tape_pos_t hole : tape_holes) { @@ -172,9 +175,9 @@ // No more holes: will hit end of tape return NULL_TAPE_POS; } else { - for (int i = (sizeof(tape_holes) / sizeof(tape_holes[ 0 ])) - 1; i >= 0; i--) { - if (tape_holes[ i ] < pos) { - return tape_holes[ i ]; + for (int i = (sizeof(tape_holes) / sizeof(tape_holes[0])) - 1; i >= 0; i--) { + if (tape_holes[i] < pos) { + return tape_holes[i]; } } // No more holes: will hit start of tape @@ -182,16 +185,16 @@ } } -void hti_format_t::write_word(unsigned track_no , tape_pos_t start , tape_word_t word , tape_pos_t& length , bool forward) +void hti_format_t::write_word(unsigned track_no, tape_pos_t start, tape_word_t word, tape_pos_t &length, bool forward) { - tape_track_t& track = m_tracks[ track_no ]; + tape_track_t &track = m_tracks[track_no]; track_iterator_t it_low = track.lower_bound(start); - adjust_it(track , it_low , start); + adjust_it(track, it_low, start); length = word_length(word); tape_pos_t end_pos = start + length; track_iterator_t it_high = track.lower_bound(end_pos); - track.erase(it_low , it_high); + track.erase(it_low, it_high); // A 0 word is inserted after the word being written, if space allows. // This is meant to avoid fragmentation of the slack space at the end of a record @@ -203,24 +206,24 @@ it_high--; } - track.insert(it_high , std::make_pair(start, word)); + track.insert(it_high, std::make_pair(start, word)); } -void hti_format_t::write_gap(unsigned track_no , tape_pos_t a , tape_pos_t b) +void hti_format_t::write_gap(unsigned track_no, tape_pos_t a, tape_pos_t b) { - ensure_a_lt_b(a , b); - tape_track_t& track = m_tracks[ track_no ]; + ensure_a_lt_b(a, b); + tape_track_t &track = m_tracks[track_no]; track_iterator_t it_low = track.lower_bound(a); - adjust_it(track , it_low , a); + adjust_it(track, it_low, a); track_iterator_t it_high = track.lower_bound(b); track.erase(it_low, it_high); } -bool hti_format_t::just_gap(unsigned track_no , tape_pos_t a , tape_pos_t b) +bool hti_format_t::just_gap(unsigned track_no, tape_pos_t a, tape_pos_t b) { - ensure_a_lt_b(a , b); - tape_track_t& track = m_tracks[ track_no ]; + ensure_a_lt_b(a, b); + tape_track_t &track = m_tracks[track_no]; track_iterator_t it_low = track.lower_bound(a); track_iterator_t it_high = track.lower_bound(b); @@ -229,9 +232,9 @@ return it_low == it_high; } -bool hti_format_t::next_data(unsigned track_no , tape_pos_t pos , bool forward , bool inclusive , track_iterator_t& it) +bool hti_format_t::next_data(unsigned track_no, tape_pos_t pos, bool forward, bool inclusive, track_iterator_t &it) { - tape_track_t& track = m_tracks[ track_no ]; + tape_track_t &track = m_tracks[track_no]; it = track.lower_bound(pos); if (forward) { if (inclusive) { @@ -251,9 +254,9 @@ } } -hti_format_t::adv_res_t hti_format_t::adv_it(unsigned track_no , bool forward , track_iterator_t& it) +hti_format_t::adv_res_t hti_format_t::adv_it(unsigned track_no, bool forward, track_iterator_t &it) { - tape_track_t& track = m_tracks[ track_no ]; + tape_track_t &track = m_tracks[track_no]; if (forward) { tape_pos_t prev_pos = word_end_pos(it); ++it; @@ -275,7 +278,7 @@ } } -bool hti_format_t::sync_with_record(unsigned track_no , track_iterator_t& it , unsigned& bit_idx) +bool hti_format_t::sync_with_record(unsigned track_no, track_iterator_t &it, unsigned &bit_idx) { while ((it->second & (1U << bit_idx)) == 0) { if (bit_idx) { @@ -296,7 +299,7 @@ return true; } -hti_format_t::adv_res_t hti_format_t::next_word(unsigned track_no , track_iterator_t& it , unsigned& bit_idx , tape_word_t& word) +hti_format_t::adv_res_t hti_format_t::next_word(unsigned track_no, track_iterator_t &it, unsigned &bit_idx, tape_word_t &word) { if (bit_idx == 15) { auto res = adv_it(track_no, true, it); @@ -319,13 +322,13 @@ } } -bool hti_format_t::next_gap(unsigned track_no , tape_pos_t& pos , bool forward , tape_pos_t min_gap) +bool hti_format_t::next_gap(unsigned track_no, tape_pos_t &pos, bool forward, tape_pos_t min_gap) { tape_track_t::iterator it; // First align with next data - next_data(track_no , pos , forward , true , it); + next_data(track_no, pos, forward, true, it); // Then scan for 1st gap - tape_track_t& track = m_tracks[ track_no ]; + tape_track_t &track = m_tracks[track_no]; bool done = false; track_iterator_t prev_it; unsigned n_gaps = 1; @@ -346,7 +349,7 @@ adv_res_t adv_res; do { prev_it = it; - adv_res = adv_it(track_no , forward , it); + adv_res = adv_it(track_no, forward, it); } while (adv_res == ADV_CONT_DATA); pos = word_end_pos(prev_it); } @@ -366,32 +369,36 @@ adv_res_t adv_res; do { prev_it = it; - adv_res = adv_it(track_no , forward , it); + adv_res = adv_it(track_no, forward, it); } while (adv_res == ADV_CONT_DATA); pos = prev_it->first; } } // Set "pos" where minimum gap size is met - pos_offset(pos , forward , min_gap); + pos_offset(pos, forward, min_gap); return n_gaps == 0; } -bool hti_format_t::load_track(util::random_read &io , tape_track_t& track , bool old_format) +bool hti_format_t::load_track(util::random_read &io, tape_track_t &track, bool old_format) { - size_t actual; - uint8_t tmp[ 4 ]; - uint32_t tmp32; tape_pos_t delta_pos = 0; tape_pos_t last_word_end = 0; track.clear(); while (1) { - // Read no. of words to follow - io.read(tmp, 4, actual); + std::error_condition err; + size_t actual; + uint8_t tmp[4]; + uint32_t tmp32; + // Read no. of words to follow + std::tie(err, actual) = read(io, tmp, 4); + if (err || (4 != actual)) { + return false; + } tmp32 = get_u32le(tmp); // Track ends @@ -402,8 +409,10 @@ unsigned n_words = tmp32; // Read tape position of block - io.read(tmp, 4, actual); - + std::tie(err, actual) = read(io, tmp, 4); + if (err || (4 != actual)) { + return false; + } tmp32 = get_u32le(tmp); tape_pos_t pos = (tape_pos_t)tmp32 + delta_pos; @@ -414,11 +423,14 @@ for (unsigned i = 0; i < n_words; i++) { uint16_t tmp16; - io.read(tmp, 2, actual); + std::tie(err, actual) = read(io, tmp, 2); + if (err || (2 != actual)) { + return false; + } tmp16 = get_u16le(tmp); if (!old_format) { - track.insert(std::make_pair(pos , tmp16)); + track.insert(std::make_pair(pos, tmp16)); pos += word_length(tmp16); } else if (m_img_format == HTI_DELTA_MOD_16_BITS) { // Convert HP9845 & HP85 old format @@ -471,29 +483,28 @@ } } -void hti_format_t::dump_sequence(util::random_read_write &io , tape_track_t::const_iterator it_start , unsigned n_words) +void hti_format_t::dump_sequence(util::random_read_write &io, tape_track_t::const_iterator it_start, unsigned n_words) { if (n_words) { - size_t actual; - uint8_t tmp[ 8 ]; - put_u32le(&tmp[ 0 ], n_words); - put_u32le(&tmp[ 4 ], it_start->first); - io.write(tmp, 8, actual); + uint8_t tmp[8]; + put_u32le(&tmp[0], n_words); + put_u32le(&tmp[4], it_start->first); + write(io, tmp, 8); // FIXME: check for errors for (unsigned i = 0; i < n_words; i++) { put_u16le(tmp, it_start->second); - io.write(tmp, 2, actual); + write(io, tmp, 2); // FIXME: check for errors ++it_start; } } } -hti_format_t::tape_pos_t hti_format_t::word_end_pos(const track_iterator_t& it) const +hti_format_t::tape_pos_t hti_format_t::word_end_pos(const track_iterator_t &it) const { return it->first + word_length(it->second); } -void hti_format_t::adjust_it(tape_track_t& track , track_iterator_t& it , tape_pos_t pos) const +void hti_format_t::adjust_it(tape_track_t &track, track_iterator_t &it, tape_pos_t pos) const { if (it != track.begin()) { --it; @@ -503,7 +514,7 @@ } } -void hti_format_t::ensure_a_lt_b(tape_pos_t& a , tape_pos_t& b) +void hti_format_t::ensure_a_lt_b(tape_pos_t &a, tape_pos_t &b) { if (a > b) { // Ensure A always comes before B diff -Nru mame-0.263+dfsg.1/src/lib/formats/hti_tape.h mame-0.264+dfsg.1/src/lib/formats/hti_tape.h --- mame-0.263+dfsg.1/src/lib/formats/hti_tape.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/hti_tape.h 2024-03-25 14:00:46.000000000 +0000 @@ -22,8 +22,6 @@ class hti_format_t { public: - hti_format_t(); - // Tape position, 1 unit = 1 inch / (968 * 1024) typedef int32_t tape_pos_t; @@ -55,7 +53,6 @@ // Iterator to access words on tape typedef tape_track_t::iterator track_iterator_t; - // Set image format enum image_format_t { // Delta modulation, 16 bits per word, 2 tracks per cartridge // HP 9845 & HP 85 @@ -68,6 +65,16 @@ HTI_MANCHESTER_MOD }; + enum adv_res_t + { + ADV_NO_MORE_DATA, + ADV_CONT_DATA, + ADV_DISCONT_DATA + }; + + hti_format_t(); + + // Set image format void set_image_format(image_format_t fmt) { m_img_format = fmt; } // Return number of tracks @@ -86,55 +93,48 @@ // Return physical length of a 16-bit word on tape tape_pos_t word_length(tape_word_t w) const; - tape_pos_t farthest_end(const track_iterator_t& it , bool forward) const; + tape_pos_t farthest_end(const track_iterator_t &it, bool forward) const; - static bool pos_offset(tape_pos_t& pos , bool forward , tape_pos_t offset); + static bool pos_offset(tape_pos_t &pos, bool forward, tape_pos_t offset); // Position of next hole tape will reach in a given direction - static tape_pos_t next_hole(tape_pos_t pos , bool forward); + static tape_pos_t next_hole(tape_pos_t pos, bool forward); // Write a data word on tape - void write_word(unsigned track_no , tape_pos_t start , tape_word_t word , tape_pos_t& length , bool forward = true); + void write_word(unsigned track_no, tape_pos_t start, tape_word_t word, tape_pos_t &length, bool forward = true); // Write a gap on tape - void write_gap(unsigned track_no , tape_pos_t a , tape_pos_t b); + void write_gap(unsigned track_no, tape_pos_t a, tape_pos_t b); // Check that a section of tape has no data (it's just gap) - bool just_gap(unsigned track_no , tape_pos_t a , tape_pos_t b); + bool just_gap(unsigned track_no, tape_pos_t a, tape_pos_t b); // Return position of next data word in a given direction - bool next_data(unsigned track_no , tape_pos_t pos , bool forward , bool inclusive , track_iterator_t& it); - - enum adv_res_t - { - ADV_NO_MORE_DATA, - ADV_CONT_DATA, - ADV_DISCONT_DATA - }; + bool next_data(unsigned track_no, tape_pos_t pos, bool forward, bool inclusive, track_iterator_t &it); // Advance an iterator to next word of data - adv_res_t adv_it(unsigned track_no , bool forward , track_iterator_t& it); + adv_res_t adv_it(unsigned track_no, bool forward, track_iterator_t &it); // Sync with the preamble of a record - bool sync_with_record(unsigned track_no , track_iterator_t& it , unsigned& bit_idx); + bool sync_with_record(unsigned track_no, track_iterator_t &it, unsigned &bit_idx); // Get a data word from record, after syncing - adv_res_t next_word(unsigned track_no , track_iterator_t& it , unsigned& bit_idx , tape_word_t& word); + adv_res_t next_word(unsigned track_no, track_iterator_t &it, unsigned &bit_idx, tape_word_t &word); // Scan for beginning of next gap in a given direction - bool next_gap(unsigned track_no , tape_pos_t& pos , bool forward , tape_pos_t min_gap); + bool next_gap(unsigned track_no, tape_pos_t &pos, bool forward, tape_pos_t min_gap); private: // Content of tape tracks - tape_track_t m_tracks[ 2 ]; + tape_track_t m_tracks[2]; // Image format image_format_t m_img_format; - bool load_track(util::random_read &io , tape_track_t& track , bool old_format); - static void dump_sequence(util::random_read_write &io , tape_track_t::const_iterator it_start , unsigned n_words); + bool load_track(util::random_read &io, tape_track_t &track, bool old_format); + static void dump_sequence(util::random_read_write &io, tape_track_t::const_iterator it_start, unsigned n_words); - tape_pos_t word_end_pos(const track_iterator_t& it) const; - void adjust_it(tape_track_t& track , track_iterator_t& it , tape_pos_t pos) const; - static void ensure_a_lt_b(tape_pos_t& a , tape_pos_t& b); + tape_pos_t word_end_pos(const track_iterator_t &it) const; + void adjust_it(tape_track_t &track, track_iterator_t &it, tape_pos_t pos) const; + static void ensure_a_lt_b(tape_pos_t &a, tape_pos_t &b); }; #endif // MAME_FORMATS_HTI_TAPE_H diff -Nru mame-0.263+dfsg.1/src/lib/formats/hxchfe_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/hxchfe_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/hxchfe_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/hxchfe_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,6 +106,8 @@ #include "osdcore.h" // osd_printf_* +#include + #define HFE_FORMAT_HEADER "HXCPICFE" @@ -139,10 +141,11 @@ int hfe_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[8]; - - size_t actual; - io.read_at(0, &header, sizeof(header), actual); - if ( memcmp( header, HFE_FORMAT_HEADER, 8 ) ==0) { + auto const [err, actual] = read_at(io, 0, &header, sizeof(header)); + if (err || (sizeof(header) != actual)) { + return 0; + } + if (!memcmp(header, HFE_FORMAT_HEADER, 8)) { return FIFID_SIGN; } return 0; @@ -150,16 +153,15 @@ bool hfe_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; - uint8_t header[HEADER_LENGTH]; - uint8_t track_table[TRACK_TABLE_LENGTH]; - header_info info; int drivecyl, driveheads; image.get_maximal_geometry(drivecyl, driveheads); // read header - io.read_at(0, header, HEADER_LENGTH, actual); + uint8_t header[HEADER_LENGTH]; + std::tie(err, actual) = read_at(io, 0, header, HEADER_LENGTH); // FIXME: check for errors and premature EOF // get values // Format revision must be 0 @@ -169,6 +171,7 @@ return false; } + header_info info; info.m_cylinders = header[9] & 0xff; info.m_heads = header[10] & 0xff; @@ -194,7 +197,7 @@ return false; } - info.m_track_encoding = (encoding_t)(header[11] & 0xff); + info.m_track_encoding = encoding_t(header[11] & 0xff); if (info.m_track_encoding > EMU_FM_ENCODING) { @@ -231,7 +234,8 @@ // read track lookup table (multiple of 512) int table_offset = get_u16le(&header[18]); - io.read_at(table_offset<<9, track_table, TRACK_TABLE_LENGTH, actual); + uint8_t track_table[TRACK_TABLE_LENGTH]; + std::tie(err, actual) = read_at(io, table_offset<<9, track_table, TRACK_TABLE_LENGTH); // FIXME: check for errors and premature EOF for (int i=0; i < info.m_cylinders; i++) { @@ -244,10 +248,9 @@ for(int cyl=0; cyl < info.m_cylinders; cyl++) { // actual data read - // The HFE format defines an interleave of the two sides per cylinder - // at every 256 bytes + // The HFE format defines an interleave of the two sides per cylinder at every 256 bytes cylinder_buffer.resize(info.m_cyl_length[cyl]); - io.read_at(info.m_cyl_offset[cyl]<<9, &cylinder_buffer[0], info.m_cyl_length[cyl], actual); + std::tie(err, actual) = read_at(io, info.m_cyl_offset[cyl]<<9, &cylinder_buffer[0], info.m_cyl_length[cyl]); // FIXME: check for errors and premature EOF generate_track_from_hfe_bitstream(cyl, 0, samplelength, &cylinder_buffer[0], info.m_cyl_length[cyl], image); if (info.m_heads == 2) diff -Nru mame-0.263+dfsg.1/src/lib/formats/hxcmfm_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/hxcmfm_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/hxcmfm_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/hxcmfm_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -6,6 +6,7 @@ #include "ioprocs.h" #include +#include #define MFM_FORMAT_HEADER "HXCMFM" @@ -63,10 +64,11 @@ int mfm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t header[7]; - - size_t actual; - io.read_at(0, &header, sizeof(header), actual); - if ( memcmp( header, MFM_FORMAT_HEADER, 6 ) ==0) { + auto const [err, actual] = read_at(io, 0, &header, sizeof(header)); // FIXME: does this really need to read 7 bytes? only 6 are checked. also check for premature EOF + if (err) { + return 0; + } + if (!memcmp(header, MFM_FORMAT_HEADER, 6)) { return FIFID_SIGN; } return 0; @@ -74,12 +76,13 @@ bool mfm_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; MFMIMG header; MFMTRACKIMG trackdesc; // read header - io.read_at(0, &header, sizeof(header), actual); + std::tie(err, actual) = read_at(io, 0, &header, sizeof(header)); // FIXME: check for errors and premature EOF int drivecyl, driveheads; image.get_maximal_geometry(drivecyl, driveheads); @@ -91,12 +94,12 @@ for(int side=0; side < header.number_of_side; side++) { if (!skip_odd || track%2 == 0) { // read location of - io.read_at((header.mfmtracklistoffset)+( counter *sizeof(trackdesc)), &trackdesc, sizeof(trackdesc), actual); + std::tie(err, actual) = read_at(io, header.mfmtracklistoffset + (counter * sizeof(trackdesc)), &trackdesc, sizeof(trackdesc)); // FIXME: check for errors and premature EOF trackbuf.resize(trackdesc.mfmtracksize); // actual data read - io.read_at(trackdesc.mfmtrackoffset, &trackbuf[0], trackdesc.mfmtracksize, actual); + std::tie(err, actual) = read_at(io, trackdesc.mfmtrackoffset, &trackbuf[0], trackdesc.mfmtracksize); // FIXME: check for errors and premature EOF if (skip_odd) { generate_track_from_bitstream(track/2, side, &trackbuf[0], trackdesc.mfmtracksize*8, image); @@ -117,7 +120,6 @@ bool mfm_format::save(util::random_read_write &io, const std::vector &variants, const floppy_image &image) const { // TODO: HD support - size_t actual; MFMIMG header; int track_count, head_count; image.get_actual_geometry(track_count, head_count); @@ -130,7 +132,7 @@ header.floppyiftype = 4; header.mfmtracklistoffset = sizeof(MFMIMG); - io.write_at(0, &header, sizeof(MFMIMG), actual); + write_at(io, 0, &header, sizeof(MFMIMG)); // FIXME: check for errors int tpos = sizeof(MFMIMG); int dpos = tpos + track_count*head_count*sizeof(MFMTRACKIMG); @@ -149,8 +151,8 @@ trackdesc.mfmtracksize = packed.size(); trackdesc.mfmtrackoffset = dpos; - io.write_at(tpos, &trackdesc, sizeof(MFMTRACKIMG), actual); - io.write_at(dpos, packed.data(), packed.size(), actual); + write_at(io, tpos, &trackdesc, sizeof(MFMTRACKIMG)); // FIXME: check for errors + write_at(io, dpos, packed.data(), packed.size()); // FIXME: check for errors tpos += sizeof(MFMTRACKIMG); dpos += packed.size(); diff -Nru mame-0.263+dfsg.1/src/lib/formats/ibmxdf_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ibmxdf_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ibmxdf_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ibmxdf_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -186,8 +186,8 @@ const format &f = formats[type]; - for(int track=0; track < f.track_count; track++) - for(int head=0; head < f.head_count; head++) { + for(int track = 0; track < f.track_count; track++) { + for(int head = 0; head < f.head_count; head++) { uint8_t sectdata[23 * 2 * 512]; // XXX magic desc_s sectors[40]; floppy_image_format_t::desc_e *desc; @@ -213,10 +213,10 @@ build_sector_description(tf, sectdata, sectors, track, head); int const track_size = compute_track_size(f) * 2; // read both sides at once - size_t actual; - io.read_at(get_image_offset(f, head, track), sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, get_image_offset(f, head, track), sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(desc, track, head, sectors, tf.sector_count, total_size, image); } + } image.set_variant(f.variant); diff -Nru mame-0.263+dfsg.1/src/lib/formats/imd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/imd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/imd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/imd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -425,9 +425,10 @@ int imd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { char h[4]; + auto const [err, actual] = read_at(io, 0, h, 4); + if(err || (4 != actual)) + return 0; - size_t actual; - io.read_at(0, h, 4, actual); if(!memcmp(h, "IMD ", 4)) return FIFID_SIGN; @@ -451,9 +452,9 @@ uint64_t size; if(io.length(size)) return false; - std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [err, img, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return false; uint64_t pos, savepos; for(pos=0; pos < size && img[pos] != 0x1a; pos++) { } diff -Nru mame-0.263+dfsg.1/src/lib/formats/img_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/img_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/img_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/img_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -72,9 +72,10 @@ image.set_variant(is_dd ? floppy_image::SSDD : floppy_image::SSSD); // Suck in the whole image - std::vector image_data(size); - size_t actual; - io.read_at(0, image_data.data(), size, actual); + auto const [err, image_data, actual] = read_at(io, 0, size); + if (err || (actual != size)) { + return false; + } for (unsigned cyl = 0; cyl < TRACKS; cyl++) { if (is_dd) { @@ -134,7 +135,7 @@ sects[ sector ].sector = real_sector; sects[ sector ].bad_crc = false; sects[ sector ].deleted = false; - sects[ sector ].data = image_data.data() + offset_in_image; + sects[ sector ].data = &image_data[offset_in_image]; } build_pc_track_fm(cyl, 0, image, 83333, SECTORS_FM, sects, 33, 46, 32, 11); } @@ -155,8 +156,7 @@ while (get_next_sector(bitstream , pos , track_no , sector_no , sector_data)) { if (track_no == cyl && sector_no >= 1 && sector_no <= SECTORS) { unsigned offset_in_image = (cyl * SECTORS + sector_no - 1) * SECTOR_SIZE; - size_t actual; - io.write_at(offset_in_image, sector_data, SECTOR_SIZE, actual); + /*auto const [err, actual] =*/ write_at(io, offset_in_image, sector_data, SECTOR_SIZE); // FIXME: check for errors } } } else { @@ -164,8 +164,7 @@ auto sects = extract_sectors_from_bitstream_fm_pc(bitstream); for (unsigned s = 1; s <= SECTORS_FM; s++) { unsigned offset_in_image = (cyl * SECTORS_FM + s - 1) * SECTOR_SIZE; - size_t actual; - io.write_at(offset_in_image, sects[ s ].data(), SECTOR_SIZE, actual); + /*auto const [err, actual] =*/ write_at(io, offset_in_image, sects[ s ].data(), SECTOR_SIZE); // FIXME: check for errors and premature EOF } } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/ipf_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ipf_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ipf_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ipf_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,6 +8,72 @@ #include +struct ipf_format::ipf_decode { + struct track_info { + uint32_t cylinder = 0, head = 0, type = 0; + uint32_t sigtype = 0, process = 0, reserved[3] = { 0, 0, 0 }; + uint32_t size_bytes = 0, size_cells = 0; + uint32_t index_bytes = 0, index_cells = 0; + uint32_t datasize_cells = 0, gapsize_cells = 0; + uint32_t block_count = 0, weak_bits = 0; + + uint32_t data_size_bits = 0; + + bool info_set = false; + + const uint8_t *data = nullptr; + uint32_t data_size = 0; + }; + + std::vector tinfos; + uint32_t tcount = 0; + + uint32_t type = 0, release = 0, revision = 0; + uint32_t encoder_type = 0, encoder_revision = 0, origin = 0; + uint32_t min_cylinder = 0, max_cylinder = 0, min_head = 0, max_head = 0; + uint32_t credit_day = 0, credit_time = 0; + uint32_t platform[4] = {}, extra[5] = {}; + + uint32_t crc32r(const uint8_t *data, uint32_t size); + + bool parse_info(const uint8_t *info); + bool parse_imge(const uint8_t *imge); + bool parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size); + + bool scan_one_tag(uint8_t *data, size_t size, uint32_t &pos, uint8_t *&tag, uint32_t &tsize); + bool scan_all_tags(uint8_t *data, size_t size); + static uint32_t rb(const uint8_t *&p, int count); + + track_info *get_index(uint32_t idx); + + void track_write_raw(std::vector::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context); + void track_write_mfm(std::vector::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context); + void track_write_weak(std::vector::iterator &tpos, uint32_t cells); + bool generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector::iterator tpos, std::vector::iterator tlimit, bool &context); + + bool gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size); + bool generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector::iterator tpos, uint32_t size, bool pre, bool &context); + bool generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector::iterator &tpos, bool &context); + bool generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); + bool generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); + bool generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); + bool generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator tpos, bool &context); + + bool generate_block(const track_info &t, uint32_t idx, uint32_t ipos, std::vector &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context); + uint32_t block_compute_real_size(const track_info &t); + + void timing_set(std::vector &track, uint32_t start, uint32_t end, uint32_t time); + bool generate_timings(const track_info &t, std::vector &track, const std::vector &data_pos, const std::vector &gap_pos); + + void rotate(std::vector &track, uint32_t offset, uint32_t size); + void mark_track_splice(std::vector &track, uint32_t offset, uint32_t size); + bool generate_track(track_info &t, floppy_image &image); + bool generate_tracks(floppy_image &image); + + bool parse(uint8_t *data, size_t size, floppy_image &image); +}; + + const ipf_format FLOPPY_IPF_FORMAT; const char *ipf_format::name() const noexcept @@ -34,8 +100,9 @@ { static const uint8_t refh[12] = { 0x43, 0x41, 0x50, 0x53, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0xd5, 0x73, 0xba }; uint8_t h[12]; - size_t actual; - io.read_at(0, h, 12, actual); + auto const [err, actual] = read_at(io, 0, h, 12); + if(err || (12 != actual)) + return 0; if(!memcmp(h, refh, 12)) return FIFID_SIGN; @@ -46,13 +113,13 @@ bool ipf_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { uint64_t size; - if (io.length(size)) + if(io.length(size)) + return false; + auto const [err, data, actual] = read_at(io, 0, size); + if(err || (actual != size)) return false; - std::vector data(size); - size_t actual; - io.read_at(0, &data[0], size, actual); ipf_decode dec; - return dec.parse(data, image); + return dec.parse(data.get(), size, image); } @@ -79,12 +146,12 @@ return ~crc; } -bool ipf_format::ipf_decode::parse(std::vector &data, floppy_image &image) +bool ipf_format::ipf_decode::parse(uint8_t *data, size_t size, floppy_image &image) { image.set_variant(floppy_image::DSDD); // Not handling anything else yet tcount = 84*2+1; // Usual max tinfos.resize(tcount); - bool res = scan_all_tags(data); + bool res = scan_all_tags(data, size); if(res) res = generate_tracks(image); tinfos.clear(); @@ -177,13 +244,13 @@ return true; } -bool ipf_format::ipf_decode::scan_one_tag(std::vector &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize) +bool ipf_format::ipf_decode::scan_one_tag(uint8_t *data, size_t size, uint32_t &pos, uint8_t *&tag, uint32_t &tsize) { - if(data.size()-pos < 12) + if(size-pos < 12) return false; tag = &data[pos]; tsize = get_u32be(tag+4); - if(data.size()-pos < tsize) + if(size-pos < tsize) return false; uint32_t crc = get_u32be(tag+8); tag[8] = tag[9] = tag[10] = tag[11] = 0; @@ -193,15 +260,14 @@ return true; } -bool ipf_format::ipf_decode::scan_all_tags(std::vector &data) +bool ipf_format::ipf_decode::scan_all_tags(uint8_t *data, size_t size) { uint32_t pos = 0; - uint32_t size = data.size(); while(pos != size) { uint8_t *tag; uint32_t tsize; - if(!scan_one_tag(data, pos, tag, tsize)) + if(!scan_one_tag(data, size, pos, tag, tsize)) return false; switch(get_u32be(tag)) { diff -Nru mame-0.263+dfsg.1/src/lib/formats/ipf_dsk.h mame-0.264+dfsg.1/src/lib/formats/ipf_dsk.h --- mame-0.263+dfsg.1/src/lib/formats/ipf_dsk.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ipf_dsk.h 2024-03-25 14:00:46.000000000 +0000 @@ -21,71 +21,7 @@ virtual bool supports_save() const noexcept override; private: - struct ipf_decode { - struct track_info { - uint32_t cylinder = 0, head = 0, type = 0; - uint32_t sigtype = 0, process = 0, reserved[3] = { 0, 0, 0 }; - uint32_t size_bytes = 0, size_cells = 0; - uint32_t index_bytes = 0, index_cells = 0; - uint32_t datasize_cells = 0, gapsize_cells = 0; - uint32_t block_count = 0, weak_bits = 0; - - uint32_t data_size_bits = 0; - - bool info_set = false; - - const uint8_t *data = nullptr; - uint32_t data_size = 0; - }; - - std::vector tinfos; - uint32_t tcount = 0; - - uint32_t type = 0, release = 0, revision = 0; - uint32_t encoder_type = 0, encoder_revision = 0, origin = 0; - uint32_t min_cylinder = 0, max_cylinder = 0, min_head = 0, max_head = 0; - uint32_t credit_day = 0, credit_time = 0; - uint32_t platform[4] = {}, extra[5] = {}; - - uint32_t crc32r(const uint8_t *data, uint32_t size); - - bool parse_info(const uint8_t *info); - bool parse_imge(const uint8_t *imge); - bool parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size); - - bool scan_one_tag(std::vector &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize); - bool scan_all_tags(std::vector &data); - static uint32_t r32(const uint8_t *p); - static uint32_t rb(const uint8_t *&p, int count); - - track_info *get_index(uint32_t idx); - - void track_write_raw(std::vector::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context); - void track_write_mfm(std::vector::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context); - void track_write_weak(std::vector::iterator &tpos, uint32_t cells); - bool generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector::iterator tpos, std::vector::iterator tlimit, bool &context); - - bool gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size); - bool generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector::iterator tpos, uint32_t size, bool pre, bool &context); - bool generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector::iterator &tpos, bool &context); - bool generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); - bool generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); - bool generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator &tpos, bool &context); - bool generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector::iterator tpos, bool &context); - - bool generate_block(const track_info &t, uint32_t idx, uint32_t ipos, std::vector &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context); - uint32_t block_compute_real_size(const track_info &t); - - void timing_set(std::vector &track, uint32_t start, uint32_t end, uint32_t time); - bool generate_timings(const track_info &t, std::vector &track, const std::vector &data_pos, const std::vector &gap_pos); - - void rotate(std::vector &track, uint32_t offset, uint32_t size); - void mark_track_splice(std::vector &track, uint32_t offset, uint32_t size); - bool generate_track(track_info &t, floppy_image &image); - bool generate_tracks(floppy_image &image); - - bool parse(std::vector &data, floppy_image &image); - }; + struct ipf_decode; }; extern const ipf_format FLOPPY_IPF_FORMAT; diff -Nru mame-0.263+dfsg.1/src/lib/formats/jfd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/jfd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/jfd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/jfd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -197,8 +197,9 @@ return 0; std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return 0; int err; std::vector gz_ptr(4); @@ -222,7 +223,7 @@ err = inflateEnd(&d_stream); if (err != Z_OK) return 0; - img = gz_ptr; + img = std::move(gz_ptr); } if (!memcmp(&img[0], JFD_HEADER, sizeof(JFD_HEADER))) { @@ -239,8 +240,9 @@ return false; std::vector img(size); - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return false; int err; std::vector gz_ptr; @@ -274,7 +276,7 @@ return false; } size = inflate_size; - img = gz_ptr; + img = std::move(gz_ptr); } osd_printf_verbose("jfd_dsk: loading %s\n", &img[48]); diff -Nru mame-0.263+dfsg.1/src/lib/formats/jvc_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/jvc_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/jvc_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/jvc_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -141,11 +141,14 @@ uint8_t header[5]; // if we know that this is a header of a bad size, we can fail immediately; otherwise read the header - size_t actual; - if (header_size >= sizeof(header)) + if (header_size >= sizeof(header)) // TODO: wouldn't this make more sense with > than >=? The first case in the following switch statement is unreachable as-is. return false; if (header_size > 0) - io.read_at(0, header, header_size, actual); + { + auto const [err, actual] = read_at(io, 0, header, header_size); + if (err || (actual != header_size)) + return false; + } // default values heads = 1; @@ -241,8 +244,7 @@ sectors[interleave[i]].bad_crc = false; sectors[interleave[i]].data = §or_data[sector_offset]; - size_t actual; - io.read_at(file_offset, sectors[interleave[i]].data, sector_size, actual); + /*auto const [err, actual] =*/ read_at(io, file_offset, sectors[interleave[i]].data, sector_size); // FIXME: check for errors and premature EOF sector_offset += sector_size; file_offset += sector_size; @@ -268,8 +270,7 @@ uint8_t header[2]; header[0] = 18; header[1] = 2; - size_t actual; - io.write_at(file_offset, header, sizeof(header), actual); + /*auto const [err, actual] =*/ write_at(io, file_offset, header, sizeof(header)); // FIXME: check for errors file_offset += sizeof(header); } @@ -289,8 +290,7 @@ return false; } - size_t actual; - io.write_at(file_offset, sectors[1 + i].data(), 256, actual); + /*auto const [err, actual] =*/ write_at(io, file_offset, sectors[1 + i].data(), 256); // FIXME: check for errors file_offset += 256; } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/lw30_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/lw30_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/lw30_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/lw30_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -138,9 +138,11 @@ int lw30_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint64_t size = 0; - io.length(size); + if(io.length(size)) + return 0; + if(size == TRACKS_PER_DISK * SECTORS_PER_TRACK * SECTOR_SIZE) - return 50; // identified by size + return FIFID_SIZE; // identified by size return 0; } @@ -150,9 +152,8 @@ uint8_t trackdata[SECTORS_PER_TRACK * SECTOR_SIZE], rawdata[CELLS_PER_REV / 8]; memset(rawdata, 0xaa, sizeof(rawdata)); for(int track = 0; track < TRACKS_PER_DISK; track++) { - size_t actual{}; - io.read_at(track * SECTORS_PER_TRACK * SECTOR_SIZE, trackdata, SECTORS_PER_TRACK * SECTOR_SIZE, actual); - if(actual != SECTORS_PER_TRACK * SECTOR_SIZE) + auto const [err, actual] = read_at(io, track * SECTORS_PER_TRACK * SECTOR_SIZE, trackdata, SECTORS_PER_TRACK * SECTOR_SIZE); + if(err || (actual != SECTORS_PER_TRACK * SECTOR_SIZE)) return false; size_t i = 0; for(int x = 0; x < 2 + 48; x++) diff -Nru mame-0.263+dfsg.1/src/lib/formats/m20_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/m20_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/m20_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/m20_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -62,8 +62,7 @@ bool mfm = track || head; desc_pc_sector sects[16]; uint8_t sectdata[16*256]; - size_t actual; - io.read_at(16*256*(track*2+head), sectdata, 16*256, actual); + /*auto const [err, actual] =*/ read_at(io, 16*256*(track*2+head), sectdata, 16*256); // FIXME: check for errors and premature EOF for (int i = 0; i < 16; i++) { int j = i/2 + (i & 1 ? 0 : 8); sects[i].track = track; @@ -92,17 +91,16 @@ int track_count, head_count; track_count = 35; head_count = 2; //FIXME: use image.get_actual_geometry(track_count, head_count) instead - // initial fm track + // initial FM track auto bitstream = generate_bitstream_from_track(0, 0, 4000, image); auto sectors = extract_sectors_from_bitstream_fm_pc(bitstream); for (int i = 0; i < 16; i++) { - size_t actual; - io.write_at(file_offset, sectors[i + 1].data(), 128, actual); + /*auto const [err, actual] =*/ write_at(io, file_offset, sectors[i + 1].data(), 128); // FIXME: check for errors file_offset += 256; //128; } - // rest are mfm tracks + // rest are MFM tracks for (int track = 0; track < track_count; track++) { for (int head = 0; head < head_count; head++) { // skip track 0, head 0 @@ -115,8 +113,7 @@ sectors = extract_sectors_from_bitstream_mfm_pc(bitstream); for (int i = 0; i < 16; i++) { - size_t actual; - io.write_at(file_offset, sectors[i + 1].data(), 256, actual); + /*auto const [err, actual] =*/ write_at(io, file_offset, sectors[i + 1].data(), 256); // FIXME: check for errors file_offset += 256; } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/mdos_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/mdos_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/mdos_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/mdos_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -55,6 +55,8 @@ #include "ioprocs.h" #include "multibyte.h" +#include + mdos_format::mdos_format() : wd177x_format(formats) { @@ -77,10 +79,10 @@ int mdos_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { - int type = find_size(io, form_factor, variants); + int const type = find_size(io, form_factor, variants); if (type != -1) - return FIFID_SIZE; + return FIFID_SIZE | FIFID_STRUCT; return 0; } @@ -115,18 +117,22 @@ int mdos_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { + std::error_condition err; size_t actual; + uint64_t size; if (io.length(size)) return -1; + // Look at the disk ID sector. disk_id_sector info; - // Look at the disk id sector. - io.read_at(0, &info, sizeof(struct disk_id_sector), actual); + std::tie(err, actual) = read_at(io, 0, &info, sizeof(disk_id_sector)); + if (err || (sizeof(disk_id_sector) != actual)) + return -1; LOG_FORMATS("MDOS floppy dsk: size %d bytes, %d total sectors, %d remaining bytes, expected form factor %x\n", (uint32_t)size, (uint32_t)size / 128, (uint32_t)size % 128, form_factor); - // The 'unused' area is not necessarily zero filled and is ignoded + // The 'unused' area is not necessarily zero filled and is ignored // in the identification of a MDOS format image. // Expect an ASCII id, version, revision, and 'user name' strings. @@ -146,9 +152,9 @@ return -1; // The date should be the numeric day, month and year. - int month = parse_date_field(info.date); - int day = parse_date_field(info.date + 2); - int year = parse_date_field(info.date + 4); + int const month = parse_date_field(info.date); + int const day = parse_date_field(info.date + 2); + int const year = parse_date_field(info.date + 4); LOG_FORMATS(" day %d, month %d, year %d\n", day, month, year); if (day < 1 || day > 32 || month < 1 || month > 12 || year < 0) @@ -182,8 +188,12 @@ // the extent of the disk are free or available. uint8_t cluster_allocation[128], cluster_available[128]; - io.read_at(1 * 128, &cluster_allocation, sizeof(cluster_allocation), actual); - io.read_at(2 * 128, &cluster_available, sizeof(cluster_available), actual); + std::tie(err, actual) = read_at(io, 1 * 128, &cluster_allocation, sizeof(cluster_allocation)); + if (err || (sizeof(cluster_allocation) != actual)) + return -1; + std::tie(err, actual) = read_at(io, 2 * 128, &cluster_available, sizeof(cluster_available)); + if (err || (sizeof(cluster_available) != actual)) + return -1; for (int cluster = 0; cluster < sizeof(cluster_allocation) * 8; cluster++) { if (cluster * 4 * 128 + 4 * 128 > size) { @@ -202,7 +212,7 @@ } } - for (int i=0; formats[i].form_factor; i++) { + for (int i = 0; formats[i].form_factor; i++) { const format &f = formats[i]; LOG_FORMATS(" checking format %d with form factor %02x, %d sectors, %d heads\n", i, f.form_factor, f.sector_count, f.head_count); diff -Nru mame-0.263+dfsg.1/src/lib/formats/mfi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/mfi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/mfi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/mfi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,6 +8,7 @@ #include #include +#include /* @@ -99,38 +100,46 @@ int mfi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { header h; + auto const [err, actual] = read_at(io, 0, &h, sizeof(header)); + if (err || (sizeof(header) != actual)) + return 0; - size_t actual; - io.read_at(0, &h, sizeof(header), actual); - if((memcmp( h.sign, sign, 16) == 0 || memcmp( h.sign, sign_old, 16) == 0) && + if((!memcmp(h.sign, sign, 16) || !memcmp(h.sign, sign_old, 16)) && (h.cyl_count & CYLINDER_MASK) <= 84 && (h.cyl_count >> RESOLUTION_SHIFT) < 3 && h.head_count <= 2 && (!form_factor || !h.form_factor || h.form_factor == form_factor)) return FIFID_SIGN|FIFID_STRUCT; + return 0; } bool mfi_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; + header h; - entry entries[84*2*4]; - io.read_at(0, &h, sizeof(header), actual); - int resolution = h.cyl_count >> RESOLUTION_SHIFT; + std::tie(err, actual) = read_at(io, 0, &h, sizeof(header)); + if(err || (sizeof(header) != actual)) + return false; + int const resolution = h.cyl_count >> RESOLUTION_SHIFT; h.cyl_count &= CYLINDER_MASK; - io.read_at(sizeof(header), &entries, (h.cyl_count << resolution)*h.head_count*sizeof(entry), actual); - image.set_form_variant(h.form_factor, h.variant); if(!h.cyl_count) return true; + entry entries[84*2*4]; + std::tie(err, actual) = read_at(io, sizeof(header), &entries, (h.cyl_count << resolution)*h.head_count*sizeof(entry)); + if(err || (((h.cyl_count << resolution)*h.head_count*sizeof(entry)) != actual)) + return false; + std::function &src, std::vector &track)> converter; - if(!memcmp( h.sign, sign, 16)) { - converter = [](const std::vector &src, std::vector &track) -> void { + if(!memcmp(h.sign, sign, 16)) { + converter = [] (const std::vector &src, std::vector &track) { uint32_t ctime = 0; for(uint32_t mg : src) { ctime += mg & TIME_MASK; @@ -139,7 +148,7 @@ }; } else { - converter = [](const std::vector &src, std::vector &track) -> void { + converter = [] (const std::vector &src, std::vector &track) { unsigned int cell_count = src.size(); uint32_t mg = src[0] & MG_MASK; uint32_t wmg = src[cell_count - 1] & MG_MASK; @@ -184,7 +193,7 @@ compressed.resize(ent->compressed_size); uncompressed.resize(cell_count); - io.read_at(ent->offset, &compressed[0], ent->compressed_size, actual); + std::tie(err, actual) = read_at(io, ent->offset, &compressed[0], ent->compressed_size); // FIXME: check for errors and premature EOF uLongf size = ent->uncompressed_size; if(uncompress((Bytef *)uncompressed.data(), &size, &compressed[0], ent->compressed_size) != Z_OK) { @@ -204,7 +213,6 @@ bool mfi_format::save(util::random_read_write &io, const std::vector &variants, const floppy_image &image) const { - size_t actual; int tracks, heads; image.get_actual_geometry(tracks, heads); int resolution = image.get_resolution(); @@ -224,7 +232,7 @@ h.form_factor = image.get_form_factor(); h.variant = image.get_variant(); - io.write_at(0, &h, sizeof(header), actual); + write_at(io, 0, &h, sizeof(header)); // FIXME: check for errors memset(entries, 0, sizeof(entries)); @@ -258,11 +266,11 @@ entries[epos].write_splice = image.get_write_splice_position(track >> 2, head, track & 3); epos++; - io.write_at(pos, postcomp.get(), csize, actual); + write_at(io, pos, postcomp.get(), csize); // FIXME: check for errors pos += csize; } - io.write_at(sizeof(header), entries, (tracks << resolution)*heads*sizeof(entry), actual); + write_at(io, sizeof(header), entries, (tracks << resolution)*heads*sizeof(entry)); // FIXME: check for errors return true; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/mfi_dsk.h mame-0.264+dfsg.1/src/lib/formats/mfi_dsk.h --- mame-0.263+dfsg.1/src/lib/formats/mfi_dsk.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/mfi_dsk.h 2024-03-25 14:00:46.000000000 +0000 @@ -45,13 +45,13 @@ static const char sign[16]; struct header { - char sign[16]; - unsigned int cyl_count, head_count; - unsigned int form_factor, variant; + uint8_t sign[16]; + uint32_t cyl_count, head_count; + uint32_t form_factor, variant; }; struct entry { - unsigned int offset, compressed_size, uncompressed_size, write_splice; + uint32_t offset, compressed_size, uncompressed_size, write_splice; }; }; diff -Nru mame-0.263+dfsg.1/src/lib/formats/nabupc_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/nabupc_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/nabupc_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/nabupc_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -18,6 +18,7 @@ #include "ioprocs.h" #include "strformat.h" + const nabupc_format::format nabupc_format::formats[] = { { // 200k 40 track single sided double density (nabu) @@ -167,8 +168,7 @@ for (int head = 0; head < f.head_count; head++) { desc_pc_sector sects[sector_count]; uint8_t sectdata[sector_count * sector_size]; - size_t actual; - io.read_at((track * f.head_count + head) * sector_count * sector_size, sectdata, sector_count * sector_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track * f.head_count + head) * sector_count * sector_size, sectdata, sector_count * sector_size); // FIXME: check for errors and premature EOF for (int i = 0; i < sector_count; i++) { sects[i].track = track; sects[i].head = head; @@ -196,8 +196,7 @@ auto bitstream = generate_bitstream_from_track(track, head, 2000, image); auto sectors = extract_sectors_from_bitstream_mfm_pc(bitstream); for (int i = 0; i < sector_count; i++) { - size_t actual; - io.write_at(file_offset, sectors[i + 1].data(), sector_size, actual); + /*auto const [err, actual] =*/ write_at(io, file_offset, sectors[i + 1].data(), sector_size); // FIXME: check for errors file_offset += sector_size; } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/nfd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/nfd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/nfd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/nfd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -108,10 +108,11 @@ int nfd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[16]; - size_t actual; - io.read_at(0, h, 16, actual); + auto const [err, actual] = read_at(io, 0, h, 16); // TODO: does it really need 16 bytes? it only looks at 14. + if (err || (16 != actual)) + return 0; - if (strncmp((const char *)h, "T98FDDIMAGE.R0", 14) == 0 || strncmp((const char *)h, "T98FDDIMAGE.R1", 14) == 0) + if (!memcmp(h, "T98FDDIMAGE.R0", 14) || !memcmp(h, "T98FDDIMAGE.R1", 14)) return FIFID_SIGN; return 0; @@ -119,13 +120,12 @@ bool nfd_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint64_t size; if (io.length(size)) return false; uint8_t h[0x120], hsec[0x10]; - io.read_at(0, h, 0x120, actual); - int format_version = !strncmp((const char *)h, "T98FDDIMAGE.R0", 14) ? 0 : 1; + read_at(io, 0, h, 0x120); // FIXME: check for errors and premature EOF + int format_version = !memcmp(h, "T98FDDIMAGE.R0", 14) ? 0 : 1; // sector map (the 164th entry is only used by rev.1 format, loops with track < 163 are correct for rev.0) uint8_t disk_type = 0; @@ -149,7 +149,7 @@ { int curr_track_size = 0; // read sector map absolute location - io.read_at(pos, hsec, 4, actual); + read_at(io, pos, hsec, 4); // FIXME: check for errors and premature EOF pos += 4; uint32_t secmap_addr = little_endianize_int32(*(uint32_t *)(hsec)); @@ -158,14 +158,14 @@ // read actual sector map for the sectors of this track // for rev.1 format the first 0x10 are a track summary: // first WORD is # of sectors, second WORD is # of special data sectors - io.read_at(secmap_addr, hsec, 0x10, actual); + read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF secmap_addr += 0x10; num_secs[track] = little_endianize_int16(*(uint16_t *)(hsec)); num_specials[track] = little_endianize_int16(*(uint16_t *)(hsec + 0x2)); for (int sect = 0; sect < num_secs[track]; sect++) { - io.read_at(secmap_addr, hsec, 0x10, actual); + read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF if (track == 0 && sect == 0) disk_type = hsec[0xb]; // can this change across the disk? I don't think so... @@ -184,7 +184,7 @@ { for (int sect = 0; sect < num_specials[track]; sect++) { - io.read_at(secmap_addr, hsec, 0x10, actual); + read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF secmap_addr += 0x10; curr_track_size += (hsec[9] + 1) * little_endianize_int32(*(uint32_t *)(hsec + 0x0a)); } @@ -207,7 +207,7 @@ { // read sector map for this sector // for rev.0 format each sector uses 0x10 bytes - io.read_at(pos, hsec, 0x10, actual); + read_at(io, pos, hsec, 0x10); // FIXME: check for errors and premature EOF if (track == 0 && sect == 0) disk_type = hsec[0xa]; // can this change across the disk? I don't think so... @@ -254,7 +254,7 @@ for (int track = 0; track < 163 && pos < size; track++) { - io.read_at(pos, sect_data, track_sizes[track], actual); + read_at(io, pos, sect_data, track_sizes[track]); // FIXME: check for errors and premature EOF for (int i = 0; i < num_secs[track]; i++) { diff -Nru mame-0.263+dfsg.1/src/lib/formats/oric_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/oric_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/oric_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/oric_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,8 +39,7 @@ int oric_dsk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[256]; - size_t actual; - io.read_at(0, h, 256, actual); + /*auto const [err, actual] =*/ read_at(io, 0, h, 256); // FIXME: check for errors and premature EOF if(memcmp(h, "MFM_DISK", 8)) return 0; @@ -60,19 +59,18 @@ bool oric_dsk_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint8_t h[256]; uint8_t t[6250+3]; t[6250] = t[6251] = t[6252] = 0; - io.read_at(0, h, 256, actual); + read_at(io, 0, h, 256); // FIXME: check for errors and premature EOF int sides = get_u32le(&h[ 8]); int tracks = get_u32le(&h[12]); for(int side=0; side stream; int sector_size = 128; for(int i=0; i<6250; i++) { @@ -157,9 +155,9 @@ int const heads = size == 41*17*256 ? 1 : 2; - std::vector data(size); - size_t actual; - io.read_at(0, data.data(), size, actual); + auto const [err, data, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return false; for(int head = 0; head != heads; head++) for(int track = 0; track != 41; track++) { @@ -171,7 +169,7 @@ sdesc[s].sector = sector + 1; sdesc[s].size = 1; sdesc[s].actual_size = 256; - sdesc[s].data = data.data() + 256 * (sector + track*17 + head*17*41); + sdesc[s].data = &data[256 * (sector + track*17 + head*17*41)]; sdesc[s].deleted = false; sdesc[s].bad_crc = false; } @@ -203,8 +201,7 @@ auto sectors = extract_sectors_from_bitstream_mfm_pc(generate_bitstream_from_track(track, head, 2000, image)); for(unsigned int sector = 0; sector != 17; sector ++) { uint8_t const *const data = (sector+1 < sectors.size() && !sectors[sector+1].empty()) ? sectors[sector+1].data() : zero; - size_t actual; - io.write_at(256 * (sector + track*17 + head*17*41), data, 256, actual); + /*auto const [err, actual] =*/ write_at(io, 256 * (sector + track*17 + head*17*41), data, 256); // FIXME: check for errors } } return true; diff -Nru mame-0.263+dfsg.1/src/lib/formats/os9_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/os9_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/os9_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/os9_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -88,8 +88,7 @@ return -1; uint8_t os9_header[0x60]; - size_t actual; - io.read_at(0, os9_header, sizeof(os9_header), actual); + /*auto const [err, actual] =*/ read_at(io, 0, os9_header, sizeof(os9_header)); // FIXME: check for errors and premature EOF int os9_total_sectors = get_u24be(&os9_header[0x00]); int os9_heads = util::BIT(os9_header[0x10], 0) ? 2 : 1; diff -Nru mame-0.263+dfsg.1/src/lib/formats/pasti_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/pasti_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/pasti_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/pasti_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -45,11 +45,10 @@ int pasti_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { uint8_t h[16]; - size_t actual; - io.read_at(0, h, 16, actual); + /*auto const [err, actual] =*/ read_at(io, 0, h, 16); // FIXME: check for errors and premature EOF if(!memcmp(h, "RSY\0\3\0", 6) && - (1 || (h[10] >= 80 && h[10] <= 82) || (h[10] >= 160 && h[10] <= 164))) + (1 || (h[10] >= 80 && h[10] <= 82) || (h[10] >= 160 && h[10] <= 164))) // TODO: why is this check disabled? return FIFID_SIGN; return 0; @@ -67,9 +66,8 @@ bool pasti_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint8_t fh[16]; - io.read_at(0, fh, 16, actual); + read_at(io, 0, fh, 16); // FIXME: check for errors and premature EOF std::vector raw_track; @@ -84,7 +82,7 @@ for(int track=0; track < tracks; track++) { for(int head=0; head < heads; head++) { uint8_t th[16]; - io.read_at(pos, th, 16, actual); + read_at(io, pos, th, 16); // FIXME: check for errors and premature EOF int entry_len = get_u32le(&th[0]); int fuzz_len = get_u32le(&th[4]); int sect = get_u16le(&th[8]); @@ -95,7 +93,7 @@ raw_track.resize(entry_len-16); - io.read_at(pos+16, &raw_track[0], entry_len-16, actual); + read_at(io, pos+16, &raw_track[0], entry_len-16); // FIXME: check for errors and premature EOF uint8_t *fuzz = fuzz_len ? &raw_track[16*sect] : nullptr; uint8_t *bdata = fuzz ? fuzz+fuzz_len : &raw_track[16*sect]; diff -Nru mame-0.263+dfsg.1/src/lib/formats/pc98fdi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/pc98fdi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/pc98fdi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/pc98fdi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,8 +11,9 @@ #include "pc98fdi_dsk.h" #include "ioprocs.h" +#include "multibyte.h" -#include "osdcomm.h" // little_endianize_int32 +#include pc98fdi_format::pc98fdi_format() @@ -41,15 +42,16 @@ return 0; uint8_t h[32]; - size_t actual; - io.read_at(0, h, 32, actual); + auto const [err, actual] = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return 0; - uint32_t const hsize = little_endianize_int32(*(uint32_t *) (h + 0x8)); - uint32_t const psize = little_endianize_int32(*(uint32_t *) (h + 0xc)); - uint32_t const ssize = little_endianize_int32(*(uint32_t *) (h + 0x10)); - uint32_t const scnt = little_endianize_int32(*(uint32_t *) (h + 0x14)); - uint32_t const sides = little_endianize_int32(*(uint32_t *) (h + 0x18)); - uint32_t const ntrk = little_endianize_int32(*(uint32_t *) (h + 0x1c)); + uint32_t const hsize = get_u32le(h + 0x8); + uint32_t const psize = get_u32le(h + 0xc); + uint32_t const ssize = get_u32le(h + 0x10); + uint32_t const scnt = get_u32le(h + 0x14); + uint32_t const sides = get_u32le(h + 0x18); + uint32_t const ntrk = get_u32le(h + 0x1c); if(size == hsize + psize && psize == ssize*scnt*sides*ntrk) return FIFID_STRUCT; @@ -58,16 +60,19 @@ bool pc98fdi_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; uint8_t h[32]; - io.read_at(0, h, 32, actual); - - uint32_t const hsize = little_endianize_int32(*(uint32_t *)(h+0x8)); - uint32_t const sector_size = little_endianize_int32(*(uint32_t *)(h+0x10)); - uint32_t const sector_count = little_endianize_int32(*(uint32_t *)(h+0x14)); - uint32_t const head_count = little_endianize_int32(*(uint32_t *)(h+0x18)); - uint32_t const track_count = little_endianize_int32(*(uint32_t *)(h+0x1c)); + std::tie(err, actual) = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return false; + + uint32_t const hsize = get_u32le(h + 0x8); + uint32_t const sector_size = get_u32le(h + 0x10); + uint32_t const sector_count = get_u32le(h + 0x14); + uint32_t const head_count = get_u32le(h + 0x18); + uint32_t const track_count = get_u32le(h + 0x1c); int const cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666; @@ -78,9 +83,9 @@ desc_pc_sector sects[256]; uint8_t sect_data[65536]; - for(int track=0; track < track_count; track++) + for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { - io.read_at(hsize + sector_size*sector_count*(track*head_count + head), sect_data, sector_size*sector_count, actual); + std::tie(err, actual) = read_at(io, hsize + sector_size*sector_count*(track*head_count + head), sect_data, sector_size*sector_count); // FIXME: check for errors and premature EOF for(int i=0; i &variants, floppy_image &image) const { uint8_t track_count, head_count, sector_count; @@ -158,8 +158,7 @@ int track_size = sector_count*512; for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { - size_t actual; - io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(rx50_10_desc, track, head, sectors, sector_count, 102064, image); // 98480 } } @@ -205,8 +204,7 @@ for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata); - size_t actual; - io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors } } return true; diff -Nru mame-0.263+dfsg.1/src/lib/formats/sdf_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/sdf_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/sdf_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/sdf_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -50,8 +50,11 @@ return 0; } - size_t actual; - io.read_at(0, header, HEADER_SIZE, actual); + auto const [err, actual] = read_at(io, 0, header, HEADER_SIZE); + if (err || (HEADER_SIZE != actual)) + { + return 0; + } int tracks = header[4]; int heads = header[5]; @@ -79,12 +82,11 @@ bool sdf_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; uint8_t header[HEADER_SIZE]; std::vector track_data(TOTAL_TRACK_SIZE); std::vector raw_track_data; - io.read_at(0, header, HEADER_SIZE, actual); + read_at(io, 0, header, HEADER_SIZE); // FIXME: check for errors and premature EOF const int tracks = header[4]; const int heads = header[5]; @@ -108,7 +110,7 @@ raw_track_data.clear(); // Read track - io.read_at(HEADER_SIZE + (heads * track + head) * TOTAL_TRACK_SIZE, &track_data[0], TOTAL_TRACK_SIZE, actual); + read_at(io, HEADER_SIZE + (heads * track + head) * TOTAL_TRACK_SIZE, &track_data[0], TOTAL_TRACK_SIZE); // FIXME: check for errors and premature EOF int sector_count = track_data[0]; diff -Nru mame-0.263+dfsg.1/src/lib/formats/st_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/st_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/st_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/st_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -79,8 +79,7 @@ int track_size = sector_count*512; for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { - size_t actual; - io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(atari_st_fcp_get_desc(track, head, head_count, sector_count), track, head, sectors, sector_count, 100000, image); } @@ -116,8 +115,7 @@ for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata); - size_t actual; - io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors } } @@ -152,8 +150,7 @@ void msa_format::read_header(util::random_read &io, uint16_t &sign, uint16_t §, uint16_t &head, uint16_t &strack, uint16_t &etrack) { uint8_t h[10]; - size_t actual; - io.read_at(0, h, 10, actual); + /*auto const [err, actual] =*/ read_at(io, 0, h, 10); // FIXME: check for errors and premature EOF sign = get_u16be(&h[0]); sect = get_u16be(&h[2]); head = get_u16be(&h[4]); @@ -247,12 +244,11 @@ for(int track=strack; track <= etrack; track++) { for(int head=0; head <= heads; head++) { - size_t actual; uint8_t th[2]; - io.read_at(pos, th, 2, actual); + read_at(io, pos, th, 2); // FIXME: check for errors and premature EOF pos += 2; int tsize = get_u16be(th); - io.read_at(pos, sectdata, tsize, actual); + read_at(io, pos, sectdata, tsize); // FIXME: check for errors and premature EOF pos += tsize; if(tsize < track_size) { if(!uncompress(sectdata, tsize, track_size)) @@ -301,8 +297,7 @@ if(io.seek(0, SEEK_SET)) return false; - size_t actual; - io.write(header, 10, actual); + write(io, header, 10); // FIXME: check for errors uint8_t sectdata[11*512]; uint8_t compdata[11*512]; @@ -315,13 +310,13 @@ if(compress(sectdata, track_size, compdata, csize)) { uint8_t th[2]; put_u16be(th, csize); - io.write(th, 2, actual); - io.write(compdata, csize, actual); + write(io, th, 2); // FIXME: check for errors + write(io, compdata, csize); // FIXME: check for errors } else { uint8_t th[2]; put_u16be(th, track_size); - io.write(th, 2, actual); - io.write(sectdata, track_size, actual); + write(io, th, 2); // FIXME: check for errors + write(io, sectdata, track_size); // FIXME: check for errors } } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/svi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/svi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/svi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/svi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,8 +83,7 @@ sectors[i].bad_crc = false; sectors[i].data = §or_data[sector_offset]; - size_t actual; - io.read(sectors[i].data, sector_size, actual); + /*auto const [err, actual] =*/ read(io, sectors[i].data, sector_size); // FIXME: check for errors and premature EOF sector_offset += sector_size; } @@ -113,8 +112,7 @@ for (int i = 0; i < 18; i++) { - size_t actual; - io.write(sectors[i + 1].data(), 128, actual); + /*auto const [err, actual] =*/ write(io, sectors[i + 1].data(), 128); // FIXME: check for errors } // rest are mfm tracks @@ -130,8 +128,7 @@ for (int i = 0; i < 17; i++) { - size_t actual; - io.write(sectors[i + 1].data(), 256, actual); + /*auto const [err, actual] =*/ write(io, sectors[i + 1].data(), 256); // FIXME: check for errors } } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/td0_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/td0_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/td0_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/td0_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -20,6 +20,7 @@ #include "multibyte.h" #include +#include #define BUFSZ 512 // new input buffer @@ -330,8 +331,7 @@ if (size > image_size - floppy_file_offset) { size = image_size - floppy_file_offset; } - size_t actual; - floppy_file.read_at(floppy_file_offset, buf, size, actual); + /*auto const [err, actual] =*/ read_at(floppy_file, floppy_file_offset, buf, size); // FIXME: check for errors and premature EOF floppy_file_offset += size; return size; } @@ -810,10 +810,13 @@ int td0_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { - size_t actual; uint8_t h[7]; + auto const [err, actual] = read_at(io, 0, h, 7); // FIXME: does this need to read 7 bytes? it only check 2 bytes. Also check for premature EOF. + if(err) + { + return 0; + } - io.read_at(0, h, 7, actual); if(((h[0] == 'T') && (h[1] == 'D')) || ((h[0] == 't') && (h[1] == 'd'))) { return FIFID_SIGN; @@ -823,6 +826,7 @@ bool td0_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { + std::error_condition err; size_t actual; int track_count = 0; int head_count = 0; @@ -830,9 +834,10 @@ int offset = 0; const int max_size = 4*1024*1024; // 4MB ought to be large enough for any floppy std::vector imagebuf(max_size); - uint8_t header[12]; - if(io.read_at(0, header, 12, actual) || actual != 12) + uint8_t header[12]; + std::tie(err, actual) = read_at(io, 0, header, 12); + if(err || (actual != 12)) return false; head_count = header[9]; @@ -849,7 +854,8 @@ uint64_t image_size; if(io.length(image_size)) return false; - if(io.read_at(12, &imagebuf[0], image_size - 12, actual) || actual != (image_size - 12)) + std::tie(err, actual) = read_at(io, 12, &imagebuf[0], image_size - 12); + if(err || (actual != (image_size - 12))) return false; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/ti99_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/ti99_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/ti99_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/ti99_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -954,8 +954,7 @@ { // Read first sector (Volume Information Block) ti99vib vib; - size_t actual; - io.read_at(0, &vib, sizeof(ti99vib), actual); + /*auto const [err, actual] =*/ read_at(io, 0, &vib, sizeof(ti99vib)); // FIXME: check for errors and premature EOF // Check from contents if ((vib.id[0]=='D')&&(vib.id[1]=='S')&&(vib.id[2]=='K')) @@ -993,8 +992,7 @@ // Read first sector ti99vib vib; - size_t actual; - io.read_at(0, &vib, sizeof(ti99vib), actual); + /*auto const [err, actual] =*/ read_at(io, 0, &vib, sizeof(ti99vib)); // FIXME: check for errors and premature EOF // Check from contents if ((vib.id[0]=='D')&&(vib.id[1]=='S')&&(vib.id[2]=='K')) @@ -1079,8 +1077,7 @@ int logicaltrack = (head==0)? track : (2*trackcount - track - 1); int position = logicaltrack * get_track_size(sectorcount); - size_t actual; - io.read_at(position, sectordata, sectorcount*SECTOR_SIZE, actual); + /*auto const [err, actual] =*/ read_at(io, position, sectordata, sectorcount*SECTOR_SIZE); // FIXME: check for errors and premature EOF // Interleave and skew int interleave = 7; @@ -1158,8 +1155,7 @@ { uint8_t const *const buf = sectordata + i * SECTOR_SIZE; LOGMASKED(LOG_DETAIL, "[ti99_dsk] Writing sector %d (offset %06x)\n", sector[i], sector[i] * SECTOR_SIZE); - size_t actual; - io.write_at(trackoffset + sector[i] * SECTOR_SIZE, buf, SECTOR_SIZE, actual); + /*auto const [err, actual] =*/ write_at(io, trackoffset + sector[i] * SECTOR_SIZE, buf, SECTOR_SIZE); // FIXME: check for errors } } @@ -1246,8 +1242,7 @@ LOGMASKED(LOG_INFO, "[ti99_dsk] Image file length matches TDF\n"); // Fetch track 0 - size_t actual; - io.read_at(0, fulltrack, get_track_size(sector_count), actual); + /*auto const [err, actual] =*/ read_at(io, 0, fulltrack, get_track_size(sector_count)); // FIXME: check for errors and premature EOF if (sector_count == 9) { @@ -1358,12 +1353,11 @@ */ void ti99_tdf_format::load_track(util::random_read &io, uint8_t *sectordata, int *sector, int *secoffset, int head, int track, int sectorcount, int trackcount) const { - size_t actual; uint8_t fulltrack[12544]; // space for a full TDF track // Read beginning of track 0. We need this to get the first gap, according // to the format - io.read_at(0, fulltrack, 100, actual); + read_at(io, 0, fulltrack, 100); // FIXME: check for errors and premature EOF int offset = 0; int tracksize = get_track_size(sectorcount); @@ -1404,7 +1398,7 @@ int base = (head * trackcount + track) * tracksize; int position = 0; - io.read_at(base, fulltrack, tracksize, actual); + read_at(io, base, fulltrack, tracksize); // FIXME: check for errors and premature EOF for (int i=0; i < sectorcount; i++) { @@ -1506,8 +1500,7 @@ for (int i=0; i < param[WGAP3]; i++) trackdata[pos++] = param[WGAPBYTE]; } for (int i=0; i < param[WGAP4]; i++) trackdata[pos++] = param[WGAPBYTE]; - size_t actual; - io.write_at(offset, trackdata, get_track_size(sector_count), actual); + /*auto const [err, actual] =*/ write_at(io, offset, trackdata, get_track_size(sector_count)); // FIXME: check for errors } int ti99_tdf_format::get_track_size(int sector_count) const diff -Nru mame-0.263+dfsg.1/src/lib/formats/trd_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/trd_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/trd_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/trd_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,6 +12,8 @@ #include "ioprocs.h" +#include + trd_format::trd_format() : wd177x_format(formats) { @@ -51,16 +53,19 @@ { index = i; // at least size match, save it for the case if there will be no exact matches + std::error_condition err; size_t actual; uint8_t sectdata[0x100]; if (f.encoding == floppy_image::MFM) - io.read_at(0x800, sectdata, 0x100, actual); + std::tie(err, actual) = read_at(io, 0x800, sectdata, 0x100); else { - io.read_at(0x100, sectdata, 0x100, actual); + std::tie(err, actual) = read_at(io, 0x100, sectdata, 0x100); for (int i = 0; i < 0x100; i++) sectdata[i] ^= 0xff; } + if (err || (0x100 != actual)) + continue; uint8_t disktype = sectdata[0xe3]; // 16 - DS80, 17 - DS40, 18 - SS80, 19 - SS40 if (disktype < 0x16 || disktype > 0x19) diff -Nru mame-0.263+dfsg.1/src/lib/formats/trs80_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/trs80_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/trs80_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/trs80_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -146,9 +146,9 @@ if (image_size < 0x2200) return 0; // too small, silent return - std::vector data(image_size); - size_t actual; - io.read_at(0, data.data(), image_size, actual); + auto const [err, data, actual] = read_at(io, 0, image_size); + if (err || (actual != image_size)) + return 0; const uint32_t entries = 2901; const uint32_t header_size = entries *3 +1; @@ -238,9 +238,9 @@ uint64_t image_size; if (io.length(image_size)) return false; - std::vector data(image_size); - size_t actual; - io.read_at(0, data.data(), data.size(), actual); + auto const [err, data, actual] = read_at(io, 0, image_size); + if (err || (actual != image_size)) + return 0; const uint32_t entries = 2901; const uint32_t header_size = entries *3 +1; bool is_dd = false, is_ds = false; @@ -365,13 +365,14 @@ { // If the disk already exists, find out if it's writable uint64_t image_size; - if (!io.length(image_size)) + if (!io.length(image_size) && (image_size >= 0x2200)) { - std::vector data(image_size); - size_t actual; - io.read_at(0, data.data(), data.size(), actual); - if ((data.size() >= 0x2200) && (data[0x21ff] == 0)) - return false; // disk is readonly + uint8_t flag; + auto const [err, actual] = read_at(io, 0x21ff, &flag, 1); + if (err || (1 != actual)) // TODO: should we save over the top if we couldn’t read the read-only flag? + return false; + if (flag == 0) + return false; // disk is read-only } } @@ -413,8 +414,7 @@ header[sect_ptr++] = track; header[sect_ptr++] = i; header[sect_ptr++] = head ? 0x10 : 0; - size_t actual; - io.write_at(data_ptr, &dummy[0], 256, actual); + /*auto const [err, actual] =*/ write_at(io, data_ptr, &dummy[0], 256); // FIXME: check for errors data_ptr += 256; } } @@ -435,16 +435,14 @@ flags |= (sectors[i].size() >> 8) ^1; flags |= head ? 0x10 : 0; header[sect_ptr++] = flags; - size_t actual; - io.write_at(data_ptr, sectors[i].data(), sectors[i].size(), actual); + /*auto const [err, actual] =*/ write_at(io, data_ptr, sectors[i].data(), sectors[i].size()); // FIXME: check for errors data_ptr += sectors[i].size(); } } } } // Save the header - size_t actual; - io.write_at(0, header, 0x2200, actual); + /*auto const [err, actual] =*/ write_at(io, 0, header, 0x2200); // FIXME: check for errors return true; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/uniflex_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/uniflex_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/uniflex_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/uniflex_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,8 +53,9 @@ // Look at the SIR sector, the second sector. uint8_t sir[192]; - size_t actual; - io.read_at(1 * 512, sir, sizeof(sir), actual); + auto const [err, actual] = read_at(io, 1 * 512, sir, sizeof(sir)); // FIXME: check for premature EOF + if (err) + return -1; uint16_t fdn_block_count = get_u16be(&sir[0x10]); uint32_t last_block_number = get_u24be(&sir[0x12]); diff -Nru mame-0.263+dfsg.1/src/lib/formats/upd765_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/upd765_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/upd765_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/upd765_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -231,8 +231,7 @@ for(int track=0; track < f.track_count; track++) for(int head=0; head < f.head_count; head++) { build_sector_description(f, sectdata, sectors, track, head); - size_t actual; - io.read_at((track*f.head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, (track*f.head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(desc, track, head, sectors, f.sector_count, total_size, image); } @@ -345,20 +344,19 @@ if(chosen_candidate == -1) chosen_candidate = 0; - const format &f = formats[chosen_candidate]; int track_size = compute_track_size(f); uint8_t sectdata[40*512]; desc_s sectors[40]; - for(int track=0; track < f.track_count; track++) + for(int track=0; track < f.track_count; track++) { for(int head=0; head < f.head_count; head++) { build_sector_description(f, sectdata, sectors, track, head); extract_sectors(image, f, sectors, track, head); - size_t actual; - io.write_at((track*f.head_count + head)*track_size, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, (track*f.head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors } + } return true; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/vdk_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/vdk_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/vdk_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/vdk_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -36,9 +36,10 @@ int vdk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) const { - size_t actual; uint8_t id[2]; - io.read_at(0, id, 2, actual); + auto const [err, actual] = read_at(io, 0, id, 2); + if (err || (2 != actual)) + return 0; if (id[0] == 'd' && id[1] == 'k') return FIFID_SIGN; @@ -48,12 +49,11 @@ bool vdk_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { - size_t actual; if (io.seek(0, SEEK_SET)) return false; uint8_t header[0x100]; - io.read(header, 0x100, actual); + read(io, header, 0x100); // FIXME: check for errors and premature EOF int const header_size = header[3] * 0x100 + header[2]; int const track_count = header[8]; @@ -81,7 +81,7 @@ sectors[i].bad_crc = false; sectors[i].data = §or_data[sector_offset]; - io.read(sectors[i].data, SECTOR_SIZE, actual); + read(io, sectors[i].data, SECTOR_SIZE); // FIXME: check for errors and premature EOF sector_offset += SECTOR_SIZE; } @@ -95,7 +95,6 @@ bool vdk_format::save(util::random_read_write &io, const std::vector &variants, const floppy_image &image) const { - size_t actual; if (io.seek(0, SEEK_SET)) return false; @@ -118,7 +117,7 @@ header[10] = 0; header[11] = 0; - io.write(header, sizeof(header), actual); + write(io, header, sizeof(header)); // FIXME: check for errors // write disk data for (int track = 0; track < track_count; track++) @@ -129,7 +128,7 @@ auto sectors = extract_sectors_from_bitstream_mfm_pc(bitstream); for (int i = 0; i < SECTOR_COUNT; i++) - io.write(sectors[FIRST_SECTOR_ID + i].data(), SECTOR_SIZE, actual); + write(io, sectors[FIRST_SECTOR_ID + i].data(), SECTOR_SIZE); // FIXME: check for errors } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/vgi_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/vgi_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/vgi_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/vgi_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -18,8 +18,8 @@ #include -static const int track_size = 100'000; -static const int half_bitcell_size = 2000; +static constexpr int TRACK_SIZE = 100'000; +static constexpr int HALF_BITCELL_SIZE = 2000; micropolis_vgi_format::micropolis_vgi_format() : floppy_image_format_t() { @@ -76,14 +76,14 @@ for (int track = 0; track < fmt.track_count; track++) { for (int sector = 0; sector < 16; sector++) { for (int i = 0; i < 40; i++) - mfm_w(buf, 8, 0, half_bitcell_size); - std::size_t actual; - if (io.read(sector_bytes, std::size(sector_bytes), actual)) + mfm_w(buf, 8, 0, HALF_BITCELL_SIZE); + auto const [err, actual] = read(io, sector_bytes, std::size(sector_bytes)); + if (err || (actual != std::size(sector_bytes))) return false; for (int i = 0; i < std::size(sector_bytes); i++) - mfm_w(buf, 8, sector_bytes[i], half_bitcell_size); - while (buf.size() < track_size/16 * (sector+1)) - mfm_w(buf, 8, 0, half_bitcell_size); + mfm_w(buf, 8, sector_bytes[i], HALF_BITCELL_SIZE); + while (buf.size() < TRACK_SIZE/16 * (sector+1)) + mfm_w(buf, 8, 0, HALF_BITCELL_SIZE); } generate_track_from_levels(track, head, buf, 0, image); buf.clear(); @@ -116,9 +116,9 @@ uint8_t sector_bytes[275]; for (int head = 0; head < fmt.head_count; head++) { for (int track = 0; track < fmt.track_count; track++) { - std::vector bitstream = generate_bitstream_from_track(track, head, half_bitcell_size, image); + std::vector bitstream = generate_bitstream_from_track(track, head, HALF_BITCELL_SIZE, image); for (int sector = 0; sector < 16; sector++) { - int sector_start = track_size/16 * sector; + int sector_start = TRACK_SIZE/16 * sector; uint32_t pos = sector_start + 512 - 16; uint16_t shift_reg = 0; while (pos < sector_start + 60*16 && pos < bitstream.size()) { @@ -134,8 +134,8 @@ memset(sector_bytes, 0, std::size(sector_bytes)); } - std::size_t actual; - if (io.write(sector_bytes, std::size(sector_bytes), actual)) + auto const [err, actual] = write(io, sector_bytes, std::size(sector_bytes)); + if (err) return false; } } diff -Nru mame-0.263+dfsg.1/src/lib/formats/victor9k_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/victor9k_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/victor9k_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/victor9k_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -136,12 +136,12 @@ int victor9k_format::find_size(util::random_read &io) { uint64_t size; - if(io.length(size)) + if (io.length(size)) return -1; - for(int i=0; formats[i].sector_count; i++) { + for (int i = 0; formats[i].sector_count; i++) { const format &f = formats[i]; - if(size == (uint32_t) f.sector_count*f.sector_base_size) + if(size == uint32_t(f.sector_count*f.sector_base_size)) return i; } @@ -155,7 +155,7 @@ int victor9k_format::identify(const floppy_image &image) { - for(int i=0; formats[i].form_factor; i++) { + for (int i = 0; formats[i].form_factor; i++) { const format &f = formats[i]; if(f.variant == image.get_variant()) return i; @@ -291,7 +291,7 @@ bool victor9k_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image &image) const { int const type = find_size(io, form_factor); - if(type == -1) + if (type == -1) return false; const format &f = formats[type]; @@ -300,15 +300,12 @@ f.head_count, f.sector_count); uint64_t size; - if(io.length(size)) + if (io.length(size)) return false; - std::vector img; - try { img.resize(size); } - catch (...) { return false; } - - size_t actual; - io.read_at(0, &img[0], size, actual); + auto const [err, img, actual] = read_at(io, 0, size); + if (err || (actual != size)) + return false; log_boot_sector(&img[0]); @@ -449,17 +446,17 @@ { int type = victor9k_format::identify(image); uint64_t size; - io.length(size); + io.length(size); // FIXME: check for errors osd_printf_verbose("save type: %01d, size: %d\n", type, size); - if(type == -1) + if (type == -1) return false; const format &f = formats[type]; osd_printf_verbose("save Heads: %01d Tracks: %02d Sectors/track head[1]track[1]: %02d\n ", f.head_count, f.track_count, sectors_per_track[1][1]); - for(int head=0; head < f.head_count; head++) { + for (int head = 0; head < f.head_count; head++) { for(int track=0; track < f.track_count; track++) { int sector_count = sectors_per_track[head][track]; int track_size = compute_track_size(f, head, track); @@ -471,8 +468,7 @@ build_sector_description(f, sectdata, 0, sectors, sector_count); extract_sectors(image, f, sectors, track, head, sector_count); - size_t actual; - io.write_at(offset, sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, offset, sectdata, track_size); // FIXME: check for errors } } @@ -481,7 +477,6 @@ void victor9k_format::extract_sectors(const floppy_image &image, const format &f, desc_s *sdesc, int track, int head, int sector_count) { - // Extract the sectors auto bitstream = generate_bitstream_from_track(track, head, cell_size[speed_zone[head][track]], image); auto sectors = extract_sectors_from_bitstream_victor_gcr5(bitstream); @@ -493,14 +488,14 @@ } } - for(int i=0; i> i) & 1); } -void vtech_common_format::image_to_flux(const std::vector &bdata, floppy_image &image) +void vtech_common_format::image_to_flux(const uint8_t *bdata, size_t size, floppy_image &image) { static const uint8_t sector_map[16] = { 0x0, 0xb, 0x6, 0x1, 0xc, 0x7, 0x2, 0xd, 0x8, 0x3, 0xe, 0x9, 0x4, 0xf, 0xa, 0x5 }; - for(int track = 0; track != 40; track ++) { + for(int track = 0; track != 40; track++) { uint32_t pos = 0; std::vector &buffer = image.get_buffer(track, 0); buffer.clear(); @@ -49,7 +49,7 @@ // One window of pad at the start to avoid problems with the write splice wbit(buffer, pos, 0); - for(int sector = 0; sector != 16; sector ++) { + for(int sector = 0; sector != 16; sector++) { uint8_t sid = sector_map[sector]; for(int i=0; i != 7; i++) wbyte(buffer, pos, 0x80); @@ -69,7 +69,7 @@ wbyte(buffer, pos, 0xe7); wbyte(buffer, pos, 0xfe); uint16_t chk = 0; - const uint8_t *src = bdata.data() + 16*128*track + 128*sid; + const uint8_t *src = &bdata[16*128*track + 128*sid]; for(int i=0; i != 128; i++) { chk += src[i]; wbyte(buffer, pos, src[i]); @@ -106,7 +106,7 @@ for(;;) { int npos = cpos; for(;;) { - npos ++; + npos++; if(npos == sz) npos = 0; if((buffer[npos] & floppy_image::MG_MASK) == floppy_image::MG_F) @@ -135,7 +135,7 @@ buf = (buf << 1) | bitstream[sz-64+i]; for(;;) { buf = (buf << 1) | bitstream[pos]; - count ++; + count++; switch(mode) { case 0: // idle if(buf == 0x80808000fee718c3) @@ -243,15 +243,15 @@ if(size < 256) return 0; - std::vector bdata(size); - size_t actual; - io.read_at(0, bdata.data(), size, actual); + auto const [err, bdata, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return 0; // Structurally validate the presence of sector headers and data int count_sh = 0, count_sd = 0; uint64_t buf = 0; - for(uint8_t b : bdata) { - buf = (buf << 8) | b; + for(size_t i = 0; size > i; ++i) { + buf = (buf << 8) | bdata[i]; if(buf == 0x80808000fee718c3) count_sh++; else if(buf == 0x80808000c318e7fe) @@ -267,11 +267,11 @@ if(io.length(size) || (size != 40*16*256)) return false; - std::vector bdata(size); - size_t actual; - io.read_at(0, bdata.data(), size, actual); + auto const [err, bdata, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return false; - image_to_flux(bdata, image); + image_to_flux(bdata.get(), size, image); image.set_form_variant(floppy_image::FF_525, floppy_image::SSSD); return true; } @@ -281,9 +281,9 @@ uint64_t size; if(io.length(size)) return false; - std::vector bdata(size); - size_t actual; - io.read_at(0, bdata.data(), size, actual); + auto const [err, bdata, actual] = read_at(io, 0, size); + if(err || (actual != size)) + return false; std::vector bdatax(128*16*40, 0); @@ -293,9 +293,9 @@ uint64_t buf = 0; uint8_t *dest = nullptr; - for(uint8_t b : bdata) { - buf = (buf << 8) | b; - count ++; + for(size_t i = 0; size > i; ++i) { + buf = (buf << 8) | bdata[i]; + count++; switch(mode) { case 0: // idle if(buf == 0x80808000fee718c3) @@ -305,14 +305,14 @@ case 1: // sector header if(count == 3) { - uint8_t trk = buf >> 16; - uint8_t sector = buf >> 8; - uint8_t chk = buf; + const uint8_t trk = buf >> 16; + const uint8_t sector = buf >> 8; + const uint8_t chk = buf; if(chk != sector + trk) { mode = 0; break; } - dest = bdatax.data() + 128*16*trk + sector*128; + dest = &bdatax[128*16*trk + sector*128]; checksum = 0; mode = 2; } @@ -328,7 +328,7 @@ case 3: // sector data if(count <= 128) { - uint8_t byte = buf; + const uint8_t byte = buf; checksum += byte; *dest++ = byte; @@ -341,7 +341,7 @@ } } - image_to_flux(bdatax, image); + image_to_flux(bdatax.data(), bdatax.size(), image); image.set_form_variant(floppy_image::FF_525, floppy_image::SSSD); return true; } @@ -354,8 +354,7 @@ return false; auto bdata = flux_to_image(image); - size_t actual; - io.write_at(0, bdata.data(), bdata.size(), actual); + /*auto const [err, actual] =*/ write_at(io, 0, bdata.data(), bdata.size()); // FIXME: check for errors return true; } @@ -376,8 +375,8 @@ }; int pos = 0; - for(int track = 0; track != 40; track ++) { - for(int sector = 0; sector != 16; sector ++) { + for(int track = 0; track != 40; track++) { + for(int sector = 0; sector != 16; sector++) { uint8_t sid = sector_map[sector]; for(int i=0; i != 7; i++) bdatax[pos++] = 0x80; @@ -407,8 +406,7 @@ } } - size_t actual; - io.write_at(0, bdatax.data(), bdatax.size(), actual); + /*auto const [err, actual] =*/ write_at(io, 0, bdatax.data(), bdatax.size()); // FIXME: check for errors return true; } diff -Nru mame-0.263+dfsg.1/src/lib/formats/vt_dsk.h mame-0.264+dfsg.1/src/lib/formats/vt_dsk.h --- mame-0.263+dfsg.1/src/lib/formats/vt_dsk.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/vt_dsk.h 2024-03-25 14:00:46.000000000 +0000 @@ -19,7 +19,7 @@ virtual bool supports_save() const noexcept override { return true; } protected: - static void image_to_flux(const std::vector &bdata, floppy_image &image); + static void image_to_flux(const uint8_t *bdata, size_t size, floppy_image &image); static std::vector flux_to_image(const floppy_image &image); static void wbit(std::vector &buffer, uint32_t &pos, bool bit); diff -Nru mame-0.263+dfsg.1/src/lib/formats/wd177x_dsk.cpp mame-0.264+dfsg.1/src/lib/formats/wd177x_dsk.cpp --- mame-0.263+dfsg.1/src/lib/formats/wd177x_dsk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/formats/wd177x_dsk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -262,8 +262,7 @@ build_sector_description(tf, sectdata, sectors, track, head); int track_size = compute_track_size(tf); - size_t actual; - io.read_at(get_image_offset(f, head, track), sectdata, track_size, actual); + /*auto const [err, actual] =*/ read_at(io, get_image_offset(f, head, track), sectdata, track_size); // FIXME: check for errors and premature EOF generate_track(desc, track, head, sectors, tf.sector_count, total_size, image); } @@ -389,8 +388,7 @@ build_sector_description(tf, sectdata, sectors, track, head); extract_sectors(image, tf, sectors, track, head); int track_size = compute_track_size(tf); - size_t actual; - io.write_at(get_image_offset(f, head, track), sectdata, track_size, actual); + /*auto const [err, actual] =*/ write_at(io, get_image_offset(f, head, track), sectdata, track_size); // FIXME: check for errors } } diff -Nru mame-0.263+dfsg.1/src/lib/netlist/generated/static_solvers.cpp mame-0.264+dfsg.1/src/lib/netlist/generated/static_solvers.cpp --- mame-0.263+dfsg.1/src/lib/netlist/generated/static_solvers.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/netlist/generated/static_solvers.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4889,6 +4889,182 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// armora,solarq,starcas,wotw +static void nl_gcr_22_double_double_1250f340dea396ae(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + double m_A13(0.0); + double m_A14(0.0); + double m_A15(0.0); + double m_A16(0.0); + double m_A17(0.0); + double m_A18(0.0); + double m_A19(0.0); + double m_A20(0.0); + double m_A21(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A0 += gt[3]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 += Idr[3]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + RHS0 -= go[3] * *cnV[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A3 += go[4]; + double RHS1 = Idr[4]; + RHS1 += Idr[5]; + RHS1 -= go[5] * *cnV[5]; + m_A4 += gt[6]; + m_A4 += gt[7]; + m_A4 += gt[8]; + m_A4 += gt[9]; + m_A4 += gt[10]; + m_A4 += gt[11]; + m_A4 += gt[12]; + m_A4 += gt[13]; + m_A7 += go[6]; + m_A6 += go[7]; + m_A6 += go[8]; + m_A5 += go[9]; + m_A5 += go[10]; + double RHS2 = Idr[6]; + RHS2 += Idr[7]; + RHS2 += Idr[8]; + RHS2 += Idr[9]; + RHS2 += Idr[10]; + RHS2 += Idr[11]; + RHS2 += Idr[12]; + RHS2 += Idr[13]; + RHS2 -= go[11] * *cnV[11]; + RHS2 -= go[12] * *cnV[12]; + RHS2 -= go[13] * *cnV[13]; + m_A10 += gt[14]; + m_A10 += gt[15]; + m_A10 += gt[16]; + m_A10 += gt[17]; + m_A10 += gt[18]; + m_A10 += gt[19]; + m_A9 += go[14]; + m_A9 += go[15]; + m_A8 += go[16]; + double RHS3 = Idr[14]; + RHS3 += Idr[15]; + RHS3 += Idr[16]; + RHS3 += Idr[17]; + RHS3 += Idr[18]; + RHS3 += Idr[19]; + RHS3 -= go[17] * *cnV[17]; + RHS3 -= go[18] * *cnV[18]; + RHS3 -= go[19] * *cnV[19]; + m_A15 += gt[20]; + m_A15 += gt[21]; + m_A15 += gt[22]; + m_A15 += gt[23]; + m_A15 += gt[24]; + m_A16 += go[20]; + m_A16 += go[21]; + m_A13 += go[22]; + m_A13 += go[23]; + double RHS4 = Idr[20]; + RHS4 += Idr[21]; + RHS4 += Idr[22]; + RHS4 += Idr[23]; + RHS4 += Idr[24]; + RHS4 -= go[24] * *cnV[24]; + m_A21 += gt[25]; + m_A21 += gt[26]; + m_A21 += gt[27]; + m_A21 += gt[28]; + m_A21 += gt[29]; + m_A20 += go[25]; + m_A20 += go[26]; + m_A18 += go[27]; + m_A17 += go[28]; + double RHS5 = Idr[25]; + RHS5 += Idr[26]; + RHS5 += Idr[27]; + RHS5 += Idr[28]; + RHS5 += Idr[29]; + RHS5 -= go[29] * *cnV[29]; + const double f0 = 1.0 / m_A0; + const double f0_3 = -f0 * m_A8; + m_A10 += m_A1 * f0_3; + RHS3 += f0_3 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_5 = -f1 * m_A17; + m_A21 += m_A3 * f1_5; + RHS5 += f1_5 * RHS1; + const double f2 = 1.0 / m_A4; + const double f2_3 = -f2 * m_A9; + m_A10 += m_A5 * f2_3; + m_A11 += m_A6 * f2_3; + m_A12 += m_A7 * f2_3; + RHS3 += f2_3 * RHS2; + const double f2_4 = -f2 * m_A13; + m_A14 += m_A5 * f2_4; + m_A15 += m_A6 * f2_4; + m_A16 += m_A7 * f2_4; + RHS4 += f2_4 * RHS2; + const double f2_5 = -f2 * m_A18; + m_A19 += m_A5 * f2_5; + m_A20 += m_A6 * f2_5; + m_A21 += m_A7 * f2_5; + RHS5 += f2_5 * RHS2; + const double f3 = 1.0 / m_A10; + const double f3_4 = -f3 * m_A14; + m_A15 += m_A11 * f3_4; + m_A16 += m_A12 * f3_4; + RHS4 += f3_4 * RHS3; + const double f3_5 = -f3 * m_A19; + m_A20 += m_A11 * f3_5; + m_A21 += m_A12 * f3_5; + RHS5 += f3_5 * RHS3; + const double f4 = 1.0 / m_A15; + const double f4_5 = -f4 * m_A20; + m_A21 += m_A16 * f4_5; + RHS5 += f4_5 * RHS4; + V[5] = RHS5 / m_A21; + double tmp4 = 0.0; + tmp4 += m_A16 * V[5]; + V[4] = (RHS4 - tmp4) / m_A15; + double tmp3 = 0.0; + tmp3 += m_A11 * V[4]; + tmp3 += m_A12 * V[5]; + V[3] = (RHS3 - tmp3) / m_A10; + double tmp2 = 0.0; + tmp2 += m_A5 * V[3]; + tmp2 += m_A6 * V[4]; + tmp2 += m_A7 * V[5]; + V[2] = (RHS2 - tmp2) / m_A4; + double tmp1 = 0.0; + tmp1 += m_A3 * V[5]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[3]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // armora static void nl_gcr_22_double_double_a6cfda6668b153c2(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -6698,107 +6874,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// astrob,rebound -static void nl_gcr_13_double_double_a41a44bd5c424f88(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - m_A2 += gt[3]; - m_A2 += gt[4]; - m_A2 += gt[5]; - m_A3 += go[3]; - double RHS1 = Idr[3]; - RHS1 += Idr[4]; - RHS1 += Idr[5]; - RHS1 -= go[4] * *cnV[4]; - RHS1 -= go[5] * *cnV[5]; - m_A4 += gt[6]; - m_A4 += gt[7]; - m_A4 += gt[8]; - m_A5 += go[6]; - double RHS2 = Idr[6]; - RHS2 += Idr[7]; - RHS2 += Idr[8]; - RHS2 -= go[7] * *cnV[7]; - RHS2 -= go[8] * *cnV[8]; - m_A6 += gt[9]; - m_A6 += gt[10]; - m_A6 += gt[11]; - m_A7 += go[9]; - double RHS3 = Idr[9]; - RHS3 += Idr[10]; - RHS3 += Idr[11]; - RHS3 -= go[10] * *cnV[10]; - RHS3 -= go[11] * *cnV[11]; - m_A12 += gt[12]; - m_A12 += gt[13]; - m_A12 += gt[14]; - m_A12 += gt[15]; - m_A12 += gt[16]; - m_A11 += go[12]; - m_A10 += go[13]; - m_A9 += go[14]; - m_A8 += go[15]; - double RHS4 = Idr[12]; - RHS4 += Idr[13]; - RHS4 += Idr[14]; - RHS4 += Idr[15]; - RHS4 += Idr[16]; - RHS4 -= go[16] * *cnV[16]; - const double f0 = 1.0 / m_A0; - const double f0_4 = -f0 * m_A8; - m_A12 += m_A1 * f0_4; - RHS4 += f0_4 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_4 = -f1 * m_A9; - m_A12 += m_A3 * f1_4; - RHS4 += f1_4 * RHS1; - const double f2 = 1.0 / m_A4; - const double f2_4 = -f2 * m_A10; - m_A12 += m_A5 * f2_4; - RHS4 += f2_4 * RHS2; - const double f3 = 1.0 / m_A6; - const double f3_4 = -f3 * m_A11; - m_A12 += m_A7 * f3_4; - RHS4 += f3_4 * RHS3; - V[4] = RHS4 / m_A12; - double tmp3 = 0.0; - tmp3 += m_A7 * V[4]; - V[3] = (RHS3 - tmp3) / m_A6; - double tmp2 = 0.0; - tmp2 += m_A5 * V[4]; - V[2] = (RHS2 - tmp2) / m_A4; - double tmp1 = 0.0; - tmp1 += m_A3 * V[4]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[4]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // astrob static void nl_gcr_154_double_double_13833bf8c127deaa(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -12987,6 +13062,79 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// boxingb,solarq +static void nl_gcr_10_double_double_d7d45dc58b08cab9(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 -= go[1] * *cnV[1]; + m_A2 += gt[2]; + m_A2 += gt[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A3 += go[2]; + double RHS1 = Idr[2]; + RHS1 += Idr[3]; + RHS1 += Idr[4]; + RHS1 += Idr[5]; + RHS1 -= go[3] * *cnV[3]; + RHS1 -= go[4] * *cnV[4]; + RHS1 -= go[5] * *cnV[5]; + m_A5 += gt[6]; + m_A5 += gt[7]; + m_A5 += gt[8]; + m_A6 += go[6]; + m_A4 += go[7]; + double RHS2 = Idr[6]; + RHS2 += Idr[7]; + RHS2 += Idr[8]; + RHS2 -= go[8] * *cnV[8]; + m_A9 += gt[9]; + m_A9 += gt[10]; + m_A7 += go[9]; + m_A8 += go[10]; + double RHS3 = Idr[9]; + RHS3 += Idr[10]; + const double f0 = 1.0 / m_A0; + const double f0_2 = -f0 * m_A4; + m_A5 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_3 = -f1 * m_A7; + m_A9 += m_A3 * f1_3; + RHS3 += f1_3 * RHS1; + const double f2 = 1.0 / m_A5; + const double f2_3 = -f2 * m_A8; + m_A9 += m_A6 * f2_3; + RHS3 += f2_3 * RHS2; + V[3] = RHS3 / m_A9; + double tmp2 = 0.0; + tmp2 += m_A6 * V[3]; + V[2] = (RHS2 - tmp2) / m_A5; + double tmp1 = 0.0; + tmp1 += m_A3 * V[3]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[2]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // boxingb static void nl_gcr_16_double_double_50f5194a994d56ec(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -13635,6 +13783,188 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// boxingb,starcas,wotw +static void nl_gcr_23_double_double_ea2b6e3a05e6ef0b(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + double m_A13(0.0); + double m_A14(0.0); + double m_A15(0.0); + double m_A16(0.0); + double m_A17(0.0); + double m_A18(0.0); + double m_A19(0.0); + double m_A20(0.0); + double m_A21(0.0); + double m_A22(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A0 += gt[3]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 += Idr[3]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + RHS0 -= go[3] * *cnV[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A2 += gt[6]; + m_A2 += gt[7]; + m_A2 += gt[8]; + m_A2 += gt[9]; + m_A4 += go[4]; + m_A3 += go[5]; + m_A3 += go[6]; + double RHS1 = Idr[4]; + RHS1 += Idr[5]; + RHS1 += Idr[6]; + RHS1 += Idr[7]; + RHS1 += Idr[8]; + RHS1 += Idr[9]; + RHS1 -= go[7] * *cnV[7]; + RHS1 -= go[8] * *cnV[8]; + RHS1 -= go[9] * *cnV[9]; + m_A5 += gt[10]; + m_A5 += gt[11]; + m_A5 += gt[12]; + m_A5 += gt[13]; + m_A7 += go[10]; + m_A6 += go[11]; + m_A6 += go[12]; + double RHS2 = Idr[10]; + RHS2 += Idr[11]; + RHS2 += Idr[12]; + RHS2 += Idr[13]; + RHS2 -= go[13] * *cnV[13]; + m_A8 += gt[14]; + m_A8 += gt[15]; + m_A9 += go[14]; + double RHS3 = Idr[14]; + RHS3 += Idr[15]; + RHS3 -= go[15] * *cnV[15]; + m_A12 += gt[16]; + m_A12 += gt[17]; + m_A12 += gt[18]; + m_A12 += gt[19]; + m_A12 += gt[20]; + m_A12 += gt[21]; + m_A11 += go[16]; + m_A11 += go[17]; + m_A10 += go[18]; + double RHS4 = Idr[16]; + RHS4 += Idr[17]; + RHS4 += Idr[18]; + RHS4 += Idr[19]; + RHS4 += Idr[20]; + RHS4 += Idr[21]; + RHS4 -= go[19] * *cnV[19]; + RHS4 -= go[20] * *cnV[20]; + RHS4 -= go[21] * *cnV[21]; + m_A17 += gt[22]; + m_A17 += gt[23]; + m_A17 += gt[24]; + m_A17 += gt[25]; + m_A17 += gt[26]; + m_A15 += go[22]; + m_A15 += go[23]; + m_A14 += go[24]; + double RHS5 = Idr[22]; + RHS5 += Idr[23]; + RHS5 += Idr[24]; + RHS5 += Idr[25]; + RHS5 += Idr[26]; + RHS5 -= go[25] * *cnV[25]; + RHS5 -= go[26] * *cnV[26]; + m_A22 += gt[27]; + m_A22 += gt[28]; + m_A22 += gt[29]; + m_A22 += gt[30]; + m_A22 += gt[31]; + m_A20 += go[27]; + m_A19 += go[28]; + double RHS6 = Idr[27]; + RHS6 += Idr[28]; + RHS6 += Idr[29]; + RHS6 += Idr[30]; + RHS6 += Idr[31]; + RHS6 -= go[29] * *cnV[29]; + RHS6 -= go[30] * *cnV[30]; + RHS6 -= go[31] * *cnV[31]; + const double f0 = 1.0 / m_A0; + const double f0_4 = -f0 * m_A10; + m_A12 += m_A1 * f0_4; + RHS4 += f0_4 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_4 = -f1 * m_A11; + m_A12 += m_A3 * f1_4; + m_A13 += m_A4 * f1_4; + RHS4 += f1_4 * RHS1; + const double f1_5 = -f1 * m_A14; + m_A16 += m_A3 * f1_5; + m_A17 += m_A4 * f1_5; + RHS5 += f1_5 * RHS1; + const double f2 = 1.0 / m_A5; + const double f2_5 = -f2 * m_A15; + m_A17 += m_A6 * f2_5; + m_A18 += m_A7 * f2_5; + RHS5 += f2_5 * RHS2; + const double f2_6 = -f2 * m_A19; + m_A21 += m_A6 * f2_6; + m_A22 += m_A7 * f2_6; + RHS6 += f2_6 * RHS2; + const double f3 = 1.0 / m_A8; + const double f3_6 = -f3 * m_A20; + m_A22 += m_A9 * f3_6; + RHS6 += f3_6 * RHS3; + const double f4 = 1.0 / m_A12; + const double f4_5 = -f4 * m_A16; + m_A17 += m_A13 * f4_5; + RHS5 += f4_5 * RHS4; + const double f5 = 1.0 / m_A17; + const double f5_6 = -f5 * m_A21; + m_A22 += m_A18 * f5_6; + RHS6 += f5_6 * RHS5; + V[6] = RHS6 / m_A22; + double tmp5 = 0.0; + tmp5 += m_A18 * V[6]; + V[5] = (RHS5 - tmp5) / m_A17; + double tmp4 = 0.0; + tmp4 += m_A13 * V[5]; + V[4] = (RHS4 - tmp4) / m_A12; + double tmp3 = 0.0; + tmp3 += m_A9 * V[6]; + V[3] = (RHS3 - tmp3) / m_A8; + double tmp2 = 0.0; + tmp2 += m_A6 * V[5]; + tmp2 += m_A7 * V[6]; + V[2] = (RHS2 - tmp2) / m_A5; + double tmp1 = 0.0; + tmp1 += m_A3 * V[4]; + tmp1 += m_A4 * V[5]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[4]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // boxingb static void nl_gcr_23_double_double_f43cf2a28a5a5561(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -18473,60 +18803,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// brdrline,stuntcyc -static void nl_gcr_7_double_double_59cb6bf7cb9d17dc(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 -= go[1] * *cnV[1]; - m_A2 += gt[2]; - m_A2 += gt[3]; - m_A3 += go[2]; - double RHS1 = Idr[2]; - RHS1 += Idr[3]; - RHS1 -= go[3] * *cnV[3]; - m_A6 += gt[4]; - m_A6 += gt[5]; - m_A6 += gt[6]; - m_A6 += gt[7]; - m_A5 += go[4]; - m_A4 += go[5]; - double RHS2 = Idr[4]; - RHS2 += Idr[5]; - RHS2 += Idr[6]; - RHS2 += Idr[7]; - RHS2 -= go[6] * *cnV[6]; - RHS2 -= go[7] * *cnV[7]; - const double f0 = 1.0 / m_A0; - const double f0_2 = -f0 * m_A4; - m_A6 += m_A1 * f0_2; - RHS2 += f0_2 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_2 = -f1 * m_A5; - m_A6 += m_A3 * f1_2; - RHS2 += f1_2 * RHS1; - V[2] = RHS2 / m_A6; - double tmp1 = 0.0; - tmp1 += m_A3 * V[2]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[2]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // brdrline static void nl_gcr_83_double_double_f99b1245e708ec85(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -26154,6 +26430,1737 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// dribling +static void nl_gcr_257_double_double_5dc652d6668315af(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + double m_A13(0.0); + double m_A14(0.0); + double m_A15(0.0); + double m_A16(0.0); + double m_A17(0.0); + double m_A18(0.0); + double m_A19(0.0); + double m_A20(0.0); + double m_A21(0.0); + double m_A22(0.0); + double m_A23(0.0); + double m_A24(0.0); + double m_A25(0.0); + double m_A26(0.0); + double m_A27(0.0); + double m_A28(0.0); + double m_A29(0.0); + double m_A30(0.0); + double m_A31(0.0); + double m_A32(0.0); + double m_A33(0.0); + double m_A34(0.0); + double m_A35(0.0); + double m_A36(0.0); + double m_A37(0.0); + double m_A38(0.0); + double m_A39(0.0); + double m_A40(0.0); + double m_A41(0.0); + double m_A42(0.0); + double m_A43(0.0); + double m_A44(0.0); + double m_A45(0.0); + double m_A46(0.0); + double m_A47(0.0); + double m_A48(0.0); + double m_A49(0.0); + double m_A50(0.0); + double m_A51(0.0); + double m_A52(0.0); + double m_A53(0.0); + double m_A54(0.0); + double m_A55(0.0); + double m_A56(0.0); + double m_A57(0.0); + double m_A58(0.0); + double m_A59(0.0); + double m_A60(0.0); + double m_A61(0.0); + double m_A62(0.0); + double m_A63(0.0); + double m_A64(0.0); + double m_A65(0.0); + double m_A66(0.0); + double m_A67(0.0); + double m_A68(0.0); + double m_A69(0.0); + double m_A70(0.0); + double m_A71(0.0); + double m_A72(0.0); + double m_A73(0.0); + double m_A74(0.0); + double m_A75(0.0); + double m_A76(0.0); + double m_A77(0.0); + double m_A78(0.0); + double m_A79(0.0); + double m_A80(0.0); + double m_A81(0.0); + double m_A82(0.0); + double m_A83(0.0); + double m_A84(0.0); + double m_A85(0.0); + double m_A86(0.0); + double m_A87(0.0); + double m_A88(0.0); + double m_A89(0.0); + double m_A90(0.0); + double m_A91(0.0); + double m_A92(0.0); + double m_A93(0.0); + double m_A94(0.0); + double m_A95(0.0); + double m_A96(0.0); + double m_A97(0.0); + double m_A98(0.0); + double m_A99(0.0); + double m_A100(0.0); + double m_A101(0.0); + double m_A102(0.0); + double m_A103(0.0); + double m_A104(0.0); + double m_A105(0.0); + double m_A106(0.0); + double m_A107(0.0); + double m_A108(0.0); + double m_A109(0.0); + double m_A110(0.0); + double m_A111(0.0); + double m_A112(0.0); + double m_A113(0.0); + double m_A114(0.0); + double m_A115(0.0); + double m_A116(0.0); + double m_A117(0.0); + double m_A118(0.0); + double m_A119(0.0); + double m_A120(0.0); + double m_A121(0.0); + double m_A122(0.0); + double m_A123(0.0); + double m_A124(0.0); + double m_A125(0.0); + double m_A126(0.0); + double m_A127(0.0); + double m_A128(0.0); + double m_A129(0.0); + double m_A130(0.0); + double m_A131(0.0); + double m_A132(0.0); + double m_A133(0.0); + double m_A134(0.0); + double m_A135(0.0); + double m_A136(0.0); + double m_A137(0.0); + double m_A138(0.0); + double m_A139(0.0); + double m_A140(0.0); + double m_A141(0.0); + double m_A142(0.0); + double m_A143(0.0); + double m_A144(0.0); + double m_A145(0.0); + double m_A146(0.0); + double m_A147(0.0); + double m_A148(0.0); + double m_A149(0.0); + double m_A150(0.0); + double m_A151(0.0); + double m_A152(0.0); + double m_A153(0.0); + double m_A154(0.0); + double m_A155(0.0); + double m_A156(0.0); + double m_A157(0.0); + double m_A158(0.0); + double m_A159(0.0); + double m_A160(0.0); + double m_A161(0.0); + double m_A162(0.0); + double m_A163(0.0); + double m_A164(0.0); + double m_A165(0.0); + double m_A166(0.0); + double m_A167(0.0); + double m_A168(0.0); + double m_A169(0.0); + double m_A170(0.0); + double m_A171(0.0); + double m_A172(0.0); + double m_A173(0.0); + double m_A174(0.0); + double m_A175(0.0); + double m_A176(0.0); + double m_A177(0.0); + double m_A178(0.0); + double m_A179(0.0); + double m_A180(0.0); + double m_A181(0.0); + double m_A182(0.0); + double m_A183(0.0); + double m_A184(0.0); + double m_A185(0.0); + double m_A186(0.0); + double m_A187(0.0); + double m_A188(0.0); + double m_A189(0.0); + double m_A190(0.0); + double m_A191(0.0); + double m_A192(0.0); + double m_A193(0.0); + double m_A194(0.0); + double m_A195(0.0); + double m_A196(0.0); + double m_A197(0.0); + double m_A198(0.0); + double m_A199(0.0); + double m_A200(0.0); + double m_A201(0.0); + double m_A202(0.0); + double m_A203(0.0); + double m_A204(0.0); + double m_A205(0.0); + double m_A206(0.0); + double m_A207(0.0); + double m_A208(0.0); + double m_A209(0.0); + double m_A210(0.0); + double m_A211(0.0); + double m_A212(0.0); + double m_A213(0.0); + double m_A214(0.0); + double m_A215(0.0); + double m_A216(0.0); + double m_A217(0.0); + double m_A218(0.0); + double m_A219(0.0); + double m_A220(0.0); + double m_A221(0.0); + double m_A222(0.0); + double m_A223(0.0); + double m_A224(0.0); + double m_A225(0.0); + double m_A226(0.0); + double m_A227(0.0); + double m_A228(0.0); + double m_A229(0.0); + double m_A230(0.0); + double m_A231(0.0); + double m_A232(0.0); + double m_A233(0.0); + double m_A234(0.0); + double m_A235(0.0); + double m_A236(0.0); + double m_A237(0.0); + double m_A238(0.0); + double m_A239(0.0); + double m_A240(0.0); + double m_A241(0.0); + double m_A242(0.0); + double m_A243(0.0); + double m_A244(0.0); + double m_A245(0.0); + double m_A246(0.0); + double m_A247(0.0); + double m_A248(0.0); + double m_A249(0.0); + double m_A250(0.0); + double m_A251(0.0); + double m_A252(0.0); + double m_A253(0.0); + double m_A254(0.0); + double m_A255(0.0); + double m_A256(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + m_A2 += gt[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A2 += gt[6]; + m_A2 += gt[7]; + m_A2 += gt[8]; + m_A4 += go[3]; + m_A3 += go[4]; + m_A3 += go[5]; + double RHS1 = Idr[3]; + RHS1 += Idr[4]; + RHS1 += Idr[5]; + RHS1 += Idr[6]; + RHS1 += Idr[7]; + RHS1 += Idr[8]; + RHS1 -= go[6] * *cnV[6]; + RHS1 -= go[7] * *cnV[7]; + RHS1 -= go[8] * *cnV[8]; + m_A5 += gt[9]; + m_A5 += gt[10]; + m_A5 += gt[11]; + m_A5 += gt[12]; + m_A6 += go[9]; + double RHS2 = Idr[9]; + RHS2 += Idr[10]; + RHS2 += Idr[11]; + RHS2 += Idr[12]; + RHS2 -= go[10] * *cnV[10]; + RHS2 -= go[11] * *cnV[11]; + RHS2 -= go[12] * *cnV[12]; + m_A7 += gt[13]; + m_A7 += gt[14]; + m_A7 += gt[15]; + m_A8 += go[13]; + double RHS3 = Idr[13]; + RHS3 += Idr[14]; + RHS3 += Idr[15]; + RHS3 -= go[14] * *cnV[14]; + RHS3 -= go[15] * *cnV[15]; + m_A9 += gt[16]; + m_A9 += gt[17]; + m_A10 += go[16]; + double RHS4 = Idr[16]; + RHS4 += Idr[17]; + RHS4 -= go[17] * *cnV[17]; + m_A11 += gt[18]; + m_A11 += gt[19]; + m_A11 += gt[20]; + m_A11 += gt[21]; + m_A11 += gt[22]; + m_A11 += gt[23]; + m_A13 += go[18]; + m_A12 += go[19]; + m_A12 += go[20]; + double RHS5 = Idr[18]; + RHS5 += Idr[19]; + RHS5 += Idr[20]; + RHS5 += Idr[21]; + RHS5 += Idr[22]; + RHS5 += Idr[23]; + RHS5 -= go[21] * *cnV[21]; + RHS5 -= go[22] * *cnV[22]; + RHS5 -= go[23] * *cnV[23]; + m_A14 += gt[24]; + m_A14 += gt[25]; + m_A14 += gt[26]; + m_A14 += gt[27]; + m_A15 += go[24]; + double RHS6 = Idr[24]; + RHS6 += Idr[25]; + RHS6 += Idr[26]; + RHS6 += Idr[27]; + RHS6 -= go[25] * *cnV[25]; + RHS6 -= go[26] * *cnV[26]; + RHS6 -= go[27] * *cnV[27]; + m_A16 += gt[28]; + m_A16 += gt[29]; + m_A16 += gt[30]; + m_A18 += go[28]; + m_A17 += go[29]; + double RHS7 = Idr[28]; + RHS7 += Idr[29]; + RHS7 += Idr[30]; + RHS7 -= go[30] * *cnV[30]; + m_A19 += gt[31]; + m_A19 += gt[32]; + m_A19 += gt[33]; + m_A19 += gt[34]; + m_A20 += go[31]; + m_A21 += go[32]; + m_A21 += go[33]; + double RHS8 = Idr[31]; + RHS8 += Idr[32]; + RHS8 += Idr[33]; + RHS8 += Idr[34]; + RHS8 -= go[34] * *cnV[34]; + m_A22 += gt[35]; + m_A22 += gt[36]; + m_A22 += gt[37]; + m_A22 += gt[38]; + m_A23 += go[35]; + double RHS9 = Idr[35]; + RHS9 += Idr[36]; + RHS9 += Idr[37]; + RHS9 += Idr[38]; + RHS9 -= go[36] * *cnV[36]; + RHS9 -= go[37] * *cnV[37]; + RHS9 -= go[38] * *cnV[38]; + m_A24 += gt[39]; + m_A24 += gt[40]; + m_A24 += gt[41]; + m_A24 += gt[42]; + m_A25 += go[39]; + double RHS10 = Idr[39]; + RHS10 += Idr[40]; + RHS10 += Idr[41]; + RHS10 += Idr[42]; + RHS10 -= go[40] * *cnV[40]; + RHS10 -= go[41] * *cnV[41]; + RHS10 -= go[42] * *cnV[42]; + m_A26 += gt[43]; + m_A26 += gt[44]; + m_A27 += go[43]; + double RHS11 = Idr[43]; + RHS11 += Idr[44]; + RHS11 -= go[44] * *cnV[44]; + m_A28 += gt[45]; + m_A28 += gt[46]; + m_A28 += gt[47]; + m_A30 += go[45]; + m_A29 += go[46]; + double RHS12 = Idr[45]; + RHS12 += Idr[46]; + RHS12 += Idr[47]; + RHS12 -= go[47] * *cnV[47]; + m_A31 += gt[48]; + m_A31 += gt[49]; + m_A31 += gt[50]; + m_A31 += gt[51]; + m_A32 += go[48]; + m_A33 += go[49]; + m_A33 += go[50]; + double RHS13 = Idr[48]; + RHS13 += Idr[49]; + RHS13 += Idr[50]; + RHS13 += Idr[51]; + RHS13 -= go[51] * *cnV[51]; + m_A34 += gt[52]; + m_A34 += gt[53]; + m_A36 += go[52]; + m_A35 += go[53]; + double RHS14 = Idr[52]; + RHS14 += Idr[53]; + m_A37 += gt[54]; + m_A37 += gt[55]; + m_A38 += go[54]; + double RHS15 = Idr[54]; + RHS15 += Idr[55]; + RHS15 -= go[55] * *cnV[55]; + m_A39 += gt[56]; + m_A39 += gt[57]; + m_A39 += gt[58]; + m_A40 += go[56]; + double RHS16 = Idr[56]; + RHS16 += Idr[57]; + RHS16 += Idr[58]; + RHS16 -= go[57] * *cnV[57]; + RHS16 -= go[58] * *cnV[58]; + m_A41 += gt[59]; + m_A41 += gt[60]; + m_A41 += gt[61]; + m_A42 += go[59]; + double RHS17 = Idr[59]; + RHS17 += Idr[60]; + RHS17 += Idr[61]; + RHS17 -= go[60] * *cnV[60]; + RHS17 -= go[61] * *cnV[61]; + m_A43 += gt[62]; + m_A43 += gt[63]; + m_A45 += go[62]; + m_A44 += go[63]; + double RHS18 = Idr[62]; + RHS18 += Idr[63]; + m_A46 += gt[64]; + m_A46 += gt[65]; + m_A47 += go[64]; + double RHS19 = Idr[64]; + RHS19 += Idr[65]; + RHS19 -= go[65] * *cnV[65]; + m_A48 += gt[66]; + m_A48 += gt[67]; + m_A48 += gt[68]; + m_A49 += go[66]; + double RHS20 = Idr[66]; + RHS20 += Idr[67]; + RHS20 += Idr[68]; + RHS20 -= go[67] * *cnV[67]; + RHS20 -= go[68] * *cnV[68]; + m_A50 += gt[69]; + m_A50 += gt[70]; + m_A50 += gt[71]; + m_A51 += go[69]; + double RHS21 = Idr[69]; + RHS21 += Idr[70]; + RHS21 += Idr[71]; + RHS21 -= go[70] * *cnV[70]; + RHS21 -= go[71] * *cnV[71]; + m_A52 += gt[72]; + m_A52 += gt[73]; + m_A53 += go[72]; + double RHS22 = Idr[72]; + RHS22 += Idr[73]; + RHS22 -= go[73] * *cnV[73]; + m_A54 += gt[74]; + m_A54 += gt[75]; + m_A54 += gt[76]; + m_A55 += go[74]; + double RHS23 = Idr[74]; + RHS23 += Idr[75]; + RHS23 += Idr[76]; + RHS23 -= go[75] * *cnV[75]; + RHS23 -= go[76] * *cnV[76]; + m_A56 += gt[77]; + m_A56 += gt[78]; + m_A57 += go[77]; + double RHS24 = Idr[77]; + RHS24 += Idr[78]; + RHS24 -= go[78] * *cnV[78]; + m_A58 += gt[79]; + m_A58 += gt[80]; + m_A58 += gt[81]; + m_A58 += gt[82]; + m_A58 += gt[83]; + m_A58 += gt[84]; + m_A59 += go[79]; + m_A61 += go[80]; + m_A60 += go[81]; + m_A62 += go[82]; + double RHS25 = Idr[79]; + RHS25 += Idr[80]; + RHS25 += Idr[81]; + RHS25 += Idr[82]; + RHS25 += Idr[83]; + RHS25 += Idr[84]; + RHS25 -= go[83] * *cnV[83]; + RHS25 -= go[84] * *cnV[84]; + m_A63 += gt[85]; + m_A63 += gt[86]; + m_A63 += gt[87]; + m_A63 += gt[88]; + m_A63 += gt[89]; + m_A65 += go[85]; + m_A64 += go[86]; + m_A66 += go[87]; + m_A66 += go[88]; + double RHS26 = Idr[85]; + RHS26 += Idr[86]; + RHS26 += Idr[87]; + RHS26 += Idr[88]; + RHS26 += Idr[89]; + RHS26 -= go[89] * *cnV[89]; + m_A67 += gt[90]; + m_A67 += gt[91]; + m_A67 += gt[92]; + m_A67 += gt[93]; + m_A67 += gt[94]; + m_A69 += go[90]; + m_A68 += go[91]; + m_A70 += go[92]; + m_A70 += go[93]; + double RHS27 = Idr[90]; + RHS27 += Idr[91]; + RHS27 += Idr[92]; + RHS27 += Idr[93]; + RHS27 += Idr[94]; + RHS27 -= go[94] * *cnV[94]; + m_A71 += gt[95]; + m_A71 += gt[96]; + m_A71 += gt[97]; + m_A71 += gt[98]; + m_A72 += go[95]; + double RHS28 = Idr[95]; + RHS28 += Idr[96]; + RHS28 += Idr[97]; + RHS28 += Idr[98]; + RHS28 -= go[96] * *cnV[96]; + RHS28 -= go[97] * *cnV[97]; + RHS28 -= go[98] * *cnV[98]; + m_A73 += gt[99]; + m_A73 += gt[100]; + m_A75 += go[99]; + m_A74 += go[100]; + double RHS29 = Idr[99]; + RHS29 += Idr[100]; + m_A76 += gt[101]; + m_A76 += gt[102]; + m_A78 += go[101]; + m_A77 += go[102]; + double RHS30 = Idr[101]; + RHS30 += Idr[102]; + m_A79 += gt[103]; + m_A79 += gt[104]; + m_A79 += gt[105]; + m_A80 += go[103]; + m_A81 += go[104]; + double RHS31 = Idr[103]; + RHS31 += Idr[104]; + RHS31 += Idr[105]; + RHS31 -= go[105] * *cnV[105]; + m_A82 += gt[106]; + m_A82 += gt[107]; + m_A82 += gt[108]; + m_A84 += go[106]; + m_A83 += go[107]; + double RHS32 = Idr[106]; + RHS32 += Idr[107]; + RHS32 += Idr[108]; + RHS32 -= go[108] * *cnV[108]; + m_A87 += gt[109]; + m_A87 += gt[110]; + m_A87 += gt[111]; + m_A87 += gt[112]; + m_A87 += gt[113]; + m_A85 += go[109]; + m_A86 += go[110]; + m_A86 += go[111]; + double RHS33 = Idr[109]; + RHS33 += Idr[110]; + RHS33 += Idr[111]; + RHS33 += Idr[112]; + RHS33 += Idr[113]; + RHS33 -= go[112] * *cnV[112]; + RHS33 -= go[113] * *cnV[113]; + m_A91 += gt[114]; + m_A91 += gt[115]; + m_A92 += go[114]; + m_A89 += go[115]; + double RHS34 = Idr[114]; + RHS34 += Idr[115]; + m_A95 += gt[116]; + m_A95 += gt[117]; + m_A95 += gt[118]; + m_A95 += gt[119]; + m_A95 += gt[120]; + m_A93 += go[116]; + m_A94 += go[117]; + m_A94 += go[118]; + double RHS35 = Idr[116]; + RHS35 += Idr[117]; + RHS35 += Idr[118]; + RHS35 += Idr[119]; + RHS35 += Idr[120]; + RHS35 -= go[119] * *cnV[119]; + RHS35 -= go[120] * *cnV[120]; + m_A98 += gt[121]; + m_A98 += gt[122]; + m_A98 += gt[123]; + m_A100 += go[121]; + m_A99 += go[122]; + m_A97 += go[123]; + double RHS36 = Idr[121]; + RHS36 += Idr[122]; + RHS36 += Idr[123]; + m_A102 += gt[124]; + m_A102 += gt[125]; + m_A102 += gt[126]; + m_A104 += go[124]; + m_A103 += go[125]; + m_A101 += go[126]; + double RHS37 = Idr[124]; + RHS37 += Idr[125]; + RHS37 += Idr[126]; + m_A107 += gt[127]; + m_A107 += gt[128]; + m_A107 += gt[129]; + m_A107 += gt[130]; + m_A107 += gt[131]; + m_A107 += gt[132]; + m_A107 += gt[133]; + m_A106 += go[127]; + m_A105 += go[128]; + m_A109 += go[129]; + m_A109 += go[130]; + m_A109 += go[131]; + m_A108 += go[132]; + double RHS38 = Idr[127]; + RHS38 += Idr[128]; + RHS38 += Idr[129]; + RHS38 += Idr[130]; + RHS38 += Idr[131]; + RHS38 += Idr[132]; + RHS38 += Idr[133]; + RHS38 -= go[133] * *cnV[133]; + m_A113 += gt[134]; + m_A113 += gt[135]; + m_A113 += gt[136]; + m_A113 += gt[137]; + m_A113 += gt[138]; + m_A113 += gt[139]; + m_A113 += gt[140]; + m_A112 += go[134]; + m_A111 += go[135]; + m_A115 += go[136]; + m_A115 += go[137]; + m_A115 += go[138]; + m_A114 += go[139]; + double RHS39 = Idr[134]; + RHS39 += Idr[135]; + RHS39 += Idr[136]; + RHS39 += Idr[137]; + RHS39 += Idr[138]; + RHS39 += Idr[139]; + RHS39 += Idr[140]; + RHS39 -= go[140] * *cnV[140]; + m_A118 += gt[141]; + m_A118 += gt[142]; + m_A118 += gt[143]; + m_A118 += gt[144]; + m_A118 += gt[145]; + m_A118 += gt[146]; + m_A118 += gt[147]; + m_A117 += go[141]; + m_A119 += go[142]; + double RHS40 = Idr[141]; + RHS40 += Idr[142]; + RHS40 += Idr[143]; + RHS40 += Idr[144]; + RHS40 += Idr[145]; + RHS40 += Idr[146]; + RHS40 += Idr[147]; + RHS40 -= go[143] * *cnV[143]; + RHS40 -= go[144] * *cnV[144]; + RHS40 -= go[145] * *cnV[145]; + RHS40 -= go[146] * *cnV[146]; + RHS40 -= go[147] * *cnV[147]; + m_A123 += gt[148]; + m_A123 += gt[149]; + m_A123 += gt[150]; + m_A120 += go[148]; + m_A121 += go[149]; + m_A125 += go[150]; + double RHS41 = Idr[148]; + RHS41 += Idr[149]; + RHS41 += Idr[150]; + m_A128 += gt[151]; + m_A128 += gt[152]; + m_A129 += go[151]; + m_A126 += go[152]; + double RHS42 = Idr[151]; + RHS42 += Idr[152]; + m_A132 += gt[153]; + m_A132 += gt[154]; + m_A132 += gt[155]; + m_A132 += gt[156]; + m_A132 += gt[157]; + m_A130 += go[153]; + m_A131 += go[154]; + m_A134 += go[155]; + m_A134 += go[156]; + double RHS43 = Idr[153]; + RHS43 += Idr[154]; + RHS43 += Idr[155]; + RHS43 += Idr[156]; + RHS43 += Idr[157]; + RHS43 -= go[157] * *cnV[157]; + m_A137 += gt[158]; + m_A137 += gt[159]; + m_A137 += gt[160]; + m_A137 += gt[161]; + m_A137 += gt[162]; + m_A135 += go[158]; + m_A136 += go[159]; + m_A139 += go[160]; + m_A139 += go[161]; + double RHS44 = Idr[158]; + RHS44 += Idr[159]; + RHS44 += Idr[160]; + RHS44 += Idr[161]; + RHS44 += Idr[162]; + RHS44 -= go[162] * *cnV[162]; + m_A141 += gt[163]; + m_A141 += gt[164]; + m_A142 += go[163]; + m_A140 += go[164]; + double RHS45 = Idr[163]; + RHS45 += Idr[164]; + m_A144 += gt[165]; + m_A144 += gt[166]; + m_A145 += go[165]; + m_A143 += go[166]; + double RHS46 = Idr[165]; + RHS46 += Idr[166]; + m_A148 += gt[167]; + m_A148 += gt[168]; + m_A148 += gt[169]; + m_A149 += go[167]; + m_A147 += go[168]; + m_A146 += go[169]; + double RHS47 = Idr[167]; + RHS47 += Idr[168]; + RHS47 += Idr[169]; + m_A154 += gt[170]; + m_A154 += gt[171]; + m_A156 += go[170]; + m_A151 += go[171]; + double RHS48 = Idr[170]; + RHS48 += Idr[171]; + m_A161 += gt[172]; + m_A161 += gt[173]; + m_A161 += gt[174]; + m_A161 += gt[175]; + m_A161 += gt[176]; + m_A161 += gt[177]; + m_A159 += go[172]; + m_A158 += go[173]; + m_A160 += go[174]; + m_A157 += go[175]; + double RHS49 = Idr[172]; + RHS49 += Idr[173]; + RHS49 += Idr[174]; + RHS49 += Idr[175]; + RHS49 += Idr[176]; + RHS49 += Idr[177]; + RHS49 -= go[176] * *cnV[176]; + RHS49 -= go[177] * *cnV[177]; + m_A166 += gt[178]; + m_A166 += gt[179]; + m_A166 += gt[180]; + m_A165 += go[178]; + m_A163 += go[179]; + m_A164 += go[180]; + double RHS50 = Idr[178]; + RHS50 += Idr[179]; + RHS50 += Idr[180]; + m_A174 += gt[181]; + m_A174 += gt[182]; + m_A174 += gt[183]; + m_A174 += gt[184]; + m_A174 += gt[185]; + m_A174 += gt[186]; + m_A174 += gt[187]; + m_A170 += go[181]; + m_A170 += go[182]; + m_A172 += go[183]; + m_A172 += go[184]; + m_A172 += go[185]; + m_A169 += go[186]; + m_A171 += go[187]; + double RHS51 = Idr[181]; + RHS51 += Idr[182]; + RHS51 += Idr[183]; + RHS51 += Idr[184]; + RHS51 += Idr[185]; + RHS51 += Idr[186]; + RHS51 += Idr[187]; + m_A179 += gt[188]; + m_A179 += gt[189]; + m_A179 += gt[190]; + m_A178 += go[188]; + m_A176 += go[189]; + m_A177 += go[190]; + double RHS52 = Idr[188]; + RHS52 += Idr[189]; + RHS52 += Idr[190]; + m_A184 += gt[191]; + m_A184 += gt[192]; + m_A186 += go[191]; + m_A182 += go[192]; + double RHS53 = Idr[191]; + RHS53 += Idr[192]; + m_A189 += gt[193]; + m_A189 += gt[194]; + m_A191 += go[193]; + m_A187 += go[194]; + double RHS54 = Idr[193]; + RHS54 += Idr[194]; + m_A193 += gt[195]; + m_A193 += gt[196]; + m_A193 += gt[197]; + m_A193 += gt[198]; + m_A193 += gt[199]; + m_A194 += go[195]; + m_A194 += go[196]; + m_A192 += go[197]; + double RHS55 = Idr[195]; + RHS55 += Idr[196]; + RHS55 += Idr[197]; + RHS55 += Idr[198]; + RHS55 += Idr[199]; + RHS55 -= go[198] * *cnV[198]; + RHS55 -= go[199] * *cnV[199]; + m_A200 += gt[200]; + m_A200 += gt[201]; + m_A200 += gt[202]; + m_A200 += gt[203]; + m_A200 += gt[204]; + m_A200 += gt[205]; + m_A200 += gt[206]; + m_A196 += go[200]; + m_A196 += go[201]; + m_A198 += go[202]; + m_A198 += go[203]; + m_A198 += go[204]; + m_A195 += go[205]; + m_A197 += go[206]; + double RHS56 = Idr[200]; + RHS56 += Idr[201]; + RHS56 += Idr[202]; + RHS56 += Idr[203]; + RHS56 += Idr[204]; + RHS56 += Idr[205]; + RHS56 += Idr[206]; + m_A210 += gt[207]; + m_A210 += gt[208]; + m_A210 += gt[209]; + m_A210 += gt[210]; + m_A210 += gt[211]; + m_A210 += gt[212]; + m_A210 += gt[213]; + m_A205 += go[207]; + m_A208 += go[208]; + m_A206 += go[209]; + m_A204 += go[210]; + m_A203 += go[211]; + m_A202 += go[212]; + double RHS57 = Idr[207]; + RHS57 += Idr[208]; + RHS57 += Idr[209]; + RHS57 += Idr[210]; + RHS57 += Idr[211]; + RHS57 += Idr[212]; + RHS57 += Idr[213]; + RHS57 -= go[213] * *cnV[213]; + m_A216 += gt[214]; + m_A216 += gt[215]; + m_A216 += gt[216]; + m_A216 += gt[217]; + m_A216 += gt[218]; + m_A216 += gt[219]; + m_A214 += go[214]; + m_A213 += go[215]; + m_A215 += go[216]; + m_A212 += go[217]; + double RHS58 = Idr[214]; + RHS58 += Idr[215]; + RHS58 += Idr[216]; + RHS58 += Idr[217]; + RHS58 += Idr[218]; + RHS58 += Idr[219]; + RHS58 -= go[218] * *cnV[218]; + RHS58 -= go[219] * *cnV[219]; + m_A225 += gt[220]; + m_A225 += gt[221]; + m_A225 += gt[222]; + m_A225 += gt[223]; + m_A225 += gt[224]; + m_A225 += gt[225]; + m_A225 += gt[226]; + m_A221 += go[220]; + m_A221 += go[221]; + m_A219 += go[222]; + m_A219 += go[223]; + m_A218 += go[224]; + double RHS59 = Idr[220]; + RHS59 += Idr[221]; + RHS59 += Idr[222]; + RHS59 += Idr[223]; + RHS59 += Idr[224]; + RHS59 += Idr[225]; + RHS59 += Idr[226]; + RHS59 -= go[225] * *cnV[225]; + RHS59 -= go[226] * *cnV[226]; + m_A234 += gt[227]; + m_A234 += gt[228]; + m_A234 += gt[229]; + m_A234 += gt[230]; + m_A234 += gt[231]; + m_A234 += gt[232]; + m_A234 += gt[233]; + m_A230 += go[227]; + m_A230 += go[228]; + m_A228 += go[229]; + m_A228 += go[230]; + m_A227 += go[231]; + double RHS60 = Idr[227]; + RHS60 += Idr[228]; + RHS60 += Idr[229]; + RHS60 += Idr[230]; + RHS60 += Idr[231]; + RHS60 += Idr[232]; + RHS60 += Idr[233]; + RHS60 -= go[232] * *cnV[232]; + RHS60 -= go[233] * *cnV[233]; + m_A238 += gt[234]; + m_A238 += gt[235]; + m_A238 += gt[236]; + m_A238 += gt[237]; + m_A238 += gt[238]; + m_A238 += go[234]; + m_A236 += go[235]; + m_A236 += go[236]; + m_A237 += go[237]; + double RHS61 = Idr[234]; + RHS61 += Idr[235]; + RHS61 += Idr[236]; + RHS61 += Idr[237]; + RHS61 += Idr[238]; + RHS61 -= go[238] * *cnV[238]; + m_A256 += gt[239]; + m_A256 += gt[240]; + m_A256 += gt[241]; + m_A256 += gt[242]; + m_A256 += gt[243]; + m_A256 += gt[244]; + m_A256 += gt[245]; + m_A256 += gt[246]; + m_A256 += gt[247]; + m_A256 += gt[248]; + m_A256 += gt[249]; + m_A242 += go[239]; + m_A250 += go[240]; + m_A250 += go[241]; + m_A241 += go[242]; + m_A240 += go[243]; + m_A249 += go[244]; + m_A248 += go[245]; + m_A246 += go[246]; + m_A244 += go[247]; + m_A243 += go[248]; + double RHS62 = Idr[239]; + RHS62 += Idr[240]; + RHS62 += Idr[241]; + RHS62 += Idr[242]; + RHS62 += Idr[243]; + RHS62 += Idr[244]; + RHS62 += Idr[245]; + RHS62 += Idr[246]; + RHS62 += Idr[247]; + RHS62 += Idr[248]; + RHS62 += Idr[249]; + RHS62 -= go[249] * *cnV[249]; + const double f0 = 1.0 / m_A0; + const double f0_33 = -f0 * m_A85; + m_A87 += m_A1 * f0_33; + RHS33 += f0_33 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_33 = -f1 * m_A86; + m_A87 += m_A3 * f1_33; + m_A88 += m_A4 * f1_33; + RHS33 += f1_33 * RHS1; + const double f1_34 = -f1 * m_A89; + m_A90 += m_A3 * f1_34; + m_A91 += m_A4 * f1_34; + RHS34 += f1_34 * RHS1; + const double f2 = 1.0 / m_A5; + const double f2_49 = -f2 * m_A157; + m_A161 += m_A6 * f2_49; + RHS49 += f2_49 * RHS2; + const double f3 = 1.0 / m_A7; + const double f3_35 = -f3 * m_A93; + m_A95 += m_A8 * f3_35; + RHS35 += f3_35 * RHS3; + const double f4 = 1.0 / m_A9; + const double f4_49 = -f4 * m_A158; + m_A161 += m_A10 * f4_49; + RHS49 += f4_49 * RHS4; + const double f5 = 1.0 / m_A11; + const double f5_35 = -f5 * m_A94; + m_A95 += m_A12 * f5_35; + m_A96 += m_A13 * f5_35; + RHS35 += f5_35 * RHS5; + const double f5_42 = -f5 * m_A126; + m_A127 += m_A12 * f5_42; + m_A128 += m_A13 * f5_42; + RHS42 += f5_42 * RHS5; + const double f6 = 1.0 / m_A14; + const double f6_36 = -f6 * m_A97; + m_A98 += m_A15 * f6_36; + RHS36 += f6_36 * RHS6; + const double f7 = 1.0 / m_A16; + const double f7_50 = -f7 * m_A163; + m_A166 += m_A17 * f7_50; + m_A167 += m_A18 * f7_50; + RHS50 += f7_50 * RHS7; + const double f7_51 = -f7 * m_A169; + m_A173 += m_A17 * f7_51; + m_A174 += m_A18 * f7_51; + RHS51 += f7_51 * RHS7; + const double f8 = 1.0 / m_A19; + const double f8_38 = -f8 * m_A105; + m_A107 += m_A20 * f8_38; + m_A109 += m_A21 * f8_38; + RHS38 += f8_38 * RHS8; + const double f8_51 = -f8 * m_A170; + m_A172 += m_A20 * f8_51; + m_A174 += m_A21 * f8_51; + RHS51 += f8_51 * RHS8; + const double f9 = 1.0 / m_A22; + const double f9_58 = -f9 * m_A212; + m_A216 += m_A23 * f9_58; + RHS58 += f9_58 * RHS9; + const double f10 = 1.0 / m_A24; + const double f10_37 = -f10 * m_A101; + m_A102 += m_A25 * f10_37; + RHS37 += f10_37 * RHS10; + const double f11 = 1.0 / m_A26; + const double f11_58 = -f11 * m_A213; + m_A216 += m_A27 * f11_58; + RHS58 += f11_58 * RHS11; + const double f12 = 1.0 / m_A28; + const double f12_52 = -f12 * m_A176; + m_A179 += m_A29 * f12_52; + m_A180 += m_A30 * f12_52; + RHS52 += f12_52 * RHS12; + const double f12_56 = -f12 * m_A195; + m_A199 += m_A29 * f12_56; + m_A200 += m_A30 * f12_56; + RHS56 += f12_56 * RHS12; + const double f13 = 1.0 / m_A31; + const double f13_39 = -f13 * m_A111; + m_A113 += m_A32 * f13_39; + m_A115 += m_A33 * f13_39; + RHS39 += f13_39 * RHS13; + const double f13_56 = -f13 * m_A196; + m_A198 += m_A32 * f13_56; + m_A200 += m_A33 * f13_56; + RHS56 += f13_56 * RHS13; + const double f14 = 1.0 / m_A34; + const double f14_38 = -f14 * m_A106; + m_A107 += m_A35 * f14_38; + m_A110 += m_A36 * f14_38; + RHS38 += f14_38 * RHS14; + const double f14_59 = -f14 * m_A218; + m_A220 += m_A35 * f14_59; + m_A225 += m_A36 * f14_59; + RHS59 += f14_59 * RHS14; + const double f15 = 1.0 / m_A37; + const double f15_43 = -f15 * m_A130; + m_A132 += m_A38 * f15_43; + RHS43 += f15_43 * RHS15; + const double f16 = 1.0 / m_A39; + const double f16_57 = -f16 * m_A202; + m_A210 += m_A40 * f16_57; + RHS57 += f16_57 * RHS16; + const double f17 = 1.0 / m_A41; + const double f17_40 = -f17 * m_A117; + m_A119 += m_A42 * f17_40; + RHS40 += f17_40 * RHS17; + const double f17_41 = -f17 * m_A120; + m_A123 += m_A42 * f17_41; + RHS41 += f17_41 * RHS17; + const double f18 = 1.0 / m_A43; + const double f18_39 = -f18 * m_A112; + m_A113 += m_A44 * f18_39; + m_A116 += m_A45 * f18_39; + RHS39 += f18_39 * RHS18; + const double f18_60 = -f18 * m_A227; + m_A229 += m_A44 * f18_60; + m_A234 += m_A45 * f18_60; + RHS60 += f18_60 * RHS18; + const double f19 = 1.0 / m_A46; + const double f19_44 = -f19 * m_A135; + m_A137 += m_A47 * f19_44; + RHS44 += f19_44 * RHS19; + const double f20 = 1.0 / m_A48; + const double f20_57 = -f20 * m_A203; + m_A210 += m_A49 * f20_57; + RHS57 += f20_57 * RHS20; + const double f21 = 1.0 / m_A50; + const double f21_57 = -f21 * m_A204; + m_A210 += m_A51 * f21_57; + RHS57 += f21_57 * RHS21; + const double f22 = 1.0 / m_A52; + const double f22_57 = -f22 * m_A205; + m_A210 += m_A53 * f22_57; + RHS57 += f22_57 * RHS22; + const double f23 = 1.0 / m_A54; + const double f23_45 = -f23 * m_A140; + m_A141 += m_A55 * f23_45; + RHS45 += f23_45 * RHS23; + const double f24 = 1.0 / m_A56; + const double f24_46 = -f24 * m_A143; + m_A144 += m_A57 * f24_46; + RHS46 += f24_46 * RHS24; + const double f25 = 1.0 / m_A58; + const double f25_41 = -f25 * m_A121; + m_A122 += m_A59 * f25_41; + m_A123 += m_A60 * f25_41; + m_A124 += m_A61 * f25_41; + m_A125 += m_A62 * f25_41; + RHS41 += f25_41 * RHS25; + const double f25_48 = -f25 * m_A151; + m_A152 += m_A59 * f25_48; + m_A153 += m_A60 * f25_48; + m_A154 += m_A61 * f25_48; + m_A155 += m_A62 * f25_48; + RHS48 += f25_48 * RHS25; + const double f25_57 = -f25 * m_A206; + m_A207 += m_A59 * f25_57; + m_A208 += m_A60 * f25_57; + m_A209 += m_A61 * f25_57; + m_A210 += m_A62 * f25_57; + RHS57 += f25_57 * RHS25; + const double f26 = 1.0 / m_A63; + const double f26_43 = -f26 * m_A131; + m_A132 += m_A64 * f26_43; + m_A133 += m_A65 * f26_43; + m_A134 += m_A66 * f26_43; + RHS43 += f26_43 * RHS26; + const double f26_53 = -f26 * m_A182; + m_A183 += m_A64 * f26_53; + m_A184 += m_A65 * f26_53; + m_A185 += m_A66 * f26_53; + RHS53 += f26_53 * RHS26; + const double f26_59 = -f26 * m_A219; + m_A221 += m_A64 * f26_59; + m_A224 += m_A65 * f26_59; + m_A225 += m_A66 * f26_59; + RHS59 += f26_59 * RHS26; + const double f27 = 1.0 / m_A67; + const double f27_44 = -f27 * m_A136; + m_A137 += m_A68 * f27_44; + m_A138 += m_A69 * f27_44; + m_A139 += m_A70 * f27_44; + RHS44 += f27_44 * RHS27; + const double f27_54 = -f27 * m_A187; + m_A188 += m_A68 * f27_54; + m_A189 += m_A69 * f27_54; + m_A190 += m_A70 * f27_54; + RHS54 += f27_54 * RHS27; + const double f27_60 = -f27 * m_A228; + m_A230 += m_A68 * f27_60; + m_A232 += m_A69 * f27_60; + m_A234 += m_A70 * f27_60; + RHS60 += f27_60 * RHS27; + const double f28 = 1.0 / m_A71; + const double f28_55 = -f28 * m_A192; + m_A193 += m_A72 * f28_55; + RHS55 += f28_55 * RHS28; + const double f29 = 1.0 / m_A73; + const double f29_49 = -f29 * m_A159; + m_A161 += m_A74 * f29_49; + m_A162 += m_A75 * f29_49; + RHS49 += f29_49 * RHS29; + const double f29_62 = -f29 * m_A240; + m_A247 += m_A74 * f29_62; + m_A256 += m_A75 * f29_62; + RHS62 += f29_62 * RHS29; + const double f30 = 1.0 / m_A76; + const double f30_58 = -f30 * m_A214; + m_A216 += m_A77 * f30_58; + m_A217 += m_A78 * f30_58; + RHS58 += f30_58 * RHS30; + const double f30_62 = -f30 * m_A241; + m_A252 += m_A77 * f30_62; + m_A256 += m_A78 * f30_62; + RHS62 += f30_62 * RHS30; + const double f31 = 1.0 / m_A79; + const double f31_47 = -f31 * m_A146; + m_A148 += m_A80 * f31_47; + m_A150 += m_A81 * f31_47; + RHS47 += f31_47 * RHS31; + const double f31_62 = -f31 * m_A242; + m_A245 += m_A80 * f31_62; + m_A256 += m_A81 * f31_62; + RHS62 += f31_62 * RHS31; + const double f32 = 1.0 / m_A82; + const double f32_47 = -f32 * m_A147; + m_A148 += m_A83 * f32_47; + m_A149 += m_A84 * f32_47; + RHS47 += f32_47 * RHS32; + const double f32_61 = -f32 * m_A236; + m_A237 += m_A83 * f32_61; + m_A238 += m_A84 * f32_61; + RHS61 += f32_61 * RHS32; + const double f33 = 1.0 / m_A87; + const double f33_34 = -f33 * m_A90; + m_A91 += m_A88 * f33_34; + RHS34 += f33_34 * RHS33; + const double f34 = 1.0 / m_A91; + const double f34_49 = -f34 * m_A160; + m_A161 += m_A92 * f34_49; + RHS49 += f34_49 * RHS34; + const double f35 = 1.0 / m_A95; + const double f35_42 = -f35 * m_A127; + m_A128 += m_A96 * f35_42; + RHS42 += f35_42 * RHS35; + const double f36 = 1.0 / m_A98; + const double f36_50 = -f36 * m_A164; + m_A166 += m_A99 * f36_50; + m_A167 += m_A100 * f36_50; + RHS50 += f36_50 * RHS36; + const double f36_51 = -f36 * m_A171; + m_A173 += m_A99 * f36_51; + m_A174 += m_A100 * f36_51; + RHS51 += f36_51 * RHS36; + const double f37 = 1.0 / m_A102; + const double f37_52 = -f37 * m_A177; + m_A179 += m_A103 * f37_52; + m_A180 += m_A104 * f37_52; + RHS52 += f37_52 * RHS37; + const double f37_56 = -f37 * m_A197; + m_A199 += m_A103 * f37_56; + m_A200 += m_A104 * f37_56; + RHS56 += f37_56 * RHS37; + const double f38 = 1.0 / m_A107; + const double f38_50 = -f38 * m_A165; + m_A166 += m_A108 * f38_50; + m_A167 += m_A109 * f38_50; + m_A168 += m_A110 * f38_50; + RHS50 += f38_50 * RHS38; + const double f38_51 = -f38 * m_A172; + m_A173 += m_A108 * f38_51; + m_A174 += m_A109 * f38_51; + m_A175 += m_A110 * f38_51; + RHS51 += f38_51 * RHS38; + const double f38_59 = -f38 * m_A220; + m_A222 += m_A108 * f38_59; + m_A223 += m_A109 * f38_59; + m_A225 += m_A110 * f38_59; + RHS59 += f38_59 * RHS38; + const double f39 = 1.0 / m_A113; + const double f39_52 = -f39 * m_A178; + m_A179 += m_A114 * f39_52; + m_A180 += m_A115 * f39_52; + m_A181 += m_A116 * f39_52; + RHS52 += f39_52 * RHS39; + const double f39_56 = -f39 * m_A198; + m_A199 += m_A114 * f39_56; + m_A200 += m_A115 * f39_56; + m_A201 += m_A116 * f39_56; + RHS56 += f39_56 * RHS39; + const double f39_60 = -f39 * m_A229; + m_A231 += m_A114 * f39_60; + m_A233 += m_A115 * f39_60; + m_A234 += m_A116 * f39_60; + RHS60 += f39_60 * RHS39; + const double f40 = 1.0 / m_A118; + const double f40_41 = -f40 * m_A122; + m_A123 += m_A119 * f40_41; + RHS41 += f40_41 * RHS40; + const double f40_48 = -f40 * m_A152; + m_A153 += m_A119 * f40_48; + RHS48 += f40_48 * RHS40; + const double f40_57 = -f40 * m_A207; + m_A208 += m_A119 * f40_57; + RHS57 += f40_57 * RHS40; + const double f41 = 1.0 / m_A123; + const double f41_48 = -f41 * m_A153; + m_A154 += m_A124 * f41_48; + m_A155 += m_A125 * f41_48; + RHS48 += f41_48 * RHS41; + const double f41_57 = -f41 * m_A208; + m_A209 += m_A124 * f41_57; + m_A210 += m_A125 * f41_57; + RHS57 += f41_57 * RHS41; + const double f42 = 1.0 / m_A128; + const double f42_58 = -f42 * m_A215; + m_A216 += m_A129 * f42_58; + RHS58 += f42_58 * RHS42; + const double f43 = 1.0 / m_A132; + const double f43_53 = -f43 * m_A183; + m_A184 += m_A133 * f43_53; + m_A185 += m_A134 * f43_53; + RHS53 += f43_53 * RHS43; + const double f43_59 = -f43 * m_A221; + m_A224 += m_A133 * f43_59; + m_A225 += m_A134 * f43_59; + RHS59 += f43_59 * RHS43; + const double f44 = 1.0 / m_A137; + const double f44_54 = -f44 * m_A188; + m_A189 += m_A138 * f44_54; + m_A190 += m_A139 * f44_54; + RHS54 += f44_54 * RHS44; + const double f44_60 = -f44 * m_A230; + m_A232 += m_A138 * f44_60; + m_A234 += m_A139 * f44_60; + RHS60 += f44_60 * RHS44; + const double f45 = 1.0 / m_A141; + const double f45_62 = -f45 * m_A243; + m_A256 += m_A142 * f45_62; + RHS62 += f45_62 * RHS45; + const double f46 = 1.0 / m_A144; + const double f46_62 = -f46 * m_A244; + m_A256 += m_A145 * f46_62; + RHS62 += f46_62 * RHS46; + const double f47 = 1.0 / m_A148; + const double f47_61 = -f47 * m_A237; + m_A238 += m_A149 * f47_61; + m_A239 += m_A150 * f47_61; + RHS61 += f47_61 * RHS47; + const double f47_62 = -f47 * m_A245; + m_A255 += m_A149 * f47_62; + m_A256 += m_A150 * f47_62; + RHS62 += f47_62 * RHS47; + const double f48 = 1.0 / m_A154; + const double f48_57 = -f48 * m_A209; + m_A210 += m_A155 * f48_57; + m_A211 += m_A156 * f48_57; + RHS57 += f48_57 * RHS48; + const double f48_62 = -f48 * m_A246; + m_A251 += m_A155 * f48_62; + m_A256 += m_A156 * f48_62; + RHS62 += f48_62 * RHS48; + const double f49 = 1.0 / m_A161; + const double f49_62 = -f49 * m_A247; + m_A256 += m_A162 * f49_62; + RHS62 += f49_62 * RHS49; + const double f50 = 1.0 / m_A166; + const double f50_51 = -f50 * m_A173; + m_A174 += m_A167 * f50_51; + m_A175 += m_A168 * f50_51; + RHS51 += f50_51 * RHS50; + const double f50_59 = -f50 * m_A222; + m_A223 += m_A167 * f50_59; + m_A225 += m_A168 * f50_59; + RHS59 += f50_59 * RHS50; + const double f51 = 1.0 / m_A174; + const double f51_59 = -f51 * m_A223; + m_A225 += m_A175 * f51_59; + RHS59 += f51_59 * RHS51; + const double f52 = 1.0 / m_A179; + const double f52_56 = -f52 * m_A199; + m_A200 += m_A180 * f52_56; + m_A201 += m_A181 * f52_56; + RHS56 += f52_56 * RHS52; + const double f52_60 = -f52 * m_A231; + m_A233 += m_A180 * f52_60; + m_A234 += m_A181 * f52_60; + RHS60 += f52_60 * RHS52; + const double f53 = 1.0 / m_A184; + const double f53_59 = -f53 * m_A224; + m_A225 += m_A185 * f53_59; + m_A226 += m_A186 * f53_59; + RHS59 += f53_59 * RHS53; + const double f53_62 = -f53 * m_A248; + m_A253 += m_A185 * f53_62; + m_A256 += m_A186 * f53_62; + RHS62 += f53_62 * RHS53; + const double f54 = 1.0 / m_A189; + const double f54_60 = -f54 * m_A232; + m_A234 += m_A190 * f54_60; + m_A235 += m_A191 * f54_60; + RHS60 += f54_60 * RHS54; + const double f54_62 = -f54 * m_A249; + m_A254 += m_A190 * f54_62; + m_A256 += m_A191 * f54_62; + RHS62 += f54_62 * RHS54; + const double f55 = 1.0 / m_A193; + const double f55_62 = -f55 * m_A250; + m_A256 += m_A194 * f55_62; + RHS62 += f55_62 * RHS55; + const double f56 = 1.0 / m_A200; + const double f56_60 = -f56 * m_A233; + m_A234 += m_A201 * f56_60; + RHS60 += f56_60 * RHS56; + const double f57 = 1.0 / m_A210; + const double f57_62 = -f57 * m_A251; + m_A256 += m_A211 * f57_62; + RHS62 += f57_62 * RHS57; + const double f58 = 1.0 / m_A216; + const double f58_62 = -f58 * m_A252; + m_A256 += m_A217 * f58_62; + RHS62 += f58_62 * RHS58; + const double f59 = 1.0 / m_A225; + const double f59_62 = -f59 * m_A253; + m_A256 += m_A226 * f59_62; + RHS62 += f59_62 * RHS59; + const double f60 = 1.0 / m_A234; + const double f60_62 = -f60 * m_A254; + m_A256 += m_A235 * f60_62; + RHS62 += f60_62 * RHS60; + const double f61 = 1.0 / m_A238; + const double f61_62 = -f61 * m_A255; + m_A256 += m_A239 * f61_62; + RHS62 += f61_62 * RHS61; + V[62] = RHS62 / m_A256; + double tmp61 = 0.0; + tmp61 += m_A239 * V[62]; + V[61] = (RHS61 - tmp61) / m_A238; + double tmp60 = 0.0; + tmp60 += m_A235 * V[62]; + V[60] = (RHS60 - tmp60) / m_A234; + double tmp59 = 0.0; + tmp59 += m_A226 * V[62]; + V[59] = (RHS59 - tmp59) / m_A225; + double tmp58 = 0.0; + tmp58 += m_A217 * V[62]; + V[58] = (RHS58 - tmp58) / m_A216; + double tmp57 = 0.0; + tmp57 += m_A211 * V[62]; + V[57] = (RHS57 - tmp57) / m_A210; + double tmp56 = 0.0; + tmp56 += m_A201 * V[60]; + V[56] = (RHS56 - tmp56) / m_A200; + double tmp55 = 0.0; + tmp55 += m_A194 * V[62]; + V[55] = (RHS55 - tmp55) / m_A193; + double tmp54 = 0.0; + tmp54 += m_A190 * V[60]; + tmp54 += m_A191 * V[62]; + V[54] = (RHS54 - tmp54) / m_A189; + double tmp53 = 0.0; + tmp53 += m_A185 * V[59]; + tmp53 += m_A186 * V[62]; + V[53] = (RHS53 - tmp53) / m_A184; + double tmp52 = 0.0; + tmp52 += m_A180 * V[56]; + tmp52 += m_A181 * V[60]; + V[52] = (RHS52 - tmp52) / m_A179; + double tmp51 = 0.0; + tmp51 += m_A175 * V[59]; + V[51] = (RHS51 - tmp51) / m_A174; + double tmp50 = 0.0; + tmp50 += m_A167 * V[51]; + tmp50 += m_A168 * V[59]; + V[50] = (RHS50 - tmp50) / m_A166; + double tmp49 = 0.0; + tmp49 += m_A162 * V[62]; + V[49] = (RHS49 - tmp49) / m_A161; + double tmp48 = 0.0; + tmp48 += m_A155 * V[57]; + tmp48 += m_A156 * V[62]; + V[48] = (RHS48 - tmp48) / m_A154; + double tmp47 = 0.0; + tmp47 += m_A149 * V[61]; + tmp47 += m_A150 * V[62]; + V[47] = (RHS47 - tmp47) / m_A148; + double tmp46 = 0.0; + tmp46 += m_A145 * V[62]; + V[46] = (RHS46 - tmp46) / m_A144; + double tmp45 = 0.0; + tmp45 += m_A142 * V[62]; + V[45] = (RHS45 - tmp45) / m_A141; + double tmp44 = 0.0; + tmp44 += m_A138 * V[54]; + tmp44 += m_A139 * V[60]; + V[44] = (RHS44 - tmp44) / m_A137; + double tmp43 = 0.0; + tmp43 += m_A133 * V[53]; + tmp43 += m_A134 * V[59]; + V[43] = (RHS43 - tmp43) / m_A132; + double tmp42 = 0.0; + tmp42 += m_A129 * V[58]; + V[42] = (RHS42 - tmp42) / m_A128; + double tmp41 = 0.0; + tmp41 += m_A124 * V[48]; + tmp41 += m_A125 * V[57]; + V[41] = (RHS41 - tmp41) / m_A123; + double tmp40 = 0.0; + tmp40 += m_A119 * V[41]; + V[40] = (RHS40 - tmp40) / m_A118; + double tmp39 = 0.0; + tmp39 += m_A114 * V[52]; + tmp39 += m_A115 * V[56]; + tmp39 += m_A116 * V[60]; + V[39] = (RHS39 - tmp39) / m_A113; + double tmp38 = 0.0; + tmp38 += m_A108 * V[50]; + tmp38 += m_A109 * V[51]; + tmp38 += m_A110 * V[59]; + V[38] = (RHS38 - tmp38) / m_A107; + double tmp37 = 0.0; + tmp37 += m_A103 * V[52]; + tmp37 += m_A104 * V[56]; + V[37] = (RHS37 - tmp37) / m_A102; + double tmp36 = 0.0; + tmp36 += m_A99 * V[50]; + tmp36 += m_A100 * V[51]; + V[36] = (RHS36 - tmp36) / m_A98; + double tmp35 = 0.0; + tmp35 += m_A96 * V[42]; + V[35] = (RHS35 - tmp35) / m_A95; + double tmp34 = 0.0; + tmp34 += m_A92 * V[49]; + V[34] = (RHS34 - tmp34) / m_A91; + double tmp33 = 0.0; + tmp33 += m_A88 * V[34]; + V[33] = (RHS33 - tmp33) / m_A87; + double tmp32 = 0.0; + tmp32 += m_A83 * V[47]; + tmp32 += m_A84 * V[61]; + V[32] = (RHS32 - tmp32) / m_A82; + double tmp31 = 0.0; + tmp31 += m_A80 * V[47]; + tmp31 += m_A81 * V[62]; + V[31] = (RHS31 - tmp31) / m_A79; + double tmp30 = 0.0; + tmp30 += m_A77 * V[58]; + tmp30 += m_A78 * V[62]; + V[30] = (RHS30 - tmp30) / m_A76; + double tmp29 = 0.0; + tmp29 += m_A74 * V[49]; + tmp29 += m_A75 * V[62]; + V[29] = (RHS29 - tmp29) / m_A73; + double tmp28 = 0.0; + tmp28 += m_A72 * V[55]; + V[28] = (RHS28 - tmp28) / m_A71; + double tmp27 = 0.0; + tmp27 += m_A68 * V[44]; + tmp27 += m_A69 * V[54]; + tmp27 += m_A70 * V[60]; + V[27] = (RHS27 - tmp27) / m_A67; + double tmp26 = 0.0; + tmp26 += m_A64 * V[43]; + tmp26 += m_A65 * V[53]; + tmp26 += m_A66 * V[59]; + V[26] = (RHS26 - tmp26) / m_A63; + double tmp25 = 0.0; + tmp25 += m_A59 * V[40]; + tmp25 += m_A60 * V[41]; + tmp25 += m_A61 * V[48]; + tmp25 += m_A62 * V[57]; + V[25] = (RHS25 - tmp25) / m_A58; + double tmp24 = 0.0; + tmp24 += m_A57 * V[46]; + V[24] = (RHS24 - tmp24) / m_A56; + double tmp23 = 0.0; + tmp23 += m_A55 * V[45]; + V[23] = (RHS23 - tmp23) / m_A54; + double tmp22 = 0.0; + tmp22 += m_A53 * V[57]; + V[22] = (RHS22 - tmp22) / m_A52; + double tmp21 = 0.0; + tmp21 += m_A51 * V[57]; + V[21] = (RHS21 - tmp21) / m_A50; + double tmp20 = 0.0; + tmp20 += m_A49 * V[57]; + V[20] = (RHS20 - tmp20) / m_A48; + double tmp19 = 0.0; + tmp19 += m_A47 * V[44]; + V[19] = (RHS19 - tmp19) / m_A46; + double tmp18 = 0.0; + tmp18 += m_A44 * V[39]; + tmp18 += m_A45 * V[60]; + V[18] = (RHS18 - tmp18) / m_A43; + double tmp17 = 0.0; + tmp17 += m_A42 * V[41]; + V[17] = (RHS17 - tmp17) / m_A41; + double tmp16 = 0.0; + tmp16 += m_A40 * V[57]; + V[16] = (RHS16 - tmp16) / m_A39; + double tmp15 = 0.0; + tmp15 += m_A38 * V[43]; + V[15] = (RHS15 - tmp15) / m_A37; + double tmp14 = 0.0; + tmp14 += m_A35 * V[38]; + tmp14 += m_A36 * V[59]; + V[14] = (RHS14 - tmp14) / m_A34; + double tmp13 = 0.0; + tmp13 += m_A32 * V[39]; + tmp13 += m_A33 * V[56]; + V[13] = (RHS13 - tmp13) / m_A31; + double tmp12 = 0.0; + tmp12 += m_A29 * V[52]; + tmp12 += m_A30 * V[56]; + V[12] = (RHS12 - tmp12) / m_A28; + double tmp11 = 0.0; + tmp11 += m_A27 * V[58]; + V[11] = (RHS11 - tmp11) / m_A26; + double tmp10 = 0.0; + tmp10 += m_A25 * V[37]; + V[10] = (RHS10 - tmp10) / m_A24; + double tmp9 = 0.0; + tmp9 += m_A23 * V[58]; + V[9] = (RHS9 - tmp9) / m_A22; + double tmp8 = 0.0; + tmp8 += m_A20 * V[38]; + tmp8 += m_A21 * V[51]; + V[8] = (RHS8 - tmp8) / m_A19; + double tmp7 = 0.0; + tmp7 += m_A17 * V[50]; + tmp7 += m_A18 * V[51]; + V[7] = (RHS7 - tmp7) / m_A16; + double tmp6 = 0.0; + tmp6 += m_A15 * V[36]; + V[6] = (RHS6 - tmp6) / m_A14; + double tmp5 = 0.0; + tmp5 += m_A12 * V[35]; + tmp5 += m_A13 * V[42]; + V[5] = (RHS5 - tmp5) / m_A11; + double tmp4 = 0.0; + tmp4 += m_A10 * V[49]; + V[4] = (RHS4 - tmp4) / m_A9; + double tmp3 = 0.0; + tmp3 += m_A8 * V[35]; + V[3] = (RHS3 - tmp3) / m_A7; + double tmp2 = 0.0; + tmp2 += m_A6 * V[49]; + V[2] = (RHS2 - tmp2) / m_A5; + double tmp1 = 0.0; + tmp1 += m_A3 * V[33]; + tmp1 += m_A4 * V[34]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[33]; + V[0] = (RHS0 - tmp0) / m_A0; +} + +// dribling +static void nl_gcr_7_double_double_a1ecff4d37b54b76(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A0 += gt[3]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 += Idr[3]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + RHS0 -= go[3] * *cnV[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A2 += gt[6]; + m_A3 += go[4]; + double RHS1 = Idr[4]; + RHS1 += Idr[5]; + RHS1 += Idr[6]; + RHS1 -= go[5] * *cnV[5]; + RHS1 -= go[6] * *cnV[6]; + m_A6 += gt[7]; + m_A6 += gt[8]; + m_A6 += gt[9]; + m_A5 += go[7]; + m_A4 += go[8]; + double RHS2 = Idr[7]; + RHS2 += Idr[8]; + RHS2 += Idr[9]; + RHS2 -= go[9] * *cnV[9]; + const double f0 = 1.0 / m_A0; + const double f0_2 = -f0 * m_A4; + m_A6 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_2 = -f1 * m_A5; + m_A6 += m_A3 * f1_2; + RHS2 += f1_2 * RHS1; + V[2] = RHS2 / m_A6; + double tmp1 = 0.0; + tmp1 += m_A3 * V[2]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[2]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // elim,zektor static void nl_gcr_10_double_double_11c2ae166b240b6e(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -28709,57 +30716,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// elim,zektor -static void nl_gcr_7_double_double_d190a0e3b8e1f4a7(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 -= go[1] * *cnV[1]; - m_A2 += gt[2]; - m_A2 += gt[3]; - m_A3 += go[2]; - double RHS1 = Idr[2]; - RHS1 += Idr[3]; - RHS1 -= go[3] * *cnV[3]; - m_A6 += gt[4]; - m_A6 += gt[5]; - m_A6 += gt[6]; - m_A5 += go[4]; - m_A4 += go[5]; - double RHS2 = Idr[4]; - RHS2 += Idr[5]; - RHS2 += Idr[6]; - RHS2 -= go[6] * *cnV[6]; - const double f0 = 1.0 / m_A0; - const double f0_2 = -f0 * m_A4; - m_A6 += m_A1 * f0_2; - RHS2 += f0_2 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_2 = -f1 * m_A5; - m_A6 += m_A3 * f1_2; - RHS2 += f1_2 * RHS1; - V[2] = RHS2 / m_A6; - double tmp1 = 0.0; - tmp1 += m_A3 * V[2]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[2]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // fireone static void nl_gcr_128_double_double_7aee4423e3fdbfda(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -33183,63 +35139,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// fireone,astrob,rebound,speedfrk,cheekyms -static void nl_gcr_7_double_double_7c86a9bc1c6aef4c(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - m_A2 += gt[3]; - m_A2 += gt[4]; - m_A3 += go[3]; - double RHS1 = Idr[3]; - RHS1 += Idr[4]; - RHS1 -= go[4] * *cnV[4]; - m_A6 += gt[5]; - m_A6 += gt[6]; - m_A6 += gt[7]; - m_A6 += gt[8]; - m_A5 += go[5]; - m_A4 += go[6]; - double RHS2 = Idr[5]; - RHS2 += Idr[6]; - RHS2 += Idr[7]; - RHS2 += Idr[8]; - RHS2 -= go[7] * *cnV[7]; - RHS2 -= go[8] * *cnV[8]; - const double f0 = 1.0 / m_A0; - const double f0_2 = -f0 * m_A4; - m_A6 += m_A1 * f0_2; - RHS2 += f0_2 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_2 = -f1 * m_A5; - m_A6 += m_A3 * f1_2; - RHS2 += f1_2 * RHS1; - V[2] = RHS2 / m_A6; - double tmp1 = 0.0; - tmp1 += m_A3 * V[2]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[2]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // fireone static void nl_gcr_7_double_double_e7fb484f621b3ab9(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -38153,8 +40052,163 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// gi6809 +static void nl_gcr_13_double_double_9eda6de0d275a3e5(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + m_A2 += gt[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A2 += gt[6]; + m_A3 += go[3]; + double RHS1 = Idr[3]; + RHS1 += Idr[4]; + RHS1 += Idr[5]; + RHS1 += Idr[6]; + RHS1 -= go[4] * *cnV[4]; + RHS1 -= go[5] * *cnV[5]; + RHS1 -= go[6] * *cnV[6]; + m_A4 += gt[7]; + m_A4 += gt[8]; + m_A4 += gt[9]; + m_A4 += gt[10]; + m_A5 += go[7]; + double RHS2 = Idr[7]; + RHS2 += Idr[8]; + RHS2 += Idr[9]; + RHS2 += Idr[10]; + RHS2 -= go[8] * *cnV[8]; + RHS2 -= go[9] * *cnV[9]; + RHS2 -= go[10] * *cnV[10]; + m_A6 += gt[11]; + m_A6 += gt[12]; + m_A7 += go[11]; + double RHS3 = Idr[11]; + RHS3 += Idr[12]; + RHS3 -= go[12] * *cnV[12]; + m_A12 += gt[13]; + m_A12 += gt[14]; + m_A12 += gt[15]; + m_A12 += gt[16]; + m_A12 += gt[17]; + m_A12 += gt[18]; + m_A11 += go[13]; + m_A10 += go[14]; + m_A9 += go[15]; + m_A8 += go[16]; + double RHS4 = Idr[13]; + RHS4 += Idr[14]; + RHS4 += Idr[15]; + RHS4 += Idr[16]; + RHS4 += Idr[17]; + RHS4 += Idr[18]; + RHS4 -= go[17] * *cnV[17]; + RHS4 -= go[18] * *cnV[18]; + const double f0 = 1.0 / m_A0; + const double f0_4 = -f0 * m_A8; + m_A12 += m_A1 * f0_4; + RHS4 += f0_4 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_4 = -f1 * m_A9; + m_A12 += m_A3 * f1_4; + RHS4 += f1_4 * RHS1; + const double f2 = 1.0 / m_A4; + const double f2_4 = -f2 * m_A10; + m_A12 += m_A5 * f2_4; + RHS4 += f2_4 * RHS2; + const double f3 = 1.0 / m_A6; + const double f3_4 = -f3 * m_A11; + m_A12 += m_A7 * f3_4; + RHS4 += f3_4 * RHS3; + V[4] = RHS4 / m_A12; + double tmp3 = 0.0; + tmp3 += m_A7 * V[4]; + V[3] = (RHS3 - tmp3) / m_A6; + double tmp2 = 0.0; + tmp2 += m_A5 * V[4]; + V[2] = (RHS2 - tmp2) / m_A4; + double tmp1 = 0.0; + tmp1 += m_A3 * V[4]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[4]; + V[0] = (RHS0 - tmp0) / m_A0; +} + +// gi6809 +static void nl_gcr_7_double_double_8a409a18e77784cb(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 -= go[1] * *cnV[1]; + m_A2 += gt[2]; + m_A2 += gt[3]; + m_A3 += go[2]; + double RHS1 = Idr[2]; + RHS1 += Idr[3]; + RHS1 -= go[3] * *cnV[3]; + m_A6 += gt[4]; + m_A6 += gt[5]; + m_A5 += go[4]; + m_A4 += go[5]; + double RHS2 = Idr[4]; + RHS2 += Idr[5]; + const double f0 = 1.0 / m_A0; + const double f0_2 = -f0 * m_A4; + m_A6 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_2 = -f1 * m_A5; + m_A6 += m_A3 * f1_2; + RHS2 += f1_2 * RHS1; + V[2] = RHS2 / m_A6; + double tmp1 = 0.0; + tmp1 += m_A3 * V[2]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[2]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // gtrak10 -static void nl_gcr_43_double_double_4c46fdf7c0037727(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) +static void nl_gcr_22_double_double_1f38df4919cdddae(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) { @@ -38181,27 +40235,6 @@ double m_A19(0.0); double m_A20(0.0); double m_A21(0.0); - double m_A22(0.0); - double m_A23(0.0); - double m_A24(0.0); - double m_A25(0.0); - double m_A26(0.0); - double m_A27(0.0); - double m_A28(0.0); - double m_A29(0.0); - double m_A30(0.0); - double m_A31(0.0); - double m_A32(0.0); - double m_A33(0.0); - double m_A34(0.0); - double m_A35(0.0); - double m_A36(0.0); - double m_A37(0.0); - double m_A38(0.0); - double m_A39(0.0); - double m_A40(0.0); - double m_A41(0.0); - double m_A42(0.0); m_A0 += gt[0]; m_A0 += gt[1]; m_A0 += gt[2]; @@ -38221,262 +40254,159 @@ RHS1 -= go[4] * *cnV[4]; RHS1 -= go[5] * *cnV[5]; m_A4 += gt[6]; - m_A4 += gt[7]; - m_A4 += gt[8]; m_A5 += go[6]; double RHS2 = Idr[6]; - RHS2 += Idr[7]; - RHS2 += Idr[8]; - RHS2 -= go[7] * *cnV[7]; - RHS2 -= go[8] * *cnV[8]; - m_A6 += gt[9]; - m_A6 += gt[10]; - m_A6 += gt[11]; - m_A7 += go[9]; - double RHS3 = Idr[9]; - RHS3 += Idr[10]; - RHS3 += Idr[11]; - RHS3 -= go[10] * *cnV[10]; - RHS3 -= go[11] * *cnV[11]; - m_A8 += gt[12]; - m_A8 += gt[13]; - m_A8 += gt[14]; - m_A9 += go[12]; - double RHS4 = Idr[12]; - RHS4 += Idr[13]; - RHS4 += Idr[14]; - RHS4 -= go[13] * *cnV[13]; - RHS4 -= go[14] * *cnV[14]; - m_A10 += gt[15]; - m_A10 += gt[16]; - m_A10 += gt[17]; - m_A11 += go[15]; - double RHS5 = Idr[15]; - RHS5 += Idr[16]; - RHS5 += Idr[17]; - RHS5 -= go[16] * *cnV[16]; - RHS5 -= go[17] * *cnV[17]; - m_A12 += gt[18]; - m_A12 += gt[19]; - m_A12 += gt[20]; - m_A13 += go[18]; - double RHS6 = Idr[18]; - RHS6 += Idr[19]; - RHS6 += Idr[20]; - RHS6 -= go[19] * *cnV[19]; - RHS6 -= go[20] * *cnV[20]; - m_A14 += gt[21]; - m_A14 += gt[22]; - m_A14 += gt[23]; - m_A15 += go[21]; - double RHS7 = Idr[21]; + m_A6 += gt[7]; + m_A7 += go[7]; + double RHS3 = Idr[7]; + m_A8 += gt[8]; + m_A8 += gt[9]; + m_A8 += gt[10]; + m_A9 += go[8]; + double RHS4 = Idr[8]; + RHS4 += Idr[9]; + RHS4 += Idr[10]; + RHS4 -= go[9] * *cnV[9]; + RHS4 -= go[10] * *cnV[10]; + m_A10 += gt[11]; + m_A10 += gt[12]; + m_A10 += gt[13]; + m_A11 += go[11]; + double RHS5 = Idr[11]; + RHS5 += Idr[12]; + RHS5 += Idr[13]; + RHS5 -= go[12] * *cnV[12]; + RHS5 -= go[13] * *cnV[13]; + m_A14 += gt[14]; + m_A14 += gt[15]; + m_A14 += gt[16]; + m_A13 += go[14]; + m_A12 += go[15]; + m_A15 += go[16]; + double RHS6 = Idr[14]; + RHS6 += Idr[15]; + RHS6 += Idr[16]; + m_A21 += gt[17]; + m_A21 += gt[18]; + m_A21 += gt[19]; + m_A21 += gt[20]; + m_A21 += gt[21]; + m_A21 += gt[22]; + m_A21 += gt[23]; + m_A20 += go[17]; + m_A19 += go[18]; + m_A18 += go[19]; + m_A17 += go[20]; + m_A16 += go[21]; + double RHS7 = Idr[17]; + RHS7 += Idr[18]; + RHS7 += Idr[19]; + RHS7 += Idr[20]; + RHS7 += Idr[21]; RHS7 += Idr[22]; RHS7 += Idr[23]; RHS7 -= go[22] * *cnV[22]; RHS7 -= go[23] * *cnV[23]; - m_A16 += gt[24]; - m_A16 += gt[25]; - m_A16 += gt[26]; - m_A17 += go[24]; - double RHS8 = Idr[24]; - RHS8 += Idr[25]; - RHS8 += Idr[26]; - RHS8 -= go[25] * *cnV[25]; - RHS8 -= go[26] * *cnV[26]; - m_A18 += gt[27]; - m_A18 += gt[28]; - m_A18 += gt[29]; - m_A19 += go[27]; - double RHS9 = Idr[27]; - RHS9 += Idr[28]; - RHS9 += Idr[29]; - RHS9 -= go[28] * *cnV[28]; - RHS9 -= go[29] * *cnV[29]; - m_A20 += gt[30]; - m_A20 += gt[31]; - m_A20 += gt[32]; - m_A21 += go[30]; - double RHS10 = Idr[30]; - RHS10 += Idr[31]; - RHS10 += Idr[32]; - RHS10 -= go[31] * *cnV[31]; - RHS10 -= go[32] * *cnV[32]; - m_A22 += gt[33]; - m_A22 += gt[34]; - m_A22 += gt[35]; - m_A23 += go[33]; - double RHS11 = Idr[33]; - RHS11 += Idr[34]; - RHS11 += Idr[35]; - RHS11 -= go[34] * *cnV[34]; - RHS11 -= go[35] * *cnV[35]; - m_A25 += gt[36]; - m_A25 += gt[37]; - m_A25 += gt[38]; - m_A26 += go[36]; - m_A24 += go[37]; - double RHS12 = Idr[36]; - RHS12 += Idr[37]; - RHS12 += Idr[38]; - RHS12 -= go[38] * *cnV[38]; - m_A30 += gt[39]; - m_A30 += gt[40]; - m_A30 += gt[41]; - m_A30 += gt[42]; - m_A30 += gt[43]; - m_A30 += gt[44]; - m_A30 += gt[45]; - m_A29 += go[39]; - m_A28 += go[40]; - m_A27 += go[41]; - m_A31 += go[42]; - m_A31 += go[43]; - double RHS13 = Idr[39]; - RHS13 += Idr[40]; - RHS13 += Idr[41]; - RHS13 += Idr[42]; - RHS13 += Idr[43]; - RHS13 += Idr[44]; - RHS13 += Idr[45]; - RHS13 -= go[44] * *cnV[44]; - RHS13 -= go[45] * *cnV[45]; - m_A42 += gt[46]; - m_A42 += gt[47]; - m_A42 += gt[48]; - m_A42 += gt[49]; - m_A42 += gt[50]; - m_A42 += gt[51]; - m_A42 += gt[52]; - m_A42 += gt[53]; - m_A42 += gt[54]; - m_A42 += gt[55]; - m_A42 += gt[56]; - m_A42 += gt[57]; - m_A42 += gt[58]; - m_A41 += go[46]; - m_A41 += go[47]; - m_A39 += go[48]; - m_A38 += go[49]; - m_A37 += go[50]; - m_A36 += go[51]; - m_A35 += go[52]; - m_A34 += go[53]; - m_A33 += go[54]; - m_A32 += go[55]; - m_A40 += go[56]; - double RHS14 = Idr[46]; - RHS14 += Idr[47]; - RHS14 += Idr[48]; - RHS14 += Idr[49]; - RHS14 += Idr[50]; - RHS14 += Idr[51]; - RHS14 += Idr[52]; - RHS14 += Idr[53]; - RHS14 += Idr[54]; - RHS14 += Idr[55]; - RHS14 += Idr[56]; - RHS14 += Idr[57]; - RHS14 += Idr[58]; - RHS14 -= go[57] * *cnV[57]; - RHS14 -= go[58] * *cnV[58]; const double f0 = 1.0 / m_A0; - const double f0_12 = -f0 * m_A24; - m_A25 += m_A1 * f0_12; - RHS12 += f0_12 * RHS0; + const double f0_7 = -f0 * m_A16; + m_A21 += m_A1 * f0_7; + RHS7 += f0_7 * RHS0; const double f1 = 1.0 / m_A2; - const double f1_14 = -f1 * m_A32; - m_A42 += m_A3 * f1_14; - RHS14 += f1_14 * RHS1; + const double f1_7 = -f1 * m_A17; + m_A21 += m_A3 * f1_7; + RHS7 += f1_7 * RHS1; const double f2 = 1.0 / m_A4; - const double f2_14 = -f2 * m_A33; - m_A42 += m_A5 * f2_14; - RHS14 += f2_14 * RHS2; + const double f2_6 = -f2 * m_A12; + m_A14 += m_A5 * f2_6; + RHS6 += f2_6 * RHS2; const double f3 = 1.0 / m_A6; - const double f3_14 = -f3 * m_A34; - m_A42 += m_A7 * f3_14; - RHS14 += f3_14 * RHS3; + const double f3_6 = -f3 * m_A13; + m_A14 += m_A7 * f3_6; + RHS6 += f3_6 * RHS3; const double f4 = 1.0 / m_A8; - const double f4_14 = -f4 * m_A35; - m_A42 += m_A9 * f4_14; - RHS14 += f4_14 * RHS4; + const double f4_7 = -f4 * m_A18; + m_A21 += m_A9 * f4_7; + RHS7 += f4_7 * RHS4; const double f5 = 1.0 / m_A10; - const double f5_14 = -f5 * m_A36; - m_A42 += m_A11 * f5_14; - RHS14 += f5_14 * RHS5; - const double f6 = 1.0 / m_A12; - const double f6_14 = -f6 * m_A37; - m_A42 += m_A13 * f6_14; - RHS14 += f6_14 * RHS6; - const double f7 = 1.0 / m_A14; - const double f7_14 = -f7 * m_A38; - m_A42 += m_A15 * f7_14; - RHS14 += f7_14 * RHS7; - const double f8 = 1.0 / m_A16; - const double f8_14 = -f8 * m_A39; - m_A42 += m_A17 * f8_14; - RHS14 += f8_14 * RHS8; - const double f9 = 1.0 / m_A18; - const double f9_13 = -f9 * m_A27; - m_A30 += m_A19 * f9_13; - RHS13 += f9_13 * RHS9; - const double f10 = 1.0 / m_A20; - const double f10_13 = -f10 * m_A28; - m_A30 += m_A21 * f10_13; - RHS13 += f10_13 * RHS10; - const double f11 = 1.0 / m_A22; - const double f11_13 = -f11 * m_A29; - m_A30 += m_A23 * f11_13; - RHS13 += f11_13 * RHS11; - const double f12 = 1.0 / m_A25; - const double f12_14 = -f12 * m_A40; - m_A42 += m_A26 * f12_14; - RHS14 += f12_14 * RHS12; - const double f13 = 1.0 / m_A30; - const double f13_14 = -f13 * m_A41; - m_A42 += m_A31 * f13_14; - RHS14 += f13_14 * RHS13; - V[14] = RHS14 / m_A42; - double tmp13 = 0.0; - tmp13 += m_A31 * V[14]; - V[13] = (RHS13 - tmp13) / m_A30; - double tmp12 = 0.0; - tmp12 += m_A26 * V[14]; - V[12] = (RHS12 - tmp12) / m_A25; - double tmp11 = 0.0; - tmp11 += m_A23 * V[13]; - V[11] = (RHS11 - tmp11) / m_A22; - double tmp10 = 0.0; - tmp10 += m_A21 * V[13]; - V[10] = (RHS10 - tmp10) / m_A20; - double tmp9 = 0.0; - tmp9 += m_A19 * V[13]; - V[9] = (RHS9 - tmp9) / m_A18; - double tmp8 = 0.0; - tmp8 += m_A17 * V[14]; - V[8] = (RHS8 - tmp8) / m_A16; - double tmp7 = 0.0; - tmp7 += m_A15 * V[14]; - V[7] = (RHS7 - tmp7) / m_A14; + const double f5_7 = -f5 * m_A19; + m_A21 += m_A11 * f5_7; + RHS7 += f5_7 * RHS5; + const double f6 = 1.0 / m_A14; + const double f6_7 = -f6 * m_A20; + m_A21 += m_A15 * f6_7; + RHS7 += f6_7 * RHS6; + V[7] = RHS7 / m_A21; double tmp6 = 0.0; - tmp6 += m_A13 * V[14]; - V[6] = (RHS6 - tmp6) / m_A12; + tmp6 += m_A15 * V[7]; + V[6] = (RHS6 - tmp6) / m_A14; double tmp5 = 0.0; - tmp5 += m_A11 * V[14]; + tmp5 += m_A11 * V[7]; V[5] = (RHS5 - tmp5) / m_A10; double tmp4 = 0.0; - tmp4 += m_A9 * V[14]; + tmp4 += m_A9 * V[7]; V[4] = (RHS4 - tmp4) / m_A8; double tmp3 = 0.0; - tmp3 += m_A7 * V[14]; + tmp3 += m_A7 * V[6]; V[3] = (RHS3 - tmp3) / m_A6; double tmp2 = 0.0; - tmp2 += m_A5 * V[14]; + tmp2 += m_A5 * V[6]; V[2] = (RHS2 - tmp2) / m_A4; double tmp1 = 0.0; - tmp1 += m_A3 * V[14]; + tmp1 += m_A3 * V[7]; V[1] = (RHS1 - tmp1) / m_A2; double tmp0 = 0.0; - tmp0 += m_A1 * V[12]; + tmp0 += m_A1 * V[7]; + V[0] = (RHS0 - tmp0) / m_A0; +} + +// gtrak10,elim,zektor +static void nl_gcr_7_double_double_d190a0e3b8e1f4a7(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 -= go[1] * *cnV[1]; + m_A2 += gt[2]; + m_A2 += gt[3]; + m_A3 += go[2]; + double RHS1 = Idr[2]; + RHS1 += Idr[3]; + RHS1 -= go[3] * *cnV[3]; + m_A6 += gt[4]; + m_A6 += gt[5]; + m_A6 += gt[6]; + m_A5 += go[4]; + m_A4 += go[5]; + double RHS2 = Idr[4]; + RHS2 += Idr[5]; + RHS2 += Idr[6]; + RHS2 -= go[6] * *cnV[6]; + const double f0 = 1.0 / m_A0; + const double f0_2 = -f0 * m_A4; + m_A6 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_2 = -f1 * m_A5; + m_A6 += m_A3 * f1_2; + RHS2 += f1_2 * RHS1; + V[2] = RHS2 / m_A6; + double tmp1 = 0.0; + tmp1 += m_A3 * V[2]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[2]; V[0] = (RHS0 - tmp0) / m_A0; } @@ -44601,6 +46531,107 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// rebound,astrob +static void nl_gcr_13_double_double_a41a44bd5c424f88(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + m_A2 += gt[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A3 += go[3]; + double RHS1 = Idr[3]; + RHS1 += Idr[4]; + RHS1 += Idr[5]; + RHS1 -= go[4] * *cnV[4]; + RHS1 -= go[5] * *cnV[5]; + m_A4 += gt[6]; + m_A4 += gt[7]; + m_A4 += gt[8]; + m_A5 += go[6]; + double RHS2 = Idr[6]; + RHS2 += Idr[7]; + RHS2 += Idr[8]; + RHS2 -= go[7] * *cnV[7]; + RHS2 -= go[8] * *cnV[8]; + m_A6 += gt[9]; + m_A6 += gt[10]; + m_A6 += gt[11]; + m_A7 += go[9]; + double RHS3 = Idr[9]; + RHS3 += Idr[10]; + RHS3 += Idr[11]; + RHS3 -= go[10] * *cnV[10]; + RHS3 -= go[11] * *cnV[11]; + m_A12 += gt[12]; + m_A12 += gt[13]; + m_A12 += gt[14]; + m_A12 += gt[15]; + m_A12 += gt[16]; + m_A11 += go[12]; + m_A10 += go[13]; + m_A9 += go[14]; + m_A8 += go[15]; + double RHS4 = Idr[12]; + RHS4 += Idr[13]; + RHS4 += Idr[14]; + RHS4 += Idr[15]; + RHS4 += Idr[16]; + RHS4 -= go[16] * *cnV[16]; + const double f0 = 1.0 / m_A0; + const double f0_4 = -f0 * m_A8; + m_A12 += m_A1 * f0_4; + RHS4 += f0_4 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_4 = -f1 * m_A9; + m_A12 += m_A3 * f1_4; + RHS4 += f1_4 * RHS1; + const double f2 = 1.0 / m_A4; + const double f2_4 = -f2 * m_A10; + m_A12 += m_A5 * f2_4; + RHS4 += f2_4 * RHS2; + const double f3 = 1.0 / m_A6; + const double f3_4 = -f3 * m_A11; + m_A12 += m_A7 * f3_4; + RHS4 += f3_4 * RHS3; + V[4] = RHS4 / m_A12; + double tmp3 = 0.0; + tmp3 += m_A7 * V[4]; + V[3] = (RHS3 - tmp3) / m_A6; + double tmp2 = 0.0; + tmp2 += m_A5 * V[4]; + V[2] = (RHS2 - tmp2) / m_A4; + double tmp1 = 0.0; + tmp1 += m_A3 * V[4]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[4]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // rebound static void nl_gcr_28_double_double_8bec817b324dcc3(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -44831,6 +46862,63 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// rebound,speedfrk,fireone,astrob,cheekyms +static void nl_gcr_7_double_double_7c86a9bc1c6aef4c(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + m_A2 += gt[3]; + m_A2 += gt[4]; + m_A3 += go[3]; + double RHS1 = Idr[3]; + RHS1 += Idr[4]; + RHS1 -= go[4] * *cnV[4]; + m_A6 += gt[5]; + m_A6 += gt[6]; + m_A6 += gt[7]; + m_A6 += gt[8]; + m_A5 += go[5]; + m_A4 += go[6]; + double RHS2 = Idr[5]; + RHS2 += Idr[6]; + RHS2 += Idr[7]; + RHS2 += Idr[8]; + RHS2 -= go[7] * *cnV[7]; + RHS2 -= go[8] * *cnV[8]; + const double f0 = 1.0 / m_A0; + const double f0_2 = -f0 * m_A4; + m_A6 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_2 = -f1 * m_A5; + m_A6 += m_A3 * f1_2; + RHS2 += f1_2 * RHS1; + V[2] = RHS2 / m_A6; + double tmp1 = 0.0; + tmp1 += m_A3 * V[2]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[2]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // rebound static void nl_gcr_7_double_double_ae15f7f8a55fc96(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -48324,79 +50412,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// solarq,boxingb -static void nl_gcr_10_double_double_d7d45dc58b08cab9(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 -= go[1] * *cnV[1]; - m_A2 += gt[2]; - m_A2 += gt[3]; - m_A2 += gt[4]; - m_A2 += gt[5]; - m_A3 += go[2]; - double RHS1 = Idr[2]; - RHS1 += Idr[3]; - RHS1 += Idr[4]; - RHS1 += Idr[5]; - RHS1 -= go[3] * *cnV[3]; - RHS1 -= go[4] * *cnV[4]; - RHS1 -= go[5] * *cnV[5]; - m_A5 += gt[6]; - m_A5 += gt[7]; - m_A5 += gt[8]; - m_A6 += go[6]; - m_A4 += go[7]; - double RHS2 = Idr[6]; - RHS2 += Idr[7]; - RHS2 += Idr[8]; - RHS2 -= go[8] * *cnV[8]; - m_A9 += gt[9]; - m_A9 += gt[10]; - m_A7 += go[9]; - m_A8 += go[10]; - double RHS3 = Idr[9]; - RHS3 += Idr[10]; - const double f0 = 1.0 / m_A0; - const double f0_2 = -f0 * m_A4; - m_A5 += m_A1 * f0_2; - RHS2 += f0_2 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_3 = -f1 * m_A7; - m_A9 += m_A3 * f1_3; - RHS3 += f1_3 * RHS1; - const double f2 = 1.0 / m_A5; - const double f2_3 = -f2 * m_A8; - m_A9 += m_A6 * f2_3; - RHS3 += f2_3 * RHS2; - V[3] = RHS3 / m_A9; - double tmp2 = 0.0; - tmp2 += m_A6 * V[3]; - V[2] = (RHS2 - tmp2) / m_A5; - double tmp1 = 0.0; - tmp1 += m_A3 * V[3]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[2]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // solarq static void nl_gcr_15_double_double_7caaa135bff3d9f3(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -48660,6 +50675,198 @@ V[0] = (RHS0 - tmp0) / m_A0; } +// solarq,starcas,wotw +static void nl_gcr_25_double_double_4cb524006206eb1a(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) + +{ + + plib::unused_var(cnV); + double m_A0(0.0); + double m_A1(0.0); + double m_A2(0.0); + double m_A3(0.0); + double m_A4(0.0); + double m_A5(0.0); + double m_A6(0.0); + double m_A7(0.0); + double m_A8(0.0); + double m_A9(0.0); + double m_A10(0.0); + double m_A11(0.0); + double m_A12(0.0); + double m_A13(0.0); + double m_A14(0.0); + double m_A15(0.0); + double m_A16(0.0); + double m_A17(0.0); + double m_A18(0.0); + double m_A19(0.0); + double m_A20(0.0); + double m_A21(0.0); + double m_A22(0.0); + double m_A23(0.0); + double m_A24(0.0); + m_A0 += gt[0]; + m_A0 += gt[1]; + m_A0 += gt[2]; + m_A0 += gt[3]; + m_A1 += go[0]; + double RHS0 = Idr[0]; + RHS0 += Idr[1]; + RHS0 += Idr[2]; + RHS0 += Idr[3]; + RHS0 -= go[1] * *cnV[1]; + RHS0 -= go[2] * *cnV[2]; + RHS0 -= go[3] * *cnV[3]; + m_A2 += gt[4]; + m_A2 += gt[5]; + m_A2 += gt[6]; + m_A2 += gt[7]; + m_A2 += gt[8]; + m_A2 += gt[9]; + m_A2 += gt[10]; + m_A2 += gt[11]; + m_A5 += go[4]; + m_A4 += go[5]; + m_A4 += go[6]; + m_A3 += go[7]; + m_A3 += go[8]; + double RHS1 = Idr[4]; + RHS1 += Idr[5]; + RHS1 += Idr[6]; + RHS1 += Idr[7]; + RHS1 += Idr[8]; + RHS1 += Idr[9]; + RHS1 += Idr[10]; + RHS1 += Idr[11]; + RHS1 -= go[9] * *cnV[9]; + RHS1 -= go[10] * *cnV[10]; + RHS1 -= go[11] * *cnV[11]; + m_A6 += gt[12]; + m_A6 += gt[13]; + m_A7 += go[12]; + double RHS2 = Idr[12]; + RHS2 += Idr[13]; + RHS2 -= go[13] * *cnV[13]; + m_A10 += gt[14]; + m_A10 += gt[15]; + m_A10 += gt[16]; + m_A10 += gt[17]; + m_A10 += gt[18]; + m_A10 += gt[19]; + m_A9 += go[14]; + m_A9 += go[15]; + m_A8 += go[16]; + double RHS3 = Idr[14]; + RHS3 += Idr[15]; + RHS3 += Idr[16]; + RHS3 += Idr[17]; + RHS3 += Idr[18]; + RHS3 += Idr[19]; + RHS3 -= go[17] * *cnV[17]; + RHS3 -= go[18] * *cnV[18]; + RHS3 -= go[19] * *cnV[19]; + m_A15 += gt[20]; + m_A15 += gt[21]; + m_A15 += gt[22]; + m_A15 += gt[23]; + m_A15 += gt[24]; + m_A16 += go[20]; + m_A16 += go[21]; + m_A13 += go[22]; + m_A13 += go[23]; + double RHS4 = Idr[20]; + RHS4 += Idr[21]; + RHS4 += Idr[22]; + RHS4 += Idr[23]; + RHS4 += Idr[24]; + RHS4 -= go[24] * *cnV[24]; + m_A18 += gt[25]; + m_A18 += gt[26]; + m_A18 += gt[27]; + m_A19 += go[25]; + m_A17 += go[26]; + double RHS5 = Idr[25]; + RHS5 += Idr[26]; + RHS5 += Idr[27]; + RHS5 -= go[27] * *cnV[27]; + m_A24 += gt[28]; + m_A24 += gt[29]; + m_A24 += gt[30]; + m_A24 += gt[31]; + m_A23 += go[28]; + m_A22 += go[29]; + m_A22 += go[30]; + m_A20 += go[31]; + double RHS6 = Idr[28]; + RHS6 += Idr[29]; + RHS6 += Idr[30]; + RHS6 += Idr[31]; + const double f0 = 1.0 / m_A0; + const double f0_3 = -f0 * m_A8; + m_A10 += m_A1 * f0_3; + RHS3 += f0_3 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_3 = -f1 * m_A9; + m_A10 += m_A3 * f1_3; + m_A11 += m_A4 * f1_3; + m_A12 += m_A5 * f1_3; + RHS3 += f1_3 * RHS1; + const double f1_4 = -f1 * m_A13; + m_A14 += m_A3 * f1_4; + m_A15 += m_A4 * f1_4; + m_A16 += m_A5 * f1_4; + RHS4 += f1_4 * RHS1; + const double f1_6 = -f1 * m_A20; + m_A21 += m_A3 * f1_6; + m_A22 += m_A4 * f1_6; + m_A24 += m_A5 * f1_6; + RHS6 += f1_6 * RHS1; + const double f2 = 1.0 / m_A6; + const double f2_5 = -f2 * m_A17; + m_A18 += m_A7 * f2_5; + RHS5 += f2_5 * RHS2; + const double f3 = 1.0 / m_A10; + const double f3_4 = -f3 * m_A14; + m_A15 += m_A11 * f3_4; + m_A16 += m_A12 * f3_4; + RHS4 += f3_4 * RHS3; + const double f3_6 = -f3 * m_A21; + m_A22 += m_A11 * f3_6; + m_A24 += m_A12 * f3_6; + RHS6 += f3_6 * RHS3; + const double f4 = 1.0 / m_A15; + const double f4_6 = -f4 * m_A22; + m_A24 += m_A16 * f4_6; + RHS6 += f4_6 * RHS4; + const double f5 = 1.0 / m_A18; + const double f5_6 = -f5 * m_A23; + m_A24 += m_A19 * f5_6; + RHS6 += f5_6 * RHS5; + V[6] = RHS6 / m_A24; + double tmp5 = 0.0; + tmp5 += m_A19 * V[6]; + V[5] = (RHS5 - tmp5) / m_A18; + double tmp4 = 0.0; + tmp4 += m_A16 * V[6]; + V[4] = (RHS4 - tmp4) / m_A15; + double tmp3 = 0.0; + tmp3 += m_A11 * V[4]; + tmp3 += m_A12 * V[6]; + V[3] = (RHS3 - tmp3) / m_A10; + double tmp2 = 0.0; + tmp2 += m_A7 * V[5]; + V[2] = (RHS2 - tmp2) / m_A6; + double tmp1 = 0.0; + tmp1 += m_A3 * V[3]; + tmp1 += m_A4 * V[4]; + tmp1 += m_A5 * V[6]; + V[1] = (RHS1 - tmp1) / m_A2; + double tmp0 = 0.0; + tmp0 += m_A1 * V[3]; + V[0] = (RHS0 - tmp0) / m_A0; +} + // solarq static void nl_gcr_303_double_double_62612f71055b8fd4(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -62238,556 +64445,6 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// starcas,wotw,solarq,armora -static void nl_gcr_22_double_double_1250f340dea396ae(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - double m_A13(0.0); - double m_A14(0.0); - double m_A15(0.0); - double m_A16(0.0); - double m_A17(0.0); - double m_A18(0.0); - double m_A19(0.0); - double m_A20(0.0); - double m_A21(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A0 += gt[3]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 += Idr[3]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - RHS0 -= go[3] * *cnV[3]; - m_A2 += gt[4]; - m_A2 += gt[5]; - m_A3 += go[4]; - double RHS1 = Idr[4]; - RHS1 += Idr[5]; - RHS1 -= go[5] * *cnV[5]; - m_A4 += gt[6]; - m_A4 += gt[7]; - m_A4 += gt[8]; - m_A4 += gt[9]; - m_A4 += gt[10]; - m_A4 += gt[11]; - m_A4 += gt[12]; - m_A4 += gt[13]; - m_A7 += go[6]; - m_A6 += go[7]; - m_A6 += go[8]; - m_A5 += go[9]; - m_A5 += go[10]; - double RHS2 = Idr[6]; - RHS2 += Idr[7]; - RHS2 += Idr[8]; - RHS2 += Idr[9]; - RHS2 += Idr[10]; - RHS2 += Idr[11]; - RHS2 += Idr[12]; - RHS2 += Idr[13]; - RHS2 -= go[11] * *cnV[11]; - RHS2 -= go[12] * *cnV[12]; - RHS2 -= go[13] * *cnV[13]; - m_A10 += gt[14]; - m_A10 += gt[15]; - m_A10 += gt[16]; - m_A10 += gt[17]; - m_A10 += gt[18]; - m_A10 += gt[19]; - m_A9 += go[14]; - m_A9 += go[15]; - m_A8 += go[16]; - double RHS3 = Idr[14]; - RHS3 += Idr[15]; - RHS3 += Idr[16]; - RHS3 += Idr[17]; - RHS3 += Idr[18]; - RHS3 += Idr[19]; - RHS3 -= go[17] * *cnV[17]; - RHS3 -= go[18] * *cnV[18]; - RHS3 -= go[19] * *cnV[19]; - m_A15 += gt[20]; - m_A15 += gt[21]; - m_A15 += gt[22]; - m_A15 += gt[23]; - m_A15 += gt[24]; - m_A16 += go[20]; - m_A16 += go[21]; - m_A13 += go[22]; - m_A13 += go[23]; - double RHS4 = Idr[20]; - RHS4 += Idr[21]; - RHS4 += Idr[22]; - RHS4 += Idr[23]; - RHS4 += Idr[24]; - RHS4 -= go[24] * *cnV[24]; - m_A21 += gt[25]; - m_A21 += gt[26]; - m_A21 += gt[27]; - m_A21 += gt[28]; - m_A21 += gt[29]; - m_A20 += go[25]; - m_A20 += go[26]; - m_A18 += go[27]; - m_A17 += go[28]; - double RHS5 = Idr[25]; - RHS5 += Idr[26]; - RHS5 += Idr[27]; - RHS5 += Idr[28]; - RHS5 += Idr[29]; - RHS5 -= go[29] * *cnV[29]; - const double f0 = 1.0 / m_A0; - const double f0_3 = -f0 * m_A8; - m_A10 += m_A1 * f0_3; - RHS3 += f0_3 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_5 = -f1 * m_A17; - m_A21 += m_A3 * f1_5; - RHS5 += f1_5 * RHS1; - const double f2 = 1.0 / m_A4; - const double f2_3 = -f2 * m_A9; - m_A10 += m_A5 * f2_3; - m_A11 += m_A6 * f2_3; - m_A12 += m_A7 * f2_3; - RHS3 += f2_3 * RHS2; - const double f2_4 = -f2 * m_A13; - m_A14 += m_A5 * f2_4; - m_A15 += m_A6 * f2_4; - m_A16 += m_A7 * f2_4; - RHS4 += f2_4 * RHS2; - const double f2_5 = -f2 * m_A18; - m_A19 += m_A5 * f2_5; - m_A20 += m_A6 * f2_5; - m_A21 += m_A7 * f2_5; - RHS5 += f2_5 * RHS2; - const double f3 = 1.0 / m_A10; - const double f3_4 = -f3 * m_A14; - m_A15 += m_A11 * f3_4; - m_A16 += m_A12 * f3_4; - RHS4 += f3_4 * RHS3; - const double f3_5 = -f3 * m_A19; - m_A20 += m_A11 * f3_5; - m_A21 += m_A12 * f3_5; - RHS5 += f3_5 * RHS3; - const double f4 = 1.0 / m_A15; - const double f4_5 = -f4 * m_A20; - m_A21 += m_A16 * f4_5; - RHS5 += f4_5 * RHS4; - V[5] = RHS5 / m_A21; - double tmp4 = 0.0; - tmp4 += m_A16 * V[5]; - V[4] = (RHS4 - tmp4) / m_A15; - double tmp3 = 0.0; - tmp3 += m_A11 * V[4]; - tmp3 += m_A12 * V[5]; - V[3] = (RHS3 - tmp3) / m_A10; - double tmp2 = 0.0; - tmp2 += m_A5 * V[3]; - tmp2 += m_A6 * V[4]; - tmp2 += m_A7 * V[5]; - V[2] = (RHS2 - tmp2) / m_A4; - double tmp1 = 0.0; - tmp1 += m_A3 * V[5]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[3]; - V[0] = (RHS0 - tmp0) / m_A0; -} - -// starcas,wotw,boxingb -static void nl_gcr_23_double_double_ea2b6e3a05e6ef0b(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - double m_A13(0.0); - double m_A14(0.0); - double m_A15(0.0); - double m_A16(0.0); - double m_A17(0.0); - double m_A18(0.0); - double m_A19(0.0); - double m_A20(0.0); - double m_A21(0.0); - double m_A22(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A0 += gt[3]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 += Idr[3]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - RHS0 -= go[3] * *cnV[3]; - m_A2 += gt[4]; - m_A2 += gt[5]; - m_A2 += gt[6]; - m_A2 += gt[7]; - m_A2 += gt[8]; - m_A2 += gt[9]; - m_A4 += go[4]; - m_A3 += go[5]; - m_A3 += go[6]; - double RHS1 = Idr[4]; - RHS1 += Idr[5]; - RHS1 += Idr[6]; - RHS1 += Idr[7]; - RHS1 += Idr[8]; - RHS1 += Idr[9]; - RHS1 -= go[7] * *cnV[7]; - RHS1 -= go[8] * *cnV[8]; - RHS1 -= go[9] * *cnV[9]; - m_A5 += gt[10]; - m_A5 += gt[11]; - m_A5 += gt[12]; - m_A5 += gt[13]; - m_A7 += go[10]; - m_A6 += go[11]; - m_A6 += go[12]; - double RHS2 = Idr[10]; - RHS2 += Idr[11]; - RHS2 += Idr[12]; - RHS2 += Idr[13]; - RHS2 -= go[13] * *cnV[13]; - m_A8 += gt[14]; - m_A8 += gt[15]; - m_A9 += go[14]; - double RHS3 = Idr[14]; - RHS3 += Idr[15]; - RHS3 -= go[15] * *cnV[15]; - m_A12 += gt[16]; - m_A12 += gt[17]; - m_A12 += gt[18]; - m_A12 += gt[19]; - m_A12 += gt[20]; - m_A12 += gt[21]; - m_A11 += go[16]; - m_A11 += go[17]; - m_A10 += go[18]; - double RHS4 = Idr[16]; - RHS4 += Idr[17]; - RHS4 += Idr[18]; - RHS4 += Idr[19]; - RHS4 += Idr[20]; - RHS4 += Idr[21]; - RHS4 -= go[19] * *cnV[19]; - RHS4 -= go[20] * *cnV[20]; - RHS4 -= go[21] * *cnV[21]; - m_A17 += gt[22]; - m_A17 += gt[23]; - m_A17 += gt[24]; - m_A17 += gt[25]; - m_A17 += gt[26]; - m_A15 += go[22]; - m_A15 += go[23]; - m_A14 += go[24]; - double RHS5 = Idr[22]; - RHS5 += Idr[23]; - RHS5 += Idr[24]; - RHS5 += Idr[25]; - RHS5 += Idr[26]; - RHS5 -= go[25] * *cnV[25]; - RHS5 -= go[26] * *cnV[26]; - m_A22 += gt[27]; - m_A22 += gt[28]; - m_A22 += gt[29]; - m_A22 += gt[30]; - m_A22 += gt[31]; - m_A20 += go[27]; - m_A19 += go[28]; - double RHS6 = Idr[27]; - RHS6 += Idr[28]; - RHS6 += Idr[29]; - RHS6 += Idr[30]; - RHS6 += Idr[31]; - RHS6 -= go[29] * *cnV[29]; - RHS6 -= go[30] * *cnV[30]; - RHS6 -= go[31] * *cnV[31]; - const double f0 = 1.0 / m_A0; - const double f0_4 = -f0 * m_A10; - m_A12 += m_A1 * f0_4; - RHS4 += f0_4 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_4 = -f1 * m_A11; - m_A12 += m_A3 * f1_4; - m_A13 += m_A4 * f1_4; - RHS4 += f1_4 * RHS1; - const double f1_5 = -f1 * m_A14; - m_A16 += m_A3 * f1_5; - m_A17 += m_A4 * f1_5; - RHS5 += f1_5 * RHS1; - const double f2 = 1.0 / m_A5; - const double f2_5 = -f2 * m_A15; - m_A17 += m_A6 * f2_5; - m_A18 += m_A7 * f2_5; - RHS5 += f2_5 * RHS2; - const double f2_6 = -f2 * m_A19; - m_A21 += m_A6 * f2_6; - m_A22 += m_A7 * f2_6; - RHS6 += f2_6 * RHS2; - const double f3 = 1.0 / m_A8; - const double f3_6 = -f3 * m_A20; - m_A22 += m_A9 * f3_6; - RHS6 += f3_6 * RHS3; - const double f4 = 1.0 / m_A12; - const double f4_5 = -f4 * m_A16; - m_A17 += m_A13 * f4_5; - RHS5 += f4_5 * RHS4; - const double f5 = 1.0 / m_A17; - const double f5_6 = -f5 * m_A21; - m_A22 += m_A18 * f5_6; - RHS6 += f5_6 * RHS5; - V[6] = RHS6 / m_A22; - double tmp5 = 0.0; - tmp5 += m_A18 * V[6]; - V[5] = (RHS5 - tmp5) / m_A17; - double tmp4 = 0.0; - tmp4 += m_A13 * V[5]; - V[4] = (RHS4 - tmp4) / m_A12; - double tmp3 = 0.0; - tmp3 += m_A9 * V[6]; - V[3] = (RHS3 - tmp3) / m_A8; - double tmp2 = 0.0; - tmp2 += m_A6 * V[5]; - tmp2 += m_A7 * V[6]; - V[2] = (RHS2 - tmp2) / m_A5; - double tmp1 = 0.0; - tmp1 += m_A3 * V[4]; - tmp1 += m_A4 * V[5]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[4]; - V[0] = (RHS0 - tmp0) / m_A0; -} - -// starcas,wotw,solarq -static void nl_gcr_25_double_double_4cb524006206eb1a(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - double m_A13(0.0); - double m_A14(0.0); - double m_A15(0.0); - double m_A16(0.0); - double m_A17(0.0); - double m_A18(0.0); - double m_A19(0.0); - double m_A20(0.0); - double m_A21(0.0); - double m_A22(0.0); - double m_A23(0.0); - double m_A24(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A0 += gt[3]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 += Idr[3]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - RHS0 -= go[3] * *cnV[3]; - m_A2 += gt[4]; - m_A2 += gt[5]; - m_A2 += gt[6]; - m_A2 += gt[7]; - m_A2 += gt[8]; - m_A2 += gt[9]; - m_A2 += gt[10]; - m_A2 += gt[11]; - m_A5 += go[4]; - m_A4 += go[5]; - m_A4 += go[6]; - m_A3 += go[7]; - m_A3 += go[8]; - double RHS1 = Idr[4]; - RHS1 += Idr[5]; - RHS1 += Idr[6]; - RHS1 += Idr[7]; - RHS1 += Idr[8]; - RHS1 += Idr[9]; - RHS1 += Idr[10]; - RHS1 += Idr[11]; - RHS1 -= go[9] * *cnV[9]; - RHS1 -= go[10] * *cnV[10]; - RHS1 -= go[11] * *cnV[11]; - m_A6 += gt[12]; - m_A6 += gt[13]; - m_A7 += go[12]; - double RHS2 = Idr[12]; - RHS2 += Idr[13]; - RHS2 -= go[13] * *cnV[13]; - m_A10 += gt[14]; - m_A10 += gt[15]; - m_A10 += gt[16]; - m_A10 += gt[17]; - m_A10 += gt[18]; - m_A10 += gt[19]; - m_A9 += go[14]; - m_A9 += go[15]; - m_A8 += go[16]; - double RHS3 = Idr[14]; - RHS3 += Idr[15]; - RHS3 += Idr[16]; - RHS3 += Idr[17]; - RHS3 += Idr[18]; - RHS3 += Idr[19]; - RHS3 -= go[17] * *cnV[17]; - RHS3 -= go[18] * *cnV[18]; - RHS3 -= go[19] * *cnV[19]; - m_A15 += gt[20]; - m_A15 += gt[21]; - m_A15 += gt[22]; - m_A15 += gt[23]; - m_A15 += gt[24]; - m_A16 += go[20]; - m_A16 += go[21]; - m_A13 += go[22]; - m_A13 += go[23]; - double RHS4 = Idr[20]; - RHS4 += Idr[21]; - RHS4 += Idr[22]; - RHS4 += Idr[23]; - RHS4 += Idr[24]; - RHS4 -= go[24] * *cnV[24]; - m_A18 += gt[25]; - m_A18 += gt[26]; - m_A18 += gt[27]; - m_A19 += go[25]; - m_A17 += go[26]; - double RHS5 = Idr[25]; - RHS5 += Idr[26]; - RHS5 += Idr[27]; - RHS5 -= go[27] * *cnV[27]; - m_A24 += gt[28]; - m_A24 += gt[29]; - m_A24 += gt[30]; - m_A24 += gt[31]; - m_A23 += go[28]; - m_A22 += go[29]; - m_A22 += go[30]; - m_A20 += go[31]; - double RHS6 = Idr[28]; - RHS6 += Idr[29]; - RHS6 += Idr[30]; - RHS6 += Idr[31]; - const double f0 = 1.0 / m_A0; - const double f0_3 = -f0 * m_A8; - m_A10 += m_A1 * f0_3; - RHS3 += f0_3 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_3 = -f1 * m_A9; - m_A10 += m_A3 * f1_3; - m_A11 += m_A4 * f1_3; - m_A12 += m_A5 * f1_3; - RHS3 += f1_3 * RHS1; - const double f1_4 = -f1 * m_A13; - m_A14 += m_A3 * f1_4; - m_A15 += m_A4 * f1_4; - m_A16 += m_A5 * f1_4; - RHS4 += f1_4 * RHS1; - const double f1_6 = -f1 * m_A20; - m_A21 += m_A3 * f1_6; - m_A22 += m_A4 * f1_6; - m_A24 += m_A5 * f1_6; - RHS6 += f1_6 * RHS1; - const double f2 = 1.0 / m_A6; - const double f2_5 = -f2 * m_A17; - m_A18 += m_A7 * f2_5; - RHS5 += f2_5 * RHS2; - const double f3 = 1.0 / m_A10; - const double f3_4 = -f3 * m_A14; - m_A15 += m_A11 * f3_4; - m_A16 += m_A12 * f3_4; - RHS4 += f3_4 * RHS3; - const double f3_6 = -f3 * m_A21; - m_A22 += m_A11 * f3_6; - m_A24 += m_A12 * f3_6; - RHS6 += f3_6 * RHS3; - const double f4 = 1.0 / m_A15; - const double f4_6 = -f4 * m_A22; - m_A24 += m_A16 * f4_6; - RHS6 += f4_6 * RHS4; - const double f5 = 1.0 / m_A18; - const double f5_6 = -f5 * m_A23; - m_A24 += m_A19 * f5_6; - RHS6 += f5_6 * RHS5; - V[6] = RHS6 / m_A24; - double tmp5 = 0.0; - tmp5 += m_A19 * V[6]; - V[5] = (RHS5 - tmp5) / m_A18; - double tmp4 = 0.0; - tmp4 += m_A16 * V[6]; - V[4] = (RHS4 - tmp4) / m_A15; - double tmp3 = 0.0; - tmp3 += m_A11 * V[4]; - tmp3 += m_A12 * V[6]; - V[3] = (RHS3 - tmp3) / m_A10; - double tmp2 = 0.0; - tmp2 += m_A7 * V[5]; - V[2] = (RHS2 - tmp2) / m_A6; - double tmp1 = 0.0; - tmp1 += m_A3 * V[3]; - tmp1 += m_A4 * V[4]; - tmp1 += m_A5 * V[6]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[3]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // starcas,wotw static void nl_gcr_62_double_double_a582a424cb61c678(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -70535,8 +72192,8 @@ V[0] = (RHS0 - tmp0) / m_A0; } -// stuntcyc -static void nl_gcr_22_double_double_ca68d70bd8f2f62e(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) +// stuntcyc,brdrline +static void nl_gcr_7_double_double_59cb6bf7cb9d17dc(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) { @@ -70548,140 +72205,44 @@ double m_A4(0.0); double m_A5(0.0); double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - double m_A13(0.0); - double m_A14(0.0); - double m_A15(0.0); - double m_A16(0.0); - double m_A17(0.0); - double m_A18(0.0); - double m_A19(0.0); - double m_A20(0.0); - double m_A21(0.0); m_A0 += gt[0]; m_A0 += gt[1]; - m_A0 += gt[2]; - m_A0 += gt[3]; - m_A2 += go[0]; - m_A2 += go[1]; - m_A1 += go[2]; + m_A1 += go[0]; double RHS0 = Idr[0]; RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 += Idr[3]; - RHS0 -= go[3] * *cnV[3]; - m_A3 += gt[4]; - m_A3 += gt[5]; - m_A3 += gt[6]; - m_A3 += gt[7]; + RHS0 -= go[1] * *cnV[1]; + m_A2 += gt[2]; + m_A2 += gt[3]; + m_A3 += go[2]; + double RHS1 = Idr[2]; + RHS1 += Idr[3]; + RHS1 -= go[3] * *cnV[3]; + m_A6 += gt[4]; + m_A6 += gt[5]; + m_A6 += gt[6]; + m_A6 += gt[7]; m_A5 += go[4]; - m_A5 += go[5]; - m_A4 += go[6]; - double RHS1 = Idr[4]; - RHS1 += Idr[5]; - RHS1 += Idr[6]; - RHS1 += Idr[7]; - RHS1 -= go[7] * *cnV[7]; - m_A6 += gt[8]; - m_A6 += gt[9]; - m_A6 += gt[10]; - m_A7 += go[8]; - double RHS2 = Idr[8]; - RHS2 += Idr[9]; - RHS2 += Idr[10]; - RHS2 -= go[9] * *cnV[9]; - RHS2 -= go[10] * *cnV[10]; - m_A10 += gt[11]; - m_A10 += gt[12]; - m_A10 += gt[13]; - m_A12 += go[11]; - m_A9 += go[12]; - m_A8 += go[13]; - double RHS3 = Idr[11]; - RHS3 += Idr[12]; - RHS3 += Idr[13]; - m_A16 += gt[14]; - m_A16 += gt[15]; - m_A16 += gt[16]; - m_A16 += gt[17]; - m_A16 += gt[18]; - m_A17 += go[14]; - m_A14 += go[15]; - m_A14 += go[16]; - m_A13 += go[17]; - m_A13 += go[18]; - double RHS4 = Idr[14]; - RHS4 += Idr[15]; - RHS4 += Idr[16]; - RHS4 += Idr[17]; - RHS4 += Idr[18]; - m_A21 += gt[19]; - m_A21 += gt[20]; - m_A21 += gt[21]; - m_A18 += go[19]; - m_A20 += go[20]; - m_A19 += go[21]; - double RHS5 = Idr[19]; - RHS5 += Idr[20]; - RHS5 += Idr[21]; + m_A4 += go[5]; + double RHS2 = Idr[4]; + RHS2 += Idr[5]; + RHS2 += Idr[6]; + RHS2 += Idr[7]; + RHS2 -= go[6] * *cnV[6]; + RHS2 -= go[7] * *cnV[7]; const double f0 = 1.0 / m_A0; - const double f0_3 = -f0 * m_A8; - m_A10 += m_A1 * f0_3; - m_A11 += m_A2 * f0_3; - RHS3 += f0_3 * RHS0; - const double f0_4 = -f0 * m_A13; - m_A15 += m_A1 * f0_4; - m_A16 += m_A2 * f0_4; - RHS4 += f0_4 * RHS0; - const double f1 = 1.0 / m_A3; - const double f1_3 = -f1 * m_A9; - m_A10 += m_A4 * f1_3; - m_A11 += m_A5 * f1_3; - RHS3 += f1_3 * RHS1; - const double f1_4 = -f1 * m_A14; - m_A15 += m_A4 * f1_4; - m_A16 += m_A5 * f1_4; - RHS4 += f1_4 * RHS1; - const double f2 = 1.0 / m_A6; - const double f2_5 = -f2 * m_A18; - m_A21 += m_A7 * f2_5; - RHS5 += f2_5 * RHS2; - const double f3 = 1.0 / m_A10; - const double f3_4 = -f3 * m_A15; - m_A16 += m_A11 * f3_4; - m_A17 += m_A12 * f3_4; - RHS4 += f3_4 * RHS3; - const double f3_5 = -f3 * m_A19; - m_A20 += m_A11 * f3_5; - m_A21 += m_A12 * f3_5; - RHS5 += f3_5 * RHS3; - const double f4 = 1.0 / m_A16; - const double f4_5 = -f4 * m_A20; - m_A21 += m_A17 * f4_5; - RHS5 += f4_5 * RHS4; - V[5] = RHS5 / m_A21; - double tmp4 = 0.0; - tmp4 += m_A17 * V[5]; - V[4] = (RHS4 - tmp4) / m_A16; - double tmp3 = 0.0; - tmp3 += m_A11 * V[4]; - tmp3 += m_A12 * V[5]; - V[3] = (RHS3 - tmp3) / m_A10; - double tmp2 = 0.0; - tmp2 += m_A7 * V[5]; - V[2] = (RHS2 - tmp2) / m_A6; + const double f0_2 = -f0 * m_A4; + m_A6 += m_A1 * f0_2; + RHS2 += f0_2 * RHS0; + const double f1 = 1.0 / m_A2; + const double f1_2 = -f1 * m_A5; + m_A6 += m_A3 * f1_2; + RHS2 += f1_2 * RHS1; + V[2] = RHS2 / m_A6; double tmp1 = 0.0; - tmp1 += m_A4 * V[3]; - tmp1 += m_A5 * V[4]; - V[1] = (RHS1 - tmp1) / m_A3; + tmp1 += m_A3 * V[2]; + V[1] = (RHS1 - tmp1) / m_A2; double tmp0 = 0.0; - tmp0 += m_A1 * V[3]; - tmp0 += m_A2 * V[4]; + tmp0 += m_A1 * V[2]; V[0] = (RHS0 - tmp0) / m_A0; } @@ -81845,6 +83406,8 @@ {"nl_gcr_57_double_double_bb501e6a23177009", reinterpret_cast(&nl_gcr_57_double_double_bb501e6a23177009)}, // NOLINT // 280zzzap {"nl_gcr_95_double_double_24643c159711f292", reinterpret_cast(&nl_gcr_95_double_double_24643c159711f292)}, // NOLINT +// armora,solarq,starcas,wotw + {"nl_gcr_22_double_double_1250f340dea396ae", reinterpret_cast(&nl_gcr_22_double_double_1250f340dea396ae)}, // NOLINT // armora {"nl_gcr_22_double_double_a6cfda6668b153c2", reinterpret_cast(&nl_gcr_22_double_double_a6cfda6668b153c2)}, // NOLINT // armora,boxingb @@ -81855,8 +83418,6 @@ {"nl_gcr_58_double_double_64e460d8f716cd89", reinterpret_cast(&nl_gcr_58_double_double_64e460d8f716cd89)}, // NOLINT // armora {"nl_gcr_67_double_double_ee2cacaa15d32491", reinterpret_cast(&nl_gcr_67_double_double_ee2cacaa15d32491)}, // NOLINT -// astrob,rebound - {"nl_gcr_13_double_double_a41a44bd5c424f88", reinterpret_cast(&nl_gcr_13_double_double_a41a44bd5c424f88)}, // NOLINT // astrob {"nl_gcr_154_double_double_13833bf8c127deaa", reinterpret_cast(&nl_gcr_154_double_double_13833bf8c127deaa)}, // NOLINT // astrob @@ -81887,6 +83448,8 @@ {"nl_gcr_31_double_double_79e756c5892cf87d", reinterpret_cast(&nl_gcr_31_double_double_79e756c5892cf87d)}, // NOLINT // barrier,spacewar {"nl_gcr_47_double_double_6ef39a62161d596c", reinterpret_cast(&nl_gcr_47_double_double_6ef39a62161d596c)}, // NOLINT +// boxingb,solarq + {"nl_gcr_10_double_double_d7d45dc58b08cab9", reinterpret_cast(&nl_gcr_10_double_double_d7d45dc58b08cab9)}, // NOLINT // boxingb {"nl_gcr_16_double_double_50f5194a994d56ec", reinterpret_cast(&nl_gcr_16_double_double_50f5194a994d56ec)}, // NOLINT // boxingb @@ -81895,6 +83458,8 @@ {"nl_gcr_22_double_double_a6b734322b3ea924", reinterpret_cast(&nl_gcr_22_double_double_a6b734322b3ea924)}, // NOLINT // boxingb {"nl_gcr_23_double_double_53e1117fdb16f546", reinterpret_cast(&nl_gcr_23_double_double_53e1117fdb16f546)}, // NOLINT +// boxingb,starcas,wotw + {"nl_gcr_23_double_double_ea2b6e3a05e6ef0b", reinterpret_cast(&nl_gcr_23_double_double_ea2b6e3a05e6ef0b)}, // NOLINT // boxingb {"nl_gcr_23_double_double_f43cf2a28a5a5561", reinterpret_cast(&nl_gcr_23_double_double_f43cf2a28a5a5561)}, // NOLINT // boxingb @@ -81925,8 +83490,6 @@ {"nl_gcr_75_double_double_75400df5d559a266", reinterpret_cast(&nl_gcr_75_double_double_75400df5d559a266)}, // NOLINT // brdrline {"nl_gcr_77_double_double_437326911721091", reinterpret_cast(&nl_gcr_77_double_double_437326911721091)}, // NOLINT -// brdrline,stuntcyc - {"nl_gcr_7_double_double_59cb6bf7cb9d17dc", reinterpret_cast(&nl_gcr_7_double_double_59cb6bf7cb9d17dc)}, // NOLINT // brdrline {"nl_gcr_83_double_double_f99b1245e708ec85", reinterpret_cast(&nl_gcr_83_double_double_f99b1245e708ec85)}, // NOLINT // brdrline @@ -81965,6 +83528,10 @@ {"nl_gcr_16_double_double_8c0f7f2284333de5", reinterpret_cast(&nl_gcr_16_double_double_8c0f7f2284333de5)}, // NOLINT // destroyr {"nl_gcr_399_double_double_4334c95878d1be92", reinterpret_cast(&nl_gcr_399_double_double_4334c95878d1be92)}, // NOLINT +// dribling + {"nl_gcr_257_double_double_5dc652d6668315af", reinterpret_cast(&nl_gcr_257_double_double_5dc652d6668315af)}, // NOLINT +// dribling + {"nl_gcr_7_double_double_a1ecff4d37b54b76", reinterpret_cast(&nl_gcr_7_double_double_a1ecff4d37b54b76)}, // NOLINT // elim,zektor {"nl_gcr_10_double_double_11c2ae166b240b6e", reinterpret_cast(&nl_gcr_10_double_double_11c2ae166b240b6e)}, // NOLINT // elim,zektor @@ -81989,8 +83556,6 @@ {"nl_gcr_36_double_double_e76692c10e79997e", reinterpret_cast(&nl_gcr_36_double_double_e76692c10e79997e)}, // NOLINT // elim,zektor {"nl_gcr_45_double_double_28b736fe552777a9", reinterpret_cast(&nl_gcr_45_double_double_28b736fe552777a9)}, // NOLINT -// elim,zektor - {"nl_gcr_7_double_double_d190a0e3b8e1f4a7", reinterpret_cast(&nl_gcr_7_double_double_d190a0e3b8e1f4a7)}, // NOLINT // fireone {"nl_gcr_128_double_double_7aee4423e3fdbfda", reinterpret_cast(&nl_gcr_128_double_double_7aee4423e3fdbfda)}, // NOLINT // fireone @@ -82009,8 +83574,6 @@ {"nl_gcr_73_double_double_643133e86b2b1628", reinterpret_cast(&nl_gcr_73_double_double_643133e86b2b1628)}, // NOLINT // fireone {"nl_gcr_79_double_double_c1d22fe6e895255d", reinterpret_cast(&nl_gcr_79_double_double_c1d22fe6e895255d)}, // NOLINT -// fireone,astrob,rebound,speedfrk,cheekyms - {"nl_gcr_7_double_double_7c86a9bc1c6aef4c", reinterpret_cast(&nl_gcr_7_double_double_7c86a9bc1c6aef4c)}, // NOLINT // fireone {"nl_gcr_7_double_double_e7fb484f621b3ab9", reinterpret_cast(&nl_gcr_7_double_double_e7fb484f621b3ab9)}, // NOLINT // fireone @@ -82043,8 +83606,14 @@ {"nl_gcr_10_double_double_934712b55bb3b2b2", reinterpret_cast(&nl_gcr_10_double_double_934712b55bb3b2b2)}, // NOLINT // gamemachine {"nl_gcr_7_double_double_782d79b5cbe953b1", reinterpret_cast(&nl_gcr_7_double_double_782d79b5cbe953b1)}, // NOLINT +// gi6809 + {"nl_gcr_13_double_double_9eda6de0d275a3e5", reinterpret_cast(&nl_gcr_13_double_double_9eda6de0d275a3e5)}, // NOLINT +// gi6809 + {"nl_gcr_7_double_double_8a409a18e77784cb", reinterpret_cast(&nl_gcr_7_double_double_8a409a18e77784cb)}, // NOLINT // gtrak10 - {"nl_gcr_43_double_double_4c46fdf7c0037727", reinterpret_cast(&nl_gcr_43_double_double_4c46fdf7c0037727)}, // NOLINT + {"nl_gcr_22_double_double_1f38df4919cdddae", reinterpret_cast(&nl_gcr_22_double_double_1f38df4919cdddae)}, // NOLINT +// gtrak10,elim,zektor + {"nl_gcr_7_double_double_d190a0e3b8e1f4a7", reinterpret_cast(&nl_gcr_7_double_double_d190a0e3b8e1f4a7)}, // NOLINT // gunfight {"nl_gcr_112_double_double_743595e64cee0a5e", reinterpret_cast(&nl_gcr_112_double_double_743595e64cee0a5e)}, // NOLINT // gunfight @@ -82081,8 +83650,12 @@ {"nl_gcr_7_double_double_e51b463cd890ef6d", reinterpret_cast(&nl_gcr_7_double_double_e51b463cd890ef6d)}, // NOLINT // popeye {"nl_gcr_50_double_double_c6f25bb06e161d1c", reinterpret_cast(&nl_gcr_50_double_double_c6f25bb06e161d1c)}, // NOLINT +// rebound,astrob + {"nl_gcr_13_double_double_a41a44bd5c424f88", reinterpret_cast(&nl_gcr_13_double_double_a41a44bd5c424f88)}, // NOLINT // rebound {"nl_gcr_28_double_double_8bec817b324dcc3", reinterpret_cast(&nl_gcr_28_double_double_8bec817b324dcc3)}, // NOLINT +// rebound,speedfrk,fireone,astrob,cheekyms + {"nl_gcr_7_double_double_7c86a9bc1c6aef4c", reinterpret_cast(&nl_gcr_7_double_double_7c86a9bc1c6aef4c)}, // NOLINT // rebound {"nl_gcr_7_double_double_ae15f7f8a55fc96", reinterpret_cast(&nl_gcr_7_double_double_ae15f7f8a55fc96)}, // NOLINT // ripoff,sundance @@ -82113,12 +83686,12 @@ {"nl_gcr_84_double_double_c61e08cf5e35918", reinterpret_cast(&nl_gcr_84_double_double_c61e08cf5e35918)}, // NOLINT // sfxphasor {"nl_gcr_40_double_double_53bd9f9a45276ed0", reinterpret_cast(&nl_gcr_40_double_double_53bd9f9a45276ed0)}, // NOLINT -// solarq,boxingb - {"nl_gcr_10_double_double_d7d45dc58b08cab9", reinterpret_cast(&nl_gcr_10_double_double_d7d45dc58b08cab9)}, // NOLINT // solarq {"nl_gcr_15_double_double_7caaa135bff3d9f3", reinterpret_cast(&nl_gcr_15_double_double_7caaa135bff3d9f3)}, // NOLINT // solarq {"nl_gcr_20_double_double_66496d6073aca98e", reinterpret_cast(&nl_gcr_20_double_double_66496d6073aca98e)}, // NOLINT +// solarq,starcas,wotw + {"nl_gcr_25_double_double_4cb524006206eb1a", reinterpret_cast(&nl_gcr_25_double_double_4cb524006206eb1a)}, // NOLINT // solarq {"nl_gcr_303_double_double_62612f71055b8fd4", reinterpret_cast(&nl_gcr_303_double_double_62612f71055b8fd4)}, // NOLINT // solarq @@ -82171,12 +83744,6 @@ {"nl_gcr_109_double_double_5d550fc7441617a2", reinterpret_cast(&nl_gcr_109_double_double_5d550fc7441617a2)}, // NOLINT // starcas,wotw {"nl_gcr_12_double_double_88a8ef5f6bd43d48", reinterpret_cast(&nl_gcr_12_double_double_88a8ef5f6bd43d48)}, // NOLINT -// starcas,wotw,solarq,armora - {"nl_gcr_22_double_double_1250f340dea396ae", reinterpret_cast(&nl_gcr_22_double_double_1250f340dea396ae)}, // NOLINT -// starcas,wotw,boxingb - {"nl_gcr_23_double_double_ea2b6e3a05e6ef0b", reinterpret_cast(&nl_gcr_23_double_double_ea2b6e3a05e6ef0b)}, // NOLINT -// starcas,wotw,solarq - {"nl_gcr_25_double_double_4cb524006206eb1a", reinterpret_cast(&nl_gcr_25_double_double_4cb524006206eb1a)}, // NOLINT // starcas,wotw {"nl_gcr_62_double_double_a582a424cb61c678", reinterpret_cast(&nl_gcr_62_double_double_a582a424cb61c678)}, // NOLINT // starcas,wotw @@ -82215,8 +83782,8 @@ {"nl_gcr_10_double_double_85652d3e3ada285a", reinterpret_cast(&nl_gcr_10_double_double_85652d3e3ada285a)}, // NOLINT // stuntcyc {"nl_gcr_20_double_double_c924fe5960b1479e", reinterpret_cast(&nl_gcr_20_double_double_c924fe5960b1479e)}, // NOLINT -// stuntcyc - {"nl_gcr_22_double_double_ca68d70bd8f2f62e", reinterpret_cast(&nl_gcr_22_double_double_ca68d70bd8f2f62e)}, // NOLINT +// stuntcyc,brdrline + {"nl_gcr_7_double_double_59cb6bf7cb9d17dc", reinterpret_cast(&nl_gcr_7_double_double_59cb6bf7cb9d17dc)}, // NOLINT // sundance {"nl_gcr_100_double_double_e02a162cb515a958", reinterpret_cast(&nl_gcr_100_double_double_e02a162cb515a958)}, // NOLINT // sundance,warrior diff -Nru mame-0.263+dfsg.1/src/lib/netlist/nl_create_mame_solvers.sh mame-0.264+dfsg.1/src/lib/netlist/nl_create_mame_solvers.sh --- mame-0.263+dfsg.1/src/lib/netlist/nl_create_mame_solvers.sh 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/netlist/nl_create_mame_solvers.sh 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ #--dir src/lib/netlist/generated/static --static-include -if ${NLTOOL} --cmd static --output=${GENERATED}.tmp --include=src/mame/audio ${FILES} ; then +if ${NLTOOL} --cmd static --output=${GENERATED}.tmp --include=src/mame/shared ${FILES} ; then mv -f ${GENERATED}.tmp ${GENERATED} echo Created ${GENERATED} file else diff -Nru mame-0.263+dfsg.1/src/lib/util/cdrom.cpp mame-0.264+dfsg.1/src/lib/util/cdrom.cpp --- mame-0.263+dfsg.1/src/lib/util/cdrom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/cdrom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -25,6 +25,7 @@ #include #include +#include /*************************************************************************** @@ -191,7 +192,7 @@ logofs += track.frames; if (EXTRA_VERBOSE) - printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d logframes %d\n", i+1, + printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d logframes %d pad %d\n", i+1, track.trktype, track.subtype, track.datasize, @@ -205,7 +206,8 @@ track.logframeofs, track.physframeofs, track.chdframeofs, - track.logframes); + track.logframes, + track.padframes); } // fill out dummy entries for the last track to help our search @@ -288,7 +290,7 @@ logofs += track.frames; if (EXTRA_VERBOSE) - printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d logframes %d\n", i+1, + printf("Track %02d is format %d subtype %d datasize %d subsize %d frames %d extraframes %d pregap %d pgmode %d presize %d postgap %d logofs %d physofs %d chdofs %d logframes %d pad %d\n", i+1, track.trktype, track.subtype, track.datasize, @@ -302,7 +304,8 @@ track.logframeofs, track.physframeofs, track.chdframeofs, - track.logframes); + track.logframes, + track.padframes); } // fill out dummy entries for the last track to help our search @@ -400,11 +403,11 @@ if (EXTRA_VERBOSE) printf("Reading %u bytes from sector %d from track %d at offset %lu\n", (unsigned)length, chdsector, tracknum + 1, (unsigned long)sourcefileoffset); - size_t actual; result = srcfile.seek(sourcefileoffset, SEEK_SET); + size_t actual; if (!result) - result = srcfile.read(dest, length, actual); - // FIXME: if (actual < length) report error + std::tie(result, actual) = read(srcfile, dest, length); + // FIXME: if (!result && (actual < length)) report error needswap = cdtrack_info.track[tracknum].swap; } @@ -414,7 +417,8 @@ uint8_t *buffer = (uint8_t *)dest - startoffs; for (int swapindex = startoffs; swapindex < 2352; swapindex += 2 ) { - std::swap(buffer[ swapindex ], buffer[ swapindex + 1 ]); + using std::swap; + swap(buffer[ swapindex ], buffer[ swapindex + 1 ]); } } return result; @@ -1410,14 +1414,14 @@ * * @brief A macro that defines tokenize. * - * @param linebuffer The linebuffer. - * @param i Zero-based index of the. - * @param sizeof(linebuffer) The sizeof(linebuffer) - * @param token The token. - * @param sizeof(token) The sizeof(token) + * @param linebuffer The linebuffer. + * @param i Zero-based index of the. + * @param std::size(linebuffer) The std::size(linebuffer) + * @param token The token. + * @param std::size(token) The std::size(token) */ -#define TOKENIZE i = tokenize( linebuffer, i, sizeof(linebuffer), token, sizeof(token) ); +#define TOKENIZE i = tokenize( linebuffer, i, std::size(linebuffer), token, std::size(token) ); /*************************************************************************** @@ -1491,17 +1495,17 @@ int cdrom_file::tokenize( const char *linebuffer, int i, int linebuffersize, char *token, int tokensize ) { int j = 0; - int singlequote = 0; - int doublequote = 0; + bool singlequote = false; + bool doublequote = false; while ((i < linebuffersize) && isspace((uint8_t)linebuffer[i])) { i++; } - while ((i < linebuffersize) && (j < tokensize)) + while ((i < linebuffersize) && (j < tokensize) && (linebuffer[i] != '\0')) { - if (!singlequote && linebuffer[i] == '"' ) + if (!singlequote && linebuffer[i] == '"') { doublequote = !doublequote; } @@ -2092,6 +2096,8 @@ outtoc.flags = CD_FLAG_GDROM; char linebuffer[512]; + memset(linebuffer, 0, sizeof(linebuffer)); + fgets(linebuffer,511,infile); numtracks=atoi(linebuffer); @@ -2187,7 +2193,7 @@ } /*------------------------------------------------- - parse_cue - parse a CDRWin format CUE file + parse_cue - parse a .CUE file -------------------------------------------------*/ /** @@ -2200,15 +2206,21 @@ * @param [in,out] outinfo The outinfo. * * @return A std::error_condition. + * + * Redump multi-CUE for Dreamcast GDI: + * Dreamcast discs have two images on a single disc. The first image is SINGLE-DENSITY and the second image + * is HIGH-DENSITY. The SINGLE-DENSITY area starts 0 LBA and HIGH-DENSITY area starts 45000 LBA. */ std::error_condition cdrom_file::parse_cue(std::string_view tocfname, toc &outtoc, track_input_info &outinfo) { int i, trknum; - static char token[512]; + char token[512]; std::string lastfname; uint32_t wavlen, wavoffs; std::string path = std::string(tocfname); + const bool is_gdrom = is_gdicue(tocfname); + enum gdi_area current_area = SINGLE_DENSITY; FILE *infile = fopen(path.c_str(), "rt"); if (!infile) @@ -2225,11 +2237,19 @@ trknum = -1; wavoffs = wavlen = 0; + if (is_gdrom) + { + outtoc.flags = CD_FLAG_GDROM; + } + char linebuffer[512]; + memset(linebuffer, 0, sizeof(linebuffer)); + while (!feof(infile)) { /* get the next line */ - fgets(linebuffer, 511, infile); + if (!fgets(linebuffer, 511, infile)) + break; /* if EOF didn't hit, keep going */ if (!feof(infile)) @@ -2238,7 +2258,26 @@ TOKENIZE - if (!strcmp(token, "FILE")) + if (!strcmp(token, "REM")) + { + /* TODO: sessions are notated using REM commands: "REM SESSION 01" */ + + /* skip to actual data of REM command */ + while (i < std::size(linebuffer) && isspace((uint8_t)linebuffer[i])) + i++; + + if (is_gdrom && !strncmp(linebuffer+i, "SINGLE-DENSITY AREA", 19)) + { + /* single-density area starts LBA = 0 */ + current_area = SINGLE_DENSITY; + } + else if (is_gdrom && !strncmp(linebuffer+i, "HIGH-DENSITY AREA", 17)) + { + /* high-density area starts LBA = 45000 */ + current_area = HIGH_DENSITY; + } + } + else if (!strcmp(token, "FILE")) { /* found the data file for a track */ TOKENIZE @@ -2283,30 +2322,37 @@ /* next token on the line is the track type */ TOKENIZE - if (wavlen != 0) - { - outtoc.tracks[trknum].trktype = CD_TRACK_AUDIO; - outtoc.tracks[trknum].frames = wavlen/2352; - outinfo.track[trknum].offset = wavoffs; - wavoffs = wavlen = 0; - } - else - { - outtoc.tracks[trknum].trktype = CD_TRACK_MODE1; - outtoc.tracks[trknum].datasize = 0; - outinfo.track[trknum].offset = 0; - } outtoc.tracks[trknum].subtype = CD_SUB_NONE; outtoc.tracks[trknum].subsize = 0; outtoc.tracks[trknum].pgsub = CD_SUB_NONE; outtoc.tracks[trknum].pregap = 0; outtoc.tracks[trknum].padframes = 0; + outtoc.tracks[trknum].datasize = 0; + outtoc.tracks[trknum].multicuearea = is_gdrom ? current_area : 0; outinfo.track[trknum].idx0offs = -1; outinfo.track[trknum].idx1offs = 0; + outinfo.track[trknum].offset = 0; + + if (wavlen != 0) + { + outtoc.tracks[trknum].frames = wavlen/2352; + outinfo.track[trknum].offset = wavoffs; + wavoffs = wavlen = 0; + } outinfo.track[trknum].fname.assign(lastfname); // default filename to the last one -// printf("trk %d: fname %s offset %d\n", trknum, outinfo.track[trknum].fname.c_str(), outinfo.track[trknum].offset); + if (EXTRA_VERBOSE) + { + if (is_gdrom) + { + printf("trk %d: fname %s offset %d area %d\n", trknum, outinfo.track[trknum].fname.c_str(), outinfo.track[trknum].offset, outtoc.tracks[trknum].multicuearea); + } + else + { + printf("trk %d: fname %s offset %d\n", trknum, outinfo.track[trknum].fname.c_str(), outinfo.track[trknum].offset); + } + } convert_type_string_to_track_info(token, &outtoc.tracks[trknum]); if (outtoc.tracks[trknum].datasize == 0) @@ -2344,28 +2390,7 @@ { outtoc.tracks[trknum].pregap = frames - outinfo.track[trknum].idx0offs; outtoc.tracks[trknum].pgtype = outtoc.tracks[trknum].trktype; - switch (outtoc.tracks[trknum].pgtype) - { - case CD_TRACK_MODE1: - case CD_TRACK_MODE2_FORM1: - outtoc.tracks[trknum].pgdatasize = 2048; - break; - - case CD_TRACK_MODE1_RAW: - case CD_TRACK_MODE2_RAW: - case CD_TRACK_AUDIO: - outtoc.tracks[trknum].pgdatasize = 2352; - break; - - case CD_TRACK_MODE2: - case CD_TRACK_MODE2_FORM_MIX: - outtoc.tracks[trknum].pgdatasize = 2336; - break; - - case CD_TRACK_MODE2_FORM2: - outtoc.tracks[trknum].pgdatasize = 2324; - break; - } + outtoc.tracks[trknum].pgdatasize = outtoc.tracks[trknum].datasize; } else // pregap sectors not in file, but we're always using idx0ofs for track length calc now { @@ -2480,9 +2505,67 @@ } } } - //printf("trk %d: %d frames @ offset %d\n", trknum+1, outtoc.tracks[trknum].frames, outinfo.track[trknum].offset); } + if (is_gdrom) + { + /* + * Strip pregaps from Redump tracks and adjust the LBA offset to match TOSEC layout + */ + for (trknum = 1; trknum < outtoc.numtrks; trknum++) + { + uint32_t this_pregap = outtoc.tracks[trknum].pregap; + uint32_t this_offset = this_pregap * (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize); + + outtoc.tracks[trknum-1].frames += this_pregap; + outtoc.tracks[trknum-1].splitframes += this_pregap; + + outinfo.track[trknum].offset += this_offset; + outtoc.tracks[trknum].frames -= this_pregap; + outinfo.track[trknum].idx1offs -= this_pregap; + + outtoc.tracks[trknum].pregap = 0; + outtoc.tracks[trknum].pgtype = 0; + } + + /* + * TOC now matches TOSEC layout, set LBA for every track with HIGH-DENSITY area @ LBA 45000 + */ + for (trknum = 1; trknum < outtoc.numtrks; trknum++) + { + if (outtoc.tracks[trknum].multicuearea == HIGH_DENSITY && outtoc.tracks[trknum-1].multicuearea == SINGLE_DENSITY) + { + outtoc.tracks[trknum].physframeofs = 45000; + int dif=outtoc.tracks[trknum].physframeofs-(outtoc.tracks[trknum-1].frames+outtoc.tracks[trknum-1].physframeofs); + outtoc.tracks[trknum-1].frames += dif; + outtoc.tracks[trknum-1].padframes = dif; + } + else + { + outtoc.tracks[trknum].physframeofs = outtoc.tracks[trknum-1].physframeofs + outtoc.tracks[trknum-1].frames; + } + } + } + + if (EXTRA_VERBOSE) + for (trknum = 0; trknum < outtoc.numtrks; trknum++) + { + printf("trk %d: %d frames @ offset %d, pad=%d, split=%d, area=%d, phys=%d, pregap=%d, pgtype=%d, pgdatasize=%d, idx0=%d, idx1=%d, dataframes=%d\n", + trknum+1, + outtoc.tracks[trknum].frames, + outinfo.track[trknum].offset, + outtoc.tracks[trknum].padframes, + outtoc.tracks[trknum].splitframes, + outtoc.tracks[trknum].multicuearea, + outtoc.tracks[trknum].physframeofs, + outtoc.tracks[trknum].pregap, + outtoc.tracks[trknum].pgtype, + outtoc.tracks[trknum].pgdatasize, + outinfo.track[trknum].idx0offs, + outinfo.track[trknum].idx1offs, + outtoc.tracks[trknum].frames - outtoc.tracks[trknum].padframes); + } + return std::error_condition(); } @@ -2504,6 +2587,7 @@ bool cdrom_file::is_gdicue(std::string_view tocfname) { + char token[512]; bool has_rem_singledensity = false; bool has_rem_highdensity = false; std::string path = std::string(tocfname); @@ -2517,428 +2601,37 @@ path = get_file_path(path); char linebuffer[512]; - while (!feof(infile)) - { - fgets(linebuffer, 511, infile); + memset(linebuffer, 0, sizeof(linebuffer)); - /* if EOF didn't hit, keep going */ - if (!feof(infile)) - { - has_rem_singledensity = has_rem_singledensity || !strncmp(linebuffer, "REM SINGLE-DENSITY AREA", 23); - has_rem_highdensity = has_rem_highdensity || !strncmp(linebuffer, "REM HIGH-DENSITY AREA", 21); - } - } - - fclose(infile); - - return has_rem_singledensity && has_rem_highdensity; -} - -/*----------------------------------------------------------------- - parse_gdicue - parse a Redump multi-CUE for Dreamcast GDI -------------------------------------------------------------------*/ - -/** - * @fn std::error_condition parse_gdicue(std::string_view tocfname, toc &outtoc, track_input_info &outinfo) - * - * @brief Chdcd parse cue. - * - * @param tocfname The tocfname. - * @param [in,out] outtoc The outtoc. - * @param [in,out] outinfo The outinfo. - * - * @return A std::error_condition. - * - * Dreamcast discs have two images on a single disc. The first image is SINGLE-DENSITY and the second image - * is HIGH-DENSITY. The SINGLE-DENSITY area starts 0 LBA and HIGH-DENSITY area starts 45000 LBA. - * - * There are three Dreamcast disc patterns. - * - * Pattern I - (SD) DATA + AUDIO, (HD) DATA - * Pattern II - (SD) DATA + AUDIO, (HD) DATA + ... + AUDIO - * Pattern III - (SD) DATA + AUDIO, (HD) DATA + ... + DATA - * - * TOSEC layout is preferred and this code adjusts the TOC and INFO generated by a Redump .cue to match the - * layout from a TOSEC .gdi. - */ - -std::error_condition cdrom_file::parse_gdicue(std::string_view tocfname, toc &outtoc, track_input_info &outinfo) -{ - int i, trknum; - static char token[512]; - std::string lastfname; - uint32_t wavlen, wavoffs; - std::string path = std::string(tocfname); - enum gdi_area current_area = SINGLE_DENSITY; - enum gdi_pattern disc_pattern = TYPE_UNKNOWN; - - FILE *infile = fopen(path.c_str(), "rt"); - if (!infile) - { - return std::error_condition(errno, std::generic_category()); - } - - path = get_file_path(path); - - /* clear structures */ - memset(&outtoc, 0, sizeof(outtoc)); - outinfo.reset(); - - trknum = -1; - wavoffs = wavlen = 0; - - outtoc.flags = CD_FLAG_GDROM; - - char linebuffer[512]; while (!feof(infile)) { - /* get the next line */ - fgets(linebuffer, 511, infile); + if (!fgets(linebuffer, 511, infile)) + break; /* if EOF didn't hit, keep going */ if (!feof(infile)) { - /* single-density area starts LBA = 0 */ - if (!strncmp(linebuffer, "REM SINGLE-DENSITY AREA", 23)) - { - current_area = SINGLE_DENSITY; - continue; - } - - /* high-density area starts LBA = 45000 */ - if (!strncmp(linebuffer, "REM HIGH-DENSITY AREA", 21)) - { - current_area = HIGH_DENSITY; - continue; - } - - i = 0; + int i = 0; TOKENIZE - if (!strcmp(token, "FILE")) + if (!strcmp(token, "REM")) { - /* found the data file for a track */ - TOKENIZE - - /* keep the filename */ - lastfname.assign(path).append(token); - - /* get the file type */ - TOKENIZE - - if (!strcmp(token, "BINARY")) - { - outinfo.track[trknum+1].swap = false; - } - else if (!strcmp(token, "MOTOROLA")) - { - outinfo.track[trknum+1].swap = true; - } - else if (!strcmp(token, "WAVE")) - { - wavlen = parse_wav_sample(lastfname, &wavoffs); - if (!wavlen) - { - fclose(infile); - printf("ERROR: couldn't read [%s] or not a valid .WAV\n", lastfname.c_str()); - return chd_file::error::INVALID_DATA; - } - } - else - { - fclose(infile); - printf("ERROR: Unhandled track type %s\n", token); - return chd_file::error::UNSUPPORTED_FORMAT; - } - } - else if (!strcmp(token, "TRACK")) - { - /* get the track number */ - TOKENIZE - trknum = strtoul(token, nullptr, 10) - 1; - - /* next token on the line is the track type */ - TOKENIZE - - if (wavlen != 0) - { - outtoc.tracks[trknum].trktype = CD_TRACK_AUDIO; - outtoc.tracks[trknum].frames = wavlen/2352; - outinfo.track[trknum].offset = wavoffs; - wavoffs = wavlen = 0; - } - else - { - outtoc.tracks[trknum].trktype = CD_TRACK_MODE1; - outtoc.tracks[trknum].datasize = 0; - outinfo.track[trknum].offset = 0; - } - outtoc.tracks[trknum].subtype = CD_SUB_NONE; - outtoc.tracks[trknum].subsize = 0; - outtoc.tracks[trknum].pgsub = CD_SUB_NONE; - outtoc.tracks[trknum].pregap = 0; - outtoc.tracks[trknum].padframes = 0; - outtoc.tracks[trknum].multicuearea = current_area; - outinfo.track[trknum].idx0offs = -1; - outinfo.track[trknum].idx1offs = 0; - - outinfo.track[trknum].fname.assign(lastfname); // default filename to the last one - - if (EXTRA_VERBOSE) - printf("trk %d: fname %s offset %d area %d\n", trknum, outinfo.track[trknum].fname.c_str(), outinfo.track[trknum].offset, outtoc.tracks[trknum].multicuearea); - - convert_type_string_to_track_info(token, &outtoc.tracks[trknum]); - if (outtoc.tracks[trknum].datasize == 0) - { - fclose(infile); - printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token); - return chd_file::error::UNSUPPORTED_FORMAT; - } - - /* next (optional) token on the line is the subcode type */ - TOKENIZE - - convert_subtype_string_to_track_info(token, &outtoc.tracks[trknum]); - } - else if (!strcmp(token, "INDEX")) /* only in bin/cue files */ - { - int idx, frames; - - /* get index number */ - TOKENIZE - idx = strtoul(token, nullptr, 10); - - /* get index */ - TOKENIZE - frames = msf_to_frames( token ); - - if (idx == 0) - { - outinfo.track[trknum].idx0offs = frames; - } - else if (idx == 1) - { - outinfo.track[trknum].idx1offs = frames; - if ((outtoc.tracks[trknum].pregap == 0) && (outinfo.track[trknum].idx0offs != -1)) - { - outtoc.tracks[trknum].pregap = frames - outinfo.track[trknum].idx0offs; - outtoc.tracks[trknum].pgtype = outtoc.tracks[trknum].trktype; - switch (outtoc.tracks[trknum].pgtype) - { - case CD_TRACK_MODE1: - case CD_TRACK_MODE2_FORM1: - outtoc.tracks[trknum].pgdatasize = 2048; - break; - - case CD_TRACK_MODE1_RAW: - case CD_TRACK_MODE2_RAW: - case CD_TRACK_AUDIO: - outtoc.tracks[trknum].pgdatasize = 2352; - break; - - case CD_TRACK_MODE2: - case CD_TRACK_MODE2_FORM_MIX: - outtoc.tracks[trknum].pgdatasize = 2336; - break; - - case CD_TRACK_MODE2_FORM2: - outtoc.tracks[trknum].pgdatasize = 2324; - break; - } - } - else // pregap sectors not in file, but we're always using idx0ofs for track length calc now - { - outinfo.track[trknum].idx0offs = frames; - } - } - } - else if (!strcmp(token, "PREGAP")) - { - int frames; - - /* get index */ - TOKENIZE - frames = msf_to_frames( token ); - - outtoc.tracks[trknum].pregap = frames; - } - else if (!strcmp(token, "POSTGAP")) - { - int frames; - - /* get index */ - TOKENIZE - frames = msf_to_frames( token ); - - outtoc.tracks[trknum].postgap = frames; + /* skip to actual data of REM command */ + while (i < std::size(linebuffer) && isspace((uint8_t)linebuffer[i])) + i++; + + if (!strncmp(linebuffer+i, "SINGLE-DENSITY AREA", 19)) + has_rem_singledensity = true; + else if (!strncmp(linebuffer+i, "HIGH-DENSITY AREA", 17)) + has_rem_highdensity = true; } } } - /* close the input CUE */ fclose(infile); - /* store the number of tracks found */ - outtoc.numtrks = trknum + 1; - - /* now go over the files again and set the lengths */ - for (trknum = 0; trknum < outtoc.numtrks; trknum++) - { - uint64_t tlen = 0; - - // this is true for cue/bin and cue/iso, and we need it for cue/wav since .WAV is little-endian - if (outtoc.tracks[trknum].trktype == CD_TRACK_AUDIO) - { - outinfo.track[trknum].swap = true; - } - - // don't do this for .WAV tracks, we already have their length and offset filled out - if (outinfo.track[trknum].offset == 0) - { - // is this the last track? - if (trknum == (outtoc.numtrks-1)) - { - /* if we have the same filename as the last track, do it that way */ - if (trknum != 0 && (outinfo.track[trknum].fname.compare(outinfo.track[trknum-1].fname)==0)) - { - tlen = get_file_size(outinfo.track[trknum].fname); - if (tlen == 0) - { - printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str()); - return std::errc::no_such_file_or_directory; - } - outinfo.track[trknum].offset = outinfo.track[trknum-1].offset + outtoc.tracks[trknum-1].frames * (outtoc.tracks[trknum-1].datasize + outtoc.tracks[trknum-1].subsize); - outtoc.tracks[trknum].frames = (tlen - outinfo.track[trknum].offset) / (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize); - } - else /* data files are different */ - { - tlen = get_file_size(outinfo.track[trknum].fname); - if (tlen == 0) - { - printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum-1].fname.c_str()); - return std::errc::no_such_file_or_directory; - } - tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize); - outtoc.tracks[trknum].frames = tlen; - outinfo.track[trknum].offset = 0; - } - } - else - { - /* if we have the same filename as the next track, do it that way */ - if (outinfo.track[trknum].fname.compare(outinfo.track[trknum+1].fname)==0) - { - outtoc.tracks[trknum].frames = outinfo.track[trknum+1].idx0offs - outinfo.track[trknum].idx0offs; - - if (trknum == 0) // track 0 offset is 0 - { - outinfo.track[trknum].offset = 0; - } - else - { - outinfo.track[trknum].offset = outinfo.track[trknum-1].offset + outtoc.tracks[trknum-1].frames * (outtoc.tracks[trknum-1].datasize + outtoc.tracks[trknum-1].subsize); - } - - if (!outtoc.tracks[trknum].frames) - { - printf("ERROR: unable to determine size of track %d, missing INDEX 01 markers?\n", trknum+1); - return chd_file::error::INVALID_DATA; - } - } - else /* data files are different */ - { - tlen = get_file_size(outinfo.track[trknum].fname); - if (tlen == 0) - { - printf("ERROR: couldn't find bin file [%s]\n", outinfo.track[trknum].fname.c_str()); - return std::errc::no_such_file_or_directory; - } - tlen /= (outtoc.tracks[trknum].datasize + outtoc.tracks[trknum].subsize); - outtoc.tracks[trknum].frames = tlen; - outinfo.track[trknum].offset = 0; - } - } - } - } - - /* - * Dreamcast patterns are identified by track types and number of tracks - */ - if (outtoc.numtrks > 4 && outtoc.tracks[outtoc.numtrks-1].pgtype == CD_TRACK_MODE1_RAW) - { - if (outtoc.tracks[outtoc.numtrks-2].pgtype == CD_TRACK_AUDIO) - disc_pattern = TYPE_III_SPLIT; - else - disc_pattern = TYPE_III; - } - else if (outtoc.numtrks > 3) - { - if (outtoc.tracks[outtoc.numtrks-1].pgtype == CD_TRACK_AUDIO) - disc_pattern = TYPE_II; - else - disc_pattern = TYPE_III; - } - else if (outtoc.numtrks == 3) - { - disc_pattern = TYPE_I; - } - - /* - * Special handling for TYPE_III_SPLIT, pregap in last track contains 75 frames audio and 150 frames data - */ - if (disc_pattern == TYPE_III_SPLIT) - { - assert(outtoc.tracks[outtoc.numtrks-1].pregap == 225); - - // grow the AUDIO track into DATA track by 75 frames as per Pattern III - outtoc.tracks[outtoc.numtrks-2].frames += 225; - outtoc.tracks[outtoc.numtrks-2].padframes += 150; - outinfo.track[outtoc.numtrks-2].offset = 150 * (outtoc.tracks[outtoc.numtrks-2].datasize+outtoc.tracks[outtoc.numtrks-2].subsize); - outtoc.tracks[outtoc.numtrks-2].splitframes = 75; - - // skip the pregap when reading the DATA track - outtoc.tracks[outtoc.numtrks-1].frames -= 225; - outinfo.track[outtoc.numtrks-1].offset += 225 * (outtoc.tracks[outtoc.numtrks-1].datasize+outtoc.tracks[outtoc.numtrks-1].subsize); - } - - /* - * Set LBA for every track with HIGH-DENSITY area @ LBA 45000 - */ - for (trknum = 1; trknum < outtoc.numtrks; trknum++) - { - if (outtoc.tracks[trknum].multicuearea == HIGH_DENSITY && outtoc.tracks[trknum-1].multicuearea == SINGLE_DENSITY) - { - outtoc.tracks[trknum].physframeofs = 45000; - int dif=outtoc.tracks[trknum].physframeofs-(outtoc.tracks[trknum-1].frames+outtoc.tracks[trknum-1].physframeofs); - outtoc.tracks[trknum-1].frames += dif; - outtoc.tracks[trknum-1].padframes = dif; - } - else - { - outtoc.tracks[trknum].physframeofs = outtoc.tracks[trknum-1].physframeofs + outtoc.tracks[trknum-1].frames; - } - } - - if (EXTRA_VERBOSE) - for (trknum = 0; trknum < outtoc.numtrks; trknum++) - { - printf("trk %d: %d frames @ offset %d, pad=%d, split=%d, area=%d, phys=%d, pregap=%d, pgtype=%d, idx0=%d, idx1=%d, (true %d)\n", - trknum+1, - outtoc.tracks[trknum].frames, - outinfo.track[trknum].offset, - outtoc.tracks[trknum].padframes, - outtoc.tracks[trknum].splitframes, - outtoc.tracks[trknum].multicuearea, - outtoc.tracks[trknum].physframeofs, - outtoc.tracks[trknum].pregap, - outtoc.tracks[trknum].pgtype, - outinfo.track[trknum].idx0offs, - outinfo.track[trknum].idx1offs, - outtoc.tracks[trknum].frames - outtoc.tracks[trknum].padframes); - } - - return std::error_condition(); + return has_rem_singledensity && has_rem_highdensity; } /*------------------------------------------------- @@ -2959,7 +2652,7 @@ std::error_condition cdrom_file::parse_toc(std::string_view tocfname, toc &outtoc, track_input_info &outinfo) { - static char token[512]; + char token[512]; auto pos = tocfname.rfind('.'); std::string tocfext = pos == std::string_view::npos ? std::string() : strmakelower(tocfname.substr(pos + 1)); @@ -2971,10 +2664,7 @@ if (tocfext == "cue") { - if (is_gdicue(tocfname)) - return parse_gdicue(tocfname, outtoc, outinfo); - else - return parse_cue(tocfname, outtoc, outinfo); + return parse_cue(tocfname, outtoc, outinfo); } if (tocfext == "nrg") @@ -3004,10 +2694,13 @@ int trknum = -1; char linebuffer[512]; + memset(linebuffer, 0, sizeof(linebuffer)); + while (!feof(infile)) { /* get the next line */ - fgets(linebuffer, 511, infile); + if (!fgets(linebuffer, 511, infile)) + break; /* if EOF didn't hit, keep going */ if (!feof(infile)) diff -Nru mame-0.263+dfsg.1/src/lib/util/cdrom.h mame-0.264+dfsg.1/src/lib/util/cdrom.h --- mame-0.263+dfsg.1/src/lib/util/cdrom.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/cdrom.h 2024-03-25 14:00:46.000000000 +0000 @@ -75,7 +75,7 @@ /* fields used in CHDMAN only */ uint32_t padframes; /* number of frames of padding to add to the end of the track; needed for GDI */ - uint32_t splitframes; /* number of frames to read from the next file; needed for Redump split-bin GDI */ + uint32_t splitframes; /* number of frames from the next file to add to the end of the current track after padding; needed for Redump split-bin GDI */ /* fields used in MAME/MESS only */ uint32_t logframeofs; /* logical frame of actual track data - offset by pregap size if pregap not physically present */ @@ -135,7 +135,6 @@ static std::error_condition parse_gdi(std::string_view tocfname, toc &outtoc, track_input_info &outinfo); static std::error_condition parse_cue(std::string_view tocfname, toc &outtoc, track_input_info &outinfo); static bool is_gdicue(std::string_view tocfname); - static std::error_condition parse_gdicue(std::string_view tocfname, toc &outtoc, track_input_info &outinfo); static std::error_condition parse_toc(std::string_view tocfname, toc &outtoc, track_input_info &outinfo); int get_last_track() const { return cdtoc.numtrks; } int get_adr_control(int track) const { return track == 0xaa || cdtoc.tracks[track].trktype == CD_TRACK_AUDIO ? 0x10 : 0x14; } diff -Nru mame-0.263+dfsg.1/src/lib/util/chd.cpp mame-0.264+dfsg.1/src/lib/util/chd.cpp --- mame-0.263+dfsg.1/src/lib/util/chd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/chd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include //************************************************************************** @@ -165,13 +166,16 @@ throw std::error_condition(error::NOT_OPEN); // seek and read - m_file->seek(offset, SEEK_SET); + std::error_condition err; + err = m_file->seek(offset, SEEK_SET); + if (err) + throw err; size_t count; - std::error_condition err = m_file->read(dest, length, count); + std::tie(err, count) = read(*m_file, dest, length); if (err) throw err; else if (count != length) - throw std::error_condition(std::errc::io_error); // TODO: revisit this error code (happens if file is cut off) + throw std::error_condition(std::errc::io_error); // TODO: revisit this error code (happens if file is truncated) } @@ -187,13 +191,13 @@ throw std::error_condition(error::NOT_OPEN); // seek and write - m_file->seek(offset, SEEK_SET); - size_t count; - std::error_condition err = m_file->write(source, length, count); + std::error_condition err; + err = m_file->seek(offset, SEEK_SET); + if (err) + throw err; + std::tie(err, std::ignore) = write(*m_file, source, length); if (err) throw err; - else if (count != length) - throw std::error_condition(std::errc::interrupted); // can theoretically happen if write is inuterrupted by a signal } @@ -232,7 +236,7 @@ { uint32_t bytes_to_write = std::min(sizeof(buffer), delta); size_t count; - err = m_file->write(buffer, bytes_to_write, count); + std::tie(err, count) = write(*m_file, buffer, bytes_to_write); if (err) throw err; delta -= count; @@ -245,12 +249,9 @@ err = m_file->tell(offset); if (err) throw err; - size_t count; - err = m_file->write(source, length, count); + std::tie(err, std::ignore) = write(*m_file, source, length); if (err) throw err; - else if (count != length) - throw std::error_condition(std::errc::interrupted); // can theoretically happen if write is interrupted by a signal return offset; } diff -Nru mame-0.263+dfsg.1/src/lib/util/corefile.cpp mame-0.264+dfsg.1/src/lib/util/corefile.cpp --- mame-0.263+dfsg.1/src/lib/util/corefile.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/corefile.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -48,13 +48,13 @@ virtual std::error_condition tell(std::uint64_t &result) noexcept override { return m_file.tell(result); } virtual std::error_condition length(std::uint64_t &result) noexcept override { return m_file.length(result); } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.read(buffer, length, actual); } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.read_at(offset, buffer, length, actual); } + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.read_some(buffer, length, actual); } + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.read_some_at(offset, buffer, length, actual); } virtual std::error_condition finalize() noexcept override { return m_file.finalize(); } virtual std::error_condition flush() noexcept override { return m_file.flush(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.write(buffer, length, actual); } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.write_at(offset, buffer, length, actual); } + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.write_some(buffer, length, actual); } + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { return m_file.write_some_at(offset, buffer, length, actual); } virtual bool eof() const override { return m_file.eof(); } @@ -167,13 +167,13 @@ ~core_in_memory_file() override { purge(); } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override; - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override; virtual std::error_condition finalize() noexcept override { return std::error_condition(); } virtual std::error_condition flush() noexcept override { clear_putback(); return std::error_condition(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0; return std::errc::bad_file_descriptor; } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0; return std::errc::bad_file_descriptor; } + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0; return std::errc::bad_file_descriptor; } + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0; return std::errc::bad_file_descriptor; } void const *buffer() const { return m_data; } @@ -217,13 +217,13 @@ } ~core_osd_file() override; - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override; - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override; virtual std::error_condition finalize() noexcept override; virtual std::error_condition flush() noexcept override; - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override; - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override; + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override; virtual std::error_condition truncate(std::uint64_t offset) override; @@ -260,9 +260,8 @@ { if (!pos) { - std::size_t readlen; std::uint8_t bom[4]; - read(bom, 4, readlen); + auto const [err, readlen] = read(*this, bom, 4); // FIXME: check for errors if (readlen == 4) { if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) @@ -303,15 +302,14 @@ // fetch the next character // FIXME: all of this plays fast and loose with error checking and seeks backwards far too frequently char16_t utf16_buffer[UTF16_CHAR_MAX]; - auto uchar = char32_t(~0); + char32_t uchar = ~char32_t(0); switch (m_text_type) { default: case text_file_type::OSD: { char default_buffer[16]; - std::size_t readlen; - read(default_buffer, sizeof(default_buffer), readlen); + auto const [err, readlen] = read(*this, default_buffer, sizeof(default_buffer)); if (readlen > 0) { auto const charlen = osd_uchar_from_osdchar(&uchar, default_buffer, readlen / sizeof(default_buffer[0])); @@ -323,8 +321,7 @@ case text_file_type::UTF8: { char utf8_buffer[UTF8_CHAR_MAX]; - std::size_t readlen; - read(utf8_buffer, sizeof(utf8_buffer), readlen); + auto const [err, readlen] = read(*this, utf8_buffer, sizeof(utf8_buffer)); if (readlen > 0) { auto const charlen = uchar_from_utf8(&uchar, utf8_buffer, readlen / sizeof(utf8_buffer[0])); @@ -335,8 +332,7 @@ case text_file_type::UTF16BE: { - std::size_t readlen; - read(utf16_buffer, sizeof(utf16_buffer), readlen); + auto const [err, readlen] = read(*this, utf16_buffer, sizeof(utf16_buffer)); if (readlen > 0) { auto const charlen = uchar_from_utf16be(&uchar, utf16_buffer, readlen / sizeof(utf16_buffer[0])); @@ -347,8 +343,7 @@ case text_file_type::UTF16LE: { - std::size_t readlen; - read(utf16_buffer, sizeof(utf16_buffer), readlen); + auto const [err, readlen] = read(*this, utf16_buffer, sizeof(utf16_buffer)); if (readlen > 0) { auto const charlen = uchar_from_utf16le(&uchar, utf16_buffer, readlen / sizeof(utf16_buffer[0])); @@ -360,8 +355,7 @@ case text_file_type::UTF32BE: { // FIXME: deal with read returning short - std::size_t readlen; - read(&uchar, sizeof(uchar), readlen); + auto const [err, readlen] = read(*this, &uchar, sizeof(uchar)); if (sizeof(uchar) == readlen) uchar = big_endianize_int32(uchar); } @@ -370,8 +364,7 @@ case text_file_type::UTF32LE: { // FIXME: deal with read returning short - std::size_t readlen; - read(&uchar, sizeof(uchar), readlen); + auto const [err, readlen] = read(*this, &uchar, sizeof(uchar)); if (sizeof(uchar) == readlen) uchar = little_endianize_int32(uchar); } @@ -467,7 +460,7 @@ int core_text_file::puts(std::string_view s) { - // TODO: what to do about write errors or short writes (interrupted)? + // TODO: what to do about write errors? // The API doesn't lend itself to reporting the error as the return // value includes extra bytes inserted like the UTF-8 marker and // carriage returns. @@ -511,8 +504,7 @@ // if we overflow, break into chunks if (pconvbuf >= convbuf + std::size(convbuf) - 10) { - std::size_t written; - write(convbuf, pconvbuf - convbuf, written); // FIXME: error ignored here + auto const [err, written] = write(*this, convbuf, pconvbuf - convbuf); // FIXME: error ignored here count += written; pconvbuf = convbuf; } @@ -521,8 +513,7 @@ // final flush if (pconvbuf != convbuf) { - std::size_t written; - write(convbuf, pconvbuf - convbuf, written); // FIXME: error ignored here + auto const [err, written] = write(*this, convbuf, pconvbuf - convbuf); // FIXME: error ignored here count += written; } @@ -646,7 +637,7 @@ // read - read from a file //------------------------------------------------- -std::error_condition core_in_memory_file::read(void *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_in_memory_file::read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept { clear_putback(); @@ -659,7 +650,7 @@ return std::error_condition(); } -std::error_condition core_in_memory_file::read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_in_memory_file::read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept { clear_putback(); @@ -705,17 +696,17 @@ // read - read from a file //------------------------------------------------- -std::error_condition core_osd_file::read(void *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_osd_file::read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept { // since osd_file works like pread/pwrite, implement in terms of read_at // core_osd_file is declared final, so a derived class can't interfere - std::error_condition err = read_at(index(), buffer, length, actual); + std::error_condition err = read_some_at(index(), buffer, length, actual); add_offset(actual); return err; } -std::error_condition core_osd_file::read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_osd_file::read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept { if (!m_file) { @@ -750,18 +741,12 @@ } else { - // read the remainder directly from the file - do - { - // may need to split into chunks if size_t is larger than 32 bits - std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length - actual); - std::uint32_t bytes_read; - err = m_file->read(reinterpret_cast(buffer) + actual, offset + actual, chunk, bytes_read); - if (err || !bytes_read) - break; + // read the remainder directly from the file - may need to return short if size_t is larger than 32 bits + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length - actual); + std::uint32_t bytes_read; + err = m_file->read(reinterpret_cast(buffer) + actual, offset + actual, chunk, bytes_read); + if (!err) actual += bytes_read; - } - while (actual < length); } } @@ -774,17 +759,17 @@ // write - write to a file //------------------------------------------------- -std::error_condition core_osd_file::write(void const *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_osd_file::write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept { // since osd_file works like pread/pwrite, implement in terms of write_at // core_osd_file is declared final, so a derived class can't interfere - std::error_condition err = write_at(index(), buffer, length, actual); + std::error_condition err = write_some_at(index(), buffer, length, actual); add_offset(actual); return err; } -std::error_condition core_osd_file::write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept +std::error_condition core_osd_file::write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept { // flush any buffered char clear_putback(); @@ -792,21 +777,20 @@ // invalidate any buffered data m_bufferbytes = 0U; - // do the write - may need to split into chunks if size_t is larger than 32 bits - actual = 0U; - while (length) + // do the write - may need to return short if size_t is larger than 32 bits + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); + std::uint32_t bytes_written; + std::error_condition err = m_file->write(buffer, offset, chunk, bytes_written); + if (err) { // bytes written not valid on error - std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); - std::uint32_t bytes_written; - std::error_condition err = m_file->write(buffer, offset, chunk, bytes_written); - if (err) - return err; + actual = 0U; + } + else + { assert(chunk >= bytes_written); offset += bytes_written; - buffer = reinterpret_cast(buffer) + bytes_written; - length -= bytes_written; - actual += bytes_written; + actual = bytes_written; set_size((std::max)(size(), offset)); } return std::error_condition(); @@ -968,7 +952,7 @@ // pointer //------------------------------------------------- -std::error_condition core_file::load(std::string_view filename, void **data, std::uint32_t &length) noexcept +std::error_condition core_file::load(std::string_view filename, void **data, std::size_t &length) noexcept { std::error_condition err; @@ -983,20 +967,20 @@ err = file->length(size); if (err) return err; - else if (std::uint32_t(size) != size) // TODO: change interface to use size_t rather than uint32_t for output size + else if (std::size_t(size) != size) return std::errc::file_too_large; // allocate memory *data = std::malloc(std::size_t(size)); if (!*data) return std::errc::not_enough_memory; - length = std::uint32_t(size); + length = std::size_t(size); // read the data if (size) { std::size_t actual; - err = file->read(*data, std::size_t(size), actual); + std::tie(err, actual) = read(*file, *data, std::size_t(size)); if (err || (size != actual)) { std::free(*data); @@ -1004,7 +988,7 @@ if (err) return err; else - return std::errc::io_error; // TODO: revisit this error code - either interrupted by an async signal or file truncated out from under us + return std::errc::io_error; // TODO: revisit this error code - file truncated out from under us } } @@ -1038,14 +1022,14 @@ if (size) { std::size_t actual; - err = file->read(&data[0], std::size_t(size), actual); + std::tie(err, actual) = read(*file, &data[0], std::size_t(size)); if (err || (size != actual)) { data.clear(); if (err) return err; else - return std::errc::io_error; // TODO: revisit this error code - either interrupted by an async signal or file truncated out from under us + return std::errc::io_error; // TODO: revisit this error code - file truncated out from under us } } diff -Nru mame-0.263+dfsg.1/src/lib/util/corefile.h mame-0.264+dfsg.1/src/lib/util/corefile.h --- mame-0.263+dfsg.1/src/lib/util/corefile.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/corefile.h 2024-03-25 14:00:46.000000000 +0000 @@ -77,7 +77,7 @@ virtual char *gets(char *s, int n) = 0; // open a file with the specified filename, read it into memory, and return a pointer - static std::error_condition load(std::string_view filename, void **data, std::uint32_t &length) noexcept; + static std::error_condition load(std::string_view filename, void **data, std::size_t &length) noexcept; static std::error_condition load(std::string_view filename, std::vector &data) noexcept; diff -Nru mame-0.263+dfsg.1/src/lib/util/coreutil.cpp mame-0.264+dfsg.1/src/lib/util/coreutil.cpp --- mame-0.263+dfsg.1/src/lib/util/coreutil.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/coreutil.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,7 +10,6 @@ #include "coreutil.h" #include -#include /*************************************************************************** @@ -55,14 +54,3 @@ } return result; } - - - -/*************************************************************************** - MISC -***************************************************************************/ - -uint32_t core_crc32(uint32_t crc, const uint8_t *buf, uint32_t len) -{ - return crc32(crc, buf, len); -} diff -Nru mame-0.263+dfsg.1/src/lib/util/coreutil.h mame-0.264+dfsg.1/src/lib/util/coreutil.h --- mame-0.263+dfsg.1/src/lib/util/coreutil.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/coreutil.h 2024-03-25 14:00:46.000000000 +0000 @@ -72,11 +72,4 @@ return result; } - -/*************************************************************************** - MISC -***************************************************************************/ - -uint32_t core_crc32(uint32_t crc, const uint8_t *buf, uint32_t len); - #endif // MAME_UTIL_COREUTIL_H diff -Nru mame-0.263+dfsg.1/src/lib/util/flac.cpp mame-0.264+dfsg.1/src/lib/util/flac.cpp --- mame-0.263+dfsg.1/src/lib/util/flac.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/flac.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include //************************************************************************** @@ -84,6 +85,8 @@ FLAC__stream_encoder_set_blocksize(m_encoder, m_block_size); // re-start processing + if (m_file) + return (FLAC__stream_encoder_init_stream(m_encoder, write_callback_static, seek_callback_static, tell_callback_static, nullptr, this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK); return (FLAC__stream_encoder_init_stream(m_encoder, write_callback_static, nullptr, nullptr, nullptr, this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK); } @@ -266,8 +269,7 @@ int count = bytes - offset; if (m_file) { - size_t actual; - m_file->write(buffer, count, actual); // TODO: check for errors + /*auto const [err, actual] =*/ write(*m_file, buffer, count); // FIXME: check for errors } else { @@ -281,6 +283,38 @@ return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; } +FLAC__StreamEncoderSeekStatus flac_encoder::seek_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + return reinterpret_cast(client_data)->seek_callback(absolute_byte_offset); +} + +FLAC__StreamEncoderSeekStatus flac_encoder::seek_callback(FLAC__uint64 absolute_byte_offset) +{ + if (m_file) + { + if (!m_file->seek(absolute_byte_offset, SEEK_SET)) + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; + return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + } + return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; +} + +FLAC__StreamEncoderTellStatus flac_encoder::tell_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + return reinterpret_cast(client_data)->tell_callback(absolute_byte_offset); +} + +FLAC__StreamEncoderTellStatus flac_encoder::tell_callback(FLAC__uint64 *absolute_byte_offset) +{ + if (m_file) + { + if (!m_file->tell(*absolute_byte_offset)) + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + } + return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; +} + //************************************************************************** @@ -537,7 +571,8 @@ if (m_file) // if a file, just read { - m_file->read(buffer, expected, *bytes); // TODO: check for errors + std::error_condition err; + std::tie(err, *bytes) = read(*m_file, buffer, expected); // FIXME: check for errors } else // otherwise, copy from memory { diff -Nru mame-0.263+dfsg.1/src/lib/util/flac.h mame-0.264+dfsg.1/src/lib/util/flac.h --- mame-0.263+dfsg.1/src/lib/util/flac.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/flac.h 2024-03-25 14:00:46.000000000 +0000 @@ -62,6 +62,10 @@ void init_common(); static FLAC__StreamEncoderWriteStatus write_callback_static(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame); + static FLAC__StreamEncoderSeekStatus seek_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); + FLAC__StreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); + static FLAC__StreamEncoderTellStatus tell_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + FLAC__StreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); // internal state FLAC__StreamEncoder * m_encoder; // actual encoder diff -Nru mame-0.263+dfsg.1/src/lib/util/harddisk.cpp mame-0.264+dfsg.1/src/lib/util/harddisk.cpp --- mame-0.263+dfsg.1/src/lib/util/harddisk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/harddisk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,6 +16,7 @@ #include "osdcore.h" #include +#include /*------------------------------------------------- @@ -118,7 +119,7 @@ size_t actual = 0; std::error_condition err = fhandle->seek(fileoffset + (lbasector * hdinfo.sectorbytes), SEEK_SET); if (!err) - err = fhandle->read(buffer, hdinfo.sectorbytes, actual); + std::tie(err, actual) = util::read(*fhandle, buffer, hdinfo.sectorbytes); return !err && (actual == hdinfo.sectorbytes); } } @@ -151,8 +152,8 @@ size_t actual = 0; std::error_condition err = fhandle->seek(fileoffset + (lbasector * hdinfo.sectorbytes), SEEK_SET); if (!err) - err = fhandle->write(buffer, hdinfo.sectorbytes, actual); - return !err && (actual == hdinfo.sectorbytes); + std::tie(err, actual) = util::write(*fhandle, buffer, hdinfo.sectorbytes); + return !err; } } diff -Nru mame-0.263+dfsg.1/src/lib/util/hash.cpp mame-0.264+dfsg.1/src/lib/util/hash.cpp --- mame-0.263+dfsg.1/src/lib/util/hash.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/hash.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -410,14 +410,13 @@ unsigned const chunk_length = std::min(length, sizeof(buffer)); // read one chunk - std::size_t bytes_read; - std::error_condition err = stream.read_at(offset, buffer, chunk_length, bytes_read); + auto const [err, bytes_read] = read_at(stream, offset, buffer, chunk_length); if (err) return err; if (!bytes_read) // EOF? break; offset += bytes_read; - length -= chunk_length; + length -= bytes_read; // append the chunk creator->append(buffer, bytes_read); diff -Nru mame-0.263+dfsg.1/src/lib/util/ioprocs.cpp mame-0.264+dfsg.1/src/lib/util/ioprocs.cpp --- mame-0.263+dfsg.1/src/lib/util/ioprocs.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/ioprocs.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -120,14 +121,14 @@ { } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { do_read(this->m_pointer, buffer, length, actual); this->m_pointer += actual; return std::error_condition(); } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { do_read(offset, buffer, length, actual); return std::error_condition(); @@ -239,7 +240,7 @@ { } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { if (m_dangling_write) { @@ -270,7 +271,7 @@ return std::error_condition(); } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0U; @@ -338,7 +339,7 @@ return std::error_condition(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { if (m_dangling_read) { @@ -361,7 +362,7 @@ return std::error_condition(); } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0U; @@ -409,7 +410,7 @@ set_filler(fill); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0U; @@ -473,7 +474,7 @@ return std::error_condition(); } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = 0U; @@ -634,18 +635,12 @@ { } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { - // TODO: should the client have to deal with reading less than expected even if EOF isn't hit? - if (std::numeric_limits::max() < length) - { - actual = 0U; - return std::errc::invalid_argument; - } - // actual length not valid on error + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); std::uint32_t count; - std::error_condition err = file().read(buffer, m_pointer, std::uint32_t(length), count); + std::error_condition err = file().read(buffer, m_pointer, chunk, count); if (!err) { m_pointer += count; @@ -658,18 +653,12 @@ return err; } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { - // TODO: should the client have to deal with reading less than expected even if EOF isn't hit? - if (std::numeric_limits::max() < length) - { - actual = 0U; - return std::errc::invalid_argument; - } - // actual length not valid on error + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); std::uint32_t count; - std::error_condition err = file().read(buffer, offset, std::uint32_t(length), count); + std::error_condition err = file().read(buffer, offset, chunk, count); if (!err) actual = std::size_t(count); else @@ -696,48 +685,146 @@ return file().flush(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { - actual = 0U; - while (length) + // actual length not valid on error + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); + std::uint32_t count; + std::error_condition err = file().write(buffer, m_pointer, chunk, count); + if (!err) + { + actual = std::size_t(count); + m_pointer += count; + } + else { - // actual length not valid on error - std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); - std::uint32_t written; - std::error_condition err = file().write(buffer, m_pointer, chunk, written); - if (err) - return err; - m_pointer += written; - buffer = reinterpret_cast(buffer) + written; - length -= written; - actual += written; + actual = 0U; } - return std::error_condition(); + return err; } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { - actual = 0U; - while (length) - { - // actual length not valid on error - std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); - std::uint32_t written; - std::error_condition err = file().write(buffer, offset, chunk, written); - if (err) - return err; - offset += written; - buffer = reinterpret_cast(buffer) + written; - length -= written; - actual += written; - } - return std::error_condition(); + // actual length not valid on error + std::uint32_t const chunk = std::min >(std::numeric_limits::max(), length); + std::uint32_t count; + std::error_condition err = file().write(buffer, offset, chunk, count); + if (!err) + actual = std::size_t(count); + else + actual = 0U; + return err; } }; } // anonymous namespace +// helper functions for common patterns + +std::pair read(read_stream &stream, void *buffer, std::size_t length) noexcept +{ + std::size_t actual = 0; + do + { + std::size_t count; + std::error_condition err = stream.read_some(buffer, length, count); + actual += count; + if (!err) + { + if (!count) + break; + } + else if (std::errc::interrupted != err) + { + return std::make_pair(err, actual); + } + buffer = reinterpret_cast(buffer) + count; + length -= count; + } + while (length); + return std::make_pair(std::error_condition(), actual); +} + +std::tuple, std::size_t> read(read_stream &stream, std::size_t length) noexcept +{ + std::unique_ptr buffer(new (std::nothrow) std::uint8_t [length]); + if (!buffer) + return std::make_tuple(std::errc::not_enough_memory, std::move(buffer), std::size_t(0)); + auto [err, actual] = read(stream, buffer.get(), length); + return std::make_tuple(err, std::move(buffer), actual); +} + +std::pair read_at(random_read &stream, std::uint64_t offset, void *buffer, std::size_t length) noexcept +{ + std::size_t actual = 0; + do + { + std::size_t count; + std::error_condition err = stream.read_some_at(offset, buffer, length, count); + actual += count; + if (!err) + { + if (!count) + break; + } + else if (std::errc::interrupted != err) + { + return std::make_pair(err, actual); + } + offset += count; + buffer = reinterpret_cast(buffer) + count; + length -= count; + } + while (length); + return std::make_pair(std::error_condition(), actual); +} + +std::tuple, std::size_t> read_at(random_read &stream, std::uint64_t offset, std::size_t length) noexcept +{ + std::unique_ptr buffer(new (std::nothrow) std::uint8_t [length]); + if (!buffer) + return std::make_tuple(std::errc::not_enough_memory, std::move(buffer), std::size_t(0)); + auto [err, actual] = read_at(stream, offset, buffer.get(), length); + return std::make_tuple(err, std::move(buffer), actual); +} + +std::pair write(write_stream &stream, void const *buffer, std::size_t length) noexcept +{ + std::size_t actual = 0; + do + { + std::size_t written; + std::error_condition err = stream.write_some(buffer, length, written); + actual += written; + if (err && (std::errc::interrupted != err)) + return std::make_pair(err, actual); + buffer = reinterpret_cast(buffer) + written; + length -= written; + } + while (length); + return std::make_pair(std::error_condition(), actual); +} + +std::pair write_at(random_write &stream, std::uint64_t offset, void const *buffer, std::size_t length) noexcept +{ + std::size_t actual = 0; + do + { + std::size_t written; + std::error_condition err = stream.write_some_at(offset, buffer, length, written); + actual += written; + if (err && (std::errc::interrupted != err)) + return std::make_pair(err, actual); + offset += written; + buffer = reinterpret_cast(buffer) + written; + length -= written; + } + while (length); + return std::make_pair(std::error_condition(), actual); +} + + // creating RAM read adapters random_read::ptr ram_read(void const *data, std::size_t size) noexcept diff -Nru mame-0.263+dfsg.1/src/lib/util/ioprocs.h mame-0.264+dfsg.1/src/lib/util/ioprocs.h --- mame-0.263+dfsg.1/src/lib/util/ioprocs.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/ioprocs.h 2024-03-25 14:00:46.000000000 +0000 @@ -19,6 +19,8 @@ #include #include #include +#include +#include // FIXME: make a proper place for OSD forward declarations @@ -56,7 +58,7 @@ /// \param [out] actual Number of bytes actually read. Will always /// be less than or equal to the requested length. /// \return An error condition if reading stopped due to an error. - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept = 0; + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept = 0; }; @@ -100,7 +102,7 @@ /// \param [out] actual Number of bytes actually written. Will /// always be less than or equal to the requested length. /// \return An error condition if writing stopped due to an error. - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0; + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0; }; @@ -184,7 +186,7 @@ /// be less than or equal to the requested length. /// \return An error condition if seeking failed or reading stopped /// due to an error. - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept = 0; + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept = 0; }; @@ -214,7 +216,7 @@ /// always be less than or equal to the requested length. /// \return An error condition if seeking failed or writing stopped /// due to an error. - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0; + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept = 0; }; @@ -229,6 +231,123 @@ using ptr = std::unique_ptr; }; + +/// \brief Read from the current position in the stream +/// +/// Reads up to the specified number of bytes from the stream into the +/// supplied buffer, continuing if interrupted by asynchronous signals. +/// May read less than the requested number of bytes if the end of the +/// stream is reached or an error occurs. If the stream supports +/// seeking, reading starts at the current position in the stream, and +/// the current position is incremented by the number of bytes read. +/// The operation may not be atomic if it is interrupted before the +/// requested number of bytes is read. +/// \param [in] stream The stream to read from. +/// \param [out] buffer Destination buffer. Must be large enough to +/// hold the requested number of bytes. +/// \param [in] length Maximum number of bytes to read. +/// \return A pair containing an error condition if reading stopped due +/// to an error, and the actual number of bytes read. +std::pair read(read_stream &stream, void *buffer, std::size_t length) noexcept; + +/// \brief Allocate memory and read from the current position in the +/// stream +/// +/// Allocates the specified number of bytes and then reads up to that +/// number of bytes from the stream into the newly allocated buffer, +/// continuing if interrupted by asynchronous signals. May read less +/// than the requested number of bytes if the end of the stream is +/// reached or an error occurs. If the stream supports seeking, +/// reading starts at the current position in the stream, and the +/// current position is incremented by the number of bytes read. The +/// operation may not be atomic if it is interrupted before the +/// requested number of bytes is read. No data will be read if +/// allocation fails. +/// \param [in] stream The stream to read from. +/// hold the requested number of bytes. +/// \param [in] length Maximum number of bytes to read. +/// \return A tuple containing an error condition if allocation failed +/// or reading stopped due to an error, the allocated buffer, and the +/// actual number of bytes read. +std::tuple, std::size_t> read(read_stream &stream, std::size_t length) noexcept; + +/// \brief Read from the specified position +/// +/// Reads up to the specified number of bytes from the stream into the +/// supplied buffer, continuing if interrupted by asynchronous signals. +/// May read less than the requested number of bytes if the end of the +/// stream is reached or an error occurs. If seeking is supported, +/// reading starts at the specified position and the current position is +/// unaffected. The operation may not be atomic if it is interrupted +/// before the requested number of bytes is read. +/// \param [in] stream The stream to read from. +/// \param [in] offset The position to start reading from, specified as +/// a number of bytes from the beginning of the stream. +/// \param [out] buffer Destination buffer. Must be large enough to +/// hold the requested number of bytes. +/// \param [in] length Maximum number of bytes to read. +/// \return A pair containing an error condition if reading stopped due +/// to an error, and the actual number of bytes read. +std::pair read_at(random_read &stream, std::uint64_t offset, void *buffer, std::size_t length) noexcept; + +/// \brief Allocate memory and read from the specified position +/// +/// Allocates the specified number of bytes and then reads up to that +/// number of bytes from the stream into the newly allocated buffer, +/// continuing if interrupted by asynchronous signals. May read less +/// than the requested number of bytes if the end of the stream is +/// reached or an error occurs. If seeking is supported, reading +/// starts at the specified position and the current position is +/// unaffected. The operation may not be atomic if it is interrupted +/// before the requested number of bytes is read. No data will be read +/// if allocation fails. +/// \param [in] stream The stream to read from. +/// \param [in] offset The position to start reading from, specified as +/// a number of bytes from the beginning of the stream. +/// \param [out] buffer Destination buffer. Must be large enough to +/// hold the requested number of bytes. +/// \param [in] length Maximum number of bytes to read. +/// \return A tuple containing an error condition if allocation failed +/// or reading stopped due to an error, the allocated buffer, and the +/// actual number of bytes read. +std::tuple, std::size_t> read_at(random_read &stream, std::uint64_t offset, std::size_t length) noexcept; + +/// \brief Write at the current position in the stream +/// +/// Writes up to the specified number of bytes from the supplied +/// buffer to the stream, continuing if interrupted by asynchronous +/// signals. May write less than the requested number of bytes if an +/// error occurs. If the stream supports seeking, writing starts at the +/// current position in the stream, and the current position is +/// incremented by the number of bytes written. The operation may not +/// be atomic if it is interrupted before the requested number of bytes +/// is written. +/// \param [in] stream The stream to write to. +/// \param [in] buffer Buffer containing the data to write. Must +/// contain at least the specified number of bytes. +/// \param [in] length Number of bytes to write. +/// \return A pair containing an error condition if writing stopped due +/// to an error, and the actual number of bytes written. +std::pair write(write_stream &stream, void const *buffer, std::size_t length) noexcept; + +/// \brief Write at specified position +/// +/// Writes up to the specified number of bytes from the supplied buffer, +/// continuing if interrupted by asynchronous signals. If seeking is +/// supported, writing starts at the specified position and the current +/// position is unaffected. May write less than the requested number +/// of bytes if an error occurs. The operation may not be atomic if it +/// is interrupted before the requested number of bytes is written. +/// \param [in] stream The stream to write to. +/// \param [in] offset The position to start writing at, specified as a +/// number of bytes from the beginning of the stream. +/// \param [in] buffer Buffer containing the data to write. Must +/// contain at least the specified number of bytes. +/// \param [in] length Number of bytes to write. +/// \return A pair containing an error condition if writing stopped due +/// to an error, and the actual number of bytes written. +std::pair write_at(random_write &stream, std::uint64_t offset, void const *buffer, std::size_t length) noexcept; + /// \} diff -Nru mame-0.263+dfsg.1/src/lib/util/ioprocsfill.h mame-0.264+dfsg.1/src/lib/util/ioprocsfill.h --- mame-0.263+dfsg.1/src/lib/util/ioprocsfill.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/ioprocsfill.h 2024-03-25 14:00:46.000000000 +0000 @@ -45,9 +45,21 @@ public: using Base::Base; - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { - std::error_condition err = Base::read(buffer, length, actual); + // not atomic with respect to other read/write calls + actual = 0U; + std::error_condition err; + std::size_t chunk; + do + { + err = Base::read_some( + reinterpret_cast(buffer) + actual, + length - actual, + chunk); + actual += chunk; + } + while ((length > actual) && ((!err && chunk) || (std::errc::interrupted == err))); assert(length >= actual); std::fill( reinterpret_cast(buffer) + actual, @@ -64,9 +76,23 @@ public: using read_stream_fill_wrapper::read_stream_fill_wrapper; - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { - std::error_condition err = Base::read_at(offset, buffer, length, actual); + // not atomic with respect to other read/write calls + actual = 0U; + std::error_condition err; + std::size_t chunk; + do + { + err = Base::read_some_at( + offset, + reinterpret_cast(buffer) + actual, + length - actual, + chunk); + offset += chunk; + actual += chunk; + } + while ((length > actual) && ((!err && chunk) || (std::errc::interrupted == err))); assert(length >= actual); std::fill( reinterpret_cast(buffer) + actual, @@ -83,8 +109,9 @@ public: using Base::Base; - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { + // not atomic with respect to other read/write calls std::error_condition err; actual = 0U; @@ -108,23 +135,22 @@ do { std::size_t const chunk = std::min >(FillBlock, unfilled); - err = Base::write_at(current, fill_buffer, chunk, actual); - if (err) - { - actual = 0U; + std::size_t filled; + err = Base::write_some_at(current, fill_buffer, chunk, filled); + current += filled; + unfilled -= filled; + if (err && (std::errc::interrupted != err)) return err; - } - current += chunk; - unfilled -= chunk; } while (unfilled); } - return Base::write(buffer, length, actual); + return Base::write_some(buffer, length, actual); } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { + // not atomic with respect to other read/write calls std::error_condition err; std::uint64_t current; err = Base::length(current); @@ -139,18 +165,19 @@ do { std::size_t const chunk = std::min >(FillBlock, unfilled); - err = Base::write_at(current, fill_buffer, chunk, actual); - current += chunk; - unfilled -= chunk; + std::size_t filled; + err = Base::write_some_at(current, fill_buffer, chunk, filled); + current += filled; + unfilled -= filled; } - while (unfilled && !err); + while (unfilled && (!err || (std::errc::interrupted == err))); } if (err) { actual = 0U; return err; } - return Base::write_at(offset, buffer, length, actual); + return Base::write_some_at(offset, buffer, length, actual); } }; diff -Nru mame-0.263+dfsg.1/src/lib/util/ioprocsfilter.cpp mame-0.264+dfsg.1/src/lib/util/ioprocsfilter.cpp --- mame-0.263+dfsg.1/src/lib/util/ioprocsfilter.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/ioprocsfilter.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -372,9 +373,9 @@ public: using T::T; - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { - return this->object().read(buffer, length, actual); + return this->object().read_some(buffer, length, actual); } }; @@ -397,9 +398,9 @@ return this->object().flush(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { - return this->object().write(buffer, length, actual); + return this->object().write_some(buffer, length, actual); } }; @@ -437,9 +438,9 @@ public: using read_stream_proxy::read_stream_proxy; - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { - return this->object().read_at(offset, buffer, length, actual); + return this->object().read_some_at(offset, buffer, length, actual); } }; @@ -452,9 +453,9 @@ public: using write_stream_proxy::write_stream_proxy; - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { - return this->object().write_at(offset, buffer, length, actual); + return this->object().write_some_at(offset, buffer, length, actual); } }; @@ -487,7 +488,7 @@ { } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { std::error_condition err; actual = 0U; @@ -504,7 +505,7 @@ { auto const space = get_unfilled_input(); std::size_t filled; - err = this->object().read(space.first, space.second, filled); + std::tie(err, filled) = read(this->object(), space.first, space.second); add_input(filled); short_input = space.second > filled; } @@ -598,8 +599,7 @@ auto const output = get_output(); if (output.second) { - std::size_t written; - std::error_condition err = object().write(output.first, output.second, written); + auto const [err, written] = write(object(), output.first, output.second); consume_output(written); if (err) { @@ -611,7 +611,7 @@ return object().flush(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { std::error_condition err; actual = 0U; @@ -651,7 +651,7 @@ { auto const output = get_output(); std::size_t written; - std::error_condition err = object().write(output.first, output.second, written); + std::error_condition const err = object().write_some(output.first, output.second, written); consume_output(written); return err; } diff -Nru mame-0.263+dfsg.1/src/lib/util/ioprocsvec.h mame-0.264+dfsg.1/src/lib/util/ioprocsvec.h --- mame-0.263+dfsg.1/src/lib/util/ioprocsvec.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/ioprocsvec.h 2024-03-25 14:00:46.000000000 +0000 @@ -90,14 +90,14 @@ return std::error_condition(); } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { do_read(m_pointer, buffer, length, actual); m_pointer += actual; return std::error_condition(); } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { do_read(offset, buffer, length, actual); return std::error_condition(); @@ -113,14 +113,14 @@ return std::error_condition(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { std::error_condition result = do_write(m_pointer, buffer, length, actual); m_pointer += actual; return result; } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { return do_write(offset, buffer, length, actual); } diff -Nru mame-0.263+dfsg.1/src/lib/util/jedparse.cpp mame-0.264+dfsg.1/src/lib/util/jedparse.cpp --- mame-0.263+dfsg.1/src/lib/util/jedparse.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/jedparse.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include @@ -194,7 +195,6 @@ int jed_parse(util::random_read &src, jed_data *result) { jed_parse_info pinfo; - int i; std::size_t actual; std::error_condition err; @@ -206,7 +206,7 @@ uint8_t ch; do { - err = src.read(&ch, 1, actual); + std::tie(err, actual) = read(src, &ch, 1); if (err) { if (LOG_PARSE) printf("Read error searching for JED start marker\n"); @@ -225,7 +225,7 @@ uint16_t checksum = ch; do { - err = src.read(&ch, 1, actual); + std::tie(err, actual) = read(src, &ch, 1); if (err) { if (LOG_PARSE) printf("Read error searching for JED end marker\n"); @@ -261,7 +261,8 @@ /* see if there is a transmission checksum at the end */ uint8_t sumbuf[4]; - if (!src.read(&sumbuf[0], 4, actual) && actual == 4 && ishex(sumbuf[0]) && ishex(sumbuf[1]) && ishex(sumbuf[2]) && ishex(sumbuf[3])) + std::tie(err, actual) = read(src, &sumbuf[0], 4); + if (!err && (actual == 4) && ishex(sumbuf[0]) && ishex(sumbuf[1]) && ishex(sumbuf[2]) && ishex(sumbuf[3])) { uint16_t dessum = (hexval(sumbuf[0]) << 12) | (hexval(sumbuf[1]) << 8) | (hexval(sumbuf[2]) << 4) | hexval(sumbuf[3] << 0); if (dessum != 0 && dessum != checksum) @@ -281,7 +282,8 @@ } } auto srcdata = std::make_unique(endpos - startpos); - if (src.read(&srcdata[0], endpos - startpos, actual) || actual != endpos - startpos) + std::tie(err, actual) = read(src, &srcdata[0], endpos - startpos); + if (err || ((endpos - startpos) != actual)) { if (LOG_PARSE) printf("Error reading JED data\n"); return JEDERR_INVALID_DATA; @@ -325,7 +327,7 @@ /* validate the checksum */ checksum = 0; - for (i = 0; i < (result->numfuses + 7) / 8; i++) + for (int i = 0; i < ((result->numfuses + 7) / 8); i++) checksum += result->fusemap[i]; if (pinfo.checksum != 0 && checksum != pinfo.checksum) { @@ -441,13 +443,16 @@ int jedbin_parse(util::read_stream &src, jed_data *result) { + std::error_condition err; + std::size_t actual; + /* initialize the output */ memset(result, 0, sizeof(*result)); /* need at least 4 bytes */ uint8_t buf[4]; - std::size_t actual; - if (src.read(&buf[0], 4, actual) || actual != 4) + std::tie(err, actual) = read(src, &buf[0], 4); + if (err || (4 != actual)) return JEDERR_INVALID_DATA; /* first unpack the number of fuses */ @@ -457,7 +462,8 @@ /* now make sure we have enough data in the source */ /* copy in the data */ - if (src.read(result->fusemap, (result->numfuses + 7) / 8, actual) || actual != (result->numfuses + 7) / 8) + std::tie(err, actual) = read(src, result->fusemap, (result->numfuses + 7) / 8); + if (err || (((result->numfuses + 7) / 8) != actual)) return JEDERR_INVALID_DATA; return JEDERR_NONE; } diff -Nru mame-0.263+dfsg.1/src/lib/util/language.cpp mame-0.264+dfsg.1/src/lib/util/language.cpp --- mame-0.263+dfsg.1/src/lib/util/language.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/language.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -61,11 +61,10 @@ return; } - std::size_t read; - file.read(translation_data.get(), size, read); - if (read != size) + auto const [err, actual] = read(file, translation_data.get(), size); + if (err || (actual != size)) { - osd_printf_error("Error reading translation file: requested %u bytes but got %u bytes\n", size, read); + osd_printf_error("Error reading translation file: requested %u bytes but got %u bytes\n", size, actual); translation_data.reset(); return; } diff -Nru mame-0.263+dfsg.1/src/lib/util/msdib.cpp mame-0.264+dfsg.1/src/lib/util/msdib.cpp --- mame-0.263+dfsg.1/src/lib/util/msdib.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/msdib.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #define LOG_GENERAL (1U << 0) @@ -127,11 +128,10 @@ msdib_error dib_read_file_header(read_stream &fp, std::uint32_t &filelen) noexcept { - std::size_t actual; - // the bitmap file header doesn't use natural alignment bitmap_file_header file_header; - if (fp.read(file_header, sizeof(file_header), actual) || (sizeof(file_header) != actual)) + auto const [err, actual] = read(fp, file_header, sizeof(file_header)); + if (err || (sizeof(file_header) != actual)) { LOG("Error reading DIB file header\n"); return msdib_error::FILE_TRUNCATED; @@ -167,6 +167,7 @@ std::size_t &row_bytes, std::uint32_t length) noexcept { + std::error_condition err; std::size_t actual; // check that these things haven't been padded somehow @@ -178,7 +179,8 @@ if (sizeof(header.core) > length) return msdib_error::FILE_TRUNCATED; std::memset(&header, 0, sizeof(header)); - if (fp.read(&header.core.size, sizeof(header.core.size), actual) || (sizeof(header.core.size) != actual)) + std::tie(err, actual) = read(fp, &header.core.size, sizeof(header.core.size)); + if (err || (sizeof(header.core.size) != actual)) { LOG("Error reading DIB header size (length %u)\n", length); return msdib_error::FILE_TRUNCATED; @@ -208,7 +210,8 @@ { palette_bytes = 3U; std::uint32_t const header_read(std::min(header.core.size, sizeof(header.core)) - sizeof(header.core.size)); - if (fp.read(&header.core.width, header_read, actual) || (header_read != actual)) + std::tie(err, actual) = read(fp, &header.core.width, header_read); + if (err || (header_read != actual)) { LOG("Error reading DIB core header from image data (%u bytes)\n", length); return msdib_error::FILE_TRUNCATED; @@ -261,7 +264,8 @@ { palette_bytes = 4U; std::uint32_t const header_read(std::min(header.info.size, sizeof(header.info)) - sizeof(header.info.size)); - if (fp.read(&header.info.width, header_read, actual) || (header_read != actual)) + std::tie(err, actual) = read(fp, &header.info.width, header_read); + if (err || (header_read != actual)) { LOG("Error reading DIB info header from image data (%u bytes)\n", length); return msdib_error::FILE_TRUNCATED; @@ -445,7 +449,6 @@ msdib_error msdib_read_bitmap_data(random_read &fp, bitmap_argb32 &bitmap, std::uint32_t length, std::uint32_t dirheight) noexcept { // read the bitmap header - std::size_t actual; bitmap_headers header; unsigned palette_bytes; bool indexed; @@ -492,7 +495,8 @@ std::unique_ptr palette_data(new (std::nothrow) std::uint8_t [palette_size]); if (!palette_data) return msdib_error::OUT_OF_MEMORY; - if (fp.read(palette_data.get(), palette_size, actual) || (palette_size != actual)) + auto const [err, actual] = read(fp, palette_data.get(), palette_size); + if (err || (palette_size != actual)) { LOG("Error reading palette from DIB image data (%u bytes)\n", length); return msdib_error::FILE_TRUNCATED; @@ -575,7 +579,8 @@ int const y_inc(top_down ? 1 : -1); for (std::int32_t i = 0, y = top_down ? 0 : (header.info.height - 1); header.info.height > i; ++i, y += y_inc) { - if (fp.read(row_data.get(), row_bytes, actual) || (row_bytes != actual)) + auto const [err, actual] = read(fp, row_data.get(), row_bytes); + if (err || (row_bytes != actual)) { LOG("Error reading DIB row %d data from image data\n", i); return msdib_error::FILE_TRUNCATED; @@ -638,7 +643,8 @@ { for (std::int32_t i = 0, y = top_down ? 0 : (header.info.height - 1); header.info.height > i; ++i, y += y_inc) { - if (fp.read(row_data.get(), mask_row_bytes, actual) || (mask_row_bytes != actual)) + auto const [err, actual] = read(fp, row_data.get(), mask_row_bytes); + if (err || (mask_row_bytes != actual)) { LOG("Error reading DIB mask row %d data from image data\n", i); return msdib_error::FILE_TRUNCATED; diff -Nru mame-0.263+dfsg.1/src/lib/util/plaparse.cpp mame-0.264+dfsg.1/src/lib/util/plaparse.cpp --- mame-0.263+dfsg.1/src/lib/util/plaparse.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/plaparse.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -68,11 +68,14 @@ uint32_t value = 0; // find first digit - uint8_t ch; - std::size_t actual; bool found = false; - while (!src.read(&ch, 1, actual) && actual == 1) + while (true) { + uint8_t ch; + auto const [err, actual] = read(src, &ch, 1); + if (err || (1 != actual)) + break; + // loop over and accumulate digits if (isdigit(ch)) { @@ -189,8 +192,8 @@ curoutput = 0; } - std::size_t actual; - if (src.read(&ch, 1, actual)) + auto const [err, actual] = read(src, &ch, 1); + if (err) return false; if (actual != 1) return true; @@ -227,9 +230,11 @@ int destptr = 0; uint8_t seek; - std::size_t actual; - while (!src.read(&seek, 1, actual) && actual == 1 && isalpha(seek)) + while (true) { + auto const [err, actual] = read(src, &seek, 1); + if (err || (actual != 1) || !isalpha(seek)) + break; dest[destptr++] = tolower(seek); if (destptr == sizeof(dest)) break; @@ -275,8 +280,11 @@ // output polarity (optional) case KW_PHASE: if (LOG_PARSE) printf("Phase...\n"); - while (!src.read(&seek, 1, actual) && actual == 1 && !iscrlf(seek) && pinfo->xorptr < (JED_MAX_FUSES/2)) + while (true) { + auto const [err, actual] = read(src, &seek, 1); + if (err || (actual != 1) || iscrlf(seek) || (pinfo->xorptr >= (JED_MAX_FUSES / 2))) + break; if (seek == '0' || seek == '1') { // 0 is negative @@ -322,19 +330,23 @@ result->numfuses = 0; memset(result->fusemap, 0, sizeof(result->fusemap)); - uint8_t ch; - std::size_t actual; - while (!src.read(&ch, 1, actual) && actual == 1) + while (true) { + std::error_condition err; + size_t actual; + uint8_t ch; + std::tie(err, actual) = read(src, &ch, 1); + if (err || (actual != 1)) + break; switch (ch) { // comment line case '#': - while (!src.read(&ch, 1, actual) && actual == 1) + do { - if (iscrlf(ch)) - break; + std::tie(err, actual) = read(src, &ch, 1); } + while (!err && (actual == 1) && !iscrlf(ch)); break; // keyword diff -Nru mame-0.263+dfsg.1/src/lib/util/png.cpp mame-0.264+dfsg.1/src/lib/util/png.cpp --- mame-0.263+dfsg.1/src/lib/util/png.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/png.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include namespace util { @@ -452,7 +453,7 @@ std::uint8_t tempbuff[4]; // fetch the length of this chunk - err = fp.read(tempbuff, 4, actual); + std::tie(err, actual) = read(fp, tempbuff, 4); if (err) return err; else if (4 != actual) @@ -460,7 +461,7 @@ length = fetch_32bit(tempbuff); // fetch the type of this chunk - err = fp.read(tempbuff, 4, actual); + std::tie(err, actual) = read(fp, tempbuff, 4); if (err) return err; else if (4 != actual) @@ -477,13 +478,8 @@ // read the chunk itself into an allocated memory buffer if (length) { - // allocate memory for this chunk - data.reset(new (std::nothrow) std::uint8_t [length]); - if (!data) - return std::errc::not_enough_memory; - - // read the data from the file - err = fp.read(data.get(), length, actual); + // allocate memory and read the data from the file + std::tie(err, data, actual) = read(fp, length); if (err) { data.reset(); @@ -500,7 +496,7 @@ } // read the CRC - err = fp.read(tempbuff, 4, actual); + std::tie(err, actual) = read(fp, tempbuff, 4); if (err) { data.reset(); @@ -789,8 +785,7 @@ std::uint8_t signature[sizeof(PNG_SIGNATURE)]; // read 8 bytes - std::size_t actual; - std::error_condition err = fp.read(signature, sizeof(signature), actual); + auto const [err, actual] = read(fp, signature, sizeof(signature)); if (err) return err; else if (sizeof(signature) != actual) @@ -941,7 +936,6 @@ static std::error_condition write_chunk(write_stream &fp, const uint8_t *data, uint32_t type, uint32_t length) noexcept { std::error_condition err; - std::size_t written; std::uint8_t tempbuff[8]; std::uint32_t crc; @@ -951,30 +945,24 @@ crc = crc32(0, tempbuff + 4, 4); // write that data - err = fp.write(tempbuff, 8, written); + std::tie(err, std::ignore) = write(fp, tempbuff, 8); if (err) return err; - else if (8 != written) - return std::errc::io_error; // append the actual data if (length > 0) { - err = fp.write(data, length, written); + std::tie(err, std::ignore) = write(fp, data, length); if (err) return err; - else if (length != written) - return std::errc::io_error; crc = crc32(crc, data, length); } // write the CRC put_32bit(tempbuff, crc); - err = fp.write(tempbuff, 4, written); + std::tie(err, std::ignore) = write(fp, tempbuff, 4); if (err) return err; - else if (4 != written) - return std::errc::io_error; return std::error_condition(); } @@ -993,7 +981,6 @@ if (err) return err; - std::size_t written; std::uint8_t tempbuff[8192]; std::uint32_t zlength = 0; z_stream stream; @@ -1006,11 +993,9 @@ crc = crc32(0, tempbuff + 4, 4); // write that data - err = fp.write(tempbuff, 8, written); + std::tie(err, std::ignore) = write(fp, tempbuff, 8); if (err) return err; - else if (8 != written) - return std::errc::io_error; // initialize the stream memset(&stream, 0, sizeof(stream)); @@ -1036,17 +1021,12 @@ if (stream.avail_out < sizeof(tempbuff)) { int bytes = sizeof(tempbuff) - stream.avail_out; - err = fp.write(tempbuff, bytes, written); + std::tie(err, std::ignore) = write(fp, tempbuff, bytes); if (err) { deflateEnd(&stream); return err; } - else if (bytes != written) - { - deflateEnd(&stream); - return std::errc::io_error; - } crc = crc32(crc, tempbuff, bytes); zlength += bytes; } @@ -1079,22 +1059,18 @@ // write the CRC put_32bit(tempbuff, crc); - err = fp.write(tempbuff, 4, written); + std::tie(err, std::ignore) = write(fp, tempbuff, 4); if (err) return err; - else if (4 != written) - return std::errc::io_error; // seek back and update the length err = fp.seek(lengthpos, SEEK_SET); if (err) return err; put_32bit(tempbuff + 0, zlength); - err = fp.write(tempbuff, 4, written); + std::tie(err, std::ignore) = write(fp, tempbuff, 4); if (err) return err; - else if (4 != written) - return std::errc::io_error; // return to the end return fp.seek(lengthpos + 8 + zlength + 4, SEEK_SET); @@ -1326,12 +1302,9 @@ info = &pnginfo; // write the PNG signature - std::size_t written; - std::error_condition err = fp.write(PNG_SIGNATURE, sizeof(PNG_SIGNATURE), written); + auto const [err, written] = write(fp, PNG_SIGNATURE, sizeof(PNG_SIGNATURE)); if (err) return err; - else if (sizeof(PNG_SIGNATURE) != written) - return std::errc::io_error; // write the rest of the PNG data return write_png_stream(fp, *info, bitmap, palette_length, palette); @@ -1347,12 +1320,9 @@ std::error_condition mng_capture_start(random_write &fp, bitmap_t const &bitmap, unsigned rate) noexcept { - std::size_t written; - std::error_condition err = fp.write(MNG_Signature, 8, written); + auto const [err, written] = write(fp, MNG_Signature, 8); if (err) return err; - else if (8 != written) - return std::errc::io_error; uint8_t mhdr[28]; memset(mhdr, 0, 28); diff -Nru mame-0.263+dfsg.1/src/lib/util/simh_tape_file.cpp mame-0.264+dfsg.1/src/lib/util/simh_tape_file.cpp --- mame-0.263+dfsg.1/src/lib/util/simh_tape_file.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/simh_tape_file.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,16 +119,14 @@ void simh_tape_file::raw_read(osd::u8 *const buf, const osd::u32 len) const { - size_t actual_len; - std::error_condition err = m_file.read(buf, len, actual_len); + auto const [err, actual_len] = read(m_file, buf, len); if (err || actual_len != len) // error: we failed to read expected number of bytes throw std::runtime_error(std::string("failed read: ") + (err ? err.message() : std::string("unexpected length"))); } void simh_tape_file::raw_write(const osd::u8 *const buf, const osd::u32 len) const { - size_t actual_len; - std::error_condition err = m_file.write(buf, len, actual_len); + auto const [err, actual_len] = write(m_file, buf, len); if (err || actual_len != len) // error: we failed to write expected number of bytes throw std::runtime_error(std::string("failed write: ") + (err ? err.message() : std::string("unexpected length"))); } diff -Nru mame-0.263+dfsg.1/src/lib/util/un7z.cpp mame-0.264+dfsg.1/src/lib/util/un7z.cpp --- mame-0.263+dfsg.1/src/lib/util/un7z.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/un7z.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -71,8 +71,7 @@ if (!size) return SZ_OK; - std::size_t read_length(0); - std::error_condition const err = file->read_at(currfpos, data, size, read_length); + auto const [err, read_length] = read_at(*file, currfpos, data, size); size = read_length; currfpos += read_length; diff -Nru mame-0.263+dfsg.1/src/lib/util/unzip.cpp mame-0.264+dfsg.1/src/lib/util/unzip.cpp --- mame-0.263+dfsg.1/src/lib/util/unzip.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/unzip.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -154,8 +154,7 @@ while (cd_remaining) { std::size_t const chunk(std::size_t(std::min(std::numeric_limits::max(), cd_remaining))); - std::size_t read_length(0); - std::error_condition const filerr = m_file->read_at(m_ecd.cd_start_disk_offset + cd_offs, &m_cd[cd_offs], chunk, read_length); + auto const [filerr, read_length] = read_at(*m_file, m_ecd.cd_start_disk_offset + cd_offs, &m_cd[cd_offs], chunk); if (filerr) { osd_printf_error( @@ -914,7 +913,7 @@ } // get the compressed data offset - std::uint64_t offset; + std::uint64_t offset = 0; auto const ziperr = get_compressed_data_offset(offset); if (ziperr) return ziperr; @@ -979,7 +978,7 @@ } // read in one buffers' worth of data - filerr = m_file->read_at(m_length - buflen, &buffer[0], buflen, read_length); + std::tie(filerr, read_length) = read_at(*m_file, m_length - buflen, &buffer[0], buflen); if (filerr) { osd_printf_error( @@ -1024,11 +1023,11 @@ } // try to read the ZIP64 ECD locator - filerr = m_file->read_at( + std::tie(filerr, read_length) = read_at( + *m_file, m_length - buflen + offset - ecd64_locator_reader::minimum_length(), &buffer[0], - ecd64_locator_reader::minimum_length(), - read_length); + ecd64_locator_reader::minimum_length()); if (filerr) { osd_printf_error( @@ -1058,7 +1057,7 @@ } // try to read the ZIP64 ECD - filerr = m_file->read_at(ecd64_loc_rd.ecd64_offset(), &buffer[0], ecd64_reader::minimum_length(), read_length); + std::tie(filerr, read_length) = read_at(*m_file, ecd64_loc_rd.ecd64_offset(), &buffer[0], ecd64_reader::minimum_length()); if (filerr) { osd_printf_error( @@ -1160,8 +1159,7 @@ return ziperr; // now go read the fixed-sized part of the local file header - std::size_t read_length; - std::error_condition const filerr = m_file->read_at(m_header.local_header_offset, &m_buffer[0], local_file_header_reader::minimum_length(), read_length); + auto const [filerr, read_length] = read_at(*m_file, m_header.local_header_offset, &m_buffer[0], local_file_header_reader::minimum_length()); if (filerr) { osd_printf_error( @@ -1205,8 +1203,7 @@ std::error_condition zip_file_impl::decompress_data_type_0(std::uint64_t offset, void *buffer, std::size_t length) noexcept { // the data is uncompressed; just read it - std::size_t read_length(0); - std::error_condition const filerr = m_file->read_at(offset, buffer, m_header.compressed_length, read_length); + auto const [filerr, read_length] = read_at(*m_file, offset, buffer, m_header.compressed_length); if (filerr) { osd_printf_error( @@ -1277,12 +1274,11 @@ while (true) { // read in the next chunk of data - std::size_t read_length(0); - auto const filerr = m_file->read_at( + auto const [filerr, read_length] = read_at( + *m_file, offset, &m_buffer[0], - std::size_t(std::min(input_remaining, m_buffer.size())), - read_length); + std::size_t(std::min(input_remaining, m_buffer.size()))); if (filerr) { osd_printf_error( @@ -1393,7 +1389,7 @@ m_header.file_name, m_filename); return archive_file::error::DECOMPRESS_ERROR; } - filerr = m_file->read_at(offset, &m_buffer[0], 4, read_length); + std::tie(filerr, read_length) = read_at(*m_file, offset, &m_buffer[0], 4); if (filerr) { osd_printf_error( @@ -1425,7 +1421,7 @@ m_header.file_name, m_filename); return archive_file::error::DECOMPRESS_ERROR; } - filerr = m_file->read_at(offset, &m_buffer[0], props_size, read_length); + std::tie(filerr, read_length) = read_at(*m_file, offset, &m_buffer[0], props_size); if (filerr) { osd_printf_error( @@ -1472,11 +1468,11 @@ while (0 < input_remaining) { // read in the next chunk of data - filerr = m_file->read_at( + std::tie(filerr, read_length) = read_at( + *m_file, offset, &m_buffer[0], - std::size_t((std::min)(input_remaining, m_buffer.size())), - read_length); + std::size_t((std::min)(input_remaining, m_buffer.size()))); if (filerr) { osd_printf_error( @@ -1569,12 +1565,11 @@ while (input_remaining && length) { // read in the next chunk of data - std::size_t read_length(0); - auto const filerr = m_file->read_at( + auto const [filerr, read_length] = read_at( + *m_file, offset, &m_buffer[0], - std::size_t(std::min(input_remaining, m_buffer.size())), - read_length); + std::size_t(std::min(input_remaining, m_buffer.size()))); if (filerr) { osd_printf_error( diff -Nru mame-0.263+dfsg.1/src/lib/util/xmlfile.cpp mame-0.264+dfsg.1/src/lib/util/xmlfile.cpp --- mame-0.263+dfsg.1/src/lib/util/xmlfile.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/lib/util/xmlfile.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -41,14 +41,14 @@ void write_escaped(core_file &file, std::string const &str) { + // FIXME: check for errors std::string::size_type pos = 0; while ((str.size() > pos) && (std::string::npos != pos)) { std::string::size_type const found = str.find_first_of("\"&<>", pos); if (found != std::string::npos) { - std::size_t written; - file.write(&str[pos], found - pos, written); + write(file, &str[pos], found - pos); switch (str[found]) { case '"': file.puts("""); pos = found + 1; break; @@ -60,8 +60,7 @@ } else { - std::size_t written; - file.write(&str[pos], str.size() - pos, written); + write(file, &str[pos], str.size() - pos); pos = found; } } @@ -134,8 +133,7 @@ char tempbuf[TEMP_BUFFER_SIZE]; // read as much as we can - size_t bytes; - file.read(tempbuf, sizeof(tempbuf), bytes); // TODO: better error handling + auto const [err, bytes] = util::read(file, tempbuf, sizeof(tempbuf)); // FIXME: better error handling done = !bytes; // parse the data diff -Nru mame-0.263+dfsg.1/src/mame/acorn/atom.cpp mame-0.264+dfsg.1/src/mame/acorn/atom.cpp --- mame-0.263+dfsg.1/src/mame/acorn/atom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/acorn/atom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -710,6 +710,9 @@ void atom_state::atom_common(machine_config &config) { + [[maybe_unused]] constexpr auto X1 = 3.579545_MHz_XTAL; // MC6847 Clock + constexpr auto X2 = 4_MHz_XTAL; // CPU Clock - a divider reduces it to 1MHz + /* basic machine hardware */ M6502(config, m_maincpu, X2/4); @@ -758,7 +761,8 @@ atom_common(config); m_maincpu->set_addrmap(AS_PROGRAM, &atom_state::atom_mem); - I8271(config, m_fdc, 0); + // Atom Disc Pack + I8271(config, m_fdc, 4_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(atom_state::atom_8271_interrupt_callback)); m_fdc->hdl_wr_callback().set(FUNC(atom_state::motor_w)); FLOPPY_CONNECTOR(config, I8271_TAG ":0", atom_floppies, "525sssd", atom_state::floppy_formats).enable_sound(true); diff -Nru mame-0.263+dfsg.1/src/mame/acorn/atom.h mame-0.264+dfsg.1/src/mame/acorn/atom.h --- mame-0.263+dfsg.1/src/mame/acorn/atom.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/acorn/atom.h 2024-03-25 14:00:46.000000000 +0000 @@ -37,9 +37,6 @@ #define BASERAM_TAG "baseram" -#define X1 XTAL(3'579'545) // MC6847 Clock -#define X2 XTAL(4'000'000) // CPU Clock - a divider reduces it to 1MHz - class atom_state : public driver_device { public: diff -Nru mame-0.263+dfsg.1/src/mame/acorn/z88_impexp.cpp mame-0.264+dfsg.1/src/mame/acorn/z88_impexp.cpp --- mame-0.263+dfsg.1/src/mame/acorn/z88_impexp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/acorn/z88_impexp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -181,9 +181,8 @@ std::error_condition err; while (true) { - size_t actual; uint8_t b; - err = file.read(&b, 1, actual); + auto const [err, actual] = read(file, &b, 1); if (err || actual != 1) break; diff -Nru mame-0.263+dfsg.1/src/mame/adds/4000_260.cpp mame-0.264+dfsg.1/src/mame/adds/4000_260.cpp --- mame-0.263+dfsg.1/src/mame/adds/4000_260.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/adds/4000_260.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,121 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + ADDS 4000/260 + + ASCII/ANSI terminal + + Hardware: + - P-80C32-16 + - KM622560LP-7L (32k RAM) + - CY6225LL-70 (32k RAM) + - LSI Victor 006-9802760 REV B + - KM622560LP-7L x2 (32k RAM x2) + - 16 MHz XTAL, 44.976 MHz XTAL + + TODO: + - Everything + + Notes: + - Other models in this line: 4000/260C, 4000/260LF, 4000/260LFC + - Sold under the ADDS brand, but ADDS was part of SunRiver Data Systems + by then, which became Boundless Technologies. + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/mcs51/mcs51.h" + + +namespace { + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class _4000_260_state : public driver_device +{ +public: + _4000_260_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void _4000_260(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + + void mem_map(address_map &map); +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void _4000_260_state::mem_map(address_map &map) +{ + map(0x0000, 0xffff).rom(); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( _4000_260 ) +INPUT_PORTS_END + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void _4000_260_state::machine_start() +{ +} + +void _4000_260_state::machine_reset() +{ +} + + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** + +void _4000_260_state::_4000_260(machine_config &config) +{ + I80C32(config, m_maincpu, 16_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &_4000_260_state::mem_map); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( 4000_260 ) + ROM_REGION(0x40000, "maincpu", 0) + // 598-0010669 3.16 SunRiver Data Systems 1995 + ROM_LOAD("4000_260.bin", 0x00000, 0x40000, CRC(b957cd1d) SHA1(1b1185174ba95dca004169e4e1b51b05c8991c43)) +ROM_END + + +} // anonymous namespace + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1995, 4000_260, 0, 0, _4000_260, _4000_260, _4000_260_state, empty_init, "ADDS", "4000/260", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/adds/adds2020.cpp mame-0.264+dfsg.1/src/mame/adds/adds2020.cpp --- mame-0.263+dfsg.1/src/mame/adds/adds2020.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/adds/adds2020.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,144 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/*********************************************************************************************************************************** + + Skeleton driver for ADDS 2020 terminal. + + The PCB has a 68-pin PLCC ASIC at the top right corner, next to the 36.000 (Y4), 24.0000 (Y5), 4.9152 MHz (Y6) XTALs: + + ©NCR 1986 + 006-0130001 PT + 200-87700 + M823270 8701A + + This presumably does the video encoding, and possibly also contains the character graphics (not present in any dumped ROMs). + +***********************************************************************************************************************************/ + +#include "emu.h" +//#include "bus/rs232/rs232.h" +#include "cpu/mcs51/mcs51.h" +#include "machine/input_merger.h" +#include "machine/nvram.h" +#include "machine/scn_pci.h" +#include "video/scn2674.h" +#include "screen.h" + +namespace { + +class adds2020_state : public driver_device +{ +public: + adds2020_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_epci(*this, "epci") + , m_avdc(*this, "avdc") + , m_ram(*this, "nvram") + { + } + + void adds2020(machine_config &config); + +private: + SCN2674_DRAW_CHARACTER_MEMBER(draw_character); + + u8 char_r(offs_t offset); + + void unknown_0000_w(u8 data); + void unknown_9800_w(offs_t offset, u8 data); + + void prog_map(address_map &map); + void ext_map(address_map &map); + void char_map(address_map &map); + + required_device m_maincpu; + required_device m_epci; + required_device m_avdc; + required_shared_ptr m_ram; +}; + +SCN2674_DRAW_CHARACTER_MEMBER(adds2020_state::draw_character) +{ +} + +u8 adds2020_state::char_r(offs_t offset) +{ + return m_ram[offset & 0x1fff]; +} + +void adds2020_state::unknown_0000_w(u8 data) +{ + logerror("%s: Writing %02Xh to 0000h\n", machine().describe_context(), data); +} + +void adds2020_state::unknown_9800_w(offs_t offset, u8 data) +{ + logerror("%s: Writing %02Xh to %04Xh\n", machine().describe_context(), data, offset + 0x9800); +} + +void adds2020_state::prog_map(address_map &map) +{ + map(0x0000, 0xbfff).rom().region("firmware", 0); +} + +void adds2020_state::ext_map(address_map &map) +{ + map(0x0000, 0x0000).w(FUNC(adds2020_state::unknown_0000_w)); + map(0x4000, 0x5fff).ram().share("nvram"); + map(0x6000, 0x67ff).mirror(0x1800).ram(); // code suggests one HW variant may have a full 8K here + map(0x8000, 0x8000).select(6).lr8([this](offs_t offset) { return m_epci->read(offset >> 1); }, "epci_r"); + map(0x8001, 0x8001).select(6).lw8([this](offs_t offset, u8 data) { m_epci->write(offset >> 1, data); }, "epci_w"); + map(0x8800, 0x8807).rw(m_avdc, FUNC(scn2674_device::read), FUNC(scn2674_device::write)); + map(0x9800, 0x9801).w(FUNC(adds2020_state::unknown_9800_w)); +} + +void adds2020_state::char_map(address_map &map) +{ + map.global_mask(0x7ff); + map(0x000, 0x7ff).ram(); +} + +static INPUT_PORTS_START(adds2020) +INPUT_PORTS_END + +void adds2020_state::adds2020(machine_config &config) +{ + I8031(config, m_maincpu, 10.92_MHz_XTAL); // P8031AH + m_maincpu->set_addrmap(AS_PROGRAM, &adds2020_state::prog_map); + m_maincpu->set_addrmap(AS_IO, &adds2020_state::ext_map); + + INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, MCS51_INT1_LINE); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // NEC D4464C-15L + 3.5V battery (only first 3K is actually saved) + + SCN2661B(config, m_epci, 4.9152_MHz_XTAL); + m_epci->rxrdy_handler().set("mainint", FUNC(input_merger_device::in_w<0>)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + //screen.set_raw(24_MHz_XTAL, 960, 0, 800, 361, 0, 338); + screen.set_raw(36_MHz_XTAL, 1440, 0, 1188, 361, 0, 338); + screen.set_screen_update(m_avdc, FUNC(scn2674_device::screen_update)); + + SCN2674(config, m_avdc, 36_MHz_XTAL / 9); // SCN2674B + m_avdc->set_character_width(9); // cell width guessed (10 in 80-column mode?) + m_avdc->set_screen("screen"); + m_avdc->set_addrmap(0, &adds2020_state::char_map); + m_avdc->set_display_callback(FUNC(adds2020_state::draw_character)); + m_avdc->mbc_char_callback().set(FUNC(adds2020_state::char_r)); + m_avdc->breq_callback().set_inputline(m_maincpu, MCS51_T0_LINE); + m_avdc->intr_callback().set("mainint", FUNC(input_merger_device::in_w<1>)); + + // TODO: speaker +} + +ROM_START(adds2020) + ROM_REGION(0xc000, "firmware", ROMREGION_ERASEFF) + ROM_LOAD("2020_v2.5_ua5.bin", 0x0000, 0x4000, CRC(2d9e3397) SHA1(9aec8fdfe064618c20b4ba85dd8b71a44e29bbd3)) + ROM_LOAD("2020_v2.5_ua6.bin", 0x4000, 0x2000, CRC(f4cbda6f) SHA1(efe03a15d7eab4038de1e8118c6891d2078166fd)) + ROM_LOAD("2020_v2.5_ua8.bin", 0x8000, 0x4000, CRC(4a8ac850) SHA1(ce02a0e904ed07930a891360f1e5779fbee8eaac)) +ROM_END + +} // anonymous namespace + +COMP(1986, adds2020, 0, 0, adds2020, adds2020, adds2020_state, empty_init, "Applied Digital Data Systems", "ADDS 2020", MACHINE_IS_SKELETON) diff -Nru mame-0.263+dfsg.1/src/mame/adds/vp60.cpp mame-0.264+dfsg.1/src/mame/adds/vp60.cpp --- mame-0.263+dfsg.1/src/mame/adds/vp60.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/adds/vp60.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,136 @@ +// license:BSD-3-Clause +// copyright-holders: +/*********************************************************************************************************************************** + +Skeleton driver for ADDS Viewpoint 60 terminal. +No significant progress can be made until the 8051 has its internal ROM dumped. + +************************************************************************************************************************************/ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" +#include "cpu/mcs51/mcs51.h" +//#include "machine/er2055.h" +#include "video/i8275.h" +#include "screen.h" + + +namespace { + +class vp60_state : public driver_device +{ +public: + vp60_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_crtc(*this, "crtc") + , m_p_chargen(*this, "chargen") + { } + + void vp60(machine_config &config); + +private: + I8275_DRAW_CHARACTER_MEMBER(draw_character); + u8 crtc_r(offs_t offset); + void crtc_w(offs_t offset, u8 data); + + void io_map(address_map &map); + void kbd_map(address_map &map); + void mem_map(address_map &map); + + required_device m_maincpu; + required_device m_crtc; + required_region_ptr m_p_chargen; +}; + +I8275_DRAW_CHARACTER_MEMBER(vp60_state::draw_character) +{ +} + +u8 vp60_state::crtc_r(offs_t offset) +{ + return m_crtc->read(offset >> 8); +} + +void vp60_state::crtc_w(offs_t offset, u8 data) +{ + m_crtc->write(offset >> 8, data); +} + +void vp60_state::mem_map(address_map &map) +{ + map(0x0000, 0x2fff).rom().region("maincpu", 0); +} + +void vp60_state::io_map(address_map &map) +{ + map(0x8000, 0x87ff).ram(); + map(0xc000, 0xc000).select(0x100).mirror(0xff).rw(FUNC(vp60_state::crtc_r), FUNC(vp60_state::crtc_w)); +} + +void vp60_state::kbd_map(address_map &map) +{ + map(0x000, 0x3ff).rom().region("keyboard", 0); +} + +static INPUT_PORTS_START( vp60 ) +INPUT_PORTS_END + +void vp60_state::vp60(machine_config &config) +{ + I8051(config, m_maincpu, 10.92_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &vp60_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &vp60_state::io_map); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_raw(25.92_MHz_XTAL, 1600, 0, 1280, 270, 0, 250); + //screen.set_raw(25.92_MHz_XTAL, 1632, 0, 1280, 319, 0, 275); + screen.set_screen_update("crtc", FUNC(i8275_device::screen_update)); + + I8275(config, m_crtc, 25.92_MHz_XTAL / 16); + m_crtc->set_character_width(16); + m_crtc->set_display_callback(FUNC(vp60_state::draw_character)); + m_crtc->set_screen("screen"); + + i8035_device &kbdcpu(I8035(config, "kbdcpu", 3.579545_MHz_XTAL)); // 48-300-010 XTAL + kbdcpu.set_addrmap(AS_PROGRAM, &vp60_state::kbd_map); +} + + +/************************************************************************************************************** + +ADDS Viewpoint 60. +Chips: P8051, P8275, EAROM ER-2055, HM6116P-4 +Crystals: 25.92, 10.920 +Keyboard: INS8035N-6, crystal marked 48-300-010. + +***************************************************************************************************************/ + +ROM_START( vp60 ) + ROM_REGION(0x4000, "maincpu", ROMREGION_ERASE00) + ROM_LOAD( "p8051.ub1", 0x0000, 0x1000, NO_DUMP ) // internal ROM not dumped + ROM_LOAD( "pgm.uc1", 0x2000, 0x1000, CRC(714ca569) SHA1(405424369fd5458e02c845c104b2cb386bd857d2) ) + ROM_CONTINUE( 0x1000, 0x1000 ) + // Stubs filling in for missing code + ROM_FILL( 0x0000, 1, 0x02 ) + ROM_FILL( 0x0001, 1, 0x10 ) + ROM_FILL( 0x0002, 1, 0x09 ) + ROM_FILL( 0x005d, 1, 0x02 ) + ROM_FILL( 0x005e, 1, 0x27 ) + ROM_FILL( 0x005f, 1, 0x2e ) + ROM_FILL( 0x0100, 1, 0x22 ) + ROM_FILL( 0x0500, 1, 0x22 ) + ROM_FILL( 0x0600, 1, 0x22 ) + ROM_FILL( 0x0800, 1, 0x22 ) + + ROM_REGION(0x1000, "chargen", 0) + ROM_LOAD( "font.uc4", 0x0000, 0x1000, CRC(3c4d39c0) SHA1(9503c0d5a76e8073c94c86be57bcb312641f6cc4) ) + + ROM_REGION(0x400, "keyboard", 0) + ROM_LOAD( "195.kbd", 0x0000, 0x0400, CRC(14885da3) SHA1(3b06f658af1a62b28e62d8b3a557b74169917a12) ) +ROM_END + +} // anonymous namespace + + +COMP( 1982, vp60, 0, 0, vp60, vp60, vp60_state, empty_init, "ADDS", "Viewpoint 60", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/alba/albazg.cpp mame-0.264+dfsg.1/src/mame/alba/albazg.cpp --- mame-0.263+dfsg.1/src/mame/alba/albazg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/alba/albazg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,7 +8,7 @@ Notes: -The name of this hardware is "Alba ZG board",a newer revision of the - "Alba ZC board" used by Hanaroku (albazc.cpp driver). Test mode says clearly that this is + "Alba ZC board" used by Hanaroku (seta/albazc.cpp driver). Test mode says clearly that this is from 1991. TODO: @@ -35,12 +35,14 @@ *******************************************************************************************/ #include "emu.h" + #include "cpu/z80/z80.h" #include "machine/eepromser.h" #include "machine/i8255.h" #include "machine/watchdog.h" #include "sound/ay8910.h" #include "video/mc6845.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -138,19 +140,8 @@ /***************************************************************************************/ -static const gfx_layout charlayout = -{ - 8,8, - RGN_FRAC(1,4), - 4, - { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 -}; - static GFXDECODE_START( gfx_yumefuda ) - GFXDECODE_ENTRY( "tiles", 0x0000, charlayout, 0, 8 ) + GFXDECODE_ENTRY( "tiles", 0x0000, gfx_8x8x4_planar, 0, 8 ) GFXDECODE_END @@ -325,34 +316,35 @@ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write) - // Unused, on the PCB there's just one bank + // Added by translating the manual (both Yumefuda and Hana Awase 6 Part II have the same DIPs) PORT_START("DSW1") - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - - // Added by translating the manual - PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, "Learn Mode" )//SW Dip-Switches + PORT_DIPNAME( 0x01, 0x01, "Learn Mode" ) PORT_DIPLOCATION ("DSW1:!8") //SW Dip-Switches PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x02, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x04, 0x04, "Hopper Payout" ) - PORT_DIPSETTING( 0x04, "Hanafuda Type" )//hanaawase + PORT_SERVICE( 0x02, IP_ACTIVE_LOW ) PORT_DIPLOCATION ("DSW1:!7") + PORT_DIPNAME( 0x04, 0x04, "Hopper Payout" ) PORT_DIPLOCATION ("DSW1:!6") + PORT_DIPSETTING( 0x04, "Hanafuda Type" ) //hanaawase PORT_DIPSETTING( 0x00, "Royal Type" ) - PORT_DIPNAME( 0x08, 0x08, "Panel Type" ) - PORT_DIPSETTING( 0x08, "Hanafuda Panel" )//hanaawase + PORT_DIPNAME( 0x08, 0x08, "Panel Type" ) PORT_DIPLOCATION ("DSW1:!5") + PORT_DIPSETTING( 0x08, "Hanafuda Panel" ) //hanaawase PORT_DIPSETTING( 0x00, "Royal Panel" ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION ("DSW1:!4") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION ("DSW1:!3") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )//Screen Orientation + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION ("DSW1:!2") //Screen Orientation PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) )//Screen Flip + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPLOCATION ("DSW1:!1") //Screen Flip PORT_DIPSETTING( 0x80, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )//pressing Flip-Flop button makes the screen flip + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) //pressing Flip-Flop button makes the screen flip + + // Unused, on the PCB there's just one bank + PORT_START("DSW2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + INPUT_PORTS_END /***************************************************************************************/ @@ -413,8 +405,8 @@ SPEAKER(config, "mono").front_center(); ay8910_device &aysnd(AY8910(config, "aysnd", 12_MHz_XTAL / 16)); // guessed to use the same xtal as the crtc - aysnd.port_a_read_callback().set_ioport("DSW1"); - aysnd.port_b_read_callback().set_ioport("DSW2"); + aysnd.port_a_read_callback().set_ioport("DSW2"); + aysnd.port_b_read_callback().set_ioport("DSW1"); aysnd.port_a_write_callback().set(FUNC(albazg_state::output_w)); aysnd.add_route(ALL_OUTPUTS, "mono", 0.50); } @@ -428,16 +420,34 @@ ROM_LOAD("zg004y01.u42", 0x8000, 0x8000, CRC(ae99126b) SHA1(4ae2c1c804bbc505a013f5e3d98c0bfbb51b747a)) ROM_REGION( 0x10000, "tiles", 0 ) - ROM_LOAD("zg001006.u6", 0x0000, 0x4000, CRC(a5df443c) SHA1(a6c088a463c05e43a7b559c5d0afceddc88ef476)) - ROM_LOAD("zg001005.u5", 0x4000, 0x4000, CRC(158b6cde) SHA1(3e335b7dc1bbae2edb02722025180f32ab91f69f)) - ROM_LOAD("zg001004.u4", 0x8000, 0x4000, CRC(d8676435) SHA1(9b6df5378948f492717e1a4d9c833ddc5a9e8225)) - ROM_LOAD("zg001003.u3", 0xc000, 0x4000, CRC(5822ff27) SHA1(d40fa0790de3c912f770ef8f610bd8c42bc3500f)) + ROM_LOAD("zg001003.u3", 0x0000, 0x4000, CRC(5822ff27) SHA1(d40fa0790de3c912f770ef8f610bd8c42bc3500f)) + ROM_LOAD("zg001004.u4", 0x4000, 0x4000, CRC(d8676435) SHA1(9b6df5378948f492717e1a4d9c833ddc5a9e8225)) + ROM_LOAD("zg001005.u5", 0x8000, 0x4000, CRC(158b6cde) SHA1(3e335b7dc1bbae2edb02722025180f32ab91f69f)) + ROM_LOAD("zg001006.u6", 0xc000, 0x4000, CRC(a5df443c) SHA1(a6c088a463c05e43a7b559c5d0afceddc88ef476)) + + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD("zg1-007.u13", 0x000, 0x104, NO_DUMP ) // PAL +ROM_END + +// 花合せ・6 Part Ⅱ +// P0-066A PCB +ROM_START( hana6pt2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) // code + ROM_LOAD("zg006p11.u42", 0x00000, 0x10000, CRC(4e455ac5) SHA1(df3a327acd2eb8f566ba6b86342d8fb6f7e89560)) + // u43 empty on this PCB + + ROM_REGION( 0x10000, "tiles", 0 ) // same GFX as Yumefuda + ROM_LOAD("zg001003.u3", 0x0000, 0x4000, CRC(5822ff27) SHA1(d40fa0790de3c912f770ef8f610bd8c42bc3500f)) + ROM_LOAD("zg001004.u4", 0x4000, 0x4000, CRC(d8676435) SHA1(9b6df5378948f492717e1a4d9c833ddc5a9e8225)) + ROM_LOAD("zg001005.u5", 0x8000, 0x4000, CRC(158b6cde) SHA1(3e335b7dc1bbae2edb02722025180f32ab91f69f)) + ROM_LOAD("zg001006.u6", 0xc000, 0x4000, CRC(a5df443c) SHA1(a6c088a463c05e43a7b559c5d0afceddc88ef476)) - ROM_REGION( 0x100, "proms", 0 ) - ROM_LOAD("zg1-007.u13", 0x000, 0x100, NO_DUMP ) //could be either PROM or PAL + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD("zg2-007.u13", 0x000, 0x104, NO_DUMP ) // PAL ROM_END -} // Anonymous namespace +} // anonymous namespace -GAME( 1991, yumefuda, 0, yumefuda, yumefuda, albazg_state, empty_init, ROT0, "Alba", "Yumefuda [BET]", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, yumefuda, 0, yumefuda, yumefuda, albazg_state, empty_init, ROT0, "Alba", "Yumefuda", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, hana6pt2, 0, yumefuda, yumefuda, albazg_state, empty_init, ROT0, "Alba", "Hana Awase 6 Part II", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/alba/rmhaihai.cpp mame-0.264+dfsg.1/src/mame/alba/rmhaihai.cpp --- mame-0.263+dfsg.1/src/mame/alba/rmhaihai.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/alba/rmhaihai.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -787,7 +787,7 @@ GAME( 1985, rmhaihai, 0, rmhaihai, rmhaihai, rmhaihai_state, init_rmhaihai, ROT0, "Alba", "Real Mahjong Haihai (Japan, newer)", MACHINE_SUPPORTS_SAVE ) // writes Homedata in NVRAM GAME( 1985, rmhaihai2, rmhaihai, rmhaihai, rmhaihai, rmhaihai_state, init_rmhaihai, ROT0, "Alba", "Real Mahjong Haihai (Japan, older)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, rmhaihib, rmhaihai, rmhaihai, rmhaihib, rmhaihai_state, init_rmhaihai, ROT0, "Alba", "Real Mahjong Haihai [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, rmhaihib, rmhaihai, rmhaihai, rmhaihib, rmhaihai_state, init_rmhaihai, ROT0, "Alba", "Real Mahjong Haihai (Japan, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, rmhaijin, 0, rmhaihai, rmhaihai, rmhaihai_state, init_rmhaihai, ROT0, "Alba", "Real Mahjong Haihai Jinji Idou Hen (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, rmhaisei, 0, rmhaisei, rmhaihai, rmhaisei_state, init_rmhaihai, ROT0, "Visco", "Real Mahjong Haihai Seichouhen (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, themj, 0, themj, rmhaihai, themj_state, init_rmhaihai, ROT0, "Visco", "The Mah-jong (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/alliedleisure/aleisttl.cpp mame-0.264+dfsg.1/src/mame/alliedleisure/aleisttl.cpp --- mame-0.263+dfsg.1/src/mame/alliedleisure/aleisttl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/alliedleisure/aleisttl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -137,4 +137,4 @@ } // anonymous namespace -GAME( 1975, sburners, 0, sburners, 0, sburners_state, empty_init, ROT0, "Allied Leisure", "Street Burners [TTL]", MACHINE_IS_SKELETON ) +GAME( 1975, sburners, 0, sburners, 0, sburners_state, empty_init, ROT0, "Allied Leisure", "Street Burners", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/alliedleisure/aztarac.cpp mame-0.264+dfsg.1/src/mame/alliedleisure/aztarac.cpp --- mame-0.263+dfsg.1/src/mame/alliedleisure/aztarac.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/alliedleisure/aztarac.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,8 +89,6 @@ }; -// audio - uint8_t aztarac_state::sound_r() { return m_sound_status & 0x01; @@ -130,8 +128,6 @@ } -// video - #define AVECTOR(x, y, color, intensity) \ m_vector->add_point(m_xcenter + ((x) << 16), m_ycenter - ((y) << 16), color, intensity) @@ -225,8 +221,6 @@ } -// machine - /************************************* * * Machine init diff -Nru mame-0.263+dfsg.1/src/mame/apple/apple2e.cpp mame-0.264+dfsg.1/src/mame/apple/apple2e.cpp --- mame-0.263+dfsg.1/src/mame/apple/apple2e.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/apple2e.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1119,16 +1119,42 @@ void apple2e_state::machine_reset() { + // All MMU switches off (80STORE, RAMRD, RAMWRT, INTCXROM, ALTZP, SLOTC3ROM, PAGE2, HIRES, INTC8ROM) + // Sather, Fig 5.13 + m_ramrd = false; + m_ramwrt = false; + m_altzp = false; + m_slotc3rom = false; + m_intc8rom = false; + + // Certain IOU switches off (80STORE, 80COL, ALTCHR, PAGE2, HIRES, AN0, AN1, AN2, AN3) + // Sather, Fig 7.1 + m_video->a80store_w(false); + m_video->a80col_w(false); + m_video->altcharset_w(false); m_video->page2_w(false); - m_video->monohgr_w(m_iscecm); + m_video->res_w(0); + + // IIe IOU m_an0 = m_an1 = m_an2 = m_an3 = false; m_gameio->an0_w(0); m_gameio->an1_w(0); m_gameio->an2_w(0); m_gameio->an3_w(0); - m_vbl = m_vblmask = false; - m_slotc3rom = false; + + // IIc IOU + m_ioudis = true; m_romswitch = false; + + // LC resets to read ROM, write RAM, no pre-write, bank 2 + // Sather, Fig 5.13 + m_lcram = false; + m_lcram2 = true; + m_lcprewrite = false; + m_lcwriteenable = true; + + m_video->monohgr_w(m_iscecm); + m_vbl = m_vblmask = false; m_irqmask = 0; m_strobe = 0; m_franklin_last_fkeys = 0; @@ -1142,7 +1168,6 @@ m_xirq = false; m_yirq = false; m_mockingboard4c = false; - m_intc8rom = false; m_cec_bank = 0; m_accel_unlocked = false; m_accel_stage = 0; @@ -1221,23 +1246,10 @@ } - m_video->a80store_w(false); - m_altzp = false; - m_ramrd = false; - m_ramwrt = false; - m_ioudis = true; - - // LC default state: read ROM, write enabled, Dxxx bank 2 - m_lcram = false; - m_lcram2 = true; - m_lcprewrite = false; - m_lcwriteenable = true; - lcrom_update(); - m_exp_bankhior = 0xf0; // sync up the banking with the variables. - // Understanding the Apple IIe: RESET on the IIe always resets LC state, doesn't on II/II+ with discrete LC + lcrom_update(); auxbank_update(); update_slotrom_banks(); } @@ -1320,20 +1332,13 @@ m_reset_latch = true; m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - // As per Sather: LC resets to read ROM, write RAM, no pre-write, bank 2 - m_lcram = false; - m_lcram2 = true; - m_lcprewrite = false; - m_lcwriteenable = true; - lcrom_update(); - - // More Sather: all MMU switches off (80STORE, RAMRD, RAMWRT, INTCXROM, ALTZP, SLOTC3ROM, PAGE2, HIRES, INTC8ROM) - m_video->a80store_w(false); + // All MMU switches off (80STORE, RAMRD, RAMWRT, INTCXROM, ALTZP, SLOTC3ROM, PAGE2, HIRES, INTC8ROM) + // Sather, Fig 5.13 m_ramrd = false; m_ramwrt = false; m_altzp = false; - m_video->page2_w(false); - m_video->res_w(0); + m_slotc3rom = false; + m_intc8rom = false; // reset intcxrom to default if ((m_isiic) || (m_isace500)) @@ -1345,6 +1350,30 @@ m_intcxrom = false; m_slotc3rom = false; } + + // Certain IOU switches off (80STORE, 80COL, ALTCHR, PAGE2, HIRES, AN0, AN1, AN2, AN3) + // Sather, Fig 7.1 + m_video->a80store_w(false); + m_video->a80col_w(false); + m_video->altcharset_w(false); + m_video->page2_w(false); + m_video->res_w(0); + + // IIe IOU + m_an0 = m_an1 = m_an2 = m_an3 = false; + m_gameio->an0_w(0); + m_gameio->an1_w(0); + m_gameio->an2_w(0); + m_gameio->an3_w(0); + + // LC resets to read ROM, write RAM, no pre-write, bank 2 + // Sather, Fig 5.13 + m_lcram = false; + m_lcram2 = true; + m_lcprewrite = false; + m_lcwriteenable = true; + + lcrom_update(); auxbank_update(); update_slotrom_banks(); } diff -Nru mame-0.263+dfsg.1/src/mame/apple/apple2gs.cpp mame-0.264+dfsg.1/src/mame/apple/apple2gs.cpp --- mame-0.263+dfsg.1/src/mame/apple/apple2gs.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/apple2gs.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1681,18 +1681,18 @@ return read_floatingbus(); case 0x60: // button 3 on IIgs - return m_gameio->sw3_r() | uFloatingBus7; + return (m_gameio->sw3_r() ? 0x80 : 0x00) | uFloatingBus7; case 0x61: // button 0 or Open Apple // HACK/TODO: the 65816 loses a race to the microcontroller on reset if (m_adb_reset_freeze > 0) m_adb_reset_freeze--; - return m_gameio->sw0_r() | uFloatingBus7 | ((m_adb_p3_last & 0x20) ? 0x80 : 0); + return ((m_gameio->sw0_r() || (m_adb_p3_last & 0x20)) ? 0x80 : 0) | uFloatingBus7; case 0x62: // button 1 or Option - return m_gameio->sw1_r() | uFloatingBus7 | ((m_adb_p3_last & 0x10) ? 0x80 : 0); + return ((m_gameio->sw1_r() || (m_adb_p3_last & 0x10)) ? 0x80 : 0) | uFloatingBus7; case 0x63: // button 2 or SHIFT key - return m_gameio->sw2_r() | uFloatingBus7; + return (m_gameio->sw2_r() ? 0x80 : 0x00) | uFloatingBus7; case 0x64: // joy 1 X axis if (!m_gameio->is_device_connected()) return 0x80 | uFloatingBus7; diff -Nru mame-0.263+dfsg.1/src/mame/apple/cuda.cpp mame-0.264+dfsg.1/src/mame/apple/cuda.cpp --- mame-0.263+dfsg.1/src/mame/apple/cuda.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/cuda.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -484,8 +484,8 @@ bool cuda_device::nvram_read(util::read_stream &file) { - size_t actual; - if (!file.read(m_disk_pram, 0x100, actual) && actual == 0x100) + auto const [err, actual] = read(file, m_disk_pram, 0x100); + if (!err && (actual == 0x100)) { LOGMASKED(LOG_PRAM, "Loaded PRAM from disk\n"); return true; @@ -496,9 +496,9 @@ bool cuda_device::nvram_write(util::write_stream &file) { - size_t actual; LOGMASKED(LOG_PRAM, "Writing PRAM to disk\n"); - return !file.write(m_pram, 0x100, actual) && actual == 0x100; + auto const [err, actual] = write(file, m_pram, 0x100); + return !err; } // Cuda v2.XX ------------------------------------------------------------------------ diff -Nru mame-0.263+dfsg.1/src/mame/apple/egret.cpp mame-0.264+dfsg.1/src/mame/apple/egret.cpp --- mame-0.263+dfsg.1/src/mame/apple/egret.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/egret.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -549,8 +549,8 @@ bool egret_device::nvram_read(util::read_stream &file) { - size_t actual; - if (!file.read(m_disk_pram, 0x100, actual) && actual == 0x100) + auto const [err, actual] = read(file, m_disk_pram, 0x100); + if (!err && (actual == 0x100)) { LOGMASKED(LOG_PRAM, "PRAM read from disk OK"); m_pram_loaded = false; @@ -561,6 +561,6 @@ bool egret_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_pram, 0x100, actual) && actual == 0x100; + auto const [err, actual] = write(file, m_pram, 0x100); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/apple/heathrow.cpp mame-0.264+dfsg.1/src/mame/apple/heathrow.cpp --- mame-0.263+dfsg.1/src/mame/apple/heathrow.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/heathrow.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -675,8 +675,8 @@ bool ohare_device::nvram_read(util::read_stream &file) { - size_t actual; - if (!file.read(m_nvram, 0x8000, actual) && actual == 0x8000) + auto const [err, actual] = read(file, m_nvram, 0x8000); + if (!err && (actual == 0x8000)) { return true; } @@ -685,8 +685,8 @@ bool ohare_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_nvram, 0x8000, actual) && actual == 0x8000; + auto const [err, actual] = write(file, m_nvram, 0x8000); + return !err; } // Audio support diff -Nru mame-0.263+dfsg.1/src/mame/apple/maclc.cpp mame-0.264+dfsg.1/src/mame/apple/maclc.cpp --- mame-0.263+dfsg.1/src/mame/apple/maclc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/maclc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3,11 +3,21 @@ /**************************************************************************** maclc.cpp - Mac LC, LC II, Classic II, Color Classic + Mac LC, LC II, Classic II, Color Classic, Macintosh TV By R. Belmont These are all lower-end machines based on versions of the "V8" system - controller, which has a 10 MB hard limit on RAM. + controller, which has a 10 MB hard limit on RAM (8MB in the Mac TV). + + Mac TV video input chips: + TEA63330T - Sound fader control unit for car stereos + I2C: address 1000000x + TDA8708BT - Video analog input interface + SAA7197 T - Clock signal generator circuit for desktop video systems + SAA7191 WP - Digital multistandard colour decoder + I2C: address 1000101x + SAA7186 H - Digital video scaler + I2C: address 1011100x ****************************************************************************/ @@ -39,7 +49,6 @@ #include "screen.h" #include "softlist_dev.h" - namespace { #define C32M (31.3344_MHz_XTAL) @@ -73,6 +82,7 @@ void maclc2(machine_config &config); void macclas2(machine_config &config); void maccclas(machine_config &config); + void mactv(machine_config &config); void maclc_map(address_map &map); void maccclassic_map(address_map &map); @@ -335,7 +345,7 @@ m_scsihelp->timeout_error_callback().set(FUNC(maclc_state::scsi_berr_w)); SOFTWARE_LIST(config, "hdd_list").set_original("mac_hdd"); - SOFTWARE_LIST(config, "cd_list").set_original("mac_cdrom").set_filter("MC68020"); + SOFTWARE_LIST(config, "cd_list").set_original("mac_cdrom").set_filter("MC68020,MC68020_32"); SOFTWARE_LIST(config, "flop35hd_list").set_original("mac_hdflop"); SCC85C30(config, m_scc, C7M); @@ -416,7 +426,7 @@ m_ram->set_extra_options("6M,8M,10M"); m_v8->set_baseram_is_4M(true); - SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030"); + SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030,MC68030_32"); } void maclc_state::maccclas(machine_config &config) @@ -454,7 +464,46 @@ m_ram->set_extra_options("6M,8M,10M"); m_v8->set_baseram_is_4M(true); - SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030"); + SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030,MC68030_32"); +} + +void maclc_state::mactv(machine_config &config) +{ + maclc_base(config); + + M68030(config.replace(), m_maincpu, C32M); + m_maincpu->set_addrmap(AS_PROGRAM, &maclc_state::maccclassic_map); + m_maincpu->set_dasm_override(std::function(&mac68k_dasm_override), "mac68k_dasm_override"); + + config.device_remove("egret"); + config.device_remove("fdc"); + + CUDA_V2XX(config, m_cuda, XTAL(32'768)); + m_cuda->set_default_bios_tag("341s0788"); + m_cuda->reset_callback().set(FUNC(maclc_state::egret_reset_w)); + m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w)); + m_cuda->via_clock_callback().set(m_v8, FUNC(v8_device::cb1_w)); + m_cuda->via_data_callback().set(m_v8, FUNC(v8_device::cb2_w)); + m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + config.set_perfect_quantum(m_maincpu); + + TINKERBELL(config.replace(), m_v8, C15M); + m_v8->set_maincpu_tag("maincpu"); + m_v8->set_rom_tag("bootrom"); + m_v8->hdsel_callback().set(FUNC(maclc_state::hdsel_w)); + m_v8->pb3_callback().set(m_cuda, FUNC(cuda_device::get_treq)); + m_v8->pb4_callback().set(m_cuda, FUNC(cuda_device::set_byteack)); + m_v8->pb5_callback().set(m_cuda, FUNC(cuda_device::set_tip)); + m_v8->cb2_callback().set(m_cuda, FUNC(cuda_device::set_via_data)); + + // Mac TV doesn't have an LC PDS + config.device_remove("pds"); + + m_ram->set_default_size("4M"); + m_ram->set_extra_options("5M,6M,8M"); + m_v8->set_baseram_is_4M(true); + + SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030,MC68030_32"); } void maclc_state::macclas2(machine_config &config) @@ -481,7 +530,7 @@ m_ram->set_extra_options("6M,8M,10M"); m_v8->set_baseram_is_4M(true); - SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030"); + SOFTWARE_LIST(config.replace(), "cd_list").set_original("mac_cdrom").set_filter("MC68030,MC68030_32"); } ROM_START(maclc) @@ -510,9 +559,15 @@ ROM_LOAD("ecd99dc0.rom", 0x000000, 0x100000, CRC(c84c3aa5) SHA1(fd9e852e2d77fe17287ba678709b9334d4d74f1e)) ROM_END +ROM_START(mactv) + ROM_REGION32_BE(0x100000, "bootrom", 0) + ROM_LOAD("eaf1678d.bin", 0x000000, 0x100000, CRC(0644f05b) SHA1(74975c60d3a560fac9ad63125bb65a750fceaede)) +ROM_END + } // anonymous namespace COMP(1990, maclc, 0, 0, maclc, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh LC", MACHINE_SUPPORTS_SAVE) COMP(1991, maclc2, 0, 0, maclc2, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh LC II", MACHINE_SUPPORTS_SAVE) COMP(1991, macclas2, 0, 0, macclas2, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh Classic II", MACHINE_SUPPORTS_SAVE) COMP(1993, maccclas, 0, 0, maccclas, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh Color Classic", MACHINE_SUPPORTS_SAVE) +COMP(1994, mactv, 0, 0, mactv, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh TV", MACHINE_SUPPORTS_SAVE) diff -Nru mame-0.263+dfsg.1/src/mame/apple/macquadra700.cpp mame-0.264+dfsg.1/src/mame/apple/macquadra700.cpp --- mame-0.263+dfsg.1/src/mame/apple/macquadra700.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/macquadra700.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -205,13 +205,12 @@ void macquadra_state::machine_start() { - const u8 *MAC = (u8 *)m_sonic->get_mac(); - m_dafb->set_turboscsi1_device(m_ncr1); m_dafb->set_turboscsi2_device(nullptr); // MAC PROM is stored with a bit swizzle and must match one of 2 // Apple-assigned OUI blocks 00:05:02 or 08:00:07 + const std::array &MAC = m_sonic->get_mac(); m_mac[0] = bitswap<8>(0x00, 0, 1, 2, 3, 7, 6, 5, 4); m_mac[1] = bitswap<8>(0x05, 0, 1, 2, 3, 7, 6, 5, 4); m_mac[2] = bitswap<8>(0x02, 0, 1, 2, 3, 7, 6, 5, 4); diff -Nru mame-0.263+dfsg.1/src/mame/apple/macquadra800.cpp mame-0.264+dfsg.1/src/mame/apple/macquadra800.cpp --- mame-0.263+dfsg.1/src/mame/apple/macquadra800.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/macquadra800.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,9 +106,9 @@ { m_djmemc->set_ram_info((u32 *) m_ram->pointer(), m_ram->size()); - const u8 *MAC = (u8 *)m_sonic->get_mac(); // MAC PROM is stored with a bit swizzle and must match one of 2 // Apple-assigned OUI blocks 00:05:02 or 08:00:07 + const std::array &MAC = m_sonic->get_mac(); m_mac[0] = bitswap<8>(0x08, 0, 1, 2, 3, 7, 6, 5, 4); m_mac[1] = bitswap<8>(0x00, 0, 1, 2, 3, 7, 6, 5, 4); m_mac[2] = bitswap<8>(0x07, 0, 1, 2, 3, 7, 6, 5, 4); diff -Nru mame-0.263+dfsg.1/src/mame/apple/macrtc.cpp mame-0.264+dfsg.1/src/mame/apple/macrtc.cpp --- mame-0.263+dfsg.1/src/mame/apple/macrtc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/macrtc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -419,24 +419,24 @@ bool rtc3430042_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_pram, 0x100, actual) && actual == 0x100; + auto const [err, actual] = read(file, m_pram, 0x100); + return !err && (actual == 0x100); } bool rtc3430042_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_pram, 0x100, actual) && actual == 0x100; + auto const [err, actual] = write(file, m_pram, 0x100); + return !err; } bool rtc3430040_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_pram, 20, actual) && actual == 20; + auto const [err, actual] = read(file, m_pram, 20); + return !err && (actual == 20); } bool rtc3430040_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_pram, 20, actual) && actual == 20; + auto const [err, actual] = write(file, m_pram, 20); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/apple/v8.cpp mame-0.264+dfsg.1/src/mame/apple/v8.cpp --- mame-0.263+dfsg.1/src/mame/apple/v8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/v8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:R. Belmont /* - Apple "V8", "Eagle", and "Spice" system ASICs + Apple "V8", "Eagle", "Spice", and "Tinkerbell" system ASICs Emulation by R. Belmont V8 (343S0116 or 343-0155) contains the following: @@ -22,6 +22,10 @@ and adds the option for an optional ROM expansion plus support for pushbutton sound volume and display intensity controls and power saver mode. + Tinker Bell (343S1109) is an evolution of Spice with a simpler memory controller that has + an 8MB limit (4MB on the motherboard, 1, 2, or 4MB in the SIMM slot) and support for the + Macintosh TV's video input feature. + VISA (343S0101) is a predecessor of V8 and Eagle without support for dedicated VRAM banks or VGA modes. It was coupled to a non-customized Bt450 RAMDAC on the Elsie prototype, and did not offer video modes with more than 4 bits per pixel. @@ -34,12 +38,13 @@ #include "emu.h" #include "v8.h" +#include "cpu/m68000/m68030.h" #include "formats/ap_dsk35.h" #include "layout/generic.h" #define LOG_RAM (1U << 1) -#define VERBOSE (LOG_RAM) +#define VERBOSE (0) #include "logmacro.h" static constexpr u32 C7M = 7833600; @@ -52,6 +57,7 @@ DEFINE_DEVICE_TYPE(V8, v8_device, "v8", "Apple V8 system ASIC") DEFINE_DEVICE_TYPE(EAGLE, eagle_device, "v8eagle", "Apple Eagle system ASIC") DEFINE_DEVICE_TYPE(SPICE, spice_device, "v8spice", "Apple Spice system ASIC") +DEFINE_DEVICE_TYPE(TINKERBELL, tinkerbell_device, "v8tkbell", "Apple Tinker Bell system ASIC") static INPUT_PORTS_START( v8 ) PORT_START("MONTYPE") @@ -94,8 +100,6 @@ { SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); - m_screen->set_size(1024, 768); - m_screen->set_visarea(0, 640 - 1, 0, 480 - 1); m_screen->set_screen_update(FUNC(v8_device::screen_update)); m_screen->screen_vblank().set(FUNC(v8_device::slot_irq_w<0x40>)); config.set_default_layout(layout_monitors); @@ -133,6 +137,7 @@ m_screen(*this, "screen"), m_palette(*this, "palette"), m_asc(*this, "asc"), + m_overlay(false), write_pb4(*this), write_pb5(*this), write_cb2(*this), @@ -142,7 +147,6 @@ m_montype(*this, "MONTYPE"), m_via1(*this, "via1"), m_rom(*this, finder_base::DUMMY_TAG), - m_overlay(false), m_baseIs4M(false) { } @@ -966,12 +970,17 @@ applefdintf_device::add_35_nc(config, m_floppy[1]); } +spice_device::spice_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : v8_device(mconfig, type, tag, owner, clock), + m_fdc(*this, "fdc"), + m_floppy(*this, "fdc:%d", 0U), + m_cur_floppy(nullptr), + m_hdsel(0) +{ +} + spice_device::spice_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : v8_device(mconfig, SPICE, tag, owner, clock), - m_fdc(*this, "fdc"), - m_floppy(*this, "fdc:%d", 0U), - m_cur_floppy(nullptr), - m_hdsel(0) + : spice_device(mconfig, SPICE, tag, owner, clock) { } @@ -1166,3 +1175,181 @@ // offset 1 = contrast (0-255) } +// ================ tinkerbell_device + +void tinkerbell_device::device_add_mconfig(machine_config &config) +{ + spice_device::device_add_mconfig(config); + m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480); +} + +tinkerbell_device::tinkerbell_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : spice_device(mconfig, TINKERBELL, tag, owner, clock) +{ +} + +u8 tinkerbell_device::via_in_a() +{ + return 0x84; +} + +u8 tinkerbell_device::pseudovia_r(offs_t offset) +{ + if (offset < 0x100) + { + if (offset == 0x10) + { + return 0x06 << 3; // ID as an Apple 13" 640x480 monitor + } + } + + return v8_device::pseudovia_r(offset); +} + +u32 tinkerbell_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + int hres, vres; + hres = 640; + vres = 480; + + const pen_t *pens = m_palette->pens(); + switch (m_pseudovia_regs[0x10] & 7) + { + case 0: // 1bpp + { + auto const vram8 = util::big_endian_cast(&m_vram[0]); + + for (int y = 0; y < vres; y++) + { + u32 *scanline = &bitmap.pix(y); + for (int x = 0; x < hres; x += 8) + { + u8 const pixels = vram8[(y * 1024) + (x / 8)]; + + *scanline++ = pens[0x7f | (pixels & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 1) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 2) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 3) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 4) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 5) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 6) & 0x80)]; + *scanline++ = pens[0x7f | ((pixels << 7) & 0x80)]; + } + } + } + break; + + case 1: // 2bpp + { + auto const vram8 = util::big_endian_cast(&m_vram[0]); + + for (int y = 0; y < vres; y++) + { + u32 *scanline = &bitmap.pix(y); + for (int x = 0; x < hres / 4; x++) + { + u8 const pixels = vram8[(y * 1024) + x]; + + *scanline++ = pens[0x3f | (pixels & 0xc0)]; + *scanline++ = pens[0x3f | ((pixels << 2) & 0xc0)]; + *scanline++ = pens[0x3f | ((pixels << 4) & 0xc0)]; + *scanline++ = pens[0x3f | ((pixels << 6) & 0xc0)]; + } + } + } + break; + + case 2: // 4bpp + { + auto const vram8 = util::big_endian_cast(&m_vram[0]); + + for (int y = 0; y < vres; y++) + { + u32 *scanline = &bitmap.pix(y); + + for (int x = 0; x < hres / 2; x++) + { + u8 const pixels = vram8[(y * 1024) + x]; + + *scanline++ = pens[0x0f | (pixels & 0xf0)]; + *scanline++ = pens[0x0f | ((pixels << 4) & 0xf0)]; + } + } + } + break; + + case 3: // 8bpp + { + auto const vram8 = util::big_endian_cast(&m_vram[0]); + + for (int y = 0; y < vres; y++) + { + u32 *scanline = &bitmap.pix(y); + + for (int x = 0; x < hres; x++) + { + u8 const pixels = vram8[(y * 1024) + x]; + *scanline++ = pens[pixels]; + } + } + } + break; + + case 4: // 16bpp + { + auto const vram16 = util::big_endian_cast(&m_vram[0]); + + for (int y = 0; y < vres; y++) + { + u32 *scanline = &bitmap.pix(y); + for (int x = 0; x < hres; x++) + { + u16 const pixels = vram16[(y * hres) + x]; + *scanline++ = rgb_t(((pixels >> 10) & 0x1f) << 3, ((pixels >> 5) & 0x1f) << 3, (pixels & 0x1f) << 3); + } + } + } + break; + } + + return 0; +} + +/* + Tinker Bell is different from the V8, but it still needs to kind of act like one. + The major difference: the RAM limit is 8MB instead of 10, and no RAM appears + above 0x7FFFFFFF. Also, when the bits are set for what on V8 would be 8MB SIMM + and no motherboard RAM except the 0x800000 image, that means 4MB of motherboard + and 4MB of SIMM here. +*/ +void tinkerbell_device::ram_size(u8 config) +{ + if (!m_overlay) + { + address_space &space = m_maincpu->space(AS_PROGRAM); + const void *mb_ram = m_ram_ptr; + u32 simm_size = m_ram_size - 0x400000; + void *simm_ram = &m_ram_ptr[0x400000 / 4]; + + space.unmap_readwrite(0x000000, 0x9fffff); + + // place the motherboard RAM at 0 + LOGMASKED(LOG_RAM, "Motherboard RAM at 0x00000000 to 0x003fffff\n"); + space.install_ram(0, 0x3fffff, 0, (void *)mb_ram); + + // is SIMM RAM present? it always goes at 0x400000 + if (simm_size > 0) + { + if ((config & 0xc0) != 0) + { + LOGMASKED(LOG_RAM, "SIMM RAM at 0x400000 to %x\n", simm_size - 1); + space.install_ram(0x400000, (0x400000 + simm_size) - 1, 0, (void *)simm_ram); + } + } + else + { + LOGMASKED(LOG_RAM, "Base config, no SIMM\n"); + } + } +} + diff -Nru mame-0.263+dfsg.1/src/mame/apple/v8.h mame-0.264+dfsg.1/src/mame/apple/v8.h --- mame-0.263+dfsg.1/src/mame/apple/v8.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/apple/v8.h 2024-03-25 14:00:46.000000000 +0000 @@ -52,6 +52,8 @@ u8 m_pseudovia_regs[256]; u32 *m_ram_ptr; + u32 m_ram_size; + bool m_overlay; v8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); @@ -65,6 +67,8 @@ void asc_irq(int state); + virtual void ram_size(u8 config); + private: devcb_write_line write_pb4, write_pb5, write_cb2, write_hdsel, write_hmmu_enable; devcb_read_line read_pb3; @@ -77,13 +81,10 @@ int m_via_interrupt, m_via2_interrupt, m_scc_interrupt, m_last_taken_interrupt; u8 m_pseudovia_ier, m_pseudovia_ifr; u8 m_pal_address, m_pal_idx, m_pal_control, m_pal_colkey; - bool m_overlay; - u32 m_ram_size; bool m_baseIs4M; u32 rom_switch_r(offs_t offset); - void ram_size(u8 config); void pseudovia_w(offs_t offset, u8 data); void pseudovia_recalc_irqs(); @@ -140,30 +141,52 @@ required_device_array m_floppy; protected: + spice_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + virtual void device_start() override; virtual void device_add_mconfig(machine_config &config) override; virtual ioport_constructor device_input_ports() const override; + void phases_w(u8 phases); + void devsel_w(u8 devsel); + private: floppy_image_device *m_cur_floppy = nullptr; int m_hdsel; - u8 via_in_a() override; + virtual u8 via_in_a() override; virtual void via_out_a(u8 data) override; - u8 pseudovia_r(offs_t offset) override; + virtual u8 pseudovia_r(offs_t offset) override; virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; - void phases_w(u8 phases); - void devsel_w(u8 devsel); u16 swim_r(offs_t offset, u16 mem_mask); void swim_w(offs_t offset, u16 data, u16 mem_mask); void bright_contrast_w(offs_t offset, u8 data); }; +// ======================> tinkerbell_device + +class tinkerbell_device : public spice_device +{ +public: + tinkerbell_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + + virtual void ram_size(u8 config) override; + +private: + virtual u8 via_in_a() override; + virtual u8 pseudovia_r(offs_t offset) override; + virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; +}; + // device type definition DECLARE_DEVICE_TYPE(V8, v8_device) DECLARE_DEVICE_TYPE(EAGLE, eagle_device) DECLARE_DEVICE_TYPE(SPICE, spice_device) +DECLARE_DEVICE_TYPE(TINKERBELL, tinkerbell_device) #endif // MAME_APPLE_V8_H diff -Nru mame-0.263+dfsg.1/src/mame/appliedconcepts/ggm.cpp mame-0.264+dfsg.1/src/mame/appliedconcepts/ggm.cpp --- mame-0.263+dfsg.1/src/mame/appliedconcepts/ggm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/appliedconcepts/ggm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -463,7 +463,7 @@ PORT_MODIFY("IN.3") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_L) PORT_NAME("Split") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_U) PORT_NAME("Shuffle Point") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_P) PORT_NAME("Shuffle Point") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_A) PORT_NAME("Audio") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_T) PORT_NAME("Total") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x04) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") @@ -485,7 +485,7 @@ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_U) PORT_NAME("Audio") PORT_MODIFY("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_Y) PORT_NAME("Play / -") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_P) PORT_NAME("Play / -") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_W) PORT_NAME("B/W") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_K) PORT_NAME("Rank") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x05) PORT_CODE(KEYCODE_T) PORT_NAME("Time") diff -Nru mame-0.263+dfsg.1/src/mame/atari/arcadecl.cpp mame-0.264+dfsg.1/src/mame/atari/arcadecl.cpp --- mame-0.263+dfsg.1/src/mame/atari/arcadecl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/arcadecl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -138,8 +138,6 @@ }; -// video - /*************************************************************************** Note: this video hardware has some similarities to Shuuz & company @@ -256,8 +254,6 @@ } -// machine - /************************************* * * Interrupt handling diff -Nru mame-0.263+dfsg.1/src/mame/atari/atarittl.cpp mame-0.264+dfsg.1/src/mame/atari/atarittl.cpp --- mame-0.263+dfsg.1/src/mame/atari/atarittl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/atarittl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -635,39 +635,39 @@ } // Anonymous namespace -GAME(1975, antiairc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Anti-Aircraft [TTL]", MACHINE_IS_SKELETON) -GAME(1975, crashnsc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Crash 'n Score/Stock Car [TTL]", MACHINE_IS_SKELETON) -GAME(1974, gtrak10, 0, gtrak10, gtrak10, gtrak10_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 10/Trak 10/Formula K [TTL]", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) -GAME(1974, gtrak10a, gtrak10, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 10/Trak 10/Formula K (older) [TTL]", MACHINE_IS_SKELETON) -GAME(1974, gtrak20, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 20/Trak 20/Twin Racer [TTL]", MACHINE_IS_SKELETON) -GAME(1976, indy4, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Indy 4 [TTL]", MACHINE_IS_SKELETON) -GAME(1975, indy800, 0, atarikee, 0, atarikee_state, empty_init, ROT90, "Atari/Kee", "Indy 800 [TTL]", MACHINE_IS_SKELETON) -GAME(1975, jetfight, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Jet Fighter/Jet Fighter Cocktail/Launch Aircraft (set 1) [TTL]", MACHINE_IS_SKELETON) -GAME(1975, jetfighta, jetfight, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Jet Fighter/Jet Fighter Cocktail/Launch Aircraft (set 2) [TTL]", MACHINE_IS_SKELETON) -GAME(1976, lemans, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Le Mans [TTL]", MACHINE_IS_SKELETON) -GAME(1976, outlaw, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Outlaw [TTL]", MACHINE_IS_SKELETON) -GAME(1974, qwakttl, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Qwak!/Quack [TTL]", MACHINE_IS_SKELETON) -GAME(1975, sharkjaw, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Horror Games", "Shark JAWS [TTL]", MACHINE_IS_SKELETON) -GAME(1975, steeplec, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Steeplechase [TTL]", MACHINE_IS_SKELETON) -GAME(1976, stuntcyc, 0, stuntcyc, stuntcyc, stuntcyc_state, empty_init, ROT0, "Atari", "Stunt Cycle [TTL]", MACHINE_IS_SKELETON) -GAME(1974, tank, 0, tank, tank, tank_state, empty_init, ROT0, "Atari/Kee", "Tank/Tank Cocktail [TTL]", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME(1975, tankii, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Tank II [TTL]", MACHINE_IS_SKELETON) +GAME(1975, antiairc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Anti-Aircraft", MACHINE_IS_SKELETON) +GAME(1975, crashnsc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Crash 'n Score/Stock Car", MACHINE_IS_SKELETON) +GAME(1974, gtrak10, 0, gtrak10, gtrak10, gtrak10_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 10/Trak 10/Formula K", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +GAME(1974, gtrak10a, gtrak10, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 10/Trak 10/Formula K (older)", MACHINE_IS_SKELETON) +GAME(1974, gtrak20, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Gran Trak 20/Trak 20/Twin Racer", MACHINE_IS_SKELETON) +GAME(1976, indy4, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Indy 4", MACHINE_IS_SKELETON) +GAME(1975, indy800, 0, atarikee, 0, atarikee_state, empty_init, ROT90, "Atari/Kee", "Indy 800", MACHINE_IS_SKELETON) +GAME(1975, jetfight, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Jet Fighter/Jet Fighter Cocktail/Launch Aircraft (set 1)", MACHINE_IS_SKELETON) +GAME(1975, jetfighta, jetfight, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Jet Fighter/Jet Fighter Cocktail/Launch Aircraft (set 2)", MACHINE_IS_SKELETON) +GAME(1976, lemans, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Le Mans", MACHINE_IS_SKELETON) +GAME(1976, outlaw, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Outlaw", MACHINE_IS_SKELETON) +GAME(1974, qwakttl, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Qwak!/Quack", MACHINE_IS_SKELETON) +GAME(1975, sharkjaw, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Horror Games", "Shark JAWS", MACHINE_IS_SKELETON) +GAME(1975, steeplec, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Steeplechase", MACHINE_IS_SKELETON) +GAME(1976, stuntcyc, 0, stuntcyc, stuntcyc, stuntcyc_state, empty_init, ROT0, "Atari", "Stunt Cycle", MACHINE_IS_SKELETON) +GAME(1974, tank, 0, tank, tank, tank_state, empty_init, ROT0, "Atari/Kee", "Tank/Tank Cocktail", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME(1975, tankii, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Tank II", MACHINE_IS_SKELETON) // MISSING ROM DUMPS -//GAME(1975, astrotrf, steeplec, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Astroturf [TTL]", MACHINE_IS_SKELETON) +//GAME(1975, astrotrf, steeplec, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Astroturf", MACHINE_IS_SKELETON) // 100% TTL -//GAME(1974, coupfran, worldcup, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari Europe", "Coup Franc [TTL]", MACHINE_IS_SKELETON) -//GAME(1974, coupdmnd, worldcup, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari France", "Coup du Monde [TTL]", MACHINE_IS_SKELETON) -//GAME(1975, crossfir, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Crossfire [TTL]", MACHINE_IS_SKELETON) -//GAME(1973, eliminat, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Elimination! [TTL]", MACHINE_IS_SKELETON) -//GAME(1975, goaliv, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Goal IV [TTL]", MACHINE_IS_SKELETON) -//GAME(1973, gotchaat, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Gotcha [TTL]", MACHINE_IS_SKELETON) //? -//GAME(1973, gotchaatc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Gotcha Color [TTL]", MACHINE_IS_SKELETON) //? -//GAME(1975, hiway, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Hi-Way/Highway [TTL]", MACHINE_IS_SKELETON) -//GAME(1974, pinpong, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pin Pong [TTL]", MACHINE_IS_SKELETON) -//GAME(1975, pursuit, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pursuit [TTL]", MACHINE_IS_SKELETON) -//GAME(1974, quadpong, eliminat, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Quadrapong [TTL]", MACHINE_IS_SKELETON) -//GAME(1973, spacrace, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Space Race [TTL]", MACHINE_IS_SKELETON) -//GAME(1974, touchme, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Touch-Me [TTL]", MACHINE_IS_SKELETON) //? -//GAME(1974, worldcup, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "World Cup/World Cup Football [TTL]", MACHINE_IS_SKELETON) +//GAME(1974, coupfran, worldcup, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari Europe", "Coup Franc", MACHINE_IS_SKELETON) +//GAME(1974, coupdmnd, worldcup, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari France", "Coup du Monde", MACHINE_IS_SKELETON) +//GAME(1975, crossfir, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Crossfire", MACHINE_IS_SKELETON) +//GAME(1973, eliminat, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Elimination!", MACHINE_IS_SKELETON) +//GAME(1975, goaliv, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Goal IV", MACHINE_IS_SKELETON) +//GAME(1973, gotchaat, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Gotcha", MACHINE_IS_SKELETON) //? +//GAME(1973, gotchaatc, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Gotcha Color", MACHINE_IS_SKELETON) //? +//GAME(1975, hiway, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Hi-Way/Highway", MACHINE_IS_SKELETON) +//GAME(1974, pinpong, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pin Pong", MACHINE_IS_SKELETON) +//GAME(1975, pursuit, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pursuit", MACHINE_IS_SKELETON) +//GAME(1974, quadpong, eliminat, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Quadrapong", MACHINE_IS_SKELETON) +//GAME(1973, spacrace, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Space Race", MACHINE_IS_SKELETON) +//GAME(1974, touchme, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Touch-Me", MACHINE_IS_SKELETON) //? +//GAME(1974, worldcup, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "World Cup/World Cup Football", MACHINE_IS_SKELETON) diff -Nru mame-0.263+dfsg.1/src/mame/atari/batman.cpp mame-0.264+dfsg.1/src/mame/atari/batman.cpp --- mame-0.263+dfsg.1/src/mame/atari/batman.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/batman.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,8 +77,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -280,8 +278,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/beathead.cpp mame-0.264+dfsg.1/src/mame/atari/beathead.cpp --- mame-0.263+dfsg.1/src/mame/atari/beathead.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/beathead.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -188,8 +188,6 @@ }; -// video - /************************************* * * Video start/stop @@ -358,8 +356,6 @@ } -// machine - /************************************* * * Machine init diff -Nru mame-0.263+dfsg.1/src/mame/atari/blstroid.cpp mame-0.264+dfsg.1/src/mame/atari/blstroid.cpp --- mame-0.263+dfsg.1/src/mame/atari/blstroid.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/blstroid.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -81,8 +81,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -233,8 +231,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atari/canyon.cpp mame-0.264+dfsg.1/src/mame/atari/canyon.cpp --- mame-0.263+dfsg.1/src/mame/atari/canyon.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/canyon.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// audio - /************************************* * * Write handlers @@ -129,8 +127,6 @@ } -// video - void canyon_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -201,8 +197,6 @@ } -// machine - /************************************* * * Palette generation diff -Nru mame-0.263+dfsg.1/src/mame/atari/ccastles.cpp mame-0.264+dfsg.1/src/mame/atari/ccastles.cpp --- mame-0.263+dfsg.1/src/mame/atari/ccastles.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/ccastles.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -227,8 +227,6 @@ }; -// video - /************************************* * * Video startup @@ -555,8 +553,6 @@ } -// machine - /************************************* * * VBLANK and IRQ generation * diff -Nru mame-0.263+dfsg.1/src/mame/atari/cloak.cpp mame-0.264+dfsg.1/src/mame/atari/cloak.cpp --- mame-0.263+dfsg.1/src/mame/atari/cloak.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/cloak.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -193,8 +193,6 @@ }; -// video - /*************************************************************************** CLOAK & DAGGER uses RAM to dynamically @@ -381,8 +379,6 @@ } -// machine - /************************************* * * Output ports diff -Nru mame-0.263+dfsg.1/src/mame/atari/cloud9.cpp mame-0.264+dfsg.1/src/mame/atari/cloud9.cpp --- mame-0.263+dfsg.1/src/mame/atari/cloud9.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/cloud9.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -185,8 +185,6 @@ }; -// video - /************************************* * * Video startup @@ -465,8 +463,6 @@ } -// machine - static constexpr double MASTER_CLOCK = 10'000'000; static constexpr double PIXEL_CLOCK = MASTER_CLOCK / 2; static constexpr uint16_t HTOTAL = 320; diff -Nru mame-0.263+dfsg.1/src/mame/atari/copsnrob.cpp mame-0.264+dfsg.1/src/mame/atari/copsnrob.cpp --- mame-0.263+dfsg.1/src/mame/atari/copsnrob.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/copsnrob.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -126,8 +126,6 @@ }; -// video - uint32_t copsnrob_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // redrawing the entire display is faster in this case @@ -246,8 +244,6 @@ } -// machine - void copsnrob_state::one_start_w(int state) { diff -Nru mame-0.263+dfsg.1/src/mame/atari/cyberbal.cpp mame-0.264+dfsg.1/src/mame/atari/cyberbal.cpp --- mame-0.263+dfsg.1/src/mame/atari/cyberbal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/cyberbal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -170,8 +170,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -423,8 +421,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/cybstorm.cpp mame-0.264+dfsg.1/src/mame/atari/cybstorm.cpp --- mame-0.263+dfsg.1/src/mame/atari/cybstorm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/cybstorm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,8 +83,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -286,8 +284,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/dragrace.cpp mame-0.264+dfsg.1/src/mame/atari/dragrace.cpp --- mame-0.263+dfsg.1/src/mame/atari/dragrace.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/dragrace.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -97,8 +97,6 @@ }; -// video - TILE_GET_INFO_MEMBER(dragrace_state::get_tile_info) { uint8_t code = m_playfield_ram[tile_index]; @@ -159,8 +157,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(dragrace_state::frame_callback) { for (int i = 0; i < 2; i++) diff -Nru mame-0.263+dfsg.1/src/mame/atari/eprom.cpp mame-0.264+dfsg.1/src/mame/atari/eprom.cpp --- mame-0.263+dfsg.1/src/mame/atari/eprom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/eprom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -107,8 +107,6 @@ }; -// video - /************************************* * * Palette @@ -508,8 +506,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/firetrk.cpp mame-0.264+dfsg.1/src/mame/atari/firetrk.cpp --- mame-0.263+dfsg.1/src/mame/atari/firetrk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/firetrk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -191,8 +191,6 @@ }; -// video - void firetrk_state::palette(palette_device &palette) { static constexpr uint8_t colortable_source[] = @@ -606,8 +604,6 @@ } -// audio - void firetrk_state::skid_reset_w(uint8_t data) { m_skid[0] = 0; @@ -661,8 +657,6 @@ } -// machine - void firetrk_state::set_service_mode(int enable) { m_in_service_mode = enable; diff -Nru mame-0.263+dfsg.1/src/mame/atari/gauntlet.cpp mame-0.264+dfsg.1/src/mame/atari/gauntlet.cpp --- mame-0.263+dfsg.1/src/mame/atari/gauntlet.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/gauntlet.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -232,8 +232,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -417,8 +415,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atari/jedi.cpp mame-0.264+dfsg.1/src/mame/atari/jedi.cpp --- mame-0.263+dfsg.1/src/mame/atari/jedi.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/jedi.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -231,8 +231,6 @@ }; -// audio - /************************************* * * Interrupt handling @@ -325,8 +323,6 @@ map(0x8000, 0xffff).rom(); } -// video - /*************************************************************************** Return of the Jedi has a peculiar playfield/motion object @@ -705,8 +701,6 @@ #endif -// machine - /************************************* * * Interrupt handling diff -Nru mame-0.263+dfsg.1/src/mame/atari/klax.cpp mame-0.264+dfsg.1/src/mame/atari/klax.cpp --- mame-0.263+dfsg.1/src/mame/atari/klax.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/klax.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -222,8 +220,6 @@ } -// machine - /************************************* * * Interrupt handling diff -Nru mame-0.263+dfsg.1/src/mame/atari/liberatr.cpp mame-0.264+dfsg.1/src/mame/atari/liberatr.cpp --- mame-0.263+dfsg.1/src/mame/atari/liberatr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/liberatr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -272,8 +272,6 @@ }; -// video - /*************************************************************************** Liberator's screen is 256 pixels by 256 pixels. The @@ -542,8 +540,6 @@ } -// machine - void liberatr_state::machine_start() { save_item(NAME(m_earom_data)); diff -Nru mame-0.263+dfsg.1/src/mame/atari/nitedrvr.cpp mame-0.264+dfsg.1/src/mame/atari/nitedrvr.cpp --- mame-0.263+dfsg.1/src/mame/atari/nitedrvr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/nitedrvr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -125,8 +125,6 @@ }; -// video - void nitedrvr_state::draw_box(bitmap_ind16 &bitmap, const rectangle &cliprect, int bx, int by, int ex, int ey) { for (int y = by; y < ey; y++) @@ -173,8 +171,6 @@ } -// machine - /*************************************************************************** Steering diff -Nru mame-0.263+dfsg.1/src/mame/atari/offtwall.cpp mame-0.264+dfsg.1/src/mame/atari/offtwall.cpp --- mame-0.263+dfsg.1/src/mame/atari/offtwall.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/offtwall.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -96,8 +96,6 @@ }; -// video - /************************************* * @@ -190,8 +188,6 @@ } -// machine - /************************************* * diff -Nru mame-0.263+dfsg.1/src/mame/atari/orbit.cpp mame-0.264+dfsg.1/src/mame/atari/orbit.cpp --- mame-0.263+dfsg.1/src/mame/atari/orbit.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/orbit.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - void orbit_state::playfield_w(offs_t offset, uint8_t data) { m_playfield_ram[offset] = data; @@ -181,8 +179,6 @@ } -// machine - /************************************* * * Interrupts and timing diff -Nru mame-0.263+dfsg.1/src/mame/atari/pong.cpp mame-0.264+dfsg.1/src/mame/atari/pong.cpp --- mame-0.263+dfsg.1/src/mame/atari/pong.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/pong.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -676,20 +676,20 @@ } // anonymous namespace -GAME( 1972, pong, 0, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong (Rev E) [TTL]", MACHINE_SUPPORTS_SAVE) -GAME( 1973, pongd, 0, pongd, pongd, pong_state, empty_init, ROT0, "Atari", "Pong Doubles [TTL]", MACHINE_SUPPORTS_SAVE) -GAMEL( 1974, rebound, 0, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Rebound (Rev B) [TTL]", MACHINE_SUPPORTS_SAVE, layout_rebound) -GAMEL( 1976, breakout, 0, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout [TTL]", MACHINE_SUPPORTS_SAVE, layout_breakout) +GAME( 1972, pong, 0, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong (Rev E)", MACHINE_SUPPORTS_SAVE) +GAME( 1973, pongd, 0, pongd, pongd, pong_state, empty_init, ROT0, "Atari", "Pong Doubles", MACHINE_SUPPORTS_SAVE) +GAMEL( 1974, rebound, 0, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Rebound (Rev B)", MACHINE_SUPPORTS_SAVE, layout_rebound) +GAMEL( 1976, breakout, 0, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout", MACHINE_SUPPORTS_SAVE, layout_breakout) // 100% TTL -//GAMEL(1974, spike, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari/Kee", "Spike [TTL]", MACHINE_IS_SKELETON) -//GAMEL(1974, volleyball, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Volleyball [TTL]", MACHINE_IS_SKELETON) -//GAME( 1973, coupedav, pongd, pongd, pongd, pong_state, empty_init, ROT0, "Atari France", "Coupe Davis [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1973, pongbarl, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong In-A-Barrel [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1974, cktpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari / National Entertainment Co.", "Cocktail Pong [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1974, drpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Dr. Pong [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1974, pupppong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Puppy Pong [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1974, snoopong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Snoopy Pong [TTL]", MACHINE_SUPPORTS_SAVE) -//GAME( 1974, suprpong, 0, suprpong, pong, pong_state, empty_init, ROT0, "Atari", "Superpong [TTL]", MACHINE_SUPPORTS_SAVE) -//GAMEL( 1976, breakckt, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout Cocktail [TTL]", MACHINE_SUPPORTS_SAVE, layout_breakckt) -//GAMEL( 1976, consolet, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari Europe", "Consolette [TTL]", MACHINE_SUPPORTS_SAVE, layout_consolet) +//GAMEL(1974, spike, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari/Kee", "Spike", MACHINE_IS_SKELETON) +//GAMEL(1974, volleyball, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Volleyball", MACHINE_IS_SKELETON) +//GAME( 1973, coupedav, pongd, pongd, pongd, pong_state, empty_init, ROT0, "Atari France", "Coupe Davis", MACHINE_SUPPORTS_SAVE) +//GAME( 1973, pongbarl, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong In-A-Barrel", MACHINE_SUPPORTS_SAVE) +//GAME( 1974, cktpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari / National Entertainment Co.", "Cocktail Pong", MACHINE_SUPPORTS_SAVE) +//GAME( 1974, drpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Dr. Pong", MACHINE_SUPPORTS_SAVE) +//GAME( 1974, pupppong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Puppy Pong", MACHINE_SUPPORTS_SAVE) +//GAME( 1974, snoopong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Snoopy Pong", MACHINE_SUPPORTS_SAVE) +//GAME( 1974, suprpong, 0, suprpong, pong, pong_state, empty_init, ROT0, "Atari", "Superpong", MACHINE_SUPPORTS_SAVE) +//GAMEL( 1976, breakckt, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout Cocktail", MACHINE_SUPPORTS_SAVE, layout_breakckt) +//GAMEL( 1976, consolet, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari Europe", "Consolette", MACHINE_SUPPORTS_SAVE, layout_consolet) diff -Nru mame-0.263+dfsg.1/src/mame/atari/poolshrk.cpp mame-0.264+dfsg.1/src/mame/atari/poolshrk.cpp --- mame-0.263+dfsg.1/src/mame/atari/poolshrk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/poolshrk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -86,8 +86,6 @@ }; -// video - TILE_GET_INFO_MEMBER(poolshrk_state::get_tile_info) { tileinfo.set(1, m_playfield_ram[tile_index] & 0x3f, 0, 0); @@ -125,8 +123,6 @@ } -// machine - void poolshrk_state::init_poolshrk() { uint8_t *pSprite = memregion("sprites")->base(); diff -Nru mame-0.263+dfsg.1/src/mame/atari/rampart.cpp mame-0.264+dfsg.1/src/mame/atari/rampart.cpp --- mame-0.263+dfsg.1/src/mame/atari/rampart.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/rampart.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -100,8 +100,6 @@ }; -// video - /************************************* * * Video system start @@ -208,8 +206,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/relief.cpp mame-0.264+dfsg.1/src/mame/atari/relief.cpp --- mame-0.263+dfsg.1/src/mame/atari/relief.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/relief.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -158,8 +158,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -307,8 +305,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/shuuz.cpp mame-0.264+dfsg.1/src/mame/atari/shuuz.cpp --- mame-0.263+dfsg.1/src/mame/atari/shuuz.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/shuuz.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,8 +83,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -205,8 +203,6 @@ } -// machine - void shuuz_state::machine_start() { save_item(NAME(m_cur)); diff -Nru mame-0.263+dfsg.1/src/mame/atari/skullxbo.cpp mame-0.264+dfsg.1/src/mame/atari/skullxbo.cpp --- mame-0.263+dfsg.1/src/mame/atari/skullxbo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/skullxbo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -392,8 +390,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atari/skydiver.cpp mame-0.264+dfsg.1/src/mame/atari/skydiver.cpp --- mame-0.263+dfsg.1/src/mame/atari/skydiver.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/skydiver.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -161,8 +161,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -303,8 +301,6 @@ } -// machine - /************************************* * diff -Nru mame-0.263+dfsg.1/src/mame/atari/skyraid.cpp mame-0.264+dfsg.1/src/mame/atari/skyraid.cpp --- mame-0.263+dfsg.1/src/mame/atari/skyraid.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/skyraid.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -90,8 +90,6 @@ }; -// video - void skyraid_state::video_start() { m_helper.allocate(128, 240); @@ -210,8 +208,6 @@ } -// machine - void skyraid_state::machine_start() { m_led.resolve(); diff -Nru mame-0.263+dfsg.1/src/mame/atari/sprint2.cpp mame-0.264+dfsg.1/src/mame/atari/sprint2.cpp --- mame-0.263+dfsg.1/src/mame/atari/sprint2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/sprint2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -124,8 +124,6 @@ }; -// video - void sprint2_state::palette(palette_device &palette) const { palette.set_indirect_color(0, rgb_t(0x00, 0x00, 0x00)); @@ -288,8 +286,6 @@ } -// machine - void sprint2_state::machine_start() { m_gear_sel.resolve(); diff -Nru mame-0.263+dfsg.1/src/mame/atari/sprint8.cpp mame-0.264+dfsg.1/src/mame/atari/sprint8.cpp --- mame-0.263+dfsg.1/src/mame/atari/sprint8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/sprint8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -95,8 +95,6 @@ }; -// video - void sprint8_state::palette(palette_device &palette) const { for (int i = 0; i < 0x10; i++) @@ -275,8 +273,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(sprint8_state::input_callback) { for (int i = 0; i < 8; i++) diff -Nru mame-0.263+dfsg.1/src/mame/atari/starshp1.cpp mame-0.264+dfsg.1/src/mame/atari/starshp1.cpp --- mame-0.263+dfsg.1/src/mame/atari/starshp1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/starshp1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -154,8 +154,6 @@ }; -// video - void starshp1_state::set_pens() { m_palette->set_indirect_color(m_inverse ? 7 : 0, rgb_t(0x00, 0x00, 0x00)); @@ -534,8 +532,6 @@ } -// machine - INTERRUPT_GEN_MEMBER(starshp1_state::interrupt) { if ((m_system->read() & 0x90) != 0x90) diff -Nru mame-0.263+dfsg.1/src/mame/atari/subs.cpp mame-0.264+dfsg.1/src/mame/atari/subs.cpp --- mame-0.263+dfsg.1/src/mame/atari/subs.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/subs.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -94,8 +94,6 @@ }; -// video - template void subs_state::invert_w(int state) { @@ -197,8 +195,6 @@ } -// machine - /*************************************************************************** machine initialization ***************************************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/atari/tank8.cpp mame-0.264+dfsg.1/src/mame/atari/tank8.cpp --- mame-0.263+dfsg.1/src/mame/atari/tank8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/tank8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -93,8 +93,6 @@ }; -// video - void tank8_state::palette(palette_device &palette) const { palette.set_indirect_color(8, rgb_t(0x00, 0x00, 0x00)); @@ -348,8 +346,6 @@ } -// machine - TIMER_CALLBACK_MEMBER(tank8_state::set_collision) { m_maincpu->set_input_line(0, ASSERT_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/atari/thunderj.cpp mame-0.264+dfsg.1/src/mame/atari/thunderj.cpp --- mame-0.263+dfsg.1/src/mame/atari/thunderj.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/thunderj.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -99,8 +99,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -328,8 +326,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atari/toobin.cpp mame-0.264+dfsg.1/src/mame/atari/toobin.cpp --- mame-0.263+dfsg.1/src/mame/atari/toobin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/toobin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,8 +106,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -347,8 +345,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atari/triplhnt.cpp mame-0.264+dfsg.1/src/mame/atari/triplhnt.cpp --- mame-0.263+dfsg.1/src/mame/atari/triplhnt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/triplhnt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - TILE_GET_INFO_MEMBER(triplhnt_state::get_tile_info) { int const code = m_playfield_ram[tile_index] & 0x3f; @@ -214,8 +212,6 @@ } -// machine - void triplhnt_state::init_triplhnt() { subdevice("nvram")->set_base(m_cmos, sizeof(m_cmos)); diff -Nru mame-0.263+dfsg.1/src/mame/atari/tunhunt.cpp mame-0.264+dfsg.1/src/mame/atari/tunhunt.cpp --- mame-0.263+dfsg.1/src/mame/atari/tunhunt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/tunhunt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -144,8 +144,6 @@ }; -// video - /****************************************************************************************/ void tunhunt_state::videoram_w(offs_t offset, uint8_t data) @@ -502,8 +500,6 @@ } -// machine - /************************************* * * Output ports diff -Nru mame-0.263+dfsg.1/src/mame/atari/ultratnk.cpp mame-0.264+dfsg.1/src/mame/atari/ultratnk.cpp --- mame-0.263+dfsg.1/src/mame/atari/ultratnk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/ultratnk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - void ultratnk_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -235,8 +233,6 @@ } -// machine - template int ultratnk_state::collision_flipflop_r() { diff -Nru mame-0.263+dfsg.1/src/mame/atari/videopin.cpp mame-0.264+dfsg.1/src/mame/atari/videopin.cpp --- mame-0.263+dfsg.1/src/mame/atari/videopin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/videopin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -99,8 +99,6 @@ }; -// video - TILEMAP_MAPPER_MEMBER(videopin_state::get_memory_offset) { return num_rows * ((col + 16) % 48) + row; @@ -185,8 +183,6 @@ } -// machine - void videopin_state::update_plunger() { uint8_t const val = m_in[1]->read(); diff -Nru mame-0.263+dfsg.1/src/mame/atari/vindictr.cpp mame-0.264+dfsg.1/src/mame/atari/vindictr.cpp --- mame-0.263+dfsg.1/src/mame/atari/vindictr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/vindictr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,8 +89,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -358,8 +356,6 @@ } -// machine - /************************************* * * Initialization diff -Nru mame-0.263+dfsg.1/src/mame/atari/wolfpack.cpp mame-0.264+dfsg.1/src/mame/atari/wolfpack.cpp --- mame-0.263+dfsg.1/src/mame/atari/wolfpack.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/wolfpack.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,6 @@ }; -// video - void wolfpack_state::wolfpack_palette(palette_device &palette) const { palette.set_indirect_color(0, rgb_t(0x00, 0x00, 0x00)); @@ -397,8 +395,6 @@ } -// machine - TIMER_CALLBACK_MEMBER(wolfpack_state::periodic_callback) { int scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/atari/xybots.cpp mame-0.264+dfsg.1/src/mame/atari/xybots.cpp --- mame-0.263+dfsg.1/src/mame/atari/xybots.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atari/xybots.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,8 +85,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -223,8 +221,6 @@ } -// machine - /************************************* * * Initialization & interrupts diff -Nru mame-0.263+dfsg.1/src/mame/atlus/cave.cpp mame-0.264+dfsg.1/src/mame/atlus/cave.cpp --- mame-0.263+dfsg.1/src/mame/atlus/cave.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atlus/cave.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,5539 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia +/*************************************************************************** + + -= Cave Hardware =- + + driver by Luca Elia (l.elia@tin.it) + + +Main CPU : MC68000 + +Sound CPU : Z80 [Optional] + +Sound Chips : YMZ280B or + OKIM6295 x (1|2) + YM2203 / YM2151 [Optional] + +Other : 93C46 EEPROM + + +----------------------------------------------------------------------------------------- +Year + Game License PCB Tilemaps Sprites Other +----------------------------------------------------------------------------------------- +94 Mazinger Z Banpresto BP943A 038 9335EX706 013 9341E7009 Z80 +94 Power Instinct 2 Atlus AT047G2-B 038 9429WX709 013 9341E7009 Z80 NMK 112 +95 Gogetsuji Legends Atlus AT047G2-B 038 9429WX709 013 9341E7009 Z80 NMK 112 +95 Metamoqester Banpresto BP947A 038 9437WX711 013 9346E7002 Z80 +95 Sailor Moon Banpresto BP945A 038 9437WX711 013 9346E7002 Z80 +95 Donpachi Atlus AT-C01DP-2 038 9429WX727 013 9347E7003 NMK 112 +96 Air Gallet Banpresto BP962A 038 9437WX711 013 9346E7002 Z80 +96 Hotdog Storm Marble ASCT9501 038 9341EX702 013 Z80 +96 Pac-Slot Namco N-44 EM 038 9444WX010 013 9345E7006 +96 Poka Poka Satan Kato's PPS-MAIN 038 9444WX010 013 9607EX013 +97 Tekken Card World Namco EMG4 038 9701WX001 013 9651EX001 +97 Dodonpachi Atlus AT-C03 D2 038 9341E7010 013 9338EX701 +98 Dangun Feveron Nihon System CV01 038 9808WX003 013 9807EX004 +98 ESP Ra.De. Atlus ATC04 038 9841WX002 013 9838EX002 +98 Tekken Battle Scratch Namco EMG4 038 9748WX001 013 +98 Uo Poko Jaleco CV02 038 9749WX001 013 9749EX004 +99 Guwange Atlus ATC05 038 9919WX004 013 +99 Gaia Crusaders Noise Factory ? 038 9838WX003 013 9918EX008 +99 Koro Koro Quest Takumi TUG-01B 038 9838WX004 013 9838EX004 +99 Crusher Makochan Takumi TUG-01B 038 9838WX004 013 9838EX004 +99 Tobikose! Jumpman Namco EMG4 038 9919WX007 013 9934WX002 +01 Thunder Heroes Primetek ? 038 9838WX003 013 9918EX008 +----------------------------------------------------------------------------------------- + +To Do: + +- Modernize state objects for each PCB sub-variant, rename to something more + apt than "cave_state"; + +- Sprite lag in some games (e.g. metmqstr). The sprites chip probably + generates interrupts (unknown_irq) + +- Max sprite number is possibly less than 1024 + (ex: Boss explosion scene at most of cave shmups on real hardware) + +- Tilemap scrolling issue in ppsatan right screen when flipped left + screen at some scenes + +- Most of videoreg functions aren't implemented + +- Measure video timings + +Stephh's notes (based on the games M68000 code and some tests) : + +1) 'gaia' + + - Difficulty Dip Switch also affects "Bonus Life" Dip Switch + + +2) 'theroes' + + - This is a English/Chinese version, but from the manual, there might exist a English/Japanese one + - Difficulty Dip Switch also affects "Bonus Life" Dip Switch + - There are less degrees of difficulty in this version + - DSW2 bit 5 effect remains unknown : + * it is checked at address 0x008d16 at the beginning of each sub-level + * it is checked at address 0x00c382 when you quickly push the joystick left or right twice + Any info is welcome ! + +Versions known to exist but not dumped: + Dodonpachi Campaign Version + Reportedly only 3 ever made, one was given out as a prize to a high score contest winner. The other two + PCBs were shown running (and could be played) at a Cave fan show known as Cave Festival 2006. There are + videos of the game being played floating around the internet and on YouTube. AKA DDP-CV or DDP BLUE ROM + +NOTE: Easter egg in Fereron SOS / Dangun Feveron: + Insert a coin and with the joystick move: Down, Up, Right, Left, Up, Down, Left, Right + If you did the above right, you'll hear a MEOW sound. Start the game and your ship is now a cat! + +***************************************************************************/ + +#include "emu.h" +#include "cave.h" + +#include "cpu/m68000/m68000.h" +#include "cpu/z80/z80.h" +#include "machine/nmk112.h" +#include "machine/nvram.h" +#include "machine/watchdog.h" +#include "sound/ymopm.h" +#include "sound/ymopn.h" +#include "sound/ymz280b.h" + +#include "speaker.h" + +#include + +#include "ppsatan.lh" + + +/*************************************************************************** + + + Interrupt Handling Routines + + +***************************************************************************/ + + +/* Update the IRQ state based on all possible causes */ +void cave_state::update_irq_state() +{ + if (m_vblank_irq || m_sound_irq || m_unknown_irq) + m_maincpu->set_input_line(m_irq_level, ASSERT_LINE); + else + m_maincpu->set_input_line(m_irq_level, CLEAR_LINE); +} + +TIMER_CALLBACK_MEMBER(cave_state::vblank_end) +{ + if (m_kludge == 3) /* mazinger metmqstr */ + { + m_unknown_irq = 1; + update_irq_state(); + } + m_agallet_vblank_irq = 0; +} + +TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start) +{ + m_vblank_irq = 1; + update_irq_state(); + get_sprite_info(0); + m_agallet_vblank_irq = 1; + m_vblank_end_timer->adjust(attotime::from_usec(2000)); // 2000us : vblank time +} +TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start_left) +{ + get_sprite_info(1); +} +TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start_right) +{ + get_sprite_info(2); +} + +/* Called once/frame to generate the VBLANK interrupt */ +INTERRUPT_GEN_MEMBER(cave_state::interrupt) +{ + // 17376us : frame time + m_int_timer->adjust(attotime::from_usec(17376 - m_time_vblank_irq)); +} +INTERRUPT_GEN_MEMBER(ppsatan_state::interrupt_ppsatan) +{ + m_int_timer->adjust (attotime::from_usec(17376 - m_time_vblank_irq)); + m_int_timer_left->adjust (attotime::from_usec(17376 - m_time_vblank_irq)); + m_int_timer_right->adjust(attotime::from_usec(17376 - m_time_vblank_irq)); +} + +/* Called by the YMZ280B to set the IRQ state */ +void cave_state::sound_irq_gen(int state) +{ + m_sound_irq = (state != 0); + update_irq_state(); +} + + +/* Level 1 irq routines: + + Game |first read | bit==0->routine + | + |offset: | read this offset | + + ddonpach 4,0 0 -> vblank + 4 1 -> rte 2 -> like 0 read sound + dfeveron 0 0 -> vblank + 4 1 -> + 6 - read sound + uopoko 0 0 -> vblank + 4 1 -> + 6 - read sound + esprade 0 0 -> vblank + 4 1 -> rte 2 must be 0 read sound + guwange 0 0 -> vblank + 6,4 1 -> + 6,4 2 must be 0 read sound + mazinger 0 0 -> vblank + 4 rest -> scroll + 6 +*/ + + +/* Reads the cause of the interrupt and clears the state */ + +u16 cave_state::irq_cause_r(offs_t offset) +{ + u16 result = 0x0003; + + if (m_vblank_irq) + result ^= 0x01; + if (m_unknown_irq) + result ^= 0x02; + + if (!machine().side_effects_disabled()) + { + if (offset == 4/2) + m_vblank_irq = 0; + if (offset == 6/2) + m_unknown_irq = 0; + + update_irq_state(); + } + +/* + sailormn and agallet wait for bit 2 of $b80001 to go 1 -> 0. + It must happen once per frame as agallet uses this to show + the copyright notice screen for ~8.5s +*/ + if (offset == 0) + { + result &= ~4; + result |= (m_agallet_vblank_irq ? 0 : 4); + } + + return result; +} + +template +void cave_state::videoregs_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_videoregs[Chip][offset]); + offset <<= 1; + // offset 0x04 and 0x06 is offset related? + // offset 0x0a is position mode toggle in bit 13-12 (separated for X and Y?), other bits used but unknown + // offset 0x68 or 0x78 is commonly watchdog or DMA command? + // offset 0x6c or 0x7c is encryption key or CRTC or something else? + // offset 0x6e is commonly communication when sound CPU exists + // other registers unknown + if (offset != 0x00 && + offset != 0x02 && + offset != 0x04 && + offset != 0x06 && + offset != 0x08 && + offset != 0x0a && + offset != 0x68 && + offset != 0x6e && + offset != 0x78) + logerror("%s: Unknown videoregs #%02X written %04X = %04X & %04X\n", + machine().describe_context(), Chip, offset, data, mem_mask); +} + + +/*************************************************************************** + + + Sound Handling Routines + + +***************************************************************************/ + +/* We need a FIFO buffer for sailormn, where the inter-CPUs + communication is *really* tight */ + +u8 cave_z80_state::soundflags_r() +{ + // bit 2 is low: can read command (lo) + // bit 3 is low: can read command (hi) +// return (m_sound_flag[0] ? 0 : 4) | +// (m_sound_flag[1] ? 0 : 8) ; +return 0; +} + +u16 cave_z80_state::soundflags_ack_r() +{ + // bit 0 is low: can write command + // bit 1 is low: can read answer +// return ((m_sound_flag[0] | m_sound_flag[1]) ? 1 : 0) | +// (m_soundbuf_empty ? 0 : 2) ; + + return m_soundbuf_empty ? 2 : 0; +} + +/* Main CPU: write a 16 bit sound latch and generate a NMI on the sound CPU */ +void cave_z80_state::sound_cmd_w(u16 data) +{ +// m_sound_flag[0] = 1; +// m_sound_flag[1] = 1; + m_soundlatch->write(data); + m_maincpu->spin_until_time(attotime::from_usec(50)); // Allow the other cpu to reply +} + +/* Sound CPU: read the low 8 bits of the 16 bit sound latch */ +u8 cave_z80_state::soundlatch_lo_r() +{ +// m_sound_flag[0] = 0; + return m_soundlatch->read() & 0xff; +} + +/* Sound CPU: read the high 8 bits of the 16 bit sound latch */ +u8 cave_z80_state::soundlatch_hi_r() +{ +// m_sound_flag[1] = 0; + return m_soundlatch->read() >> 8; +} + +/* Main CPU: read the latch written by the sound CPU (acknowledge) */ +u16 cave_z80_state::soundlatch_ack_r() +{ + if (!m_soundbuf_empty) + { + const u8 data = m_soundbuf_data[m_soundbuf_rptr]; + if (!machine().side_effects_disabled()) + { + m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; + m_soundbuf_empty = m_soundbuf_rptr == m_soundbuf_wptr; + } + return data; + } + else + { + logerror("%s: Sound Buffer 2 Underflow Error\n", machine().describe_context()); + return 0xff; + } +} + + +/* Sound CPU: write latch for the main CPU (acknowledge) */ +void cave_z80_state::soundlatch_ack_w(u8 data) +{ + if (m_soundbuf_empty || (m_soundbuf_wptr != m_soundbuf_rptr)) + { + m_soundbuf_data[m_soundbuf_wptr] = data; + m_soundbuf_wptr = (m_soundbuf_wptr + 1) & 0x1f; + m_soundbuf_empty = false; + } + else + logerror("%s: Sound Buffer 2 Overflow Error\n", machine().describe_context()); +} + + +/*************************************************************************** + + + EEPROM + + +***************************************************************************/ + +void cave_state::eeprom_w(u8 data) +{ + if (data & ~0xfe) + logerror("%s: Unknown EEPROM bit written %04X\n", machine().describe_context(), data); + + machine().bookkeeping().coin_lockout_w(1, BIT(~data, 7)); + machine().bookkeeping().coin_lockout_w(0, BIT(~data, 6)); + machine().bookkeeping().coin_counter_w(1, BIT( data, 5)); + machine().bookkeeping().coin_counter_w(0, BIT( data, 4)); + + // latch the bit + m_eeprom->di_write(BIT(data, 3)); + + // reset line asserted: reset. + m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); +} + +void cave_z80_state::sailormn_eeprom_w(u8 data) +{ + sailormn_tilebank_w(BIT(data, 0)); + eeprom_w(data & ~0x01); +} + +void cave_z80_state::hotdogst_eeprom_w(u8 data) +{ + // latch the bit + m_eeprom->di_write(BIT(data, 3)); + + // reset line asserted: reset. + m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); +} + +void ppsatan_state::ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask) +{ + if (data & ~0x000f) + logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); + + if (ACCESSING_BITS_0_7) // odd address + { + // bit 11? + + // latch the bit + m_eeprom->di_write((data & 0x0400) >> 10); + + // reset line asserted: reset. + m_eeprom->cs_write((data & 0x0100) ? CLEAR_LINE : ASSERT_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write((data & 0x0200) ? ASSERT_LINE : CLEAR_LINE); + } +} + + +void cave_state::guwange_eeprom_w(u8 data) +{ + if (data & ~0xef) + logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); + + machine().bookkeeping().coin_lockout_w(1, BIT(~data, 3)); + machine().bookkeeping().coin_lockout_w(0, BIT(~data, 2)); + machine().bookkeeping().coin_counter_w(1, BIT( data, 1)); + machine().bookkeeping().coin_counter_w(0, BIT( data, 0)); + + // latch the bit + m_eeprom->di_write(BIT(data, 7)); + + // reset line asserted: reset. + m_eeprom->cs_write(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write(BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); +} + +/* - No eeprom or lockouts */ +void cave_state::gaia_coin_w(u8 data) +{ + machine().bookkeeping().coin_counter_w(1, BIT(data, 1)); + machine().bookkeeping().coin_counter_w(0, BIT(data, 0)); +} + +/* - No coin lockouts + - Writing 0xcf shouldn't send a 1 bit to the EEPROM */ +void cave_z80_state::metmqstr_eeprom_w(u8 data) +{ + machine().bookkeeping().coin_counter_w(1, BIT(data, 5)); + machine().bookkeeping().coin_counter_w(0, BIT(data, 4)); + + if (BIT(~data, 0)) + { + // latch the bit + m_eeprom->di_write(BIT(data, 3)); + + // reset line asserted: reset. + m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); + } +} + +/*************************************************************************** + + + Memory Maps - Main CPU + + +***************************************************************************/ + +/* Lines starting with an empty comment in the following MemoryReadAddress + arrays are there for debug (e.g. the game does not read from those ranges + AFAIK) */ + +/*************************************************************************** + Dangun Feveron +***************************************************************************/ + +void cave_state::dfeveron_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x708000, 0x708fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x710000, 0x710bff).readonly(); // ? + map(0x710c00, 0x710fff).ram(); // ? + map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00001).portr("IN0"); // Inputs + map(0xb00002, 0xb00003).portr("IN1"); // Inputs + EEPROM + map(0xc00000, 0xc00000).w(FUNC(cave_state::eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Dodonpachi +***************************************************************************/ + +void cave_state::ddonpach_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x700000, 0x703fff).mirror(0x00c000).m(m_tilemap[2], FUNC(tilemap038_device::vram_8x8_map)); // Layer 2 + map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00000, 0xd00001).portr("IN0"); // Inputs + map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM + map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Donpachi +***************************************************************************/ + +u16 cave_state::donpachi_videoregs_r(offs_t offset) +{ + switch (offset) + { + case 0: + case 1: + case 2: + case 3: return irq_cause_r(offset); + + default: return 0x0000; + } +} + +void cave_state::donpachi_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x200000, 0x207fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x403fff).mirror(0x004000).m(m_tilemap[2], FUNC(tilemap038_device::vram_8x8_map)); // Layer 2 + map(0x500000, 0x50ffff).ram().share(m_spriteram[0]); // Sprites + map(0x600000, 0x600005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x800000, 0x800005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0x900000, 0x90007f).rw(FUNC(cave_state::donpachi_videoregs_r), FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0xa08000, 0xa08fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xb00000, 0xb00003).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // M6295 #0 + map(0xb00010, 0xb00013).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // M6295 #1 + map(0xb00020, 0xb0002f).w("nmk112", FUNC(nmk112_device::okibank_w)).umask16(0x00ff); // Samples bank + map(0xc00000, 0xc00001).portr("IN0"); // Inputs + map(0xc00002, 0xc00003).portr("IN1"); // Inputs + EEPROM + map(0xd00000, 0xd00000).w(FUNC(cave_state::eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Esprade +***************************************************************************/ + +void cave_state::esprade_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00000, 0xd00001).portr("IN0"); // Inputs + map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM + map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Gaia Crusaders +***************************************************************************/ + +void cave_state::gaia_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprite + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x508000, 0x50ffff).ram(); // More Layer 0, Tested but not used? + map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x608000, 0x60ffff).ram(); // More Layer 1, Tested but not used? + map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x708000, 0x70ffff).ram(); // More Layer 2, Tested but not used? + map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00010, 0xd00011).portr("IN0"); // Inputs + map(0xd00011, 0xd00011).w(FUNC(cave_state::gaia_coin_w)); // Coin counter only + map(0xd00012, 0xd00013).portr("IN1"); // Inputs + map(0xd00014, 0xd00015).portr("DSW"); // Dips + map(0xd00014, 0xd00015).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? +} + + +/*************************************************************************** + Guwange +***************************************************************************/ + +void cave_state::guwange_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x200000, 0x20ffff).ram(); // RAM + map(0x300000, 0x30007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x800000, 0x800003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control +/**/map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00010, 0xd00011).portr("IN0"); // Inputs + map(0xd00011, 0xd00011).w(FUNC(cave_state::guwange_eeprom_w)); // EEPROM + map(0xd00012, 0xd00013).portr("IN1"); // Inputs + EEPROM +// map(0xd00012, 0xd00013).nopw(); // ? +// map(0xd00014, 0xd00015).nopw(); // ? $800068 in dfeveron ? probably Watchdog +} + + +/*************************************************************************** + Hotdog Storm +***************************************************************************/ + +void cave_z80_state::hotdogst_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x300000, 0x30ffff).ram(); // RAM + map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x880000, 0x887fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x980000, 0x987fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0xa80000, 0xa8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0xa80000, 0xa80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause +// map(0xa8006e, 0xa8006f).r(FUNC(cave_z80_state::soundlatch_ack_r)); // From Sound CPU + map(0xa8006e, 0xa8006f).w(FUNC(cave_z80_state::sound_cmd_w)); // To Sound CPU + map(0xb00000, 0xb00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xb80000, 0xb80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xc00000, 0xc00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xc80000, 0xc80001).portr("IN0"); // Inputs + map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM + map(0xd00000, 0xd00000).w(FUNC(cave_z80_state::hotdogst_eeprom_w)); // EEPROM + map(0xd00002, 0xd00003).nopw(); // ??? + map(0xf00000, 0xf0ffff).ram().share(m_spriteram[0]); // Sprites +} + + +/*************************************************************************** + Koro Koro Quest +***************************************************************************/ + +void cave_state::show_leds() +{ +#ifdef MAME_DEBUG +// popmessage("led %04X eep %02X", m_leds[0], (m_leds[1] >> 8) & ~0x70); +#endif +} + +void cave_state::korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_leds[0]); + + m_led_outputs[0] = BIT(data, 15); + m_led_outputs[1] = BIT(data, 14); + m_led_outputs[2] = BIT(data, 12); // square button + m_led_outputs[3] = BIT(data, 11); // round button +// machine().bookkeeping().coin_lockout_w(1, ~data & 0x0200); // coin lockouts? +// machine().bookkeeping().coin_lockout_w(0, ~data & 0x0100); + +// machine().bookkeeping().coin_counter_w(2, data & 0x0080); +// machine().bookkeeping().coin_counter_w(1, data & 0x0020); + machine().bookkeeping().coin_counter_w(0, data & 0x0010); + + m_led_outputs[5] = BIT(data, 3); + m_led_outputs[6] = BIT(data, 2); + m_led_outputs[7] = BIT(data, 1); + m_led_outputs[8] = BIT(data, 0); + + show_leds(); +} + + +void cave_state::korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask) +{ + if (data & ~0x7000) + { + logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); + COMBINE_DATA(&m_leds[1]); + show_leds(); + } + + if (ACCESSING_BITS_8_15) // even address + { + m_hopper = data & 0x0100; // ??? + + // latch the bit + m_eeprom->di_write((data & 0x4000) >> 14); + + // reset line asserted: reset. + m_eeprom->cs_write((data & 0x1000) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write((data & 0x2000) ? ASSERT_LINE : CLEAR_LINE); + } +} + +int cave_state::korokoro_hopper_r() +{ + return m_hopper ? 1 : 0; +} + + +void cave_state::korokoro_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x107fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_writeonly_map)); // Layer 0 + map(0x140000, 0x140005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x180000, 0x187fff).writeonly().share(m_spriteram[0]); // Sprites + map(0x1c0000, 0x1c007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x1c0000, 0x1c0007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette +// map(0x240000, 0x240003).r("ymz", FUNC(ymz280b_device::read)).umask16(0x00ff); // YMZ280 + map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? + map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM + map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds + map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM + map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) + map(0x300000, 0x30ffff).ram(); // RAM +} + +void cave_state::crusherm_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x107fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_writeonly_map)); // Layer 0 + map(0x140000, 0x140005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x180000, 0x187fff).writeonly().share(m_spriteram[0]); // Sprites + map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? + map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM + map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds + map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM + map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) + map(0x300000, 0x30007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x340000, 0x34ffff).ram(); // RAM +} + +/*************************************************************************** + Mazinger Z +***************************************************************************/ + +void cave_z80_state::mazinger_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x30007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x300000, 0x300007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause + map(0x300068, 0x300069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x30006e, 0x30006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From Sound CPU + map(0x400000, 0x403fff).mirror(0x004000).m(m_tilemap[1], FUNC(tilemap038_device::vram_8x8_map)); // Layer 1 + map(0x500000, 0x503fff).mirror(0x004000).m(m_tilemap[0], FUNC(tilemap038_device::vram_8x8_map)); // Layer 0 + map(0x600000, 0x600005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x800000, 0x800001).portr("IN0"); // Inputs + map(0x800002, 0x800003).portr("IN1"); // Inputs + EEPROM + map(0x900000, 0x900000).w(FUNC(cave_z80_state::eeprom_w)); // EEPROM + map(0xc08000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00000, 0xd7ffff).rom().region("user1", 0); // extra data ROM +} + + +/*************************************************************************** + Metamoqester +***************************************************************************/ + +void cave_z80_state::metmqstr_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x17ffff).rom(); // ROM + map(0x200000, 0x27ffff).rom(); // ROM + map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x600000, 0x600001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog? + map(0x880000, 0x887fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x888000, 0x88ffff).ram(); // + map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x908000, 0x90ffff).ram(); // + map(0x980000, 0x987fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x988000, 0x98ffff).ram(); // + map(0xa80000, 0xa8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0xa80000, 0xa80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause + map(0xa80068, 0xa80069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? + map(0xa8006c, 0xa8006d).r(FUNC(cave_z80_state::soundflags_ack_r))/*.nopw()*/; // Communication + map(0xa8006e, 0xa8006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From Sound CPU + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xb80000, 0xb80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xc00000, 0xc00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xc80000, 0xc80001).portr("IN0"); // Inputs + map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM + map(0xd00000, 0xd00000).w(FUNC(cave_z80_state::metmqstr_eeprom_w)); // EEPROM + map(0xf00000, 0xf0ffff).ram().share(m_spriteram[0]); // Sprites + // 0xf00000-0xf07fff Sprite RAM + // 0xf08000-0xf0ffff Work RAM +} + + +/*************************************************************************** + Poka Poka Satan +***************************************************************************/ + +void ppsatan_state::ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_ppsatan_io_mux); +} + +template +u16 ppsatan_state::ppsatan_touch_r() +{ + u8 ret_x = 0, ret_y = 0; + + u16 x = m_touch_x[Player]->read(); + u16 y = m_touch_y[Player]->read(); + + if (x & 0x8000) // touching + { + x &= 0x7fff; + + // x + int slot_x = floor( ((320.0f - 1 - x) - 12) / 20 ); + + if (slot_x < 0) + slot_x = 0; + else if (slot_x > 14) + slot_x = 14; + + if ( (m_ppsatan_io_mux & (1 << slot_x)) || ((m_ppsatan_io_mux << 13) & (1 << slot_x)) ) + ret_x |= 1 << (slot_x % 8); + + // y + int slot_y = floor( ((224.0f - 1 - y) - 14) / 18 ); + + if (slot_y < 0) + slot_y = 0; + else if (slot_y > 10) + slot_y = 10; + + if ( ((m_ppsatan_io_mux >> 2) & (1 << slot_y)) || ((m_ppsatan_io_mux << 6) & (1 << slot_y)) ) + ret_y |= 1 << (slot_y % 6); + +// if (!Player) popmessage("TOUCH %03x %03x -> %f -> %d", x, y, ((320.0f - 1 - x) - 12) / 20, slot_x); + } + + return ret_x | (ret_y << 8); +} + +void ppsatan_state::ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask) +{ + if (ACCESSING_BITS_0_7) + { + machine().bookkeeping().coin_counter_w(0, data & 0x0001); + + m_led_outputs[0] = BIT(data, 4); + m_led_outputs[1] = BIT(data, 5); + m_led_outputs[2] = BIT(data, 6); + m_led_outputs[3] = BIT(data, 7); + } + if (ACCESSING_BITS_8_15) + { + m_led_outputs[4] = BIT(data, 8); + m_led_outputs[5] = BIT(data, 9); + m_led_outputs[6] = BIT(data, 10); // not tested in service mode + m_led_outputs[7] = BIT(data, 11); // not tested in service mode + + m_oki[0]->set_rom_bank((data & 0x8000) >> 15); + } + +// popmessage("OUT %04x", data); +} + +void ppsatan_state::ppsatan_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom(); // ROM + map(0x040000, 0x04ffff).ram(); // RAM + + // Left Screen (Player 2) + map(0x080000, 0x080005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control + map(0x100000, 0x107fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer +// map(0x180000, 0x1803ff).ram() // Palette (Tilemaps) +// map(0x187800, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette (Sprites) + map(0x180000, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette + map(0x1c0000, 0x1c7fff).ram().share(m_spriteram[1]); // Sprites + map(0x200000, 0x200001).portr("SYSTEM"); // DSW + (unused) EEPROM + map(0x200000, 0x200001).w(FUNC(ppsatan_state::ppsatan_out_w)); // Outputs + OKI banking + map(0x200002, 0x200003).rw(FUNC(ppsatan_state::ppsatan_touch_r<1>), FUNC(ppsatan_state::ppsatan_eeprom_w)); // Touch Screen + (unused) EEPROM + map(0x200004, 0x200005).rw(FUNC(ppsatan_state::ppsatan_touch_r<0>), FUNC(ppsatan_state::ppsatan_io_mux_w)); // Touch Screen + map(0x200006, 0x200007).nopw(); // Lev. 2 IRQ Ack? + map(0x2c0000, 0x2c007f).w(FUNC(ppsatan_state::videoregs_w<1>)).share(m_videoregs[1]); // Video Regs + map(0x2c0000, 0x2c0007).r(FUNC(ppsatan_state::irq_cause_r)); // IRQ Cause + map(0x2c0068, 0x2c0069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + + map(0x300001, 0x300001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + + // Right Screen (Player 1) + map(0x480000, 0x480005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control + map(0x500000, 0x507fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer +// map(0x580000, 0x5803ff).ram() // Palette (Tilemaps) +// map(0x587800, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette (Sprites) + map(0x580000, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette + map(0x5c0000, 0x5c7fff).ram().share(m_spriteram[2]); // Sprites + map(0x6c0000, 0x6c007f).w(FUNC(ppsatan_state::videoregs_w<2>)).share(m_videoregs[2]); // Video Regs + + // Top Screen + map(0x880000, 0x880005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control + map(0x900000, 0x907fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer +// map(0x980000, 0x9803ff).ram(); // Palette (Tilemaps) +// map(0x987800, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette (Sprites) + map(0x980000, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x9c0000, 0x9c7fff).ram().share(m_spriteram[0]); // Sprites + map(0xac0000, 0xac007f).w(FUNC(ppsatan_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs +} + + +/*************************************************************************** + Power Instinct 2 +***************************************************************************/ + +u16 cave_z80_state::pwrinst2_eeprom_r() +{ + return ~8 + ((m_eeprom->do_read() & 1) ? 8 : 0); +} + +template +void cave_z80_state::pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask) +{ + if (offset == 4 / 2) + { + switch (data & 0x000f) + { + case 1: data = (data & ~0x000f) | 0; break; + case 2: data = (data & ~0x000f) | 1; break; + case 4: data = (data & ~0x000f) | 2; break; + default: + case 8: data = (data & ~0x000f) | 3; break; + } + } + m_tilemap[Chip]->vregs_w(offset, data, mem_mask); +} + +void cave_z80_state::pwrinst2_map(address_map &map) +{ + map(0x000000, 0x1fffff).rom(); // ROM + map(0x400000, 0x40ffff).ram(); // RAM + map(0x500000, 0x500001).portr("IN0"); // Inputs + map(0x500002, 0x500003).portr("IN1"); // + map(0x600000, 0x6fffff).rom().region("user1", 0); // extra data ROM space + map(0x700000, 0x700000).w(FUNC(cave_z80_state::eeprom_w)); // EEPROM + map(0x800000, 0x807fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x880000, 0x887fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x980000, 0x983fff).mirror(0x004000).m(m_tilemap[3], FUNC(tilemap038_device::vram_8x8_map)); // Layer 3 + map(0xa00000, 0xa0ffff).ram().share(m_spriteram[0]); // Sprites + map(0xa10000, 0xa1ffff).ram(); // Sprites? + map(0xa80000, 0xa8007f).rw(FUNC(cave_z80_state::donpachi_videoregs_r), FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0xb00000, 0xb00005).r(m_tilemap[2], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<2>)); // Layer 2 Control + map(0xb80000, 0xb80005).r(m_tilemap[0], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<0>)); // Layer 0 Control + map(0xc00000, 0xc00005).r(m_tilemap[1], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<1>)); // Layer 1 Control + map(0xc80000, 0xc80005).r(m_tilemap[3], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<3>)); // Layer 3 Control + map(0xd80000, 0xd80001).r(FUNC(cave_z80_state::soundlatch_ack_r)); // ? From Sound CPU + map(0xe00000, 0xe00001).w(FUNC(cave_z80_state::sound_cmd_w)); // To Sound CPU + map(0xe80000, 0xe80001).r(FUNC(cave_z80_state::pwrinst2_eeprom_r)); // EEPROM + map(0xf00000, 0xf04fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette +} + + +/*************************************************************************** + Sailor Moon +***************************************************************************/ + +u16 cave_z80_state::sailormn_input0_r() +{ +// watchdog_reset16_r(0, 0); // written too rarely for mame. + return m_io_in0->read(); +} + +void cave_z80_state::sailormn_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x110000, 0x110001).ram(); // (agallet) + map(0x200000, 0x3fffff).rom(); // ROM + map(0x400000, 0x407fff).ram(); // (agallet) + map(0x408000, 0x40bfff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x40c000, 0x40ffff).ram(); // (agallet) + map(0x410000, 0x410001).ram(); // (agallet) + map(0x500000, 0x50ffff).ram().share(m_spriteram[0]); // Sprites + map(0x510000, 0x510001).ram(); // (agallet) + map(0x600000, 0x600001).r(FUNC(cave_z80_state::sailormn_input0_r)); // Inputs + Watchdog! + map(0x600002, 0x600003).portr("IN1"); // Inputs + EEPROM + map(0x700000, 0x700000).w(FUNC(cave_z80_state::sailormn_eeprom_w)); // EEPROM + map(0x800000, 0x807fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x880000, 0x887fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 + map(0x900000, 0x907fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 + map(0x908000, 0x908001).ram(); // (agallet) + map(0xa00000, 0xa00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0xa80000, 0xa80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control + map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control + map(0xb80000, 0xb8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0xb80000, 0xb80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause (bit 2 tested!) + map(0xb8006c, 0xb8006d).r(FUNC(cave_z80_state::soundflags_ack_r)); // Communication + map(0xb8006e, 0xb8006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From/To Sound CPU +} + + +/*************************************************************************** + Tekken Card World +***************************************************************************/ + +void cave_state::tekkencw_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x400002, 0x400003).portr("IN1"); // Inputs + map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Tekken Battle Scratch +***************************************************************************/ + +void cave_state::tekkenbs_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x600002, 0x600003).portr("IN1"); // Inputs + map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Tobikose! Jumpman +***************************************************************************/ + +void cave_state::tjumpman_eeprom_w(u8 data) +{ + if (data & ~0x38) + logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); + + // latch the bit + m_eeprom->di_write(BIT(data, 5)); + + // reset line asserted: reset. + m_eeprom->cs_write(BIT(data, 3) ? ASSERT_LINE : CLEAR_LINE); + + // clock line asserted: write latch or select next bit to read + m_eeprom->clk_write(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE); +} + +void cave_state::tjumpman_leds_w(u8 data) +{ + m_led_outputs[0] = BIT(data, 0); // suru + m_led_outputs[1] = BIT(data, 1); // shinai + m_led_outputs[2] = BIT(data, 2); // payout + m_led_outputs[3] = BIT(data, 3); // go + m_led_outputs[4] = BIT(data, 4); // 1 bet + m_led_outputs[5] = BIT(data, 5); // medal + m_hopper = BIT(data, 6); // hopper + m_led_outputs[6] = BIT(data, 7); // 3 bet + +// popmessage("led %04X", data); +} + +int cave_state::tjumpman_hopper_r() +{ + return (m_hopper && !(m_screen[0]->frame_number() % 10)) ? 0 : 1; +} + +void cave_state::tjumpman_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x304000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_16x16_writeonly_map)); // Layer 0 - 16x16 tiles mapped here + map(0x400000, 0x400005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x500000, 0x50ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x600002, 0x600003).portr("IN1"); // Inputs + map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Pac-Slot +***************************************************************************/ + +void cave_state::pacslot_leds_w(u8 data) +{ + m_led_outputs[0] = data & 0x0001; // pac-man + m_led_outputs[1] = data & 0x0002; // ms. pac-man + m_led_outputs[2] = data & 0x0004; // payout + m_led_outputs[3] = data & 0x0008; // start + m_led_outputs[4] = data & 0x0010; // bet + m_led_outputs[5] = data & 0x0020; // medal + m_hopper = data & 0x0040; // hopper + +// popmessage("led %04X", data); +} + +void cave_state::pacslot_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x40007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x400000, 0x400007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x400068, 0x400069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x700000, 0x700001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x700002, 0x700003).portr("IN1"); // Inputs + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Pac-Eight +***************************************************************************/ + +//TODO: leds need verifying + +void cave_state::paceight_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x500000, 0x500001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x500002, 0x500003).portr("IN1"); // Inputs + map(0x600000, 0x600005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + + +/*************************************************************************** + Pac-Carnival +***************************************************************************/ + +//TODO: leds need verifying + +int cave_state::paccarn_bet4_r() +{ + return (m_io_bet->read() & 0x5) ? 1 : 0; +} + +int cave_state::paccarn_bet8_r() +{ + return (m_io_bet->read() & 0x6) ? 1 : 0; +} + +void cave_state::paccarn_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites + map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x400002, 0x400003).portr("IN1"); // Inputs + map(0x500000, 0x50ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x600000, 0x600005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM +} + +/*************************************************************************** + Uo Poko +***************************************************************************/ + +void cave_state::uopoko_map(address_map &map) +{ + map(0x000000, 0x0fffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites + map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 + map(0x600000, 0x60007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs + map(0x600000, 0x600007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control + map(0x800000, 0x80ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x900000, 0x900001).portr("IN0"); // Inputs + map(0x900002, 0x900003).portr("IN1"); // Inputs + EEPROM + map(0xa00000, 0xa00000).w(FUNC(cave_state::eeprom_w)); // EEPROM +} + + + +/*************************************************************************** + + + Memory Maps - Sound CPU (Optional) + + +***************************************************************************/ + +template +void cave_z80_state::z80_rombank_w(u8 data) +{ + if (data & ~Mask) + logerror("%s: Z80 Bank %02X\n", machine().describe_context(), data); + + m_z80bank->set_entry(data & Mask); +} + +template +void cave_z80_state::oki1_bank_w(u8 data) +{ + int bank1 = (data >> 0) & Mask; + int bank2 = (data >> 4) & Mask; + m_okibank_lo[0]->set_entry(bank1); + m_okibank_hi[0]->set_entry(bank2); +} + +template +void cave_z80_state::oki2_bank_w(u8 data) +{ + int bank1 = (data >> 0) & Mask; + int bank2 = (data >> 4) & Mask; + m_okibank_lo[1]->set_entry(bank1); + m_okibank_hi[1]->set_entry(bank2); +} + + +void cave_z80_state::oki_map(address_map &map) +{ + map(0x00000, 0x1ffff).bankr(m_okibank_lo[0]); + map(0x20000, 0x3ffff).bankr(m_okibank_hi[0]); +} + +void cave_z80_state::oki2_map(address_map &map) +{ + map(0x00000, 0x1ffff).bankr(m_okibank_lo[1]); + map(0x20000, 0x3ffff).bankr(m_okibank_hi[1]); +} + + +/*************************************************************************** + Hotdog Storm +***************************************************************************/ + +void cave_z80_state::hotdogst_sound_map(address_map &map) +{ + map(0x0000, 0x3fff).rom(); // ROM + map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) + map(0xe000, 0xffff).ram(); // RAM +} + +void cave_z80_state::hotdogst_sound_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x0f>)); // ROM bank + map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU + map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" + map(0x50, 0x51).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // YM2203 + map(0x60, 0x60).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0x3>)); // Samples bank +} + + +/*************************************************************************** + Mazinger Z +***************************************************************************/ + +void cave_z80_state::mazinger_sound_map(address_map &map) +{ + map(0x0000, 0x3fff).rom(); // ROM + map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) + map(0xc000, 0xc7ff).ram(); // RAM + map(0xf800, 0xffff).ram(); // RAM +} + +void cave_z80_state::mazinger_sound_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x07>)); // ROM bank + map(0x10, 0x10).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU + map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU + map(0x50, 0x51).w("ymsnd", FUNC(ym2203_device::write)); // YM2203 + map(0x52, 0x53).r("ymsnd", FUNC(ym2203_device::read)); // YM2203 + map(0x70, 0x70).w("oki1", FUNC(okim6295_device::write)); // M6295 + map(0x74, 0x74).w(FUNC(cave_z80_state::oki1_bank_w<0x3>)); // Samples bank +} + + +/*************************************************************************** + Metamoqester +***************************************************************************/ + +void cave_z80_state::metmqstr_sound_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x0f>)); // Rom Bank + map(0x20, 0x20).r(FUNC(cave_z80_state::soundflags_r)); // Communication + map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU + map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" + map(0x50, 0x51).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 + map(0x60, 0x60).w("oki1", FUNC(okim6295_device::write)); // M6295 #0 + map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0x7>)); // Samples Bank #0 + map(0x80, 0x80).w("oki2", FUNC(okim6295_device::write)); // M6295 #1 + map(0x90, 0x90).w(FUNC(cave_z80_state::oki2_bank_w<0x7>)); // Samples Bank #1 +} + + +/*************************************************************************** + Power Instinct 2 +***************************************************************************/ + +void cave_z80_state::pwrinst2_sound_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); // ROM + map(0x8000, 0xbfff).bankr(m_z80bank); // ROM (Banked) + map(0xe000, 0xffff).ram(); // RAM +} + +void cave_z80_state::pwrinst2_sound_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #0 + map(0x08, 0x08).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #1 + map(0x10, 0x17).w("nmk112", FUNC(nmk112_device::okibank_w)); // Samples bank + map(0x40, 0x41).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // YM2203 + map(0x50, 0x50).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU +// map(0x51, 0x51).nopw(); // ?? volume + map(0x60, 0x60).r(FUNC(cave_z80_state::soundlatch_hi_r)); // From Main CPU + map(0x70, 0x70).r(FUNC(cave_z80_state::soundlatch_lo_r)); // "" + map(0x80, 0x80).w(FUNC(cave_z80_state::z80_rombank_w<0x07>)); // ROM bank +} + + +/*************************************************************************** + Sailor Moon +***************************************************************************/ + +void cave_z80_state::sailormn_sound_map(address_map &map) +{ + map(0x0000, 0x3fff).rom(); // ROM + map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) + map(0xc000, 0xdfff).mirror(0x2000).ram(); // RAM (8KB, mirrored) +} + +void cave_z80_state::sailormn_sound_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x1f>)); // Rom Bank + map(0x10, 0x10).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU + map(0x20, 0x20).r(FUNC(cave_z80_state::soundflags_r)); // Communication + map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU + map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" + map(0x50, 0x51).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 + map(0x60, 0x60).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #0 + map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0xf>)); // Samples Bank #0 + map(0x80, 0x80).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #1 + map(0xc0, 0xc0).w(FUNC(cave_z80_state::oki2_bank_w<0xf>)); // Samples Bank #1 +} + + + +/*************************************************************************** + + + Input Ports + + +***************************************************************************/ + +/* + dfeveron config menu: + 101624.w -> 8,a6 preferences + 101626.w -> c,a6 (1:coin<<4|credit) <<8 | (2:coin<<4|credit) +*/ + +/* Most games use this */ +static INPUT_PORTS_START( cave ) + PORT_START("IN0") // Player 1 + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) + PORT_SERVICE_NO_TOGGLE( 0x0200, IP_ACTIVE_LOW ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sw? exit service mode + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sw? enter & exit service mode + PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") // Player 2 + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0xf400, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + +/* Gaia Crusaders, no EEPROM. Has DIPS */ +static INPUT_PORTS_START( gaia ) + PORT_INCLUDE( cave ) + + PORT_MODIFY("IN0") // Player 1 + 2 + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_MODIFY("IN1") // Coins + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) + PORT_SERVICE_NO_TOGGLE( 0x0004, IP_ACTIVE_LOW ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x0fc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x0000, DEF_STR( English ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Japanese ) ) + PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:4,5,6") + PORT_DIPSETTING( 0x0008, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0000, "2 Coins/1 Credit (1 to continue)" ) + PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0018, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( On ) ) + + PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPSETTING( 0x0100, "1" ) + PORT_DIPSETTING( 0x0000, "2" ) + PORT_DIPSETTING( 0x0300, "3" ) + PORT_DIPSETTING( 0x0200, "4" ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0400, "150k/300k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xc000) + PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xa000) + PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xe000) + PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x6000) + PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x8000) + PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x2000) + PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x4000) + PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x0000) + PORT_DIPNAME( 0x1800, 0x1800, "Damage" ) PORT_DIPLOCATION("SW2:4,5") + PORT_DIPSETTING( 0x1800, "+0" ) + PORT_DIPSETTING( 0x1000, "+1" ) + PORT_DIPSETTING( 0x0800, "+2" ) + PORT_DIPSETTING( 0x0000, "+3" ) + PORT_DIPNAME( 0xe000, 0xe000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7,8") + PORT_DIPSETTING( 0xc000, DEF_STR( Very_Easy ) ) + PORT_DIPSETTING( 0xa000, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xe000, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x6000, DEF_STR( Medium_Hard ) ) + PORT_DIPSETTING( 0x8000, "Hard 1" ) + PORT_DIPSETTING( 0x2000, "Hard 2" ) + PORT_DIPSETTING( 0x4000, DEF_STR( Very_Hard ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( theroes ) + PORT_INCLUDE( gaia ) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x0000, DEF_STR( English ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Chinese ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0400, "150k/300k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) + PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) + PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) + PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x0000) + PORT_DIPUNKNOWN_DIPLOC( 0x2000, 0x2000, "SW2:6" ) + PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPSETTING( 0x8000, DEF_STR( Very_Easy ) ) + PORT_DIPSETTING( 0xc000, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Medium_Hard ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) +INPUT_PORTS_END + + +/* Normal layout but with 4 buttons */ +static INPUT_PORTS_START( metmqstr ) + PORT_INCLUDE( cave ) + + PORT_MODIFY("IN0") // Player 1 + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + + PORT_MODIFY("IN1") // Player 2 + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) +INPUT_PORTS_END + +/* Different layout */ +static INPUT_PORTS_START( guwange ) + PORT_START("IN0") // Player 1 & 2 + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + + PORT_START("IN1") // Coins + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) + PORT_SERVICE_NO_TOGGLE( 0x0004, IP_ACTIVE_LOW ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0xff70, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( korokoro ) + PORT_START("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // bit 0x0010 of leds (coin) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // bit 0x0020 of leds (does coin sound) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(10) // bit 0x0080 of leds + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON1 ) // round button (choose) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) // square button (select in service mode / medal out in game) + PORT_BIT( 0x0fe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE2 ) // service medal out? + PORT_SERVICE( 0x2000, IP_ACTIVE_LOW ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, korokoro_hopper_r) // motor / hopper status ??? + + PORT_START("IN1") + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0xefff, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( tekkencw ) + PORT_START("IN0") + PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( Yes ) ) PORT_CODE(KEYCODE_Y) // suru ("do") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) + + PORT_START("IN1") + PORT_CONFNAME( 0x08, 0x08, "Self Test" ) + PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME( DEF_STR( No ) ) PORT_CODE(KEYCODE_N) // shinai ("not") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Action" ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) + PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( tekkenbs ) + PORT_START("IN0") + PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) + + PORT_START("IN1") + PORT_CONFNAME( 0x08, 0x08, "Self Test" ) + PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Start" ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) + PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( tjumpman ) + PORT_START("IN0") + PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) + PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( Yes ) ) PORT_CODE(KEYCODE_Y) // suru ("do") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "1 Bet" ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) + + PORT_START("IN1") + PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_CONFNAME( 0x08, 0x08, "Self Test" ) + PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( No ) ) PORT_CODE(KEYCODE_N) // shinai ("not") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME( "Go" ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "3 Bet" ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( pacslot ) + PORT_START("IN0") + PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) // must stay on during service mode + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Pac-Man" ) PORT_CODE(KEYCODE_Y) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) + + PORT_START("IN1") + PORT_CONFNAME( 0x08, 0x08, "Self Test" ) + PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Ms. Pac-Man" ) PORT_CODE(KEYCODE_N) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) + PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + +static INPUT_PORTS_START( paceight ) + PORT_INCLUDE( pacslot ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Left" ) PORT_CODE(KEYCODE_Y) + + PORT_MODIFY("IN1") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Right" ) PORT_CODE(KEYCODE_N) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Max Bet" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( paccarn ) + PORT_START("IN0") + PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, paccarn_bet4_r) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet 2" ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) + + PORT_START("IN1") + PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_CONFNAME( 0x08, 0x08, "Self Test" ) + PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, paccarn_bet8_r) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Bet 3" ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + + // holding together Bet 4 and Bet 8 activates Bet 12 in IO Test Mode + PORT_START("BET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME( "Bet 4" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME( "Bet 8" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME( "Bet 12" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( ppsatan ) + PORT_START("SYSTEM") // $200000 + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE2 ) // advance in service mode + PORT_BIT( 0x0072, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + + PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPSETTING( 0x0300, "1 Coin/1 1P-Game (2 Coins/1 2P-Game)" ) + PORT_DIPSETTING( 0x0100, "2 Coins/1 1P-Game (3 Coins/1 2P-Game)" ) + PORT_DIPSETTING( 0x0200, "2 Coins/1 1P-Game (4 Coins/1 2P-Game)" ) + PORT_DIPSETTING( 0x0000, "2 Coins/1 1P-Game (4 Coins/1 2P-Game) (duplicate)" ) + PORT_DIPUNKNOWN(0x0400, 0x0400) PORT_DIPLOCATION("SW1:3") + PORT_DIPUNKNOWN(0x0800, 0x0800) PORT_DIPLOCATION("SW1:4") + PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPSETTING( 0x1000, DEF_STR( Easy ) ) // 15 hits + PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) ) // 20 hits + PORT_DIPSETTING( 0x0000, DEF_STR( Hard ) ) // 25 hits + PORT_DIPSETTING( 0x2000, "Hard (duplicate)" ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7") // Jingle after "warning" screen (every 3 demo loops) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( On ) ) + PORT_SERVICE(0x8000, IP_ACTIVE_LOW) PORT_DIPLOCATION("SW1:8") + + PORT_START("TOUCH1_X") + PORT_BIT( 0x7fff, 0x20, IPT_LIGHTGUN_X ) PORT_PLAYER(1) PORT_MINMAX(0x000, 0x140-1) PORT_CROSSHAIR(X, 284.0/320.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_START("TOUCH1_Y") + PORT_BIT( 0xffff, 0x18, IPT_LIGHTGUN_Y ) PORT_PLAYER(1) PORT_MINMAX(0x000, 0xe0-1) PORT_CROSSHAIR(Y, 188.0/224.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) + + PORT_START("TOUCH2_X") + PORT_BIT( 0x7fff, 0x20, IPT_LIGHTGUN_X ) PORT_PLAYER(2) PORT_MINMAX(0x000, 0x140-1) PORT_CROSSHAIR(X, 284.0/320.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_START("TOUCH2_Y") + PORT_BIT( 0xffff, 0x18, IPT_LIGHTGUN_Y ) PORT_PLAYER(2) PORT_MINMAX(0x000, 0xe0-1) PORT_CROSSHAIR(Y, 188.0/224.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) +INPUT_PORTS_END + + +/*************************************************************************** + + + Graphics Layouts + + +***************************************************************************/ + +// 6bpp tiles are accessible only 0x400 colors + +// 8x8x6 tiles (in a 8x8x8 layout) +static const gfx_layout layout_8x8x6 = +{ + 8,8, + RGN_FRAC(1,1), + 6, + {STEP2(8,1),STEP4(0,1)}, + {0*4,1*4,4*4,5*4,8*4,9*4,12*4,13*4}, + {STEP8(0,8*8)}, + 8*8*8 +}; + +// 8x8x6 tiles (4 bits in one rom, 2 bits in the other, +// unpacked in 2 pages of 4 bits) +static const gfx_layout layout_8x8x6_2 = +{ + 8,8, + RGN_FRAC(1,2), + 6, + {RGN_FRAC(1,2)+2,RGN_FRAC(1,2)+3, STEP4(0,1)}, + {STEP8(0,4)}, + {STEP8(0,4*8)}, + 8*8*4 +}; + +// 8x8x8 tiles +static const gfx_layout layout_8x8x8 = +{ + 8,8, + RGN_FRAC(1,1), + 8, + {STEP4(8,1),STEP4(0,1)}, + {0*4,1*4,4*4,5*4,8*4,9*4,12*4,13*4}, + {STEP8(0,8*8)}, + 8*8*8 +}; + +// 16~x16~x4 Zooming Sprites - decode each 16 pixel lines +static const gfx_layout layout_sprites = +{ + 16,1, + RGN_FRAC(1,1), + 4, + {STEP4(0,1)}, + {1*4,0*4,3*4,2*4,5*4,4*4,7*4,6*4,9*4,8*4,11*4,10*4,13*4,12*4,15*4,14*4}, + {0}, + 16*4 +}; + +// 16~x16~x4 Non-zooming Sprites - decode each 16 pixel lines +static const gfx_layout layout_sprites_msb = +{ + 16,1, + RGN_FRAC(1,1), + 4, + {STEP4(0,1)}, + {STEP16(0,4)}, + {0}, + 16*4 +}; + +// esprade, guwange uses 8bpp sprites instead 4bpp +static const gfx_layout layout_sprites_8bpp = +{ + 16,1, + RGN_FRAC(1,1), + 8, + {STEP4(0,1), STEP4(4*4,1)}, + {STEP4(4*4*2*0+3*4,-4),STEP4(4*4*2*1+3*4,-4),STEP4(4*4*2*2+3*4,-4),STEP4(4*4*2*3+3*4,-4)}, + {0}, + 16*8 +}; + +static GFXDECODE_START( gfx_common_spr ) + GFXDECODE_ENTRY( "sprites0", 0, layout_sprites, 0x0000, 0x40 ) +GFXDECODE_END + +/*************************************************************************** + Dangun Feveron +***************************************************************************/ + +static GFXDECODE_START( gfx_dfeveron ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [1] Layer 1 +GFXDECODE_END + +/*************************************************************************** + Dodonpachi +***************************************************************************/ + +// different gfx layout +static GFXDECODE_START( gfx_ddonpach_spr ) + GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_msb, 0x0000, 0x40 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_ddonpach ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x4000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x4000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x8, 0x4000, 0x40 ) // [2] Layer 2 +GFXDECODE_END + +/*************************************************************************** + Donpachi +***************************************************************************/ + +static GFXDECODE_START( gfx_donpachi ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [2] Layer 2 +GFXDECODE_END + +/*************************************************************************** + Esprade +***************************************************************************/ + +static GFXDECODE_START( gfx_esprade_spr ) + GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_8bpp, 0x0000, 0x40 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_esprade ) + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x8, 0x4000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x8, 0x4000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x8, 0x4000, 0x40 ) // [2] Layer 2 +GFXDECODE_END + +/*************************************************************************** + Hotdog Storm +***************************************************************************/ + +static GFXDECODE_START( gfx_hotdogst ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [2] Layer 2 +GFXDECODE_END + +/*************************************************************************** + Koro Koro Quest +***************************************************************************/ + +// different sprite base palette +static GFXDECODE_START( gfx_korokoro_spr ) + GFXDECODE_ENTRY( "sprites0", 0, layout_sprites, 0x3c00, 0x40 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_korokoro ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 +GFXDECODE_END + +/*************************************************************************** + Mazinger Z +***************************************************************************/ + +static GFXDECODE_START( gfx_mazinger ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x6, 0x0400, 0x10 ) // [1] Layer 1 +GFXDECODE_END + +/*************************************************************************** + Poka Poka Satan +***************************************************************************/ + +static GFXDECODE_START( gfx_ppsatan_0 ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_spr_1 ) + GFXDECODE_ENTRY( "sprites1", 0, layout_sprites, 0x3c00, 0x40 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_1 ) + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [1] Layer 1 +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_spr_2 ) + GFXDECODE_ENTRY( "sprites2", 0, layout_sprites, 0x3c00, 0x40 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_2 ) + GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [2] Layer 2 +GFXDECODE_END + +/*************************************************************************** + Power Instinct 2 +***************************************************************************/ + +// expanded sprite color space +static GFXDECODE_START( gfx_pwrinst2_spr ) + GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_msb, 0x0000, 0x80 ) +GFXDECODE_END + +static GFXDECODE_START( gfx_pwrinst2 ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0800, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x1000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x1800, 0x40 ) // [2] Layer 2 + GFXDECODE_ENTRY( "layer3", 0, gfx_8x8x4_packed_msb, 0x2000, 0x40 ) // [3] Layer 3 +GFXDECODE_END + + +/*************************************************************************** + Sailor Moon +***************************************************************************/ + +static GFXDECODE_START( gfx_sailormn ) + GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0800, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x6_2, 0x0c00, 0x10 ) // [2] Layer 2 +GFXDECODE_END + + +/*************************************************************************** + Uo Poko +***************************************************************************/ + +static GFXDECODE_START( gfx_uopoko ) + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x8, 0x4000, 0x40 ) // [0] Layer 0 +GFXDECODE_END + + +/*************************************************************************** + + + Machine Drivers + + +***************************************************************************/ + +void cave_state::machine_start() +{ + m_led_outputs.resolve(); + m_vblank_end_timer = timer_alloc(FUNC(cave_state::vblank_end), this); + + save_item(NAME(m_vblank_irq)); + save_item(NAME(m_sound_irq)); + save_item(NAME(m_unknown_irq)); + save_item(NAME(m_agallet_vblank_irq)); +} + +void cave_z80_state::machine_start() +{ + cave_state::machine_start(); + + save_item(NAME(m_soundbuf_wptr)); + save_item(NAME(m_soundbuf_rptr)); + save_item(NAME(m_soundbuf_data)); + save_item(NAME(m_soundbuf_empty)); +} + +void ppsatan_state::machine_start() +{ + cave_state::machine_start(); + + m_ppsatan_io_mux = 0; + save_item(NAME(m_ppsatan_io_mux)); +} + +void cave_state::machine_reset() +{ + m_vblank_irq = 0; + m_sound_irq = 0; + m_unknown_irq = 0; + m_agallet_vblank_irq = 0; +} + +void cave_z80_state::machine_reset() +{ + cave_state::machine_reset(); + + std::fill(std::begin(m_soundbuf_data), std::end(m_soundbuf_data), 0); + m_soundbuf_wptr = 0; + m_soundbuf_rptr = 0; + m_soundbuf_empty = true; +} + +void cave_state::add_base_config(machine_config &config, int layer) +{ + M68000(config, m_maincpu, 16_MHz_XTAL); + m_maincpu->set_vblank_int("screen.0", FUNC(cave_state::interrupt)); + + TIMER(config, m_int_timer).configure_generic(FUNC(cave_state::vblank_start)); + + SCREEN(config, m_screen[0], SCREEN_TYPE_RASTER); + m_screen[0]->set_refresh_hz(15625/271.5); + m_screen[0]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[0]->set_size(320, 240); + m_screen[0]->set_visarea(0, 320-1, 0, 240-1); + m_screen[0]->set_screen_update(FUNC(cave_state::screen_update)); + + PALETTE(config, m_palette[0], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x8000); + + GFXDECODE(config, m_spr_gfxdecode[0], m_palette[0], gfx_common_spr); + + for (int i = 0; i < layer; i++) + { + TMAP038(config, m_tilemap[i]); + m_tilemap[i]->set_gfxdecode_tag(m_gfxdecode[0]); + m_tilemap[i]->set_gfx(i); + } +} + +void cave_state::add_ymz(machine_config &config) +{ + // TODO: all PCB versions using mono, on a YMZ chip as well? Sounds very unlikely, verify on all flavours. + SPEAKER(config, "mono").front_center(); + + ymz280b_device &ymz(YMZ280B(config, "ymz", 16.9344_MHz_XTAL)); + ymz.irq_handler().set(FUNC(cave_state::sound_irq_gen)); + ymz.add_route(ALL_OUTPUTS, "mono", 1.0); +} + +/*************************************************************************** + Dangun Feveron +***************************************************************************/ + +void cave_state::dfeveron(machine_config &config) +{ + add_base_config(config, 2); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::dfeveron_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_dfeveron); + m_palette[0]->set_entries(0x1000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) + + /* sound hardware */ + add_ymz(config); +} + + +/*************************************************************************** + Dodonpachi +***************************************************************************/ + +void cave_state::ddonpach(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::ddonpach_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_spr_gfxdecode[0]->set_info(gfx_ddonpach_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ddonpach); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + add_ymz(config); +} + + +/*************************************************************************** + Donpachi +***************************************************************************/ + +void cave_state::donpachi(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::donpachi_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_spr_gfxdecode[0]->set_info(gfx_ddonpach_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); + m_palette[0]->set_entries(0x1000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, m_oki[0], 4.224_MHz_XTAL/4, okim6295_device::PIN7_HIGH); // pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.60); + + OKIM6295(config, m_oki[1], 4.224_MHz_XTAL/2, okim6295_device::PIN7_HIGH); // pin 7 not verified + m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); + + nmk112_device &nmk112(NMK112(config, "nmk112", 0)); + nmk112.set_rom0_tag("oki1"); + nmk112.set_rom1_tag("oki2"); + nmk112.set_page_mask(1 << 0); // chip #0 (music) is not paged +} + + +/*************************************************************************** + Esprade +***************************************************************************/ + +void cave_state::esprade(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::esprade_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_spr_gfxdecode[0]->set_info(gfx_esprade_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + add_ymz(config); +} + + +/*************************************************************************** + Gaia Crusaders +***************************************************************************/ + +void cave_state::gaia(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::gaia_map); + + WATCHDOG_TIMER(config, "watchdog"); + + /* video hardware */ + m_screen[0]->set_visarea(0, 320-1, 0, 224-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + add_ymz(config); + + // Unlike other games also using ymz, gaia (and theroes) has 16MHz clock for it + subdevice("ymz")->set_clock(16_MHz_XTAL); +} + + +/*************************************************************************** + Guwange +***************************************************************************/ + +void cave_state::guwange(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::guwange_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_spr_gfxdecode[0]->set_info(gfx_esprade_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + add_ymz(config); +} + +/*************************************************************************** + Hotdog Storm +***************************************************************************/ + +void cave_z80_state::hotdogst(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_clock(32_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_map); + + Z80(config, m_audiocpu, 32_MHz_XTAL/8); + m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_sound_map); + m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::hotdogst_sound_portmap); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_size(384, 240); + m_screen[0]->set_visarea(0, 384-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_hotdogst); + m_palette[0]->set_entries(0x1000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + GENERIC_LATCH_16(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + + ym2203_device &ymsnd(YM2203(config, "ymsnd", 32_MHz_XTAL/8)); + ymsnd.irq_handler().set_inputline("audiocpu", 0); + ymsnd.add_route(0, "mono", 0.20); + ymsnd.add_route(1, "mono", 0.20); + ymsnd.add_route(2, "mono", 0.20); + ymsnd.add_route(3, "mono", 0.80); + + OKIM6295(config, m_oki[0], 32_MHz_XTAL/16, okim6295_device::PIN7_HIGH); // pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); + m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); +} + + +/*************************************************************************** + Koro Koro Quest +***************************************************************************/ + +void cave_state::korokoro(machine_config &config) +{ + add_base_config(config, 1); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::korokoro_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_visarea(0, 320-1-2, 0, 240-1-1); + + m_spr_gfxdecode[0]->set_info(gfx_korokoro_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_korokoro); + m_palette[0]->set_entries(0x8000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) + + /* sound hardware */ + add_ymz(config); +} + +void cave_state::crusherm(machine_config &config) +{ + korokoro(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::crusherm_map); +} + + +/*************************************************************************** + Mazinger Z +***************************************************************************/ + +void cave_z80_state::mazinger(machine_config &config) +{ + add_base_config(config, 2); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::mazinger_map); + + Z80(config, m_audiocpu, 4_MHz_XTAL); // Bidirectional communication + m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::mazinger_sound_map); + m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::mazinger_sound_portmap); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_size(384, 240); + m_screen[0]->set_visarea(0, 384-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_mazinger); + m_palette[0]->set_entries(0x8000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + GENERIC_LATCH_16(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + + ym2203_device &ymsnd(YM2203(config, "ymsnd", 4_MHz_XTAL)); + ymsnd.irq_handler().set_inputline("audiocpu", 0); + ymsnd.add_route(0, "mono", 0.20); + ymsnd.add_route(1, "mono", 0.20); + ymsnd.add_route(2, "mono", 0.20); + ymsnd.add_route(3, "mono", 0.60); + + OKIM6295(config, m_oki[0], 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 2.0); + m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); +} + + +/*************************************************************************** + Metamoqester +***************************************************************************/ + +void cave_z80_state::metmqstr(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_clock(32_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::metmqstr_map); + + Z80(config, m_audiocpu, 32_MHz_XTAL / 4); + m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_sound_map); + m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::metmqstr_sound_portmap); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x7d, 0x7d + 0x180-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); + m_palette[0]->set_entries(0x1000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + GENERIC_LATCH_16(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + + ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4)); + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.6); + + OKIM6295(config, m_oki[0], 32_MHz_XTAL / 16, okim6295_device::PIN7_HIGH); + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5); + m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); + + OKIM6295(config, m_oki[1], 32_MHz_XTAL / 16, okim6295_device::PIN7_HIGH); + m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.5); + m_oki[1]->set_addrmap(0, &cave_z80_state::oki2_map); +} + + +/*************************************************************************** + Pac-Slot +***************************************************************************/ + +void cave_state::pacslot(machine_config &config) +{ + add_base_config(config, 1); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + /* basic machine hardware */ + m_maincpu->set_clock(28_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::pacslot_map); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); + + /* video hardware */ + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); + + // oki2 chip is present but its rom socket is unpopulated + OKIM6295(config, m_oki[1], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); +} + +void cave_state::paceight(machine_config &config) +{ + pacslot(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::paceight_map); +} + +void cave_state::paccarn(machine_config &config) +{ + pacslot(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::paccarn_map); +} + +/*************************************************************************** + Poka Poka Satan +***************************************************************************/ + +TIMER_DEVICE_CALLBACK_MEMBER( cave_state::timer_lev2_cb ) +{ + m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE); // ppsatan: read touch screens +} + +void ppsatan_state::ppsatan(machine_config &config) +{ + add_base_config(config, 1); + + /* basic machine hardware */ + m_maincpu->set_vblank_int("screen.0", FUNC(ppsatan_state::interrupt_ppsatan)); + m_maincpu->set_addrmap(AS_PROGRAM, &ppsatan_state::ppsatan_map); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(1)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom); + + TIMER(config, "timer_lev2").configure_periodic(FUNC(ppsatan_state::timer_lev2_cb), attotime::from_hz(60)); + + /* video hardware */ + m_screen[0]->set_visarea(0, 320-1, 0, 224-1); + m_screen[0]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_top)); + subdevice("int_timer")->configure_generic(FUNC(ppsatan_state::vblank_start)); + + SCREEN(config, m_screen[1], SCREEN_TYPE_RASTER); + m_screen[1]->set_refresh_hz(15625/271.5); + m_screen[1]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[1]->set_size(320, 240); + m_screen[1]->set_visarea(0, 320-1, 0, 224-1); + m_screen[1]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_left)); + TIMER(config, "int_timer_left").configure_generic(FUNC(ppsatan_state::vblank_start_left)); + + SCREEN(config, m_screen[2], SCREEN_TYPE_RASTER); + m_screen[2]->set_refresh_hz(15625/271.5); + m_screen[2]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[2]->set_size(320, 240); + m_screen[2]->set_visarea(0, 320-1, 0, 224-1); + m_screen[2]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_right)); + TIMER(config, "int_timer_right").configure_generic(FUNC(ppsatan_state::vblank_start_right)); + + m_spr_gfxdecode[0]->set_info(gfx_korokoro_spr); + GFXDECODE(config, m_spr_gfxdecode[1], m_palette[1], gfx_ppsatan_spr_1); + GFXDECODE(config, m_spr_gfxdecode[2], m_palette[2], gfx_ppsatan_spr_2); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ppsatan_0); + GFXDECODE(config, m_gfxdecode[1], m_palette[1], gfx_ppsatan_1); + GFXDECODE(config, m_gfxdecode[2], m_palette[2], gfx_ppsatan_2); + + m_tilemap[0]->set_xoffs(2, 0); + + TMAP038(config, m_tilemap[1]); + m_tilemap[1]->set_gfxdecode_tag(m_gfxdecode[1]); + m_tilemap[1]->set_gfx(0); + m_tilemap[1]->set_xoffs(1, 0); + + TMAP038(config, m_tilemap[2]); + m_tilemap[2]->set_gfxdecode_tag(m_gfxdecode[2]); + m_tilemap[2]->set_gfx(0); + m_tilemap[2]->set_xoffs(0, -57); + + m_palette[0]->set_entries(0x9000/2); + PALETTE(config, m_palette[1], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); + PALETTE(config, m_palette[2], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); + + config.set_default_layout(layout_ppsatan); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, m_oki[0], 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 2.0); +} + + +/*************************************************************************** + Power Instinct 2 +***************************************************************************/ + +/* X1 = 12 MHz, X2 = 28 MHz, X3 = 16 MHz. OKI: / 165 mode A ; / 132 mode B */ + +void cave_z80_state::pwrinst2(machine_config &config) +{ + add_base_config(config, 4); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::pwrinst2_map); + + Z80(config, m_audiocpu, 16_MHz_XTAL / 2); /* 8 MHz */ + m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::pwrinst2_sound_map); + m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::pwrinst2_sound_portmap); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x70, 0x70 + 0x140-1, 0, 240-1); + + m_spr_gfxdecode[0]->set_info(gfx_pwrinst2_spr); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_pwrinst2); + m_palette[0]->set_entries(0x5000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + GENERIC_LATCH_16(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + + ym2203_device &ym2203(YM2203(config, "ymsnd", 16_MHz_XTAL / 4)); + ym2203.irq_handler().set_inputline("audiocpu", 0); + ym2203.add_route(0, "mono", 0.40); + ym2203.add_route(1, "mono", 0.40); + ym2203.add_route(2, "mono", 0.40); + ym2203.add_route(3, "mono", 0.80); + + OKIM6295(config, m_oki[0], 3_MHz_XTAL, okim6295_device::PIN7_LOW); + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.80); + + OKIM6295(config, m_oki[1], 3_MHz_XTAL, okim6295_device::PIN7_LOW); + m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.00); + + nmk112_device &nmk112(NMK112(config, "nmk112", 0)); + nmk112.set_rom0_tag("oki1"); + nmk112.set_rom1_tag("oki2"); +} + + +/*************************************************************************** + Sailor Moon / Air Gallet +***************************************************************************/ + +TIMER_DEVICE_CALLBACK_MEMBER( cave_z80_state::sailormn_startup ) +{ + m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); +} + +MACHINE_RESET_MEMBER(cave_z80_state,sailormn) +{ + cave_z80_state::machine_reset(); + m_startup->adjust(attotime::from_usec(1000), 0, attotime::zero); +} + +void cave_z80_state::sailormn(machine_config &config) +{ + add_base_config(config, 3); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::sailormn_map); + + // could be a wachdog, but if it is then our watchdog address is incorrect as there are periods where the game doesn't write it. + TIMER(config, m_startup).configure_generic(FUNC(cave_z80_state::sailormn_startup)); + + Z80(config, m_audiocpu, 8_MHz_XTAL); // Bidirectional Communication + m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::sailormn_sound_map); + m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::sailormn_sound_portmap); + +// config.set_maximum_quantum(attotime::from_hz(600)); + + MCFG_MACHINE_RESET_OVERRIDE(cave_z80_state,sailormn) + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + m_screen[0]->set_size(320+1, 240); + m_screen[0]->set_visarea(0+1, 320+1-1, 0, 240-1); + + /* Layer 2 (8x8) needs to be handled differently */ + m_tilemap[2]->set_tile_callback(FUNC(cave_z80_state::sailormn_get_banked_code)); /* Layer 2 has 1 banked ROM */ + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_sailormn); // 4 bit sprites, 6 bit tiles + m_palette[0]->set_entries(0x4000/2); + + MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + GENERIC_LATCH_16(config, m_soundlatch); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + + ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4)); + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.30); + + OKIM6295(config, m_oki[0], 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); + m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); + + OKIM6295(config, m_oki[1], 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); + m_oki[1]->set_addrmap(0, &cave_z80_state::oki2_map); + + +} + + +/*************************************************************************** + Tekken Card World +***************************************************************************/ + +void cave_state::tekkencw(machine_config &config) +{ + add_base_config(config, 1); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + /* basic machine hardware */ + m_maincpu->set_clock(28_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tekkencw_map); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); + + /* video hardware */ + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); + + // oki2 chip spot and rom socket are both unpopulated +} + +void cave_state::tekkenbs(machine_config &config) +{ + tekkencw(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tekkenbs_map); +} + + +/*************************************************************************** + Tobikose! Jumpman +***************************************************************************/ + +void cave_state::tjumpman(machine_config &config) +{ + add_base_config(config, 1); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + /* basic machine hardware */ + m_maincpu->set_clock(28_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tjumpman_map); + + WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ + + EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); + + /* video hardware */ + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); + + // oki2 chip spot and rom socket are both unpopulated +} + + +/*************************************************************************** + Uo Poko +***************************************************************************/ + +void cave_state::uopoko(machine_config &config) +{ + add_base_config(config, 1); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::uopoko_map); + + EEPROM_93C46_16BIT(config, m_eeprom); + + /* video hardware */ + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); + + MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) + + /* sound hardware */ + add_ymz(config); +} + + +/*************************************************************************** + + + ROMs Loading + + +***************************************************************************/ + +void cave_state::unpack_sprites(int chip) +{ + gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); + m_sprite_gfx_mask[chip] = 1; + const u32 needed = gfx->elements() * gfx->height() * gfx->width(); + while (m_sprite_gfx_mask[chip] < needed) + { + m_sprite_gfx_mask[chip] <<= 1; + } + m_sprite_gfx[chip] = make_unique_clear(m_sprite_gfx_mask[chip]); + + u8 *dst = m_sprite_gfx[chip].get(); + for (int e = 0; e < gfx->elements(); e++) + { + const u8 *data = gfx->get_data(e); + for (int y = 0; y < gfx->height(); y++) + { + const u8 *datatmp = data; + for (int x = 0; x < gfx->width(); x++) + { + *dst++ = *datatmp++; + } + data += gfx->rowbytes(); + } + } + m_sprite_gfx_mask[chip]--; +} + + +/*************************************************************************** + + Air Gallet + +Banpresto +Runs on identical board to Sailor Moon (several sockets unpopulated) + +PCB: BP945A (overstamped with BP962A) +CPU: TMP68HC000P16 (68000, 64 pin DIP) +SND: Z84C0008PEC (Z80, 40 pin DIP), OKI M6295 x 2, YM2151, YM3012 +OSC: 28.000MHz, 16.000MHz +RAM: 62256 x 8, NEC 424260 x 2, 6264 x 5 + +Other Chips: +SGS Thomson ST93C46CB1 (EEPROM) +PALS (same as Sailor Moon, not dumped): + 18CV8 label SMBG + 18CV8 label SMZ80 + 18CV8 label SMCPU + GAL16V8 (located near BP962A.U47) + +GFX: 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 013 9346E7002 (240 pin PQFP) + +On PCB near JAMMA connector is a small push button to access test mode. + +ROMS: +BP962A.U9 27C040 Sound Program +BP962A.U45 27C240 Main Program +BP962A.U47 23C16000 Sound +BP962A.U48 23C16000 Sound +BP962A.U53 23C16000 GFX +BP962A.U54 23C16000 GFX +BP962A.U57 23C16000 GFX +BP962A.U65 23C16000 GFX +BP962A.U76 23C16000 GFX +BP962A.U77 23C16000 GFX + +***************************************************************************/ + +#define ROMS_AGALLET_COMMON \ + ROM_REGION( 0x80000, "audiocpu", 0 ) \ + ROM_LOAD( "bp962a.u9", 0x00000, 0x80000, CRC(06caddbe) SHA1(6a3cc50558ba19a31b21b7f3ec6c6e2846244ff1) ) \ + \ + ROM_REGION( 0x400000, "sprites0", 0 ) \ + ROM_LOAD( "bp962a.u76", 0x000000, 0x200000, CRC(858da439) SHA1(33a3d2a3ec3fa3364b00e1e43b405e5030a5b2a3) ) \ + ROM_LOAD( "bp962a.u77", 0x200000, 0x200000, CRC(ea2ba35e) SHA1(72487f21d44fe7be9a98068ce7f57a43c132945f) ) \ + \ + ROM_REGION( 0x100000, "layer0", 0 ) \ + ROM_LOAD( "bp962a.u53", 0x000000, 0x100000, CRC(fcd9a107) SHA1(169b94db8389e7d47d4d77f36907a62c30fea727) ) \ + ROM_CONTINUE( 0x000000, 0x100000 ) \ + \ + ROM_REGION( 0x200000, "layer1", 0 ) \ + ROM_LOAD( "bp962a.u54", 0x000000, 0x200000, CRC(0cfa3409) SHA1(17107e26762ef7e3b902fb29a6d7bc534a4d09aa) ) \ + \ + ROM_REGION( (1*0x200000)*2, "layer2", 0 ) \ + \ + ROM_LOAD( "bp962a.u57", 0x000000, 0x200000, CRC(6d608957) SHA1(15f6e8346f5f95eb229505b1b4666dabeb810ee8) ) \ + \ + ROM_LOAD( "bp962a.u65", 0x200000, 0x100000, CRC(135fcf9a) SHA1(2e8c89c2627bbdef160d96724d07883fb2fa1a57) ) \ + ROM_CONTINUE( 0x200000, 0x100000 ) \ + \ + ROM_REGION( 0x200000, "oki1", 0 ) \ + ROM_LOAD( "bp962a.u48", 0x000000, 0x200000, CRC(ae00a1ce) SHA1(5e8c74df0ac77efb3080406870856f958be14f79) ) \ + \ + ROM_REGION( 0x200000, "oki2", 0 ) \ + ROM_LOAD( "bp962a.u47", 0x000000, 0x200000, CRC(6d4e9737) SHA1(81c7ecdfc2d38d0b35e26745866f6672f566f936) ) + + +// these roms were dumped from a board set to Taiwanese region. +#define ROMS_AGALLET \ + ROM_REGION( 0x400000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "bp962a.u45", 0x000000, 0x080000, CRC(24815046) SHA1(f5eeae60b923ae850b335e7898a2760407631d8b) ) \ + ROMS_AGALLET_COMMON + +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( agallet ) + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_europe.nv", 0x0000, 0x0080, CRC(ec38bf65) SHA1(cb8d9eacc0cf55a0c6b187e6673e3354554314b5) ) +ROM_END + +ROM_START( agalletu ) + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_usa.nv", 0x0000, 0x0080, CRC(72e65056) SHA1(abf1a86df01064d9d5d8c418e8367817319ec335) ) +ROM_END + +ROM_START( agalletj ) + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_japan.nv", 0x0000, 0x0080, CRC(0753f547) SHA1(aabb987470406b8729894108bc4d050f7200917d) ) +ROM_END + +ROM_START( agalletk ) + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_korea.nv", 0x0000, 0x0080, CRC(7f41c253) SHA1(50793d4da0ad6eb590941d26a729a1cf4b3c25c2) ) +ROM_END + +ROM_START( agallett ) // the dumped board was this region + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_taiwan.nv", 0x0000, 0x0080, CRC(0af46742) SHA1(37b704c4c573b2aabd6f016e9e8dd458f95148f7) ) +ROM_END + +ROM_START( agalleth ) + ROMS_AGALLET + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_hongkong.nv", 0x0000, 0x0080, CRC(998d1a74) SHA1(13e7e27a18417949d49e97d521781fc0feeef792) ) +ROM_END + +// these roms were dumped from a board set to the Japanese region. +#define ROMS_AGALLETA \ + ROM_REGION( 0x400000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "u45", 0x000000, 0x080000, CRC(2cab18b0) SHA1(5e779b74d8520cb482697b5efba4746854e7c9fe) ) \ + ROMS_AGALLET_COMMON + +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( agalleta ) + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_europe.nv", 0x0000, 0x0080, CRC(ec38bf65) SHA1(cb8d9eacc0cf55a0c6b187e6673e3354554314b5) ) +ROM_END + +ROM_START( agalletau ) + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_usa.nv", 0x0000, 0x0080, CRC(72e65056) SHA1(abf1a86df01064d9d5d8c418e8367817319ec335) ) +ROM_END + +ROM_START( agalletaj ) // the dumped board was this region + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_japan.nv", 0x0000, 0x0080, CRC(0753f547) SHA1(aabb987470406b8729894108bc4d050f7200917d) ) +ROM_END + +ROM_START( agalletak ) + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_korea.nv", 0x0000, 0x0080, CRC(7f41c253) SHA1(50793d4da0ad6eb590941d26a729a1cf4b3c25c2) ) +ROM_END + +ROM_START( agalletat ) + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_taiwan.nv", 0x0000, 0x0080, CRC(0af46742) SHA1(37b704c4c573b2aabd6f016e9e8dd458f95148f7) ) +ROM_END + +ROM_START( agalletah ) + ROMS_AGALLETA + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "agallet_hongkong.nv", 0x0000, 0x0080, CRC(998d1a74) SHA1(13e7e27a18417949d49e97d521781fc0feeef792) ) +ROM_END + +/*************************************************************************** + + Fever SOS (International) / Dangun Feveron (Japan) + +Board: CV01 +OSC: 28.0, 16.0, 16.9 MHz + +***************************************************************************/ + +ROM_START( dfeveron ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "cv01-u34.bin", 0x000000, 0x080000, CRC(be87f19d) SHA1(595239245df3835cdf5a99a6c62480465558d8d3) ) + ROM_LOAD16_BYTE( "cv01-u33.bin", 0x000001, 0x080000, CRC(e53a7db3) SHA1(ddced29f78dc3cc89038757b6577ba2ba0d8b041) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "cv01-u25.bin", 0x000000, 0x400000, CRC(a6f6a95d) SHA1(e1eb45cb5d0e6163edfd9d830633b913fb53c6ca) ) + ROM_LOAD( "cv01-u26.bin", 0x400000, 0x400000, CRC(32edb62a) SHA1(3def74e1316b80cc25a8c3ac162cd7bcb8cc807c) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "cv01-u50.bin", 0x000000, 0x200000, CRC(7a344417) SHA1(828bd8f95d2fcc34407e17629ccafc904a4ea12d) ) + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "cv01-u49.bin", 0x000000, 0x200000, CRC(d21cdda7) SHA1(cace4650de580c3c4a037f1f5c32bfc1846b383c) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "cv01-u19.bin", 0x000000, 0x400000, CRC(5f5514da) SHA1(53f27364aee544572a82649c9ff29bacc642b732) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-dfeveron.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) +ROM_END + +/* + +Fever SOS + + The program code checks for 0x05 & 0x19 at the 17th & 18th byte in the EEPROM. Therefore + you cannot convert a Dangun Feveron over to a Fever SOS by changing the 2 program roms + +Jumper JP1: +INT Version - 2 & 3 +JAP Version - 1 & 2 + +However there are more differences: + +U4: +INT Version - 013 9838EX003 +JAP Version - 013 9807EX004 (The second set of numbers are manufacture day codes) + +UA2 & UB2: +INT Version - 038 9838WX001 +JAP Version - 038 9808WX003 (The second set of numbers are manufacture day codes) + +TA8030S (Beside SW1) +INT Version - NOT MOUNTED +JAP Version - TA8030S (WatchDog Timer, might be controlled by JP1) + +U47 & U48 - Differ +U38 & U37 - Differ - These chips are Static RAM + +It actually looks like the international version is older than +the Japanese version PCB wise, but the software date is 98/09/25 +and mine is 98/09/17! + +The famous full extent of the JAM is inside the image but so is +"full extent" of the LAW. There are also other version strings +inside the same image look here... + + NOTICE + THIS GAME IS FOR USE IN + KOREA ONLY + HONG KONG ONLY + TAIWAN ONLY + SOUTHEAST ASIA ONLY + EUROPE ONLY + U.S.A ONLY + JAPAN ONLY +SALES, EXPORT OR OPERATION +OUTSIDE THIS COUNTRY MAY BE +CONSTRUED AS COPYRIGHT AND +TRADEMARK INFRINGEMENT AND +IS STRICTLY PROHIBITED. +VIOLATOR AND SUBJECT TO +SEVERE PENALTIES AND WILL +BE PROSECUTED TO THE FULL +EXTENT OF THE JAM. + 98/09/10 VER. + +Look at the version date! + + NOTICE +THIS GAME MAY NOT BE SOLD, +EXPORTED OR OPERATED +WITHOUTPROOF OF LEGAL CONSENT +BY CAVE CO.,LTD. +VIOLATION OF THESE TERMS WILL +RESULT IN COPYRIGHT AND +TRADEMARK INFRINGEMENT,AND IS +STRICTLY PROHIBITED. +VIOLATORS ARE SUBJECT TO +SEVERE PENALTIES AND WILL BE +PROSECUTED TO THE FULL EXTENT +OF THE LAW GOVERNED BY THE +COUNTRY OF ORIGIN. + 98/09/25 VER + +This is from Fever SOS image! Both version strings are present! + +The PCB is also different, UD's PCB does not have the Cave logo and +the CV01 marker in the lower left corner of the PCB. + +There is some "engrish" story inside the UD image but this is NOT +present in the japanese images... + +*/ + +ROM_START( feversos ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "cv01-u34.sos", 0x000000, 0x080000, CRC(24ef3ce6) SHA1(42799eebbb2686a837b8972aec684143deadca59) ) + ROM_LOAD16_BYTE( "cv01-u33.sos", 0x000001, 0x080000, CRC(64ff73fd) SHA1(7fc3a8469cec2361d373a4dac4a547c13ca5f709) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "cv01-u25.bin", 0x000000, 0x400000, CRC(a6f6a95d) SHA1(e1eb45cb5d0e6163edfd9d830633b913fb53c6ca) ) + ROM_LOAD( "cv01-u26.bin", 0x400000, 0x400000, CRC(32edb62a) SHA1(3def74e1316b80cc25a8c3ac162cd7bcb8cc807c) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "cv01-u50.bin", 0x000000, 0x200000, CRC(7a344417) SHA1(828bd8f95d2fcc34407e17629ccafc904a4ea12d) ) + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "cv01-u49.bin", 0x000000, 0x200000, CRC(d21cdda7) SHA1(cace4650de580c3c4a037f1f5c32bfc1846b383c) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "cv01-u19.bin", 0x000000, 0x400000, CRC(5f5514da) SHA1(53f27364aee544572a82649c9ff29bacc642b732) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-feversos.bin", 0x0000, 0x0080, CRC(d80303aa) SHA1(8580f7c2223c72614516d800a98465e362c333ef) ) +ROM_END + +/*************************************************************************** + + Dodonpachi (Japan) + +PCB: AT-C03 D2 +CPU: MC68000-16 +Sound: YMZ280B +OSC: 28.0000MHz + 16.0000MHz + 16.9MHz (16.9344MHz?) + +***************************************************************************/ + +ROM_START( ddonpach ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "b1.u27", 0x000000, 0x080000, CRC(b5cdc8d3) SHA1(58757b50e21a27e500a82c03f62cf02a85389926) ) + ROM_LOAD16_BYTE( "b2.u26", 0x000001, 0x080000, CRC(6bbb063a) SHA1(e5de64b9c3efc0a38a2e0e16b78ee393bff63558) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) + + ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "u62.bin", 0x000000, 0x200000, CRC(292bfb6b) SHA1(11b385991ee990eb5ef36e136b988802b5f90fa4) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) + ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) +ROM_END + + +ROM_START( ddonpachj ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u27.bin", 0x000000, 0x080000, CRC(2432ff9b) SHA1(fbc826c30553f6553ead40b312b73c049e8f4bf6) ) + ROM_LOAD16_BYTE( "u26.bin", 0x000001, 0x080000, CRC(4f3a914a) SHA1(ae98eba049f1462aa1145f6959b9f9a32c97278f) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) + + ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "u62.bin", 0x000000, 0x200000, CRC(292bfb6b) SHA1(11b385991ee990eb5ef36e136b988802b5f90fa4) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) + ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) +ROM_END + + +ROM_START( ddonpacha ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "arrange_u27.bin", 0x000000, 0x080000, CRC(44b899ae) SHA1(798ec437d861b94fcd90c99a7015dd420887c788) ) + ROM_LOAD16_BYTE( "arrange_u26.bin", 0x000001, 0x080000, CRC(727a09a8) SHA1(91876386855f19e8a3d8d1df71dfe9b3d98e9ea9) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "arrange_u51.bin", 0x200000, 0x200000, CRC(0f3e5148) SHA1(3016f4d075940feae691389606cd2aa7ac53849e) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) + + ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "arrange_u62.bin", 0x000000, 0x200000, CRC(42e4c6c5) SHA1(4d282f7592f5fc5e11839c57f39cae20b8422aa1) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) + ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(2df16438) SHA1(4881b70589a97e2420feb6d6e6737273beeff303) ) +ROM_END + +/*************************************************************************** + + Donpachi + +Known versions: + +USA Version 1.12 1995/05/2x +Korea Version 1.12 1995/05/2x +Hong Kong Version 1.10 1995/05/17 +Japan Version 1.01 1995/05/11 + +BOARD #: AT-C01DP-2 +CPU: TMP68HC000-16 +VOICE: M6295 x2 +OSC: 28.000/16.000/4.220MHz +EEPROM: ATMEL 93C46 +CUSTOM: ATLUS 8647-01 013 + 038 9429WX727 x3 + NMK 112 (M6295 sample ROM banking) + +--------------------------------------------------- + filenames devices kind +--------------------------------------------------- + PRG.U29 27C4096 68000 main prg. + U58.BIN 27C020 gfx data + ATDP.U32 57C8200 M6295 data + ATDP.U33 57C16200 M6295 data + ATDP.U44 57C16200 gfx data + ATDP.U45 57C16200 gfx data + ATDP.U54 57C8200 gfx data + ATDP.U57 57C8200 gfx data + + USA Version +---------------------------------------------------- + prgu.U29 27C4002 68000 Main Program + text.u58 27C2001 Labeled as "TEXT" + +***************************************************************************/ + +ROM_START( donpachi ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "prgu.u29", 0x00000, 0x80000, CRC(89c36802) SHA1(7857c726cecca5a4fce282e0d2b873774d2c1b1d) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) + + ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ + ROM_LOAD( "text.u58", 0x000000, 0x040000, CRC(5dba06e7) SHA1(f9dab7f6c732a683fddb4cae090a875b3962332b) ) + + ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) + ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-donpachi.u10", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) /* ATMEL 93C46 */ + + ROM_REGION( 0x0155, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( donpachij ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "prg.u29", 0x00000, 0x80000, CRC(6be14af6) SHA1(5b1158071f160efeded816ae4c4edca1d00d6e05) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) + + ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ + ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) + + ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) + ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) + + ROM_REGION( 0x0155, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( donpachikr ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "prgk.u26", 0x00000, 0x80000, CRC(bbaf4c8b) SHA1(0f9d42c8c4c5b69e3d39bf768bc4b663f66b4f36) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) + + ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ + ROM_LOAD( "text.u58", 0x000000, 0x040000, CRC(5dba06e7) SHA1(f9dab7f6c732a683fddb4cae090a875b3962332b) ) + + ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) + ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) + + ROM_REGION( 0x0155, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( donpachihk ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "37.u29", 0x00000, 0x80000, CRC(71f39f30) SHA1(08a028208f21c073d450a29061604f27775786a8) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) + + ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ + ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) + + ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) + ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) + + ROM_REGION( 0x0155, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ +ROM_END + +/* + When you press the 2p start button, it pauses the game (music still plays). + Pressing the 1p start button unpauses the game. + If you press both 1p start and 2p start at the same time, the game lets you play in slow motion (music still plays normally). + + This was on the label of the ROM chip: 国内撮影用 +*/ + +ROM_START( donpachijs ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "prg.u29", 0x00000, 0x80000, CRC(810dbd42) SHA1(703a5aec90b595a1c5a679ab165643119ba6b2f3) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) + + ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ + ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) + + ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) + ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-donpachi.u10", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) /* ATMEL 93C46 */ + + ROM_REGION( 0x0155, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ +ROM_END + +/*************************************************************************** + + ESP Ra.De. + +ATC04 +OSC: 28.0, 16.0, 16.9 MHz + +***************************************************************************/ + +ROM_START( esprade ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u42.int", 0x000000, 0x080000, CRC(3b510a73) SHA1(ab1666eb826cb4a71588d86831dd18a2ef1c2a33) ) + ROM_LOAD16_BYTE( "u41.int", 0x000001, 0x080000, CRC(97c1b649) SHA1(37a56b7b9662219a356aee3f4b5cbb774ac4950e) ) + + ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) + ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) + ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) + ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) + + ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) + ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) + + ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) + ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) +ROM_END + +ROM_START( espradej ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u42_ver.2", 0x000000, 0x080000, CRC(75d03c42) SHA1(1c176185b6f1531752b633a97f705ffa0cfeb5ad) ) + ROM_LOAD16_BYTE( "u41_ver.2", 0x000001, 0x080000, CRC(734b3ef0) SHA1(f584227b85c347d62d5f179445011ce0f607bcfd) ) + + ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) + ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) + ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) + ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) + + ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) + ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) + + ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) + ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) +ROM_END + +ROM_START( espradejo ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u42.bin", 0x000000, 0x080000, CRC(0718c7e5) SHA1(c7d1f30bd2ef363cad15b6918f9980312a15809a) ) + ROM_LOAD16_BYTE( "u41.bin", 0x000001, 0x080000, CRC(def30539) SHA1(957ad0b06f06689ae71393572592f6b8f818603a) ) + + ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) + ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) + ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) + ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) + + ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) + ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) + + ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) + ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) +ROM_END + + +/*************************************************************************** + + Gaia Crusaders + +Noise Factory, 1999 + +PCB Layout +---------- + +|------------------------------------------------| +| YAC516 YMZ280B XC9536 68000 | +| 16MHz PRG2 PAL| +| TC51832 PRG1 | +| SND3 SND2 TC51832 28.322MHz | +| SND1 62256 16MHz | +| 62256 | +|J 62256 62256 62256 62256 62256 62256 | +|A KM416C256 | +|M KM416C256| +|M ------------------- --------------- | +|A | | | | | | 62256| +| | | | | | | | +| DSW1 | | | | |013 9918EX008| 62256| +| |038 9838WX003(x3)| | | | +| ------------------- --------------- | +| DSW2 | +| XC9536 OBJ2 | +| | +| BG2 BG3 BG1 OBJ1 | +| | +|------------------------------------------------| + +Notes: + 68000 clock : 16.000MHz + YMZ280B clock: 16.000MHz + VSync : 58Hz + HSync : 15.40kHz + +***************************************************************************/ + +ROM_START( gaia ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "prg1.127", 0x000000, 0x080000, CRC(47b904b2) SHA1(58b9b55f59cf00f70b690a0371096e86f4d723c2) ) + ROM_LOAD16_BYTE( "prg2.128", 0x000001, 0x080000, CRC(469b7794) SHA1(502f855c51005a866900b19c3a0a170d9ea02392) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD( "obj1.736", 0x000000, 0x400000, CRC(f4f84e5d) SHA1(8f445dd7a5c8a996939c211e5aec5742121a6e7e) ) + ROM_LOAD( "obj2.738", 0x400000, 0x400000, CRC(15c2a9ce) SHA1(631eb2968395be86ef2403733e7d4ec769a013b9) ) + + ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "bg1.989", 0x000000, 0x400000, CRC(013a693d) SHA1(2cc5be6f47c13febed942e1c3167946efedc5f9b) ) + + ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "bg2.995", 0x000000, 0x400000, CRC(783cc62f) SHA1(8b6e4212688b53be5ecc29ff2d41fd43e7d0a420) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "bg3.998", 0x000000, 0x400000, CRC(bcd61d1c) SHA1(660a3b02a8c39e1117b00d0ad06f73221fef4ce8) ) + + ROM_REGION( 0xc00000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "snd1.447", 0x000000, 0x400000, CRC(92770a52) SHA1(81f6835e1b45eb0f367e4586fdda92466f02edb9) ) + ROM_LOAD( "snd2.454", 0x400000, 0x400000, CRC(329ae1cf) SHA1(0c5e5074a5d8f4fb85ab4893bc953f192dcb301a) ) + ROM_LOAD( "snd3.455", 0x800000, 0x400000, CRC(4048d64e) SHA1(5e4ec6d37e70484e2fcd04188385e79ef0b53026) ) +ROM_END + +/* +Thunder Heroes +Primetek Investments Ltd. , 2001 + +A quasi-clone, remake or continuation of Gaia Crusaders but is clearly a different game. + +PCB Layout +---------- + +|------------------------------------------------------| +| 4558 YAC516 YMZ280B XILINX | +| 4558 16MHz XC9536 68000 PAL | +| SND2 | +| VOL SND3 TC51832 EPM0 | +| SND1 | +| TC51832 EPM1 | +| 58257 28.322MHz | +|J 58257 16MHz | +|A 58257 58257 58257 58257 58257 | +|M DSW1 58257 M514260 M514260 | +|M | +|A DSW2 |------| |------| |------| |--------|58257 | +| | 038 | | 038 | | 038 | | 013 | | +| | | | | | | | |58257 | +| |------| |------| |------| | | | +| |--------| | +| XILINX OBJ2 | +| XC9536 | +| BG2 BG3 BG1 OBJ1 | +|------------------------------------------------------| +Notes: + 68000 clock 16.00MHz + YMZ280B clock 16.000MHz + HSync 15.4kHz + VSync 58Hz + 038/013 = Same video chips used on some Banpresto games +*/ + +ROM_START( theroes ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "t-hero-epm1.u0127", 0x000000, 0x080000, CRC(09db7195) SHA1(6aa5aa80e3b74e405ed8f1b9b801ce4367756986) ) + ROM_LOAD16_BYTE( "t-hero-epm0.u0129", 0x000001, 0x080000, CRC(2d4e3310) SHA1(7c3284a2adc7943db50933a209d037422f87f80b) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD( "t-hero-obj1.u0736", 0x000000, 0x400000, CRC(35090f7c) SHA1(035e6c12a87d9c7241eea34fc7e2170bec842acc) ) + ROM_LOAD( "t-hero-obj2.u0738", 0x400000, 0x400000, CRC(71605108) SHA1(6070c26d8f22fafc81d97cacfef96ae652e355d0) ) + + ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "t-hero-bg1.u0999", 0x000000, 0x400000, CRC(47b0fb40) SHA1(a7217b3d805b4255c589821cdadd9b190cada525) ) + + ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "t-hero-bg2.u0995", 0x000000, 0x400000, CRC(b16237a1) SHA1(66aed2c5036492a17d20de90333e172a6f117851) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "t-hero-bg3.u0998", 0x000000, 0x400000, CRC(08eb5604) SHA1(3d32966708c73198272c40e6ddc680bf4c7919eb) ) + + ROM_REGION( 0xc00000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "crvsaders-snd1.u0447", 0x000000, 0x400000, CRC(92770a52) SHA1(81f6835e1b45eb0f367e4586fdda92466f02edb9) ) + ROM_LOAD( "crvsaders-snd2.u0454", 0x400000, 0x400000, CRC(329ae1cf) SHA1(0c5e5074a5d8f4fb85ab4893bc953f192dcb301a) ) + ROM_LOAD( "t-hero-snd3.u0455", 0x800000, 0x400000, CRC(52b0b2c0) SHA1(6e96698905391c21a4fedd60e2768734b58add4e) ) +ROM_END + + +/*************************************************************************** + + Guwange (Japan) + +PCB: ATC05 +CPU: MC68000-16 +Sound: YMZ280B +OSC: 28.0000MHz + 16.0000MHz + 16.9MHz + +***************************************************************************/ + +ROM_START( guwange ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "gu-u0127.bin", 0x000000, 0x080000, CRC(f86b5293) SHA1(f8b1cd77cc25328d5010889850e4b86c27d9e396) ) + ROM_LOAD16_BYTE( "gu-u0129.bin", 0x000001, 0x080000, CRC(6c0e3b93) SHA1(aaad6569b9a7b6f9a315062f9fedfc95851c1bc6) ) + + ROM_REGION( 0x2000000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD32_WORD_SWAP( "u083.bin", 0x0000000, 0x800000, CRC(adc4b9c4) SHA1(3f9fb004e19187bbfa87ddfe8cfc69740656a1bd) ) + ROM_LOAD32_WORD_SWAP( "u082.bin", 0x0000002, 0x800000, CRC(3d75876c) SHA1(705b8c2dbdc31e9516f429969f87988beec796d7) ) + ROM_LOAD32_WORD_SWAP( "u086.bin", 0x1000000, 0x400000, CRC(188e4f81) SHA1(626074d81782a6de0b52406331b4b8561d3e36f5) ) + ROM_RELOAD( 0x1800000, 0x400000 ) + ROM_LOAD32_WORD_SWAP( "u085.bin", 0x1000002, 0x400000, CRC(a7d5659e) SHA1(10abac022ebe106a3ca7186ff18ca2757f903033) ) + ROM_RELOAD( 0x1800002, 0x400000 ) +// sprite bug fix? +// ROM_FILL( 0x1800000, 0x800000, 0xff ) + + ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "u101.bin", 0x000000, 0x800000, CRC(0369491f) SHA1(ca6b1345506f13a17c9bace01637d1f61a278644) ) + + ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "u10102.bin", 0x000000, 0x400000, CRC(e28d6855) SHA1(7001a6e298c6a1fcceb79586bf5f4bf0f30027f6) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "u10103.bin", 0x000000, 0x400000, CRC(0fe91b8e) SHA1(8b71ebeef5e4d2b00fdaaab97776d74e1c96dc59) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "u0462.bin", 0x000000, 0x400000, CRC(b3d75691) SHA1(71d8dae92be1542a3cff50efeec0bf3c14ab59f5) ) + + ROM_REGION( 0x0004, "plds", 0 ) + ROM_LOAD( "atc05-1.bin", 0x0000, 0x0001, NO_DUMP ) /* GAL16V8D-15LP located at U159 */ + ROM_LOAD( "u0259.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U0249. (Chip label different then label silk screened onto the board.) */ + ROM_LOAD( "u108.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U108. */ + ROM_LOAD( "u084.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U084. */ + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-guwange.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) +ROM_END + +ROM_START( guwanges ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "gu-u0127b.bin", 0x000000, 0x080000, CRC(64667d2e) SHA1(a5893eb38e309e2bced4a46559f02850ab39afe7) ) + ROM_LOAD16_BYTE( "gu-u0129b.bin", 0x000001, 0x080000, CRC(a99c6b6c) SHA1(614a3cd1de9b325f73e461eaf250ff9cf773f4a5) ) + + ROM_REGION( 0x2000000, "sprites0", 0 ) /* Sprites */ + ROM_LOAD32_WORD_SWAP( "u083.bin", 0x0000000, 0x800000, CRC(adc4b9c4) SHA1(3f9fb004e19187bbfa87ddfe8cfc69740656a1bd) ) + ROM_LOAD32_WORD_SWAP( "u082.bin", 0x0000002, 0x800000, CRC(3d75876c) SHA1(705b8c2dbdc31e9516f429969f87988beec796d7) ) + ROM_LOAD32_WORD_SWAP( "u086.bin", 0x1000000, 0x400000, CRC(188e4f81) SHA1(626074d81782a6de0b52406331b4b8561d3e36f5) ) + ROM_RELOAD( 0x1800000, 0x400000 ) + ROM_LOAD32_WORD_SWAP( "u085.bin", 0x1000002, 0x400000, CRC(a7d5659e) SHA1(10abac022ebe106a3ca7186ff18ca2757f903033) ) + ROM_RELOAD( 0x1800002, 0x400000 ) +// sprite bug fix? +// ROM_FILL( 0x1800000, 0x800000, 0xff ) + + ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "u101.bin", 0x000000, 0x800000, CRC(0369491f) SHA1(ca6b1345506f13a17c9bace01637d1f61a278644) ) + + ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "u10102.bin", 0x000000, 0x400000, CRC(e28d6855) SHA1(7001a6e298c6a1fcceb79586bf5f4bf0f30027f6) ) + + ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "u10103.bin", 0x000000, 0x400000, CRC(0fe91b8e) SHA1(8b71ebeef5e4d2b00fdaaab97776d74e1c96dc59) ) + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "u0462.bin", 0x000000, 0x400000, CRC(b3d75691) SHA1(71d8dae92be1542a3cff50efeec0bf3c14ab59f5) ) + + ROM_REGION( 0x0004, "plds", 0 ) + ROM_LOAD( "atc05-1.bin", 0x0000, 0x0001, NO_DUMP ) /* GAL16V8D-15LP located at U159 */ + ROM_LOAD( "u0259.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U0249. (Chip label different then label silk screened onto the board.) */ + ROM_LOAD( "u108.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U108. */ + ROM_LOAD( "u084.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U084. */ + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-guwange.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) +ROM_END + + +/*************************************************************************** + +Hotdog Storm +Marble 1996 + ++------------------------------------------------------+ +| 6295 MP1 MP2 6264 6264 LED 68257 | +| GAL 68257 68257 | +| VOL Y3014 Z80 +--------+ | +|LA4460N YM2203 | | 9 8 | +| | 013 | P P | +| | | M M | +| 68257 +--------+ | +| 68000P12 68257 | +|J | +|A 93C46 MP3 +------+ +------+ +------+ | +|M MP4 | 038 | | 038 | | 038 | | +|M | | | | | | | +|A +------+ +------+ +------+ | +| | +| 4 4 4 4 4 4 | +| 6264 5 6 6 6 6 6 7 6 6 | +| P1 P2 6264 P 2 2 P 2 2 P 2 2 | +| 32MHz M 6 6 M 6 6 M 6 6 | ++------------------------------------------------------+ + +BOARD #: ASCT9501 +CPU: MC68HC00P12, Z0840006PSC +Sound: M6295, YM2203C + Y3014B + LA4460N Sanyo High Gain 51dB, 12W AF Power Amplifier +OSC: 32.000MHz +EEPROM: ATMEL 93C46 +CUSTOM: 038 9341EX702 x3 + 013 ????? +P1 & P2 Pushbuttons for Reset & Service +VOL Volume pot +LED Power indicator LED + +Have seen bootleg boards without the standard JAMMA "key" slot and with a +small daughter card that splits MP8 & MP9 into two roms each: ++-------------+ +| 8 9 8 9 ::| +| P P P P ::| +| M M M M ::| ++-------------+ + +***************************************************************************/ + +ROM_START( hotdogst ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "mp3.u29", 0x00000, 0x80000, CRC(1f4e5479) SHA1(5c3d7b36b1eda4c87c53e4f7cf89951cc5bcc871) ) + ROM_LOAD16_BYTE( "mp4.u28", 0x00001, 0x80000, CRC(6f1c3c4b) SHA1(ab4e4d9b2ef74a2eefda718e120bef05fd0346ff) ) + + ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "mp2.u19", 0x00000, 0x40000, CRC(ff979ebe) SHA1(4cb80086cfdc69a321c7f75455cef89e20488b76) ) // FIRST AND SECOND HALF IDENTICAL + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "mp9.u55", 0x000000, 0x200000, CRC(258d49ec) SHA1(f39e30c82d8f680f248e1eb59d7c5acb479fa277) ) + ROM_LOAD( "mp8.u54", 0x200000, 0x200000, CRC(bdb4d7b8) SHA1(0dd490988aa84b0e9a21ade5fd606b03eca13f6c) ) + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "mp7.u56", 0x00000, 0x80000, CRC(87c21c50) SHA1(fc0eea79abdd96edb4fa2c7047aaa728ef838234) ) + + ROM_REGION( 0x80000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "mp6.u61", 0x00000, 0x80000, CRC(4dafb288) SHA1(4756259adfe49ba42cde25e7902655b0f0731a6c) ) + + ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "mp5.u64", 0x00000, 0x80000, CRC(9b26458c) SHA1(acef62422fa3f92e6ca1eba0ee6fb914cd1ee190) ) + + ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ + ROM_LOAD( "mp1.u65", 0x00000, 0x80000, CRC(4868be1b) SHA1(32b8234b19fdbe07fa5057fa7965e36807e35e77) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF, 4 x 0x20000 + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-hotdogst.u14", 0x0000, 0x0080, CRC(12b4f934) SHA1(5b28d8fbd78869db78ce49e541a9d65558841966) ) +ROM_END + + +/*************************************************************************** + +Koro Koro Quest +Takumi, 1999 + +Hardware is kind of Banpresto-ish + +TUG-01B +MP-001 +|--------------------------------------------------| +| NJM4560 ROM.U0130 | +| 68000 | +| | +| YAC516 16MHz PAL | +| PAL | +| PAL PAL | +|M 62256 3V_BATT | +|A 93C46 62256 | +|H | +|J 28MHz |---------| | +|O |------| | 013 | | +|N | 038 | | 9838E | M5M44260 | +|G | 9838W| 62256 | X004 | M5M44260 | +|5 | X004 | 62256 | | | +|6 |------| |---------| | +| YMZ280B 62256 | +| 16.9344MHz 62256 | +| | +| PAL | +| | +|ROM.U1186 X | +| | +| X ROM.U1060 ROM.U1051 ROM.U1066 | +|--------------------------------------------------| + + PCB Number - TUG-01B MP001-00175 + 68000-16 + 16MHZ OSC + YMZ280B + YAC516-M + Xtal 16.9344MHz + 93C46 EEPROM + Custom - 013 9838EX004 (QFP240), 038 9838WX004 (QFP144) + OSC 28MHz + RAM - 62256 (x8), M5M44260 (x2) + 3volt battery + GAL16V8H (x5) + +***************************************************************************/ + +ROM_START( korokoro ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_WORD_SWAP( "mp-001_ver07.u0130", 0x000000, 0x080000, CRC(86c7241f) SHA1(c9f0ab63c4fe36df1300445e9bb0d5c6a1bb733f) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x180000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "mp-001_ver01.u1066", 0x000000, 0x100000, CRC(c5c6af7e) SHA1(13ac26fd703672a01d629be4e5efe9fb8720a4fb) ) + ROM_LOAD( "mp-001_ver01.u1051", 0x100000, 0x080000, CRC(fe5e28e8) SHA1(44da1a7d813b149f9bae351bbcbd0bc2d4c70e10) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "mp-001_ver01.u1060", 0x000000, 0x100000, CRC(ec9cf9d8) SHA1(32fa7120e30c14e484de3b3a9c93efe3654d43c8) ) + + ROM_REGION( 0x100000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "mp-001_ver01.u1186", 0x000000, 0x100000, CRC(d16e7c5d) SHA1(1f825ace3ed2e23c8d3212320c4645d3d52214c7) ) +ROM_END + +ROM_START( crusherm ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_WORD_SWAP( "mp-003ver01.u0130", 0x000000, 0x080000, CRC(a4f56e6b) SHA1(1d3af7602c48a6b6c76c376dbc8ad3823b56868a) ) + + ROM_REGION( 0x200000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "mp-003ver01.u1067", 0x000000, 0x100000, CRC(268a4921) SHA1(8bb818466616051af01680b381af53b8b6a18428) ) + ROM_LOAD( "mp-003ver01.u1066", 0x100000, 0x100000, CRC(79e77a6e) SHA1(9d03dd083769851d628ba6b3d77cfde9603e74f4) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "mp-003ver01.u1060", 0x000000, 0x100000, CRC(7661893e) SHA1(d51645c96247b039214393ba5eae7357144dfd65) ) + + ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "mp-003ver01.u1186", 0x000000, 0x100000, CRC(c3aeb745) SHA1(1bb8ab0512a9a9b0d3ce15f90b49cda431fb14eb) ) + ROM_LOAD( "mp-003ver01.u1187", 0x100000, 0x100000, CRC(d9312497) SHA1(a349cfdbcad96701a74f06394e87f0e0614e115d) ) +ROM_END + +/*************************************************************************** + + Mazinger Z + +Banpresto 1994 + +U63 038 62256 + 9335EX706 62256 +3664 62256 62256 +3664 U924 32MHz + U24 +U60 038 68000 + 9335EX706 +3664 U21 YM2203 92E422 +3664 Z80 + 3664 + 013 + 9341E7009 +U56 +U55 + +62256 62256 514260 514260 U64 M6295 + +***************************************************************************/ + +#define ROMS_MAZINGER \ + ROM_REGION( 0x80000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "mzp-0.u24", 0x00000, 0x80000, CRC(43a4279f) SHA1(2c17eb31040bb7f1554bc1c9a968eec5e72af097) ) \ + \ + ROM_REGION16_BE( 0x80000, "user1", 0 ) \ + ROM_LOAD16_WORD_SWAP( "mzp-1.924", 0x00000, 0x80000, CRC(db40acba) SHA1(797a3046b6ab33773c5c4d6bb6d045ea60c1eb45) ) \ + \ + ROM_REGION( 0x20000, "audiocpu", 0 ) \ + ROM_LOAD( "mzs.u21", 0x00000, 0x20000, CRC(c5b4f7ed) SHA1(01f3cd1dd4045029260544e0e1c15dd08817012e) ) \ + \ + ROM_REGION( 0x400000, "sprites0", ROMREGION_ERASEFF ) \ + ROM_LOAD( "bp943a-2.u56", 0x000000, 0x200000, CRC(97e13959) SHA1(c30b1093aacebafefcae701af767dd36fc55fac7) ) \ + ROM_LOAD( "bp943a-3.u55", 0x200000, 0x080000, CRC(9c4957dd) SHA1(e775605a01b6cadc318855ac046dad03c4fc5bb4) ) \ + \ + ROM_REGION( 0x200000, "layer0", 0 ) \ + ROM_LOAD( "bp943a-1.u60", 0x000000, 0x200000, CRC(46327415) SHA1(679d26caefa975569198fac550105c370e2be00d) ) \ + \ + ROM_REGION( 0x200000, "layer1", 0 ) \ + ROM_LOAD( "bp943a-0.u63", 0x000000, 0x200000, CRC(c1fed98a) SHA1(c276505f80a49b129862966a19db507f97153e45) ) \ + \ + ROM_REGION( 0x080000, "oki1", 0 ) \ + ROM_LOAD( "bp943a-4.u64", 0x000000, 0x080000, CRC(3fc7f29a) SHA1(feb21b918243c0a03dfa4a80cc80b86be4f62680) ) + +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( mazinger ) + ROMS_MAZINGER + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "mazinger_world.nv", 0x0000, 0x0080, CRC(4f6225c6) SHA1(ed8e1c3ca9b961778cd317deb0dd8a0143eaab4f) ) +ROM_END + +ROM_START( mazingerj ) + ROMS_MAZINGER + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "mazinger_japan.nv", 0x0000, 0x0080, CRC(f84a2a45) SHA1(2e8ad10994bba9a3952889ed0ec3bcaca9b41d03) ) +ROM_END + +/*************************************************************************** + + Metamoqester (World) / Oni - The Ninja Master (Japan) + +(C) 1995 Banpresto + +PCB: BP947A +CPU: MC68HC000P16 (68000, 64 pin DIP) +SND: Z0840008PSC (Z80, 40 pin DIP), AD-65 x 2 (= OKI M6295), YM2151, CY5002 (= YM3012) +OSC: 32.000 MHz +RAM: LGS GM76C88ALFW-15 x 9 (28 pin SOP), LGS GM71C4260AJ70 x 2 (40 pin SOJ) + Hitachi HM62256LFP-12T x 2 (40 pin SOJ) + +Other Chips: +AT93C46 (EEPROM) +PAL (not dumped, located near 68000): ATF16V8 x 1 + +GFX: (Same GFX chips as "Sailor Moon") + + 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 013 9346E7002 (240 pin PQFP) + +On PCB near JAMMA connector is a small push button labelled SW1 to access test mode. + +ROMS: +BP947A.U37 16M Mask \ Oki Samples +BP947A.U42 16M Mask / + +BP947A.U46 16M Mask \ +BP947A.U47 16M Mask | +BP947A.U48 16M Mask | +BP947A.U49 16M Mask | GFX +BP947A.U50 16M Mask | +BP947A.U51 16M Mask | +BP947A.U52 16M Mask / + +BP947A.U20 27C020 Sound PRG + +BP947A.U25 27C240 \ +BP947A.U28 27C240 | Main PRG +BP947A.U29 27C240 / + +***************************************************************************/ + +ROM_START( metmqstr ) + ROM_REGION( 0x280000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "bp947a.u25", 0x000000, 0x80000, CRC(0a5c3442) SHA1(684b79912dedc103f45c42fdebf9983e091b1308) ) + ROM_LOAD16_WORD_SWAP( "bp947a.u28", 0x100000, 0x80000, CRC(8c55decf) SHA1(76c6ce4c8e621273258d31ceb9ec4442fcf1a393) ) + ROM_LOAD16_WORD_SWAP( "bp947a.u29", 0x200000, 0x80000, CRC(cf0f3f3b) SHA1(49a3c0e7536edd53bbf09353e43e9166d736b3f4) ) + + ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "bp947a.u20", 0x00000, 0x40000, CRC(a4a36170) SHA1(ae55094518bd968ea0d04613a133c1421e412012) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "bp947a.u49", 0x000000, 0x200000, CRC(09749531) SHA1(6deeed2712241611ec3202c49a66beed28698af8) ) + ROM_LOAD( "bp947a.u50", 0x200000, 0x200000, CRC(19cea8b2) SHA1(87fb29458074f0e4852237e0184b8b3b44b0eb29) ) + ROM_LOAD( "bp947a.u51", 0x400000, 0x200000, CRC(c19bed67) SHA1(ac664a15512c0e8c8b701833aede95f53cd46a45) ) + ROM_LOAD( "bp947a.u52", 0x600000, 0x200000, CRC(70c64875) SHA1(1c20ab100ccfdf42c97a25e4deb9041b83f5ca8d) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "bp947a.u48", 0x000000, 0x100000, CRC(04ff6a3d) SHA1(7187db436f7a2ab59a3f5c6ab297b3d740e20f1d) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "bp947a.u47", 0x000000, 0x100000, CRC(0de42827) SHA1(05d452ca11a31f941cb8a9b0cbb0b59c6b0cbdcb) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "bp947a.u46", 0x000000, 0x100000, CRC(0f9c906e) SHA1(03872e8be28637df66373bddb04ed91de4f9db75) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "bp947a.u42", 0x000000, 0x100000, CRC(2ce8ff2a) SHA1(8ef8c5b7d4a0e60c980c2962e75f7977faafa311) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + ROM_LOAD( "bp947a.u37", 0x000000, 0x100000, CRC(c3077c8f) SHA1(0a76316a81b7de78279b859549eb5161a721ac71) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) +ROM_END + +ROM_START( nmaster ) + ROM_REGION( 0x280000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "bp947a_n.u25",0x000000, 0x80000, CRC(748cc514) SHA1(11d882e77a539407c314f087386e50d691a6bc0b) ) + ROM_LOAD16_WORD_SWAP( "bp947a.u28" , 0x100000, 0x80000, CRC(8c55decf) SHA1(76c6ce4c8e621273258d31ceb9ec4442fcf1a393) ) + ROM_LOAD16_WORD_SWAP( "bp947a.u29", 0x200000, 0x80000, CRC(cf0f3f3b) SHA1(49a3c0e7536edd53bbf09353e43e9166d736b3f4) ) + + ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "bp947a.u20", 0x00000, 0x40000, CRC(a4a36170) SHA1(ae55094518bd968ea0d04613a133c1421e412012) ) + + ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "bp947a.u49", 0x000000, 0x200000, CRC(09749531) SHA1(6deeed2712241611ec3202c49a66beed28698af8) ) + ROM_LOAD( "bp947a.u50", 0x200000, 0x200000, CRC(19cea8b2) SHA1(87fb29458074f0e4852237e0184b8b3b44b0eb29) ) + ROM_LOAD( "bp947a.u51", 0x400000, 0x200000, CRC(c19bed67) SHA1(ac664a15512c0e8c8b701833aede95f53cd46a45) ) + ROM_LOAD( "bp947a.u52", 0x600000, 0x200000, CRC(70c64875) SHA1(1c20ab100ccfdf42c97a25e4deb9041b83f5ca8d) ) + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "bp947a.u48", 0x000000, 0x100000, CRC(04ff6a3d) SHA1(7187db436f7a2ab59a3f5c6ab297b3d740e20f1d) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "bp947a.u47", 0x000000, 0x100000, CRC(0de42827) SHA1(05d452ca11a31f941cb8a9b0cbb0b59c6b0cbdcb) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "bp947a.u46", 0x000000, 0x100000, CRC(0f9c906e) SHA1(03872e8be28637df66373bddb04ed91de4f9db75) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "bp947a.u42", 0x000000, 0x100000, CRC(2ce8ff2a) SHA1(8ef8c5b7d4a0e60c980c2962e75f7977faafa311) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) + + ROM_REGION( 0x100000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + ROM_LOAD( "bp947a.u37", 0x000000, 0x100000, CRC(c3077c8f) SHA1(0a76316a81b7de78279b859549eb5161a721ac71) ) // FIRST AND SECOND HALF IDENTICAL + ROM_CONTINUE( 0x000000, 0x100000 ) +ROM_END + + +/*************************************************************************** + + Pac-Slot by Namco, 1996 (according to http://pacman.com/ja/museum/index.html) + Namco N-44 EM VIDEO platform, PCB A0442 + + TMP 68HC000P-16 + + 013 9345E7006 + 038 9444WX010 + + OKI M6295 x 2 + + Battery + 93C46 EEPROM (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( pacslot ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "pa1-mprob.u41", 0x00000, 0x80000, CRC(56281370) SHA1(b75a7c5997adac14486cef7be4e41d113c86021f) ) + + ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "pa1-obj0.u52", 0x00000, 0x80000, CRC(bf9232ce) SHA1(9a887a964e9a75e16c59dcf217c664404e74cc2a) ) + ROM_LOAD16_BYTE( "pa1-obj1.u53", 0x00001, 0x80000, CRC(6eb76a04) SHA1(66c8e36bee4439c203a02b30898e4f741205d681) ) + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD16_BYTE( "pa1-cha0.u60", 0x00000, 0x40000, CRC(314b51a6) SHA1(eef102c4f0c0e0f668a7cf228cd4fbe45b2ce45f) ) + ROM_LOAD16_BYTE( "pa1-cha1.u61", 0x00001, 0x40000, CRC(f7a2c846) SHA1(3b505a7a3c7f30e6cd87803f5ae7e962205fc1f0) ) + + ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "pa1-voi0.u27", 0x00000, 0x40000, CRC(e3e623e1) SHA1(396accc7f7384277b700f019b5083def8a48ccd7) ) + + ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) /* OKIM6295 #2 Samples */ + // empty ROM socket + + ROM_REGION( 0x117 * 3, "plds", 0 ) + ROM_LOAD( "n44u1a.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8B-15LP (Protected) + ROM_LOAD( "n44u3a.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8B-15LP (Protected) + ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, CRC(3c5e9bc5) SHA1(b4e04c4fa91ff33542b73971f67e71d13e24c5ec) ) // GAL16V8B-15LP (Protected, dumped from the paceight PCB) +ROM_END + + +/*************************************************************************** + + Pac-Eight by Namco, 1996 (according to http://pacman.com/ja/museum/index.html) + Namco N-44 EM VIDEO platform, PCB C0348 + + TMP 68HC000P-16 + + 013 9341E7002 + 038 9635WY003 + + OKI M6295 x 2 + + Battery + 93C46 EEPROM (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( paceight ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "pae1-mpro.u41", 0x00000, 0x80000, CRC(bb026f97) SHA1(70d48f05275c64b25f37f03206219ef3ee9c0ee2) ) // 27c240 + + ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "pae1-obj0.u52", 0x00000, 0x80000, CRC(2cd99155) SHA1(146ed2b3f2763232a60e6b238a16067d3ccfa959) ) // 27c040 + ROM_LOAD16_BYTE( "pae1-obj1.u53", 0x00001, 0x80000, CRC(9ae2685b) SHA1(5eed5f00d28d803358c8ffaf42c4979af23a0a8c) ) // "" + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD16_BYTE( "pae1-cha0.u60", 0x00000, 0x40000, CRC(757263e3) SHA1(668060e9e209752474f48362752a3f819ff82d72) ) // 27c020? not readable + ROM_LOAD16_BYTE( "pae1-cha1.u61", 0x00001, 0x40000, CRC(0396d241) SHA1(79382805fa4486d8dae792f9afc0f02aee1bbb33) ) // "" + + ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "pae1-vo10.u27", 0x00000, 0x40000, CRC(0be7b94f) SHA1(4179e2ab2d2d1df0cc6cfd71e277ea114578f147) ) // 27c? not readable + + ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) /* OKIM6295 #2 Samples */ + // empty ROM socket + + ROM_REGION( 0x117 * 3, "plds", 0 ) + ROM_LOAD( "n44u1c.u1", 0x117*0, 0x117, CRC(903fc2d8) SHA1(becbae356efde873225ef64af462d9702aac03f0) ) // GAL16V8B-15LP + ROM_LOAD( "n44u3c.u3", 0x117*1, 0x117, CRC(72201412) SHA1(6ad7d22e612e27343eac5c38f00d548df644d52c) ) // GAL16V8B-15LP + ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, CRC(3c5e9bc5) SHA1(b4e04c4fa91ff33542b73971f67e71d13e24c5ec) ) // GAL16V8B-15LP +ROM_END + +/*************************************************************************** + + Pac-Carnival by Namco, 1996 + Namco N-44 EM VIDEO platform, PCB B0445 + + TMP 68HC000P-16 + + 013 9341E7005 + 038 9429WX704 + + OKI M6295 x 2 + + Battery + 93C46 EEPROM (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( paccarn ) + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP( "pl1-mpr0b.u41", 0x00000, 0x80000, CRC(ef6b08ea) SHA1(61fe4db433a154233c4e1efd248ad51ba1d265d0) ) + + ROM_REGION( 0x100000, "sprites0", 0 ) + ROM_LOAD16_BYTE( "pl1-obj0.u52", 0x00000, 0x80000, CRC(1dd7c292) SHA1(e78d4be35c24616a1954910039e381869246a246) ) + ROM_LOAD16_BYTE( "pl1-obj1.u53", 0x00001, 0x80000, CRC(7b9935d0) SHA1(ef05230689124d0999ba9e472968e04d6e75c405) ) + + ROM_REGION( 0x80000, "layer0", 0 ) + ROM_LOAD16_BYTE( "pl1-cha0.u60", 0x00000, 0x40000, CRC(7977662e) SHA1(5aaa69ffaa62b20196a7b638232716b7c6391490) ) + ROM_LOAD16_BYTE( "pl1-cha1.u61", 0x00001, 0x40000, CRC(2150eafa) SHA1(e744a0861ee8a76c2bb24f681df38966df5dc9f0) ) + + ROM_REGION( 0x40000, "oki1", 0 ) + ROM_LOAD( "pl1-voi0.u27", 0x00000, 0x40000, CRC(e22b87e3) SHA1(83a6952fb0f695bb74cc5a3a1e24a916b6de9c8e) ) + + ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) + // empty ROM socket + + ROM_REGION( 0x117 * 3, "plds", 0 ) // all protected + ROM_LOAD( "n44u1b.u1", 0x117*0, 0x117, NO_DUMP ) + ROM_LOAD( "n44u3b.u3", 0x117*1, 0x117, NO_DUMP ) + ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, NO_DUMP ) +ROM_END + +/*************************************************************************** + + Poka Poka Satan - wack-a-mole game with one frontal upright screen and two + table-top touch screens to bang on with plastic "hammers" + + PPS-MAIN (Sticker: 96. 4. 5 017) + + TMP 68HC000P-16 + + 013 9607EX013 x 3 + 038 9444WX010 x 3 + + OKI M6295 + + DSW8 + BR93LC46 EEPROM + + 16MHz XTAL + 28MHz XTAL + +***************************************************************************/ + +ROM_START( ppsatan ) + ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF ) /* 68000 Code */ + ROM_LOAD16_BYTE( "66a5.u79", 0x00000, 0x20000, CRC(60efeed3) SHA1(72095cef77065a8f1089273050f60a2e99582cf1) ) // checksum = 60D5 (OK?). 1xxxxxxxxxxxxxxxx = 0xFF + ROM_LOAD16_BYTE( "43b1.u61", 0x00001, 0x20000, CRC(f14e6287) SHA1(75c0465780a10ec8f533349b008f0d489bf362a5) ) // checksum = 43B1 (OK). 1xxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x200000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "ver1.0.u27", 0x00000, 0x80000, CRC(d1b02639) SHA1(19bbcf951a6ace91da72af9232f3d808afa8416c) ) + ROM_LOAD16_BYTE( "ver1.0.u17", 0x00001, 0x80000, CRC(c66730ca) SHA1(75c18c80c1d2ced69edd4f013685c4eaf015049c) ) + + ROM_REGION( 0x200000, "sprites1", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "ver1.0.u13", 0x00000, 0x80000, CRC(24c31e01) SHA1(c2c96bdd0a2a764ac0e1c8d64334d0ab76c46aa5) ) + ROM_LOAD16_BYTE( "ver1.0.u19", 0x00001, 0x80000, CRC(ffbc6284) SHA1(05a735f3193218d32ad253c5abe21e1d00d1a5ca) ) + + ROM_REGION( 0x200000, "sprites2", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "ver1.0.u15", 0x00000, 0x80000, CRC(24c31e01) SHA1(c2c96bdd0a2a764ac0e1c8d64334d0ab76c46aa5) ) + ROM_LOAD16_BYTE( "ver1.0.u23", 0x00001, 0x80000, CRC(ffbc6284) SHA1(05a735f3193218d32ad253c5abe21e1d00d1a5ca) ) + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "ver1.0.u57", 0x00000, 0x80000, CRC(5faa697a) SHA1(308ea0a4dee7510b3bdd1b3b3c0a86c6508df40b) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 + + ROM_REGION( 0x80000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "ver1.0.u49", 0x00000, 0x80000, CRC(f21787b0) SHA1(e29ffcf948ef55f8ee11949903e5a363e6c4fa44) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 + + ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "ver1.0.u53", 0x00000, 0x80000, CRC(f21787b0) SHA1(e29ffcf948ef55f8ee11949903e5a363e6c4fa44) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 + + ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ + ROM_LOAD( "7a1f.u83", 0x000000, 0x80000, CRC(2ae77933) SHA1(a5eb0915813efd538b0812a6bbd5239b4b203f4a) ) + + ROM_REGION( 0x117, "plds", 0 ) + ROM_LOAD( "u90.u90", 0x000, 0x117, CRC(dae5e82a) SHA1(718ad537a917a0fdc3ef3c2307f04499a0029451) ) + ROM_LOAD( "u91.u91", 0x000, 0x117, CRC(28382623) SHA1(9fd4b4964f71807ae35a92bd5e81d6d1a5fdf469) ) + ROM_LOAD( "u92.u92", 0x000, 0x117, CRC(40b16ace) SHA1(1cdf39743713109e9510aeb6323df2bedfddbeb1) ) + ROM_LOAD( "u94.u94", 0x000, 0x117, CRC(eefe343a) SHA1(c7627d20711c3bf00f5d498d67ff43c8a0962a23) ) + ROM_LOAD( "u95.u95", 0x000, 0x117, CRC(b1a78112) SHA1(65a4da294c74ce4d36ceead8284b79be6cbb6379) ) + ROM_LOAD( "u111.u111", 0x000, 0x117, CRC(7f93cbdd) SHA1(7432b21c83249ab53d8f37e0c6fffd28f8de4ef3) ) +ROM_END + + +/* + +Power Instinct 2 (US) / Gouketsuji Ichizoku 2 (Japan) +Atlus, 1994 + +PCB Layout +---------- + +AT047G2-B ATLUS +|---------------------------------------------------------------| +|LM324 M6295 G02_U53 Z80 16MHz 28MHz 12MHz TA8030S | +|VOL G02_U54 |------| G02_U3A G02_U82A | +| M6295 G02_U55 |NMK112| 6264 6264 | +|uPC2505 G02_U56 | | |------| | +| 4558 |------| 6264 |038 | | +| Y3014 YM2203 PAL |9429WX| | +| G02_U89 |------| | +|J TEST_SW 62256 | +|A 93C46 62256 6264 |------| | +|M |038 | | +|M |---| G G G G PAL 6264 |9429WX| | +|A | | 0 0 0 0 |------| | +| | 6 | 2 2 2 2 G02_U81 | +| | 8 | - - - - |------| | +| | 0 | U U U U 6264 |038 | | +| | 0 | 4 4 4 4 |9429WX| | +| | 0 | 5 3 4 2 62256 6264 |------| | +| | | A A A A 62256 | +| |---| PAL |-------| G02_U78 |------| | +| |8647-01| |038 | | +| |013 | KM416C256 |9429WX| | +| |9341E70| |------| | +| G02_U66 G02_U63 |-------| 6264 | +| G02_U65 G02_U62 62256 KM416C256 | +| G02_U67 G02_U64 G02_U61 62256 6264 | +|---------------------------------------------------------------| +Notes: + 68000 clock - 16.000MHz + Z80 clock - 8.000MHz [16/2] + 6295 clocks - 3.000MHz [12/4], sample rate = 3000000 / 165 + YM2203 clock- 4.000MHz [16/4] + VSync - 57.5Hz + HSync - 15.23kHz + + ROMs - + U3 : 27C1001 EPROM + U82 : 27C040 EPROM + U42-45 : 27C040 EPROMs + U81, U89 : 8M 42 pin mask ROM (read as 27C800) + ALL other ROMs are soldered-in 16M 42 pin mask ROM (read as 27C160) +*/ + +ROM_START( pwrinst2 ) /* 94.04.08 */ + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "g02.u45a", 0x000000, 0x80000, CRC(ddfff811) SHA1(720f577dc77fc12aeb67511251e995169df754b6) ) + ROM_LOAD16_BYTE( "g02.u44a", 0x000001, 0x80000, CRC(5561f620) SHA1(3241ccc47e909930d79ad0a1a1b11a11879b17be) ) + ROM_LOAD16_BYTE( "g02.u43a", 0x100000, 0x80000, CRC(c4fd5d62) SHA1(8d00adfe5da9b0d0134fc9921c12f20b80954c3b) ) + ROM_LOAD16_BYTE( "g02.u42a", 0x100001, 0x80000, CRC(56279c1c) SHA1(f86edc2264758f9dc920a162d2dc71cc1f63d22e) ) + + ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ + /* not used */ + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "g02.u3a", 0x00000, 0x20000, CRC(ebea5e1e) SHA1(4d3af9e5f29d0c1b26563f51250039c9e8bd3735) ) + + ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) + ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) + ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) + ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) + ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) + ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) + ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) + + ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) + + ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ + ROM_LOAD( "g02.82a", 0x000000, 0x080000, CRC(4b3567d6) SHA1(d3e14783b312d2bea9722a8e3c22bcec81e26166) ) + + ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) + ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) + + ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) + ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) + + ROM_REGION( 0x03ff, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( pwrinst2a ) /* also 94.04.08 like pwrinst2, but different program roms */ + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "g02.u45", 0x000000, 0x80000, CRC(7b33bc43) SHA1(a68eb94e679f03c354932b8c5cd1bb2922fec0aa) ) + ROM_LOAD16_BYTE( "g02.u44", 0x000001, 0x80000, CRC(8f6f6637) SHA1(024b12c0fe40e27c79e38bd7601a9183a62d75fd) ) + ROM_LOAD16_BYTE( "g02.u43", 0x100000, 0x80000, CRC(178e3d24) SHA1(926234f4196a5d5e3bd1438abbf73355f2c65b06) ) + ROM_LOAD16_BYTE( "g02.u42", 0x100001, 0x80000, CRC(a0b4ee99) SHA1(c6df4aa2543b04d8bda7683f503e5eb763e506af) ) + + ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ + /* not used */ + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "g02.u3a", 0x00000, 0x20000, CRC(ebea5e1e) SHA1(4d3af9e5f29d0c1b26563f51250039c9e8bd3735) ) + + ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) + ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) + ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) + ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) + ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) + ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) + ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) + + ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) + + ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ + ROM_LOAD( "g02.82a", 0x000000, 0x080000, CRC(4b3567d6) SHA1(d3e14783b312d2bea9722a8e3c22bcec81e26166) ) + + ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) + ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) + + ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) + ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) + + ROM_REGION( 0x03ff, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( pwrinst2j ) + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "g02j.u45", 0x000000, 0x80000, CRC(42d0abd7) SHA1(c58861d43c4539ccc8b2f93eabc56aab37d3aa34)) + ROM_LOAD16_BYTE( "g02j.u44", 0x000001, 0x80000, CRC(362b7af3) SHA1(2d15611530cef76f0f9c82ee0411966079ae19c3)) + ROM_LOAD16_BYTE( "g02j.u43", 0x100000, 0x80000, CRC(c94c596b) SHA1(ee755a344f769e3ed05d8ca57f517b9e8c02f22e) ) + ROM_LOAD16_BYTE( "g02j.u42", 0x100001, 0x80000, CRC(4f4c8270) SHA1(1fa964f5646bd1d078e3661c21e191b0789c05c9) ) + + ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ + /* not used */ + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "g02j.u3a", 0x00000, 0x20000, CRC(eead01f1) SHA1(0ced6755e471e0303fe397b3d54a5c799762ebd8) ) + + ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) + ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) + ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) + ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) + ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) + ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) + ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) + + ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) + + ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) + + ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ + ROM_LOAD( "g02j.82a", 0x000000, 0x080000, CRC(3be86fe1) SHA1(313bfe5fb8dc5fee4462db259738e079759f9390) ) + + ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) + ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) + + ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) + ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) + + ROM_REGION( 0x03ff, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ +ROM_END + +/* + +Power Instinct Legends (US) / Gouketsuji Ichizoku Saikyou Densetsu (Japan) +Atlus, 1995 + +PCB Layout +---------- + +AT047G2-B ATLUS +|---------------------------------------------------------------| +|LM324 M6295 G02_U53 Z80 16MHz 28MHz 12MHz TA8030S | +|VOL G02_U54 |------| SOUND_U3 TEXT_U82 | +| M6295 G02_U55 |NMK112| 6264 6264 | +|uPC2505 G02_U56 | | |------| | +| 4558 |------| 6264 |038 | | +| Y3014 YM2203 PAL |9429WX| | +| ATGS_U89 |------| | +|J TEST_SW 62256 | +|A 93C46 62256 6264 |------| | +|M |----SUB-BOARD-----| |038 | | +|M |---| |*P P *P P *P *P | PAL 6264 |9429WX| | +|A | | | R R R R R R | |------| | +| | 6 | | 1 O 1 O 1 1 | ATGS_U81 | +| | 8 | | 2 G 2 G 2 2 | |------| | +| | 0 | | U U U U U U | 6264 |038 | | +| | 0 | | 2 4 4 4 3 5 | |9429WX| | +| | 0 | | 5 4 |62256 6264 |------| | +| | | |------------------|62256 | +| |---| PAL |-------| ATGS_U78 |------| | +|--------| |8647-01| |038 | | +|*ATGS_U1| |013 | KM416C256 |9429WX| | +| | |9341E70| |------| | +| |G02_U66 G02_U63 |-------| 6264 | +| | G02_U65 G02_U62 62256 KM416C256 | +|*ATGS_U2| G02_U64 G02_U61 62256 6264 | +|--------|------------------------------------------------------| +Notes: + ROMs marked with * are located on a plug-in sub board + 68000 clock - 16.000MHz + Z80 clock - 8.000MHz [16/2] + 6295 clocks - 3.000MHz [12/4], sample rate = 3000000 / 165 + YM2203 clock- 4.000MHz [16/4] + VSync - 57.5Hz + HSync - 15.23kHz + + ROMs - + U3 : 27C1001 EPROM + U82 : 27C040 EPROM + PR12* : 27C040 EPROMs + PROG* : 27C040 EPROMs + ALL other ROMs are soldered-in 16M 42 pin mask ROM (read as 27C160) +*/ + +ROM_START( plegends ) + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "d12.u45", 0x000000, 0x80000, CRC(ed8a2e3d) SHA1(0a09c58cd8a726189cd7679d06343e0b8c3de945) ) + ROM_LOAD16_BYTE( "d13.u44", 0x000001, 0x80000, CRC(25821731) SHA1(7c6ece92b36dc7eb489879d9ae3e8af9380b9f62) ) + ROM_LOAD16_BYTE( "d14.u2", 0x100000, 0x80000, CRC(c2cb1402) SHA1(78e70915ca32b97c22605a304dc8611e1fe01ae9) ) /* Contains text strings */ + ROM_LOAD16_BYTE( "d16.u3", 0x100001, 0x80000, CRC(50a1c63e) SHA1(5a8431a81aa61034e67141944b9e7cf97842773a) ) /* Contains text strings */ + + ROM_REGION16_BE( 0x100000, "user1", 0 ) /* 68000 extra data roms */ + ROM_LOAD16_BYTE( "d15.u4", 0x000000, 0x80000, CRC(6352cec0) SHA1(a54d55b8d642e438158268d0d41880b6589e48e2) ) + ROM_LOAD16_BYTE( "d17.u5", 0x000001, 0x80000, CRC(7af810d8) SHA1(5e24f78a228809a001f3f3372c1b32ea05070e17) ) + + ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "d19.u3", 0x00000, 0x40000, CRC(47598459) SHA1(4e9dcfebfbd160230768965e8c6e5ed446c1aa7b) ) /* Same as sound.u3 below, but twice the size? */ + + ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) + ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) + ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) + ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) + ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) + ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) + ROM_LOAD( "atgs.u1", 0xc00000, 0x200000, CRC(aa6f34a9) SHA1(00de85de1b413bd2c46931c13365f8556b50b634) ) /* US version's rom labeled "sp6_u67-1" */ + ROM_LOAD( "atgs.u2", 0xe00000, 0x200000, CRC(553eda27) SHA1(5b9126f966f0c64b3ac7c06526064d71e4df60c5) ) /* US version's rom labeled "sp6_u67-2" */ + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atgs.u78", 0x000000, 0x200000, CRC(16710ecb) SHA1(6277f7f6095457df649932550b04242e5853ec5e) ) /* US version's rom labeled "bg0_u78" */ + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atgs.u81", 0x000000, 0x200000, CRC(cb2aca91) SHA1(869f0f2db35c45ec90b74d33d521cbb598e60a3f) ) /* US version's rom labeled "bg1_u81" */ + + ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "atgs.u89", 0x000000, 0x200000, CRC(65f45a0f) SHA1(b7f4b56308dcdc144100d0a92d91255459a320a4) ) /* US version's rom labeled "bg2_u89" */ + + ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ + ROM_LOAD( "text.u82", 0x000000, 0x080000, CRC(f57333ea) SHA1(409d8005ffcf91943e4a743b2434ce425f5bdc36) ) /* US version's rom labeled "d20" */ + + ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) + ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) + + ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) + ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) + + ROM_REGION( 0x03ff, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ +ROM_END + +ROM_START( plegendsj ) + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "prog.u45", 0x000000, 0x80000, CRC(94f53db2) SHA1(34c671f160cfcb7d46cc964731ff2b77dc0be928) ) + ROM_LOAD16_BYTE( "prog.u44", 0x000001, 0x80000, CRC(db0ad756) SHA1(9c1510491cdc9442062ee3bd8a1bb93f00d33d97) ) + ROM_LOAD16_BYTE( "pr12.u2", 0x100000, 0x80000, CRC(0e202559) SHA1(217a8e47d5c679aff02ca43de1641230e4f78b01) ) /* Contains text in Japanese */ + ROM_LOAD16_BYTE( "pr12.u3", 0x100001, 0x80000, CRC(54742f21) SHA1(fae7bb7381478eb077f0409acd521f77417aa968) ) /* Contains text in Japanese */ + + ROM_REGION16_BE( 0x100000, "user1", 0 ) /* 68000 extra data roms */ + ROM_LOAD16_BYTE( "d15.u4", 0x000000, 0x80000, CRC(6352cec0) SHA1(a54d55b8d642e438158268d0d41880b6589e48e2) ) + ROM_LOAD16_BYTE( "d17.u5", 0x000001, 0x80000, CRC(7af810d8) SHA1(5e24f78a228809a001f3f3372c1b32ea05070e17) ) + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ + ROM_LOAD( "sound.u3", 0x00000, 0x20000, CRC(36f71520) SHA1(11d0a059ddba3e1aa4c54ccdde7b3f5c7bde482f) ) + + ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) + ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) + ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) + ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) + ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) + ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) + ROM_LOAD( "atgs.u1", 0xc00000, 0x200000, CRC(aa6f34a9) SHA1(00de85de1b413bd2c46931c13365f8556b50b634) ) /* US version's rom labeled "sp6_u67-1" */ + ROM_LOAD( "atgs.u2", 0xe00000, 0x200000, CRC(553eda27) SHA1(5b9126f966f0c64b3ac7c06526064d71e4df60c5) ) /* US version's rom labeled "sp6_u67-2" */ + + ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "atgs.u78", 0x000000, 0x200000, CRC(16710ecb) SHA1(6277f7f6095457df649932550b04242e5853ec5e) ) /* US version's rom labeled "bg0_u78" */ + + ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ + ROM_LOAD( "atgs.u81", 0x000000, 0x200000, CRC(cb2aca91) SHA1(869f0f2db35c45ec90b74d33d521cbb598e60a3f) ) /* US version's rom labeled "bg1_u81" */ + + ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ + ROM_LOAD( "atgs.u89", 0x000000, 0x200000, CRC(65f45a0f) SHA1(b7f4b56308dcdc144100d0a92d91255459a320a4) ) /* US version's rom labeled "bg2_u89" */ + + ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ + ROM_LOAD( "text.u82", 0x000000, 0x080000, CRC(f57333ea) SHA1(409d8005ffcf91943e4a743b2434ce425f5bdc36) ) /* US version's rom labeled "d20" */ + + ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) + ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) + + ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ + /* Leave the 0x40000 bytes addressable by the chip empty */ + ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) + ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) + + ROM_REGION( 0x03ff, "pal", 0 ) + ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ + ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ +ROM_END + + +/*************************************************************************** + + Pretty Soldier Sailor Moon + +(C) 1995 Banpresto +PCB: BP945A +CPU: TMP68HC000P16 (68000, 64 pin DIP) +SND: Z84C0008PEC (Z80, 40 pin DIP), OKI M6295 x 2, YM2151, YM3012 +OSC: 28.000MHz, 16.000MHz +RAM: NEC 43256 x 8, NEC 424260 x 2, Sanyo LC3664 x 5 + +Other Chips: +SGS Thomson ST93C46CB1 (EEPROM?) +PALS (not dumped): + 18CV8 label SMBG + 18CV8 label SMZ80 + 18CV8 label SMCPU + GAL16V8 (located near BPSM-U47) + +GFX: 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 038 9437WX711 (176 pin PQFP) + 013 9346E7002 (240 pin PQFP) + +On PCB near JAMMA connector is a small push button to access test mode. + +ROMS: +BP945A.U9 27C040 Sound Program +BP945A.U45 27C240 Main Program +BPSM.U46 23C16000 Main Program? +BPSM.U47 23C4000 Sound? +BPSM.U48 23C16000 Sound? +BPSM.U53 23C16000 GFX +BPSM.U54 23C16000 GFX +BPSM.U57 23C16000 GFX +BPSM.U58 23C16000 GFX +BPSM.U59 23C16000 GFX +BPSM.U60 23C16000 GFX +BPSM.U61 23C16000 GFX +BPSM.U62 23C16000 GFX +BPSM.U63 23C16000 GFX +BPSM.U64 23C16000 GFX +BPSM.U65 23C16000 GFX +BPSM.U76 23C16000 GFX +BPSM.U77 23C16000 GFX + +***************************************************************************/ + + +#define ROMS_SAILORMN \ + ROM_REGION( 0x400000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "bpsm945a.u45", 0x000000, 0x080000, CRC(898c9515) SHA1(0fe8d7f13f5cfe2f6e79a0a21b2e8e7e70e65c4b) ) \ + ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ + \ + ROM_REGION( 0x80000, "audiocpu", 0 ) \ + ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ + \ + ROM_REGION( 0x400000, "sprites0", 0 ) \ + ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ + ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ + \ + ROM_REGION( 0x200000, "layer0", 0 ) \ + ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ + \ + ROM_REGION( 0x200000, "layer1", 0 ) \ + ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ + \ + ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ + \ + ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ + ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ + ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ + ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ + ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ + \ + ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ + ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ + ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ + ROM_CONTINUE( 0xe00000, 0x100000 ) \ + \ + ROM_REGION( 0x200000, "oki1", 0 ) \ + ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ + \ + ROM_REGION( 0x200000, "oki2", 0 ) \ + ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ + ROM_RELOAD( 0x080000, 0x080000 ) \ + ROM_RELOAD( 0x100000, 0x080000 ) \ + ROM_RELOAD( 0x180000, 0x080000 ) +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( sailormn ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) +ROM_END + +ROM_START( sailormnu ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) +ROM_END + +ROM_START( sailormnj ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) +ROM_END + +ROM_START( sailormnk ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) +ROM_END + +ROM_START( sailormnt ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) +ROM_END + +ROM_START( sailormnh ) + ROMS_SAILORMN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) +ROM_END + + +#define ROMS_SAILORMNN \ + ROM_REGION( 0x400000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "smprg.u45", 0x000000, 0x080000, CRC(234f1152) SHA1(8fc6d4a8995d550862d328011d3357c09334f0fa) ) \ + ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ + \ + ROM_REGION( 0x80000, "audiocpu", 0 ) \ + ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ + \ + ROM_REGION( 0x400000, "sprites0", 0 ) \ + ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ + ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ + \ + ROM_REGION( 0x200000, "layer0", 0 ) \ + ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ + \ + ROM_REGION( 0x200000, "layer1", 0 ) \ + ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ + \ + ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ + \ + ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ + ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ + ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ + ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ + ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ + \ + ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ + ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ + ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ + ROM_CONTINUE( 0xe00000, 0x100000 ) \ + \ + ROM_REGION( 0x200000, "oki1", 0 ) \ + ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ + \ + ROM_REGION( 0x200000, "oki2", 0 ) \ + ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ + ROM_RELOAD( 0x080000, 0x080000 ) \ + ROM_RELOAD( 0x100000, 0x080000 ) \ + ROM_RELOAD( 0x180000, 0x080000 ) +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( sailormnn ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) +ROM_END + +ROM_START( sailormnnu ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) +ROM_END + +ROM_START( sailormnnj ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) +ROM_END + +ROM_START( sailormnnk ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) +ROM_END + +ROM_START( sailormnnt ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) +ROM_END + +ROM_START( sailormnnh ) + ROMS_SAILORMNN + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) +ROM_END + + +#define ROMS_SAILORMNO \ + ROM_REGION( 0x400000, "maincpu", 0 ) \ + ROM_LOAD16_WORD_SWAP( "smprg.u45", 0x000000, 0x080000, CRC(97837ab4) SHA1(bf5a8cf3fbb942c2bb74c3b93312d9018ae6e2fd) ) \ + ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ + \ + ROM_REGION( 0x80000, "audiocpu", 0 ) \ + ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ + \ + ROM_REGION( 0x400000, "sprites0", 0 ) \ + ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ + ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ + \ + ROM_REGION( 0x200000, "layer0", 0 ) \ + ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ + \ + ROM_REGION( 0x200000, "layer1", 0 ) \ + ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ + \ + ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ + \ + ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ + ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ + ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ + ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ + ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ + \ + ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ + ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ + ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ + ROM_CONTINUE( 0xe00000, 0x100000 ) \ + \ + ROM_REGION( 0x200000, "oki1", 0 ) \ + ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ + \ + ROM_REGION( 0x200000, "oki2", 0 ) \ + ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ + ROM_RELOAD( 0x080000, 0x080000 ) \ + ROM_RELOAD( 0x100000, 0x080000 ) \ + ROM_RELOAD( 0x180000, 0x080000 ) +/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ +ROM_START( sailormno ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) +ROM_END + +ROM_START( sailormnou ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) +ROM_END + +ROM_START( sailormnoj ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) +ROM_END + +ROM_START( sailormnok ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) +ROM_END + +ROM_START( sailormnot ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) +ROM_END + +ROM_START( sailormnoh ) + ROMS_SAILORMNO + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) +ROM_END + + +/*************************************************************************** + + Tekken Card World by Namco, 1997 + Namco EMG4 platform, PCB 8824960101 (sticker: D 0049) + + TMP 68HC000P-16 + + 013 9651EX001 + 038 9701WX001 + + OKI M6295 (the second OKI location is unpopulated) + + 3V Button Battery + 93C46 EEPROM (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( tekkencw ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "mpr0.u41", 0x00000, 0x80000, CRC(5b8919f3) SHA1(580298b6dc36527ab69889c848acab97726a6cc6) ) // 27c240 + + ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "obj0.u52", 0x00000, 0x80000, CRC(6d3c0c76) SHA1(92f9c9beae222a2c2a3242f812030e08036c9963) ) // 27c040 + ROM_LOAD16_BYTE( "obj1.u53", 0x00001, 0x80000, CRC(8069b731) SHA1(9f0409c28466503092b74f635602962d9f127de8) ) // "" + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD16_BYTE( "cha0.u60", 0x00000, 0x40000, CRC(2a245ade) SHA1(7217017975c88c3edea613152ee6f2158f8777d7) ) // 27c020 + ROM_LOAD16_BYTE( "cha1.u61", 0x00001, 0x40000, CRC(43f62cce) SHA1(aa12ed0ccb94115ff8f9acf17850e1186c68bcf9) ) // "" + + ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "voi0.u27", 0x00000, 0x40000, CRC(3bcd9b7d) SHA1(7ecb47127733187f385a75b9db655e35c249de18) ) // 27c020 + + ROM_REGION( 0x117 * 2, "plds", 0 ) + ROM_LOAD( "n44u1d.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8D-15LP + ROM_LOAD( "n44u3a.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8D-15LP +ROM_END + + +/*************************************************************************** + + Tekken Battle Scratch by Namco, 1998 + Namco EMG4 platform, PCB 8824960101 (sticker: D 0880) + + TMP 68HC000P-16 + + 013 9???????? + 038 9748WX001 + + OKI M6295 (the second OKI location is unpopulated) + + 3V Button Battery + 93C46 EEPROM (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( tekkenbs ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "tbs1_mpr-0a.u41", 0x00000, 0x80000, CRC(625487d3) SHA1(6bdc0f0f9877eeb1041f8f5b0d44e41b83ddcc76) ) // 27c4002 + + ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "tbs1_obj-0a.u52", 0x00000, 0x80000, CRC(a870481b) SHA1(644370e10b197832ee828b22e43f114d40740432) ) // 27c4001 + ROM_LOAD16_BYTE( "tbs1_obj-1a.u53", 0x00001, 0x80000, CRC(73d8f520) SHA1(70ab5abeeaf0b3f5a263a7ece21d000a27148994) ) // "" + + ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD16_BYTE( "tbs1_cha-0a.u60", 0x00000, 0x80000, CRC(73e5c069) SHA1(5e4e8a0bc1fdf57e4cdf7075704dc0b60d9629e3) ) // 27c4001 + ROM_LOAD16_BYTE( "tbs1_cha-1a.u61", 0x00001, 0x80000, CRC(f41d3f2f) SHA1(d44f1506110fe9b7ef74ca05874146526ddaf020) ) // "" + + ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "tbs1_voi-0a.u27", 0x00000, 0x40000, CRC(bdccb92e) SHA1(7efcce4028fe492891e6f47b266d68a22dbe4c63) ) // 27c2001 + + ROM_REGION( 0x117 * 2, "plds", 0 ) + ROM_LOAD( "n44u1e.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8D-15LP + ROM_LOAD( "n44u3e.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8D-15LP +ROM_END + + +/*************************************************************************** + + Tobikose! Jumpman by Namco, 1999 + Namco EMG4 platform, PCB TJ0476 + + TMP 68HC000P-16 + + 013 9934WX002 + 038 9919WX007 + + OKI M6295 + + Battery + 93C46 EEPROM? (at U24) + + 28MHz XTAL + +***************************************************************************/ + +ROM_START( tjumpman ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "tj1_mpr-0c.u41", 0x00000, 0x80000, CRC(de3030b8) SHA1(5f2165ea039c34cab605ebddc0b61eadc47b1532) ) + + ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD16_BYTE( "tj1_obj-0a.u52", 0x00000, 0x80000, CRC(b42cf8e8) SHA1(9ed7fb3574ed163a81f34a0d8cfa7a4661439932) ) + ROM_LOAD16_BYTE( "tj1_obj-1a.u53", 0x00001, 0x80000, CRC(5f0124d7) SHA1(4d9cfa464159998c176a178c668273d128dedff8) ) + + ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD16_BYTE( "tj1_cha-0a.u60", 0x00000, 0x40000, CRC(8aa08a38) SHA1(92b4df72fb8a833bb686ea478811243c5b868470) ) + ROM_LOAD16_BYTE( "tj1_cha-1a.u61", 0x00001, 0x40000, CRC(50072c82) SHA1(f8823e5a865afb8824cafd3b6483e2b6250ee77f) ) + + ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ + ROM_LOAD( "tj1_voi-0a.u27", 0x00000, 0x40000, CRC(b5693aae) SHA1(8887ae98030cb5d184e3d57d2b4e48bf1e76a232) ) + + ROM_REGION( 0x117 * 2, "plds", 0 ) + ROM_LOAD( "n44u1g.u1", 0x117*0, 0x117, CRC(e226ec18) SHA1(c14098e06413d6fc88926e31538d496ef7314903) ) // GAL16V8D-15LP + ROM_LOAD( "n44u3b.u3", 0x117*1, 0x117, CRC(4cd79750) SHA1(cfb3331cd8bb2eaaf5d2a80ae76a5a15ae92d379) ) // GAL16V8D-15LP +ROM_END + + +/*************************************************************************** + + Puzzle Uo Poko +Board: CV02 +OSC: 28.0, 16.0, 16.9 MHz + +PCB found with hand written labels in Japanese (translated): + +Program (O) Program (E) +Eigo U25 Eigo U26 +C553 AOU ECB7 AOU + +Eigo means English and AOU is Amusement Operators Union. This board looks +to be an AOU show board. The data contents remained the same for the +actual International production release. + +***************************************************************************/ + +ROM_START( uopoko ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u26.u26", 0x000000, 0x080000, CRC(b445c9ac) SHA1(4dda1c6e19de629ea4d9061560c32a9f0deabd53) ) + ROM_LOAD16_BYTE( "u25.u25", 0x000001, 0x080000, CRC(a1258482) SHA1(7f4adc4a6d069032aaf3d93eb60fde16b59483f8) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "cave_cv-02_u33.u33", 0x000000, 0x400000, CRC(5d142ad2) SHA1(f26abcf7a625a322b83df44fbd6e852bfb03663c) ) /* mask ROM */ + + ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "cave_cv-02_u49.u49", 0x000000, 0x400000, CRC(12fb11bb) SHA1(953df1b16b5c9a6c3eb2fdebec4669a879270e73) ) /* mask ROM */ + + ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "cave_cv-02_u4.u4", 0x000000, 0x200000, CRC(a2d0d755) SHA1(f8493ef7f367f3dc2a229ba785ac67bc5c2c54c0) ) /* mask ROM */ + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-uopoko.bin", 0x0000, 0x0080, CRC(f4a24b95) SHA1(4043f0ffed24e38b4f7dbe1a5a4a9e79bdde7dfd) ) +ROM_END + +ROM_START( uopokoj ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u26j.u26", 0x000000, 0x080000, CRC(e7eec050) SHA1(cf3a77741029f96dbbec5ca7217a1723e4233cff) ) + ROM_LOAD16_BYTE( "u25j.u25", 0x000001, 0x080000, CRC(68cb6211) SHA1(a6db0bc2e3e54b6992a44b7d52395917e66db49b) ) + + ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ + ROM_LOAD( "cave_cv-02_u33.u33", 0x000000, 0x400000, CRC(5d142ad2) SHA1(f26abcf7a625a322b83df44fbd6e852bfb03663c) ) /* mask ROM */ + + ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ + ROM_LOAD( "cave_cv-02_u49.u49", 0x000000, 0x400000, CRC(12fb11bb) SHA1(953df1b16b5c9a6c3eb2fdebec4669a879270e73) ) /* mask ROM */ + + ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "cave_cv-02_u4.u4", 0x000000, 0x200000, CRC(a2d0d755) SHA1(f8493ef7f367f3dc2a229ba785ac67bc5c2c54c0) ) /* mask ROM */ + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD( "eeprom-uopoko.bin", 0x0000, 0x0080, CRC(f4a24b95) SHA1(4043f0ffed24e38b4f7dbe1a5a4a9e79bdde7dfd) ) +ROM_END + + +/*************************************************************************** + + + Drivers Init Routines - Rom decryption/unpacking, global vars etc. + + +***************************************************************************/ + +/* Tiles are 6 bit, 4 bits stored in one rom, 2 bits in the other. + Expand the 2 bit part into a 4 bit layout, so we can decode it */ +void cave_z80_state::sailormn_unpack_tiles(int chip) +{ + const u32 len= m_tileregion[chip]->bytes(); + u8 *rgn = m_tileregion[chip]->base(); + u8 *src = rgn + (len/4)*3 - 1; + u8 *dst = rgn + (len/4)*4 - 2; + + while (src <= dst) + { + u8 data = src[0]; + + dst[0] = ((data & 0x03) << 4) + ((data & 0x0c) >> 2); + dst[1] = ((data & 0x30) >> 0) + ((data & 0xc0) >> 6); + + src -= 1; + dst -= 2; + } +} + +void cave_state::init_cave() +{ + m_spritetype[0] = TYPE_ZOOM; // Normal sprites + m_kludge = 0; + m_time_vblank_irq = 100; + + m_irq_level = 1; +} + +void cave_z80_state::init_z80_bank() +{ + u8 *ROM = m_z80region->base(); + u32 max = m_z80region->bytes() / 0x4000; + m_z80bank->configure_entries(0, max, &ROM[0x00000], 0x4000); +} + +void cave_z80_state::init_oki_bank(int chip) +{ + u8 *ROM = m_okiregion[chip]->base(); + u32 max = m_okiregion[chip]->bytes() / 0x20000; + m_okibank_lo[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); + m_okibank_hi[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); +} + +void cave_z80_state::init_agallet() +{ + init_cave(); + + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); + + sailormn_unpack_tiles(2); + + unpack_sprites(0); +} + +void cave_state::init_dfeveron() +{ + init_cave(); + + unpack_sprites(0); + m_kludge = 2; +} + +void cave_state::init_feversos() +{ + init_cave(); + + unpack_sprites(0); + m_kludge = 2; +} + +void cave_state::init_ddonpach() +{ + init_cave(); + + unpack_sprites(0); + m_spritetype[0] = TYPE_NOZOOM; // "different" sprites (no zooming?) + m_time_vblank_irq = 90; + + /* 4bpp but Only first 16 colors are used in palette index for Layer 0, 1. */ + m_gfxdecode[0]->gfx(0)->set_granularity(256); + m_gfxdecode[0]->gfx(1)->set_granularity(256); +} + +void cave_state::init_donpachi() +{ + init_cave(); + + unpack_sprites(0); + m_spritetype[0] = TYPE_NOZOOM; // "different" sprites (no zooming?) + m_time_vblank_irq = 90; +} + +void cave_state::init_esprade() +{ + init_cave(); + + unpack_sprites(0); + m_time_vblank_irq = 2000; /**/ + +#if 0 //ROM PATCH + { + u16 *rom = (u16 *)memregion("maincpu")->base(); + rom[0x118A/2] = 0x4e71; //palette fix 118A: 5548 SUBQ.W #2,A0 --> NOP + } +#endif +} + +void cave_state::init_gaia() +{ + init_cave(); + + /* No EEPROM */ + + unpack_sprites(0); + m_time_vblank_irq = 2000; /**/ +} + +void cave_state::init_guwange() +{ + init_cave(); + + unpack_sprites(0); + m_time_vblank_irq = 2000; /**/ +} + +void cave_z80_state::init_hotdogst() +{ + init_cave(); + + init_z80_bank(); + init_oki_bank(0); + + unpack_sprites(0); + m_time_vblank_irq = 2000; /**/ +} + +void cave_z80_state::init_mazinger() +{ + u8 *src = m_spriteregion[0]->base(); + const u32 len = m_spriteregion[0]->bytes(); + + init_cave(); + + init_z80_bank(); + init_oki_bank(0); + + /* decrypt sprites */ + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + buffer[i ^ 0xdf88] = src[(i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,9,7,3,15,4,17,14,18,2,16,5,11,8,6,13,1,10,12,0)]; + std::copy(buffer.begin(), buffer.end(), &src[0]); + } + + unpack_sprites(0); + m_kludge = 3; + m_time_vblank_irq = 2100; +} + +void cave_z80_state::init_metmqstr() +{ + init_cave(); + + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); + + unpack_sprites(0); + m_kludge = 3; + m_time_vblank_irq = 17376; +} + +void ppsatan_state::init_ppsatan() +{ + init_cave(); + + unpack_sprites(0); + unpack_sprites(1); + unpack_sprites(2); + + m_time_vblank_irq = 2000; /**/ +} + +void cave_z80_state::init_pwrinst2() +{ + u8 *src = m_spriteregion[0]->base(); + const u32 len = m_spriteregion[0]->bytes(); + + init_cave(); + + init_z80_bank(); + + std::vector buffer(len); + { + for (u32 i = 0; i < len; i++) + { + u32 j = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7, 2,4,6,1,5,3, 0); + if(((j & 6) == 0) || ((j & 6) == 6)) + j ^= 6; + buffer[j ^ 7] = src[i]; + } + + std::copy(buffer.begin(), buffer.end(), &src[0]); + } + + unpack_sprites(0); + m_spritetype[0] = TYPE_NOZOOM | TYPE_ISPWRINST2; + m_kludge = 4; + m_time_vblank_irq = 2000; /**/ +} + +void cave_z80_state::init_pwrinst2a() +{ + /* this patch fixes on of the moves, why is it needed? is the rom bad or is there another + problem? does the Japan set need it or not? */ + init_pwrinst2(); + +#if 1 //ROM PATCH + { + u16 *rom = (u16 *)memregion("maincpu")->base(); + rom[0xd46c / 2] = 0xd482; // kurara dash fix 0xd400 -> 0xd482 + } +#endif + +} + +void cave_z80_state::init_sailormn() +{ + u8 *src = m_spriteregion[0]->base(); + const u32 len = m_spriteregion[0]->bytes(); + + init_cave(); + + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); + + /* decrypt sprites */ + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + buffer[i ^ 0x950c4] = src[(i & ~0xffffff) | bitswap<24>(i,23,22,21,20,15,10,12,6,11,1,13,3,16,17,2,5,14,7,18,8,4,19,9,0)]; + std::copy(buffer.begin(), buffer.end(), &src[0]); + } + + sailormn_unpack_tiles(2); + + unpack_sprites(0); + m_kludge = 1; + m_time_vblank_irq = 2000; + + m_sailormn_tilebank = 0; + save_item(NAME(m_sailormn_tilebank)); +} + +void cave_state::init_tjumpman() +{ + init_cave(); + + unpack_sprites(0); + m_kludge = 3; + m_time_vblank_irq = 17376; + + m_hopper = 0; + save_item(NAME(m_hopper)); +} + +void cave_state::init_uopoko() +{ + init_cave(); + + unpack_sprites(0); + m_kludge = 2; + m_time_vblank_irq = 2000; /**/ +} + +void cave_state::init_korokoro() +{ + init_cave(); + + m_irq_level = 2; + + unpack_sprites(0); + m_time_vblank_irq = 2000; /**/ + + m_leds[0] = 0; + m_leds[1] = 0; + m_hopper = 0; + save_item(NAME(m_leds)); + save_item(NAME(m_hopper)); +} + +/*************************************************************************** + + + Game Drivers + + +***************************************************************************/ +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS +GAME( 1994, pwrinst2, 0, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Power Instinct 2 (US, Ver. 94.04.08, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pwrinst2a, pwrinst2, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2a, ROT0, "Atlus", "Power Instinct 2 (US, Ver. 94.04.08, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, pwrinst2j, pwrinst2, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gouketsuji Ichizoku 2 (Japan, Ver. 94.04.08)", MACHINE_SUPPORTS_SAVE ) + +// Version/Date string is stored at 68000 ROM 0x1200-0x121f +// The EEPROM determines the region, program roms are the same between sets +GAME( 1994, mazinger, 0, mazinger, cave, cave_z80_state, init_mazinger, ROT90, "Banpresto / Dynamic Pl. Toei Animation", "Mazinger Z (World)", MACHINE_SUPPORTS_SAVE ) // 1994/06/27 08:00 +GAME( 1994, mazingerj, mazinger, mazinger, cave, cave_z80_state, init_mazinger, ROT90, "Banpresto / Dynamic Pl. Toei Animation", "Mazinger Z (Japan)", MACHINE_SUPPORTS_SAVE ) // 1994/06/27 08:00 + +// Version/Date string is stored at 68000 ROM 0x400-0x41f +GAME( 1995, donpachi, 0, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (US)", MACHINE_SUPPORTS_SAVE ) // Ver.1.12 1995/05/2x XXXXX +GAME( 1995, donpachij, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Japan)", MACHINE_SUPPORTS_SAVE ) // Ver.1.01 1995/05/11 +GAME( 1995, donpachijs, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Japan, Satsuei version)", MACHINE_SUPPORTS_SAVE ) // Ver.1.01 1995/05/11 +GAME( 1995, donpachikr, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Korea)", MACHINE_SUPPORTS_SAVE ) // Ver.1.12 1995/05/2x XXXXX +GAME( 1995, donpachihk, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Hong Kong)", MACHINE_SUPPORTS_SAVE ) // Ver.1.10 1995/05/17 asia + +GAME( 1995, metmqstr, 0, metmqstr, metmqstr, cave_z80_state, init_metmqstr, ROT0, "Banpresto / Pandorabox", "Metamoqester (World)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, nmaster, metmqstr, metmqstr, metmqstr, cave_z80_state, init_metmqstr, ROT0, "Banpresto / Pandorabox", "Oni - The Ninja Master (Japan)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1995, plegends, 0, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gogetsuji Legends (US, Ver. 95.06.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, plegendsj, plegends, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gouketsuji Gaiden - Saikyou Densetsu (Japan, Ver. 95.06.20)", MACHINE_SUPPORTS_SAVE ) + +// The EEPROM determines the region, program roms are the same between sets +GAME( 1995, sailormn, 0, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnu, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnk, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnt, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Hong Kong)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnn, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnnu, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnnj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnnk, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnnt, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnnh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Hong Kong)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormno, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnou, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnoj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnok, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnot, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1995, sailormnoh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Hong Kong)", MACHINE_SUPPORTS_SAVE ) + +// The EEPROM determines the region, program roms are the same between sets +GAME( 1996, agallet, 0, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletu, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletj, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Akuu Gallet (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletk, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agallett, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalleth, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Hong Kong)", MACHINE_SUPPORTS_SAVE ) +// this set appears to be older, there is some kind of reset circuit / watchdog circuit check on startup, the same check exists in the above set but the code skips over it so presumably it was removed +// to avoid boards simply hanging on a black screen if the circuit didn't fire. +GAME( 1996, agalleta, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletau, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletaj, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Akuu Gallet (older, Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletak, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletat, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, agalletah, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Hong Kong)", MACHINE_SUPPORTS_SAVE ) + +// 68000 ROM string 0x328e-32b5 has 1993 copyright and publisher string, it's planned release date but cancelled? +GAME( 1996, hotdogst, 0, hotdogst, cave, cave_z80_state, init_hotdogst, ROT90, "Marble (Ace International license)", "Hotdog Storm (Korea)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1996, pacslot, 0, pacslot, pacslot, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Slot", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, paceight, 0, paceight, paceight, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Eight", MACHINE_SUPPORTS_SAVE ) +GAME( 1996, paccarn, 0, paccarn, paccarn, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Carnival", MACHINE_SUPPORTS_SAVE ) + +GAME( 1996, ppsatan, 0, ppsatan, ppsatan, ppsatan_state, init_ppsatan, ROT0, "Kato Seisakujo Co., Ltd.", "Poka Poka Satan (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) + +GAME( 1997, tekkencw, 0, tekkencw, tekkencw, cave_state, init_tjumpman, ROT0, "Namco", "Tekken Card World", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, tekkenbs, 0, tekkenbs, tekkenbs, cave_state, init_tjumpman, ROT0, "Namco", "Tekken Battle Scratch", MACHINE_SUPPORTS_SAVE ) + +// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) +GAME( 1997, ddonpach, 0, ddonpach, cave, cave_state, init_ddonpach, ROT270, "Cave (Atlus license)", "DoDonPachi (World, 1997 2/ 5 Master Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1997, ddonpachj, ddonpach, ddonpach, cave, cave_state, init_ddonpach, ROT270, "Cave (Atlus license)", "DoDonPachi (Japan, 1997 2/ 5 Master Ver.)", MACHINE_SUPPORTS_SAVE ) +// NOT an official CAVE release, but several PCBs have been converted to it and used on location. +GAME( 2012, ddonpacha, ddonpach, ddonpach, cave, cave_state, init_ddonpach, ROT270, "hack (trap15)", "DoDonPachi (2012/02/12 Arrange Ver. 1.1) (hack)", MACHINE_SUPPORTS_SAVE ) + +// Version/Date string is stored at 68000 ROM 0x400-0x427 +GAME( 1998, dfeveron, feversos, dfeveron, cave, cave_state, init_dfeveron, ROT270, "Cave (Nihon System license)", "Dangun Feveron (Japan, 98/09/17 VER.)", MACHINE_SUPPORTS_SAVE ) // ca005 Ver0.01 Thu Sep 17 18:40:02 1998 +GAME( 1998, feversos, 0, dfeveron, cave, cave_state, init_feversos, ROT270, "Cave (Nihon System license)", "Fever SOS (World, 98/09/25 VER)", MACHINE_SUPPORTS_SAVE ) // ca005 Ver0.01 Fri Sep 25 10:10:15 1998 + +// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) +GAME( 1998, esprade, 0, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (World, 1998 4/22 International Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, espradej, esprade, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (Japan, 1998 4/21 Master Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, espradejo, esprade, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (Japan, 1998 4/14 Master Ver.)", MACHINE_SUPPORTS_SAVE ) + +// Date string is stored at 68000 ROM 0x100-0x1ff +GAME( 1998, uopoko, 0, uopoko, cave, cave_state, init_uopoko, ROT0, "Cave (Jaleco license)", "Puzzle Uo Poko (World)", MACHINE_SUPPORTS_SAVE ) // CAVE 1998.FEB.06 UOPOKO CV-02-00 OVER SEA +GAME( 1998, uopokoj, uopoko, uopoko, cave, cave_state, init_uopoko, ROT0, "Cave (Jaleco license)", "Puzzle Uo Poko (Japan)", MACHINE_SUPPORTS_SAVE ) // CAVE 1998.FEB.06 UOPOKO CV-02-00 JAPAN + +// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) +GAME( 1999, guwange, 0, guwange, guwange, cave_state, init_guwange, ROT270, "Cave (Atlus license)", "Guwange (Japan, 1999 6/24 Master Ver 16:55)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, guwanges, guwange, guwange, guwange, cave_state, init_guwange, ROT270, "Cave (Atlus license)", "Guwange (Japan, 2000 7/ 7 Special Ver 13:22)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1999, gaia, 0, gaia, gaia, cave_state, init_gaia, ROT0, "Noise Factory", "Gaia Crusaders", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // cuts out occasionally + +GAME( 1999, korokoro, 0, korokoro, korokoro, cave_state, init_korokoro, ROT0, "Takumi", "Koro Koro Quest (Japan)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1999, crusherm, 0, crusherm, korokoro, cave_state, init_korokoro, ROT0, "Takumi", "Crusher Makochan (Japan)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1999, tjumpman, 0, tjumpman, tjumpman, cave_state, init_tjumpman, ROT0, "Namco", "Tobikose! Jumpman", MACHINE_SUPPORTS_SAVE ) + +GAME( 2001, theroes, 0, gaia, theroes, cave_state, init_gaia, ROT0, "Primetek Investments", "Thunder Heroes", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // cuts out occasionally diff -Nru mame-0.263+dfsg.1/src/mame/atlus/cave.h mame-0.264+dfsg.1/src/mame/atlus/cave.h --- mame-0.263+dfsg.1/src/mame/atlus/cave.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atlus/cave.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,394 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia +#ifndef MAME_ATLUS_CAVE_H +#define MAME_ATLUS_CAVE_H + +#pragma once + +/*************************************************************************** + + Cave hardware + +***************************************************************************/ + +#include "machine/eepromser.h" +#include "machine/gen_latch.h" +#include "machine/timer.h" +#include "sound/okim6295.h" +#include "video/tmap038.h" + +#include "emupal.h" +#include "screen.h" + +class cave_state : public driver_device +{ +public: + cave_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_oki(*this, "oki%u", 1) + , m_int_timer(*this, "int_timer") + , m_eeprom(*this, "eeprom") + , m_gfxdecode(*this, "gfxdecode.%u", 0U) + , m_spr_gfxdecode(*this, "spr_gfxdecode.%u", 0U) + , m_screen(*this, "screen.%u", 0U) + , m_palette(*this, "palette.%u", 0U) + , m_tilemap(*this, "tilemap.%u", 0U) + , m_led_outputs(*this, "led%u", 0U) + , m_videoregs(*this, "videoregs.%u", 0) + , m_spriteram(*this, "spriteram.%u", 0) + , m_io_in0(*this, "IN0") + , m_io_bet(*this, "BET") + , m_spriteregion(*this, "sprites%u", 0) + , m_tileregion(*this, "layer%u", 0) + , m_okiregion(*this, "oki%u", 1) + { } + + int korokoro_hopper_r(); + int tjumpman_hopper_r(); + int paccarn_bet4_r(); + int paccarn_bet8_r(); + + void init_ddonpach(); + void init_dfeveron(); + void init_donpachi(); + void init_esprade(); + void init_feversos(); + void init_gaia(); + void init_guwange(); + void init_korokoro(); + void init_tjumpman(); + void init_uopoko(); + + void crusherm(machine_config &config); + void ddonpach(machine_config &config); + void dfeveron(machine_config &config); + void donpachi(machine_config &config); + void esprade(machine_config &config); + void gaia(machine_config &config); + void guwange(machine_config &config); + void korokoro(machine_config &config); + void paccarn(machine_config &config); + void paceight(machine_config &config); + void pacslot(machine_config &config); + void tekkenbs(machine_config &config); + void tekkencw(machine_config &config); + void tjumpman(machine_config &config); + void uopoko(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void device_post_load() override; + + // devices + required_device m_maincpu; + optional_device_array m_oki; + required_device m_int_timer; + optional_device m_eeprom; + optional_device_array m_gfxdecode; + optional_device_array m_spr_gfxdecode; + optional_device_array m_screen; + optional_device_array m_palette; + optional_device_array m_tilemap; + output_finder<9> m_led_outputs; + + // memory pointers + optional_shared_ptr_array m_videoregs; + optional_shared_ptr_array m_spriteram; + + optional_ioport m_io_in0; + optional_ioport m_io_bet; + + // memory regions + optional_memory_region_array<4> m_spriteregion; + optional_memory_region_array<4> m_tileregion; + optional_memory_region_array<2> m_okiregion; + + enum + { + TYPE_ZOOM = 0, + TYPE_NOZOOM = 1, + TYPE_ISPWRINST2 = 2 + }; + + // video-related + enum + { + MAX_PRIORITY = 4, + MAX_SPRITE_NUM = 0x400 + }; + + struct sprite_cave + { + sprite_cave() { } + + int priority = 0, flags = 0; + + const u8 *pen_data = nullptr; // points to top left corner of tile data + int line_offset = 0; + + pen_t base_pen = 0; + int tile_width = 0, tile_height = 0; + int total_width = 0, total_height = 0; // in screen coordinates + int x = 0, y = 0, xcount0 = 0, ycount0 = 0; + int zoomx_re = 0, zoomy_re = 0; + }; + + struct + { + int clip_left = 0, clip_right = 0, clip_top = 0, clip_bottom = 0; + u8 *baseaddr = 0U; + int line_offset = 0; + u8 *baseaddr_zbuf =0U; + int line_offset_zbuf = 0; + } m_blit; + + std::unique_ptr m_sprite[4]; + sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1]{}; + + bitmap_ind16 m_sprite_zbuf[4]; + u16 m_sprite_zbuf_baseval = 0U; + + std::unique_ptr m_sprite_gfx[4]; + offs_t m_sprite_gfx_mask[4]{}; + + u32 m_num_sprites[4]{}; + + u32 m_spriteram_bank[4]{}; + u32 m_spriteram_bank_delay[4]{}; + + s32 m_layers_offs_x = 0; + s32 m_layers_offs_y = 0; + s32 m_row_effect_offs_n = 0; + s32 m_row_effect_offs_f = 0; + u16 m_background_pen[4]{}; + + int m_spritetype[2]{}; + int m_kludge = 0; + emu_timer *m_vblank_end_timer = nullptr; + + u16 m_sprite_granularity = 0U; + u32 m_max_sprite_clk[4]{}; // max usable clock for sprites + + // misc + int m_time_vblank_irq = 0; + u8 m_irq_level = 0U; + u8 m_vblank_irq = 0U; + u8 m_sound_irq = 0U; + u8 m_unknown_irq = 0U; + u8 m_agallet_vblank_irq = 0U; + + // game specific + // korokoro + u16 m_leds[2]{}; + u8 m_hopper = 0; + + int m_rasflag = 0; + int m_old_rasflag = 0; + + void (cave_state::*m_get_sprite_info)(int chip); + void (cave_state::*m_sprite_draw)(int chip, int priority); + + void add_base_config(machine_config &config, int layer); + void add_ymz(machine_config &config); + + u16 irq_cause_r(offs_t offset); + void gaia_coin_w(u8 data); + u16 donpachi_videoregs_r(offs_t offset); + template void videoregs_w(offs_t offset, u16 data, u16 mem_mask); + void korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask); + void tjumpman_leds_w(u8 data); + void pacslot_leds_w(u8 data); + void eeprom_w(u8 data); + void guwange_eeprom_w(u8 data); + void korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask); + void tjumpman_eeprom_w(u8 data); + DECLARE_VIDEO_START(spr_4bpp); + DECLARE_VIDEO_START(spr_8bpp); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(interrupt); + TIMER_CALLBACK_MEMBER(vblank_end); + TIMER_DEVICE_CALLBACK_MEMBER(vblank_start); + TIMER_DEVICE_CALLBACK_MEMBER(vblank_start_left); + TIMER_DEVICE_CALLBACK_MEMBER(vblank_start_right); + TIMER_DEVICE_CALLBACK_MEMBER(timer_lev2_cb); + void get_sprite_info(int chip); + void sound_irq_gen(int state); + void update_irq_state(); + void unpack_sprites(int chip); + + inline void tilemap_draw(int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 flags, u32 priority, u32 priority2, int GFX); + void set_pens(int chip); + void vh_start(u16 sprcol_granularity); + void get_sprite_info_cave(int chip); + void get_sprite_info_donpachi(int chip); + void sprite_init(); + void sprite_check(int chip, int screen_no, screen_device &screen, const rectangle &clip); + void do_blit_zoom32(int chip, const sprite_cave *sprite); + void do_blit_zoom32_zb(int chip, const sprite_cave *sprite); + void do_blit_32(int chip, const sprite_cave *sprite); + void do_blit_32_zb(int chip, const sprite_cave *sprite); + void sprite_draw_cave(int chip, int priority); + void sprite_draw_cave_zbuf(int chip, int priority); + void sprite_draw_donpachi(int chip, int priority); + void sprite_draw_donpachi_zbuf(int chip, int priority); + void init_cave(); + void show_leds(); + + void crusherm_map(address_map &map); + void ddonpach_map(address_map &map); + void dfeveron_map(address_map &map); + void donpachi_map(address_map &map); + void esprade_map(address_map &map); + void gaia_map(address_map &map); + void guwange_map(address_map &map); + void korokoro_map(address_map &map); + void paccarn_map(address_map &map); + void paceight_map(address_map &map); + void pacslot_map(address_map &map); + void tekkenbs_map(address_map &map); + void tekkencw_map(address_map &map); + void tjumpman_map(address_map &map); + void uopoko_map(address_map &map); +}; + +// with sound Z80 +class cave_z80_state : public cave_state +{ +public: + cave_z80_state(const machine_config &mconfig, device_type type, const char *tag) + : cave_state(mconfig, type, tag) + , m_audiocpu(*this, "audiocpu") + , m_soundlatch(*this, "soundlatch") + , m_startup(*this, "startup") + , m_z80region(*this, "audiocpu") + , m_z80bank(*this, "z80bank") + , m_okibank_lo(*this, "oki%u_banklo", 1) + , m_okibank_hi(*this, "oki%u_bankhi", 1) + {} + + void init_agallet(); + void init_hotdogst(); + void init_mazinger(); + void init_metmqstr(); + void init_pwrinst2(); + void init_pwrinst2a(); + void init_sailormn(); + + void hotdogst(machine_config &config); + void mazinger(machine_config &config); + void metmqstr(machine_config &config); + void pwrinst2(machine_config &config); + void sailormn(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_audiocpu; + required_device m_soundlatch; + optional_device m_startup; + required_memory_region m_z80region; + required_memory_bank m_z80bank; + optional_memory_bank_array<2> m_okibank_lo; + optional_memory_bank_array<2> m_okibank_hi; + + // sound related + u8 m_soundbuf_wptr = 0; + u8 m_soundbuf_rptr = 0; + u8 m_soundbuf_data[32]{}; + bool m_soundbuf_empty = false; + //u8 m_sound_flag[2]{}; + + // sailormn + u8 m_sailormn_tilebank = 0; + + u8 soundflags_r(); + u16 soundflags_ack_r(); + void sound_cmd_w(u16 data); + u8 soundlatch_lo_r(); + u8 soundlatch_hi_r(); + u16 soundlatch_ack_r(); + void soundlatch_ack_w(u8 data); + + template void pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask); + u16 sailormn_input0_r(); + template void z80_rombank_w(u8 data); + template void oki1_bank_w(u8 data); + template void oki2_bank_w(u8 data); + void sailormn_eeprom_w(u8 data); + void hotdogst_eeprom_w(u8 data); + void metmqstr_eeprom_w(u8 data); + u16 pwrinst2_eeprom_r(); + void sailormn_get_banked_code(bool tiledim, u32 &color, u32 &pri, u32 &code); + DECLARE_MACHINE_RESET(sailormn); + TIMER_DEVICE_CALLBACK_MEMBER(sailormn_startup); + void sailormn_tilebank_w(int bank); + void sailormn_unpack_tiles(int chip); + void init_z80_bank(); + void init_oki_bank(int chip); + + void hotdogst_map(address_map &map); + void hotdogst_sound_map(address_map &map); + void hotdogst_sound_portmap(address_map &map); + void mazinger_map(address_map &map); + void mazinger_sound_map(address_map &map); + void mazinger_sound_portmap(address_map &map); + void metmqstr_map(address_map &map); + void metmqstr_sound_portmap(address_map &map); + void oki2_map(address_map &map); + void oki_map(address_map &map); + void pwrinst2_map(address_map &map); + void pwrinst2_sound_map(address_map &map); + void pwrinst2_sound_portmap(address_map &map); + void sailormn_map(address_map &map); + void sailormn_sound_map(address_map &map); + void sailormn_sound_portmap(address_map &map); +}; + +// with 3 screens +class ppsatan_state : public cave_state +{ +public: + ppsatan_state(const machine_config &mconfig, device_type type, const char *tag) + : cave_state(mconfig, type, tag) + , m_int_timer_left(*this, "int_timer_left") + , m_int_timer_right(*this, "int_timer_right") + , m_touch_x(*this, "TOUCH%u_X", 1U) + , m_touch_y(*this, "TOUCH%u_Y", 1U) + {} + + void init_ppsatan(); + + void ppsatan(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void video_start() override; + +private: + required_device m_int_timer_left; + required_device m_int_timer_right; + required_ioport_array<2> m_touch_x; + required_ioport_array<2> m_touch_y; + + // ppsatan + u16 m_ppsatan_io_mux = 0U; + + void ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask); + void ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask); + template u16 ppsatan_touch_r(); + void ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask); + + INTERRUPT_GEN_MEMBER(interrupt_ppsatan); + u32 screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip); + u32 screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void ppsatan_map(address_map &map); +}; + +#endif // MAME_ATLUS_CAVE_H diff -Nru mame-0.263+dfsg.1/src/mame/atlus/cave_v.cpp mame-0.264+dfsg.1/src/mame/atlus/cave_v.cpp --- mame-0.263+dfsg.1/src/mame/atlus/cave_v.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/atlus/cave_v.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,1445 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia +/*************************************************************************** + + -= Cave Hardware =- + + driver by Luca Elia (l.elia@tin.it) + + +Note: if MAME_DEBUG is defined, pressing: + + X/C/V/B/Z with Q shows layer 0 (tiles with priority 0/1/2/3/All) + X/C/V/B/Z with W shows layer 1 (tiles with priority 0/1/2/3/All) + X/C/V/B/Z with E shows layer 2 (tiles with priority 0/1/2/3/All) + X/C/V/B/Z with R shows layer 3 (tiles with priority 0/1/2/3/All) + X/C/V/B/Z with A shows sprites (tiles with priority 0/1/2/3/All) + + Keys can be used together! + + [ 1 Layer per chip (games use as many as 4 chips) ] + + Layer Size: 512 x 512 + Tiles: 8 x 8 & 16 x 16. + + There are 2 tilemaps in memory, one per tiles dimension. + A bit decides which one gets displayed. + The tiles depth varies with games, from 16 to 256 colors. + + A per layer row-scroll / row-select effect can be enabled: + + a different scroll value is fetched (from tile RAM) for each + scan line, and a different tilemap line for each scan line + + [ 1024 Zooming Sprites ] + + There are 2 or 4 0x4000 Sprite RAM Areas. A hardware register's + bit selects an area to display (sprites double buffering). + + The sprites are NOT tile based: the "tile" size and start address + is selectable for each sprite with a 16 pixel granularity. + + Also note that the zoom is of a peculiar type: pixels are never + drawn more than once. So shrinking works as usual (some pixels are + just not drawn) while enlarging adds some transparent pixels to + the image, uniformly, to reach the final size. + +**************************************************************************/ + +#include "emu.h" +#include "crsshair.h" +#include "cave.h" + + +static constexpr u8 CAVE_SPRITETYPE_ZBUF = 0x01; +static constexpr u8 CAVE_SPRITETYPE_ZOOM = 0x02; + +static constexpr u8 SPRITE_FLIPX_CAVE = 0x01; +static constexpr u8 SPRITE_FLIPY_CAVE = 0x02; +static constexpr u8 SPRITE_VISIBLE_CAVE = 0x04; + + +/* Sailormn: the lower 2 Megabytes of tiles banked */ + +void cave_z80_state::sailormn_tilebank_w(int bank) +{ + if (m_sailormn_tilebank != bank) + { + m_sailormn_tilebank = bank; + m_tilemap[2]->mark_all_dirty(); + } +} + +void cave_z80_state::sailormn_get_banked_code(bool tiledim, u32 &color, u32 &pri, u32 &code) +{ + if (!tiledim) + { + if ((code < 0x10000) && (m_sailormn_tilebank)) + code += 0x40000; + } +} + + +/*************************************************************************** + + Video Init Routines + + Depending on the game, there can be from 1 to 4 layers and the + tile sizes can be 8x8 or 16x16. + +***************************************************************************/ + +void cave_state::vh_start(u16 sprcol_granularity) +{ + m_sprite_granularity = sprcol_granularity; + + sprite_init(); + + m_layers_offs_x = 0x13; + m_layers_offs_y = -0x12; + + m_row_effect_offs_n = -1; + m_row_effect_offs_f = 1; + + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() + + (m_gfxdecode[0]->gfx(0)->colors() - 1) * + m_gfxdecode[0]->gfx(0)->granularity(); + + switch (m_kludge) + { + case 1: /* sailormn */ + m_row_effect_offs_n = -1; + m_row_effect_offs_f = -1; + break; + case 2: /* uopoko dfeveron */ + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); + break; + case 4: /* pwrinst2 */ + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); + m_layers_offs_y++; + break; + } +} + +// 4 bit sprite granularity +VIDEO_START_MEMBER(cave_state,spr_4bpp) +{ + vh_start(16); +} + +// 8 bit sprite granularity +VIDEO_START_MEMBER(cave_state,spr_8bpp) +{ + vh_start(256); +} + +// ppsatan (3 screen) +void ppsatan_state::video_start() +{ + vh_start(16); + for (int chip = 1; chip < 3; chip++) + { + m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() + + (m_gfxdecode[chip]->gfx(0)->colors() - 1) * + m_gfxdecode[chip]->gfx(0)->granularity(); + + switch (m_kludge) + { + case 2: /* uopoko dfeveron */ + case 4: /* pwrinst2 */ + m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() - m_gfxdecode[chip]->gfx(0)->granularity(); + break; + } + } +} + +/*************************************************************************** + + Zoomed Sprites Drawing + + Sprite format with zoom, 16 bytes per each sprites + + Offset: Bits: Value: + + 00.w X Position* + + 02.w Y Position* + + 04.w fe-- ---- ---- ---- + --dc ba98 ---- ---- Color + ---- ---- 76-- ---- + ---- ---- --54 ---- Priority + ---- ---- ---- 3--- Flip X + ---- ---- ---- -2-- Flip Y + ---- ---- ---- --10 Code High Bit(s?) + + 06.w Code Low Bits + + 08/0A.w Zoom X / Y + + 0C.w fedc ba98 ---- ---- Tile Size X + ---- ---- 7654 3210 Tile Size Y + + 0E.w Unused + + * S.9.6 Fixed point or 10 bit signed integer, + Configured from videoregs + + + Sprites Drawing + + Sprite format without zoom, 16 bytes per each sprites + + Offset: Bits: Value: + + 00.w fe-- ---- ---- ---- + --dc ba98 ---- ---- Color + ---- ---- 76-- ---- + ---- ---- --54 ---- Priority + ---- ---- ---- 3--- Flip X + ---- ---- ---- -2-- Flip Y + ---- ---- ---- --10 Code High Bit(s?) + + 02.w Code Low Bits + + 04.w fedc ba-- ---- ---- + ---- --98 7654 3210 X Position** + + 06.w fedc ba-- ---- ---- + ---- --98 7654 3210 Y Position** + + 08.w fedc ba98 ---- ---- Tile Size X + ---- ---- 7654 3210 Tile Size Y + + 0A.w Unused + + 0C.w Unused + + 0E.w Unused + + ** 10 bit signed only? need verifications. + +***************************************************************************/ + +void cave_state::get_sprite_info_cave(int chip) +{ + chip %= 4; + + if (m_sprite[chip] == nullptr) + return; + + gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); + sprite_cave *sprite = m_sprite[chip].get(); + + const int glob_flipx = m_videoregs[chip][0] & 0x8000; + const int glob_flipy = m_videoregs[chip][1] & 0x8000; + + const int max_x = m_screen[chip]->width(); + const int max_y = m_screen[chip]->height(); + + const u16 *source = &m_spriteram[chip][(0x4000 / 2) * m_spriteram_bank[chip]]; + const u16 *finish = source + (0x4000 / 2); + u32 clk = 0; // used clock cycle for sprites + + for (; source < finish; source += 8) + { + clk += 32; // 32 clock per each sprites + if (clk > m_max_sprite_clk[chip]) + break; + + int x, y; + int total_width_f, total_height_f; + + if ((m_videoregs[chip][5] & 0x3000) == 0) // if bit 12/13 is 0 (or separated per X and Y?) + { + x = (source[0] & 0x3ff) << 8; + y = (source[1] & 0x3ff) << 8; + } + else + { + x = source[0] << 2; + y = source[1] << 2; + } + const u16 attr = source[2]; + u32 code = source[3] + ((attr & 3) << 16); + int zoomx = source[4]; + int zoomy = source[5]; + const u16 size = source[6]; + + sprite->tile_width = ((size >> 8) & 0x1f) * 16; + sprite->tile_height = ((size >> 0) & 0x1f) * 16; + + if (!sprite->tile_width || !sprite->tile_height) + continue; + + clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks + if (clk > m_max_sprite_clk[chip]) + break; + + /* Bound checking */ + sprite->pen_data = &m_sprite_gfx[chip][(code << 8) & m_sprite_gfx_mask[chip]]; + + int flipx = attr & 0x0008; + int flipy = attr & 0x0004; + + sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 0x100; + sprite->total_height = (total_height_f = sprite->tile_height * zoomy) / 0x100; + + if (sprite->total_width <= 1) + { + sprite->total_width = 1; + sprite->zoomx_re = sprite->tile_width << 16; + sprite->xcount0 = sprite->zoomx_re / 2; + x -= 0x80; + } + else + { + sprite->zoomx_re = 0x1000000 / zoomx; + sprite->xcount0 = sprite->zoomx_re - 1; + } + + if (sprite->total_height <= 1) + { + sprite->total_height = 1; + sprite->zoomy_re = sprite->tile_height << 16; + sprite->ycount0 = sprite->zoomy_re / 2; + y -= 0x80; + } + else + { + sprite->zoomy_re = 0x1000000 / zoomy; + sprite->ycount0 = sprite->zoomy_re - 1; + } + + if ((m_videoregs[chip][5] & 0x3000) == 0) + { + x >>= 8; + y >>= 8; + if (flipx && (zoomx != 0x100)) x += sprite->tile_width - sprite->total_width; + if (flipy && (zoomy != 0x100)) y += sprite->tile_height - sprite->total_height; + } + else + { + if (flipx && (zoomx != 0x100)) x += (sprite->tile_width << 8) - total_width_f - 0x80; + if (flipy && (zoomy != 0x100)) y += (sprite->tile_height << 8) - total_height_f - 0x80; + x >>= 8; + y >>= 8; + } + + if (x > 0x1ff) x -= 0x400; + if (y > 0x1ff) y -= 0x400; + + if (x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) + {continue;} + + sprite->priority = (attr & 0x0030) >> 4; + sprite->flags = SPRITE_VISIBLE_CAVE; + sprite->line_offset = sprite->tile_width; + sprite->base_pen = gfx->colorbase() + (((attr & 0x3f00) >> 8) * gfx->granularity()); // first 0x4000 colors + + if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } + if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } + + sprite->x = x; + sprite->y = y; + + if (flipx) sprite->flags |= SPRITE_FLIPX_CAVE; + if (flipy) sprite->flags |= SPRITE_FLIPY_CAVE; + + sprite++; + } + m_num_sprites[chip] = sprite - m_sprite[chip].get(); +} + +void cave_state::get_sprite_info_donpachi(int chip) +{ + chip %= 4; + + if (m_sprite[chip] == nullptr) + return; + + gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); + sprite_cave *sprite = m_sprite[chip].get(); + + const int glob_flipx = m_videoregs[chip][0] & 0x8000; + const int glob_flipy = m_videoregs[chip][1] & 0x8000; + + const int max_x = m_screen[chip]->width(); + const int max_y = m_screen[chip]->height(); + + const u16 *source = &m_spriteram[chip][(0x4000 / 2) * m_spriteram_bank[chip]]; + const u16 *finish = source + (0x4000 / 2); + u32 clk = 0; // used clock cycle for sprites + + for (; source < finish; source += 8) + { + clk += 32; // 32 clock per each sprites + if (clk > m_max_sprite_clk[chip]) + break; + + int y; + + const u16 attr = source[0]; + u32 code = source[1] + ((attr & 3) << 16); + int x = source[2] & 0x3ff; + + if (m_spritetype[0] & TYPE_ISPWRINST2) /* pwrinst2 */ + y = (source[3] + 1) & 0x3ff; + else + y = source[3] & 0x3ff; + + const u16 size = source[4]; + + sprite->tile_width = sprite->total_width = ((size >> 8) & 0x1f) * 16; + sprite->tile_height = sprite->total_height = ((size >> 0) & 0x1f) * 16; + + /* Bound checking */ + sprite->pen_data = &m_sprite_gfx[chip][(code << 8) & m_sprite_gfx_mask[chip]]; + + if (x > 0x1ff) x -= 0x400; + if (y > 0x1ff) y -= 0x400; + + if (!sprite->tile_width || !sprite->tile_height || + x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) + {continue;} + + clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks + if (clk > m_max_sprite_clk[chip]) + break; + + int flipx = attr & 0x0008; + int flipy = attr & 0x0004; + + if (m_spritetype[0] & TYPE_ISPWRINST2) /* pwrinst2 */ + { + sprite->priority = ((attr & 0x0010) >> 4) + 2; + sprite->base_pen = gfx->colorbase() + ((((attr & 0x3f00) >> 8) + ((attr & 0x0020) << 1)) * gfx->granularity()); + } + else + { + sprite->priority = (attr & 0x0030) >> 4; + sprite->base_pen = gfx->colorbase() + (((attr & 0x3f00) >> 8) * gfx->granularity()); // first 0x4000 colors + } + + sprite->flags = SPRITE_VISIBLE_CAVE; + sprite->line_offset = sprite->tile_width; + + if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } + if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } + + sprite->x = x; + sprite->y = y; + + if (flipx) sprite->flags |= SPRITE_FLIPX_CAVE; + if (flipy) sprite->flags |= SPRITE_FLIPY_CAVE; + + sprite++; + } + m_num_sprites[chip] = sprite - m_sprite[chip].get(); +} + + +void cave_state::sprite_init() +{ + if ((m_spritetype[0] & TYPE_NOZOOM) == 0) // most of the games + { + m_get_sprite_info = &cave_state::get_sprite_info_cave; + m_spritetype[1] = CAVE_SPRITETYPE_ZOOM; + } + else // donpachi ddonpach + { + m_get_sprite_info = &cave_state::get_sprite_info_donpachi; + m_spritetype[1] = 0; + } + + m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; + for (int screen = 0; screen < 4; screen++) + { + if (m_screen[screen]) + { + m_screen[screen]->register_screen_bitmap(m_sprite_zbuf[screen]); + + save_item(NAME(m_sprite_zbuf[screen]), screen); + } + } + + for (int chip = 0; chip < 4; chip++) + { + m_max_sprite_clk[chip] = 0; + if (m_videoregs[chip] && m_spr_gfxdecode[chip]) + { + for (int screen = 0; screen < 4; screen++) + { + if (m_screen[screen]) + { + const u32 new_clk = (m_screen[screen]->visible_area().width() > 360 ? 512 : 448) * 272 * 2; // whole screen size related? + if (m_max_sprite_clk[chip] < new_clk) + { + m_max_sprite_clk[chip] = new_clk; + } + } + } + m_num_sprites[chip] = m_spriteram[chip].bytes() / 0x10 / 2; + m_sprite[chip] = std::make_unique(m_num_sprites[chip]); + m_spr_gfxdecode[chip]->gfx(0)->set_granularity(m_sprite_granularity); + } + else + { + m_num_sprites[chip] = 0; + m_sprite[chip] = nullptr; + } + for (auto &prio : m_sprite_table[chip]) + for (sprite_cave *&spr : prio) + spr = nullptr; + m_spriteram_bank[chip] = m_spriteram_bank_delay[chip] = 0; + } + + m_sprite_draw = &cave_state::sprite_draw_donpachi; + + save_item(NAME(m_sprite_zbuf_baseval)); + save_item(NAME(m_num_sprites)); + save_item(NAME(m_spriteram_bank)); + save_item(NAME(m_spriteram_bank_delay)); + + save_item(NAME(m_blit.clip_left)); + save_item(NAME(m_blit.clip_right)); + save_item(NAME(m_blit.clip_top)); + save_item(NAME(m_blit.clip_bottom)); +} + +void cave_state::sprite_check(int chip, int screen_no, screen_device &screen, const rectangle &clip) +{ + if (m_sprite[chip] == nullptr) + return; + + { /* set clip */ + const int left = clip.min_x; + const int top = clip.min_y; + const int right = clip.max_x + 1; + const int bottom = clip.max_y + 1; + + m_blit.clip_left = left; + m_blit.clip_top = top; + m_blit.clip_right = right; + m_blit.clip_bottom = bottom; + } + + { /* check priority & sprite type */ + sprite_cave *sprite = m_sprite[chip].get(); + const sprite_cave *const finish = &sprite[m_num_sprites[chip]]; + int i[4] = {0,0,0,0}; + int priority_check = 0; + int spritetype = m_spritetype[1]; + const rectangle &visarea = screen.visible_area(); + + while (sprite < finish) + { + if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right && + sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom ) + { + m_sprite_table[chip][sprite->priority][i[sprite->priority]++] = sprite; + + if (!(spritetype & CAVE_SPRITETYPE_ZBUF)) + { + if (priority_check > sprite->priority) + spritetype |= CAVE_SPRITETYPE_ZBUF; + else + priority_check = sprite->priority; + } + } + sprite++; + } + + m_sprite_table[chip][0][i[0]] = nullptr; + m_sprite_table[chip][1][i[1]] = nullptr; + m_sprite_table[chip][2][i[2]] = nullptr; + m_sprite_table[chip][3][i[3]] = nullptr; + + switch (spritetype) + { + case CAVE_SPRITETYPE_ZOOM: + m_sprite_draw = &cave_state::sprite_draw_cave; + break; + + case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF: + m_sprite_draw = &cave_state::sprite_draw_cave_zbuf; + if (clip.min_y == visarea.min_y) + { + if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) + m_sprite_zbuf[screen_no].fill(0, visarea); + } + break; + + case CAVE_SPRITETYPE_ZBUF: + m_sprite_draw = &cave_state::sprite_draw_donpachi_zbuf; + if (clip.min_y == visarea.min_y) + { + if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) + m_sprite_zbuf[screen_no].fill(0, visarea); + } + break; + + default: + case 0: + m_sprite_draw = &cave_state::sprite_draw_donpachi; + } + } +} + +void cave_state::do_blit_zoom32(int chip, const sprite_cave *sprite) +{ + /* assumes SPRITE_LIST_RAW_DATA flag is set */ + int x1, x2, y1, y2, dx, dy; + int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; + + if (sprite->flags & SPRITE_FLIPX_CAVE) + { + x2 = sprite->x; + x1 = x2 + sprite->total_width; + dx = -1; + if (x2 < m_blit.clip_left) + x2 = m_blit.clip_left; + + if (x1 > m_blit.clip_right) + { + xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; + x1 = m_blit.clip_right; + while ((xcount0 & 0xffff) >= sprite->zoomx_re) + { + xcount0 += sprite->zoomx_re; + x1--; + } + } + + if (x2 >= x1) + return; + x1--; x2--; + } + else + { + x1 = sprite->x; + x2 = x1 + sprite->total_width; + dx = 1; + if (x1 < m_blit.clip_left) + { + xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; + x1 = m_blit.clip_left; + while ((xcount0 & 0xffff) >= sprite->zoomx_re) + { + xcount0 += sprite->zoomx_re; + x1++; + } + } + if (x2 > m_blit.clip_right) + x2 = m_blit.clip_right; + if (x1 >= x2) + return; + } + + if (sprite->flags & SPRITE_FLIPY_CAVE) + { + y2 = sprite->y; + y1 = y2 + sprite->total_height; + dy = -1; + if (y2 < m_blit.clip_top) + y2 = m_blit.clip_top; + if (y1 > m_blit.clip_bottom) + { + ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; + y1 = m_blit.clip_bottom; + while ((ycount0 & 0xffff) >= sprite->zoomy_re) + { + ycount0 += sprite->zoomy_re; + y1--; + } + } + if (y2 >= y1) + return; + y1--; y2--; + } + else + { + y1 = sprite->y; + y2 = y1 + sprite->total_height; + dy = 1; + if (y1 < m_blit.clip_top) + { + ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; + y1 = m_blit.clip_top; + while ((ycount0 & 0xffff) >= sprite->zoomy_re) + { + ycount0 += sprite->zoomy_re; + y1++; + } + } + if (y2 > m_blit.clip_bottom) + y2 = m_blit.clip_bottom; + if (y1 >= y2) + return; + } + + { + const u8 *pen_data = sprite->pen_data -1 -sprite->line_offset; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + int ycount = ycount0; + + for (int y = y1; y != y2; y += dy) + { + if (ycount & 0xffff0000) + { + int xcount = xcount0; + pen_data += sprite->line_offset * (ycount >> 16); + ycount &= 0xffff; + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) + { + if (xcount & 0xffff0000) + { + source += xcount >> 16; + xcount &= 0xffff; + const u8 pen = *source; + if (pen) + dest[x] = m_palette[chip]->pen_color(base_pen + pen); + } + xcount += sprite->zoomx_re; + } + } + ycount += sprite->zoomy_re; + dest += pitch; + } + } +} + + +void cave_state::do_blit_zoom32_zb(int chip, const sprite_cave *sprite) +{ + /* assumes SPRITE_LIST_RAW_DATA flag is set */ + int x1, x2, y1, y2, dx, dy; + int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; + + if (sprite->flags & SPRITE_FLIPX_CAVE) + { + x2 = sprite->x; + x1 = x2 + sprite->total_width; + dx = -1; + if (x2 < m_blit.clip_left) + x2 = m_blit.clip_left; + if (x1 > m_blit.clip_right) + { + xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; + x1 = m_blit.clip_right; + while ((xcount0 & 0xffff) >= sprite->zoomx_re) + { + xcount0 += sprite->zoomx_re; + x1--; + } + } + if (x2 >= x1) + return; + x1--; x2--; + } + else + { + x1 = sprite->x; + x2 = x1 + sprite->total_width; + dx = 1; + if (x1 < m_blit.clip_left) + { + xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; + x1 = m_blit.clip_left; + while ((xcount0 & 0xffff) >= sprite->zoomx_re) + { + xcount0 += sprite->zoomx_re; + x1++; + } + } + if (x2 > m_blit.clip_right) + x2 = m_blit.clip_right; + if (x1 >= x2) + return; + } + if (sprite->flags & SPRITE_FLIPY_CAVE) + { + y2 = sprite->y; + y1 = y2 + sprite->total_height; + dy = -1; + if (y2 < m_blit.clip_top) + y2 = m_blit.clip_top; + if (y1 > m_blit.clip_bottom) + { + ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; + y1 = m_blit.clip_bottom; + while ((ycount0 & 0xffff) >= sprite->zoomy_re) + { + ycount0 += sprite->zoomy_re; + y1--; + } + } + if (y2 >= y1) + return; + y1--; y2--; + } + else + { + y1 = sprite->y; + y2 = y1 + sprite->total_height; + dy = 1; + if (y1 < m_blit.clip_top) + { + ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; + y1 = m_blit.clip_top; + while ((ycount0 & 0xffff) >= sprite->zoomy_re) + { + ycount0 += sprite->zoomy_re; + y1++; + } + } + if (y2 > m_blit.clip_bottom) + y2 = m_blit.clip_bottom; + if (y1 >= y2) + return; + } + + { + const u8 *pen_data = sprite->pen_data - 1 - sprite->line_offset; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + const int pitchz = m_blit.line_offset_zbuf * dy / 2; + u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); + const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; + int ycount = ycount0; + + for (int y = y1; y != y2; y += dy) + { + if (ycount & 0xffff0000) + { + int xcount = xcount0; + pen_data += sprite->line_offset * (ycount >> 16); + ycount &= 0xffff; + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) + { + if (xcount & 0xffff0000) + { + source += xcount >> 16; + xcount &= 0xffff; + const u8 pen = *source; + if (pen && (zbf[x] <= pri_sp)) + { + dest[x] = m_palette[chip]->pen_color(base_pen + pen); + zbf[x] = pri_sp; + } + } + xcount += sprite->zoomx_re; + } + } + ycount += sprite->zoomy_re; + dest += pitch; + zbf += pitchz; + } + } +} + +void cave_state::do_blit_32(int chip, const sprite_cave *sprite) +{ + /* assumes SPRITE_LIST_RAW_DATA flag is set */ + int x1, x2, y1, y2, dx, dy; + int xcount0 = 0, ycount0 = 0; + + if (sprite->flags & SPRITE_FLIPX_CAVE) + { + x2 = sprite->x; + x1 = x2 + sprite->total_width; + dx = -1; + if (x2 < m_blit.clip_left) + x2 = m_blit.clip_left; + if (x1 > m_blit.clip_right) + { + xcount0 = x1 - m_blit.clip_right; + x1 = m_blit.clip_right; + } + if (x2 >= x1) + return; + x1--; x2--; + } + else + { + x1 = sprite->x; + x2 = x1 + sprite->total_width; + dx = 1; + if (x1 < m_blit.clip_left) + { + xcount0 = m_blit.clip_left - x1; + x1 = m_blit.clip_left; + } + if (x2 > m_blit.clip_right) + x2 = m_blit.clip_right; + if (x1 >= x2) + return; + } + if (sprite->flags & SPRITE_FLIPY_CAVE) + { + y2 = sprite->y; + y1 = y2 + sprite->total_height; + dy = -1; + if (y2 < m_blit.clip_top) + y2 = m_blit.clip_top; + if (y1 > m_blit.clip_bottom) + { + ycount0 = y1 - m_blit.clip_bottom; + y1 = m_blit.clip_bottom; + } + if (y2 >= y1) + return; + y1--; y2--; + } + else + { + y1 = sprite->y; + y2 = y1 + sprite->total_height; + dy = 1; + if (y1 < m_blit.clip_top) + { + ycount0 = m_blit.clip_top - y1; + y1 = m_blit.clip_top; + } + if (y2 > m_blit.clip_bottom) + y2 = m_blit.clip_bottom; + if (y1 >= y2) + return; + } + + { + const u8 *pen_data = sprite->pen_data; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + + pen_data += sprite->line_offset * ycount0 + xcount0; + for (int y = y1; y != y2; y += dy) + { + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) + { + const u8 pen = *source; + if (pen) + dest[x] = m_palette[chip]->pen_color(base_pen + pen); + source++; + } + pen_data += sprite->line_offset; + dest += pitch; + } + } +} + + +void cave_state::do_blit_32_zb(int chip, const sprite_cave *sprite) +{ + /* assumes SPRITE_LIST_RAW_DATA flag is set */ + int x1, x2, y1, y2, dx, dy; + int xcount0 = 0, ycount0 = 0; + + if (sprite->flags & SPRITE_FLIPX_CAVE) + { + x2 = sprite->x; + x1 = x2 + sprite->total_width; + dx = -1; + if (x2 < m_blit.clip_left) + x2 = m_blit.clip_left; + if (x1 > m_blit.clip_right) + { + xcount0 = x1 - m_blit.clip_right; + x1 = m_blit.clip_right; + } + if (x2 >= x1) + return; + x1--; x2--; + } + else + { + x1 = sprite->x; + x2 = x1 + sprite->total_width; + dx = 1; + if (x1 < m_blit.clip_left) + { + xcount0 = m_blit.clip_left - x1; + x1 = m_blit.clip_left; + } + if (x2 > m_blit.clip_right) + x2 = m_blit.clip_right; + if (x1 >= x2) + return; + } + if (sprite->flags & SPRITE_FLIPY_CAVE) + { + y2 = sprite->y; + y1 = y2 + sprite->total_height; + dy = -1; + if (y2 < m_blit.clip_top) + y2 = m_blit.clip_top; + if (y1 > m_blit.clip_bottom) + { + ycount0 = y1 - m_blit.clip_bottom; + y1 = m_blit.clip_bottom; + } + if (y2 >= y1) + return; + y1--; y2--; + } + else + { + y1 = sprite->y; + y2 = y1 + sprite->total_height; + dy = 1; + if (y1 < m_blit.clip_top) + { + ycount0 = m_blit.clip_top - y1; + y1 = m_blit.clip_top; + } + if (y2 > m_blit.clip_bottom) + y2 = m_blit.clip_bottom; + if (y1 >= y2) + return; + } + + { + const u8 *pen_data = sprite->pen_data; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + const int pitchz = m_blit.line_offset_zbuf * dy / 2; + u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); + const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; + + pen_data += sprite->line_offset * ycount0 + xcount0; + for (int y = y1; y != y2; y += dy) + { + const u8 *source; + source = pen_data; + for (int x = x1; x != x2; x += dx) + { + const u8 pen = *source; + if (pen && (zbf[x] <= pri_sp)) + { + dest[x] = m_palette[chip]->pen_color(base_pen + pen); + zbf[x] = pri_sp; + } + source++; + } + pen_data += sprite->line_offset; + dest += pitch; + zbf += pitchz; + } + } +} + + +void cave_state::sprite_draw_cave(int chip, int priority) +{ + if (m_sprite[chip] == nullptr) + return; + + int i = 0; + while (m_sprite_table[chip][priority][i]) + { + const sprite_cave *sprite = m_sprite_table[chip][priority][i++]; + if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) + do_blit_32(chip, sprite); + else + do_blit_zoom32(chip, sprite); + } +} + +void cave_state::sprite_draw_cave_zbuf(int chip, int priority) +{ + if (m_sprite[chip] == nullptr) + return; + + int i = 0; + while (m_sprite_table[chip][priority][i]) + { + const sprite_cave *sprite = m_sprite_table[chip][priority][i++]; + if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) + do_blit_32_zb(chip, sprite); + else + do_blit_zoom32_zb(chip, sprite); + } +} + +void cave_state::sprite_draw_donpachi(int chip, int priority) +{ + if (m_sprite[chip] == nullptr) + return; + + int i = 0; + while (m_sprite_table[chip][priority][i]) + do_blit_32(chip, m_sprite_table[chip][priority][i++]); +} + +void cave_state::sprite_draw_donpachi_zbuf(int chip, int priority) +{ + if (m_sprite[chip] == nullptr) + return; + + int i = 0; + while (m_sprite_table[chip][priority][i]) + do_blit_32_zb(chip, m_sprite_table[chip][priority][i++]); +} + + +/*************************************************************************** + + Screen Drawing + + + Layers Control Registers (vctrl_0..3) + + + Offset: Bits: Value: + + 0.w f--- ---- ---- ---- 0 = Layer Flip X + -e-- ---- ---- ---- Activate Row-scroll + --d- ---- ---- ---- + ---c ba9- ---- ---- + ---- ---8 7654 3210 Scroll X + + 2.w f--- ---- ---- ---- 0 = Layer Flip Y + -e-- ---- ---- ---- Activate Row-select + --d- ---- ---- ---- 0 = 8x8 tiles, 1 = 16x16 tiles + ---c ba9- ---- ---- + ---- ---8 7654 3210 Scroll Y + + 4.w fedc ba98 765- ---- + ---- ---- ---4 ---- Layer Disable + ---- ---- ---- 32-- + ---- ---- ---- --10 Layer Priority (decides the order + of the layers for tiles with the + same tile priority) + + + Row-scroll / row-select data is fetched from tile RAM + $1000. + + Row-select: a tilemap line is specified for each scan line. + Row-scroll: a different scroll value is specified for each scan line. + + + Sprites Registers (videoregs) + + + Offset: Bits: Value: + + 0.w f--- ---- ---- ---- Sprites Flip X + -edc ba98 7654 3210 Sprites Offset X + + 2.w f--- ---- ---- ---- Sprites Flip Y + -edc ba98 7654 3210 Sprites Offset Y + + .. + + 8.w fedc ba98 7654 32-- + ---- ---- ---- --10 Sprite RAM Bank + + There are more! + +***************************************************************************/ + +inline void cave_state::tilemap_draw(int chip, + screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, + u32 flags, u32 priority, u32 priority2, int GFX) +{ + tilemap038_device *TILEMAP = m_tilemap[GFX]; + + /* Bail out if ... */ + + if (!TILEMAP) /* no tilemap; */ + return; + + if (((TILEMAP->external() & 0x0003) != priority2) || /* tilemap's global priority not the requested one; */ + ((!TILEMAP->enable()))) /* tilemap's disabled. */ + return; + + const bool flipx = TILEMAP->flipx(); + const bool flipy = TILEMAP->flipy(); + TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); + + int offs_x = m_layers_offs_x; + const int offs_y = m_layers_offs_y; + + const int offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n; + + /* An additional 8 pixel offset for layers with 8x8 tiles. Plus + Layer 0 is displaced by 1 pixel wrt Layer 1, so is Layer 2 wrt + Layer 1 */ + if (TILEMAP == m_tilemap[0]) offs_x -= (TILEMAP->tile_is_16x16() ? 1 : (1 + 8)); + else if (TILEMAP == m_tilemap[1]) offs_x -= (TILEMAP->tile_is_16x16() ? 2 : (2 + 8)); + else if (TILEMAP == m_tilemap[2]) offs_x -= (TILEMAP->tile_is_16x16() ? 3 : (3 + 8)); + else if (TILEMAP == m_tilemap[3]) offs_x -= (TILEMAP->tile_is_16x16() ? 4 : (4 + 8)); + + const int sx = TILEMAP->scrollx() - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x); + const int sy = TILEMAP->scrolly() - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y); + + if (TILEMAP->rowselect_en()) // row-select + { + rectangle clip; + int endline, vramdata0, vramdata1; + + /* + Row-select: + + A tilemap line is specified for each scan line. This is handled + using many horizontal clipping regions (slices) and calling + tilemap_draw multiple times. + */ + + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; + + for (int startline = cliprect.min_y; startline <= cliprect.max_y;) + { + /* Find the largest slice */ + vramdata0 = (vramdata1 = TILEMAP->rowselect(sy + offs_row + startline)); + for (endline = startline + 1; endline <= cliprect.max_y; endline++) + if ((++vramdata1) != TILEMAP->rowselect(sy + offs_row + endline)) break; + + TILEMAP->set_scrolly(0, vramdata0 - startline); + + if (TILEMAP->rowscroll_en()) // row-scroll, row-select + { + /* + Row-scroll: + + A different scroll value is specified for each scan line. + This is handled using tilemap->set_scroll_rows and calling + tilemap->draw just once. + */ + + TILEMAP->set_scroll_rows(512); + for (int line = startline; line < endline; line++) + TILEMAP->set_scrollx((vramdata0 - startline + line) & 511, + sx + TILEMAP->rowscroll(sy + offs_row + line)); + } + else // no row-scroll, row-select + { + TILEMAP->set_scroll_rows(1); + TILEMAP->set_scrollx(0, sx); + } + + if (flipy) + { + clip.min_y = cliprect.max_y - (endline - 1 - cliprect.min_y); + clip.max_y = cliprect.max_y - (startline - cliprect.min_y); + } + else + { + clip.min_y = startline; + clip.max_y = endline - 1; + } + + TILEMAP->draw(screen, bitmap, clip, flags, priority); + + startline = endline; + } + } + else if (TILEMAP->rowscroll_en()) // row-scroll, no row-select + { + TILEMAP->set_scroll_rows(512); + for (int line = cliprect.min_y; line <= cliprect.max_y; line++) + TILEMAP->set_scrollx((line + sy) & 511, + sx + TILEMAP->rowscroll(sy + offs_row + line)); + TILEMAP->set_scrolly(0, sy); + TILEMAP->draw(screen, bitmap, cliprect, flags, priority); + } + else + { + /* Normal scrolling */ + TILEMAP->set_scroll_rows(1); + TILEMAP->set_scroll_cols(1); + TILEMAP->set_scrollx(0, sx); + TILEMAP->set_scrolly(0, sy); + TILEMAP->draw(screen, bitmap, cliprect, flags, priority); + } +} + + +u32 cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + int layers_ctrl = -1; + + m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); + m_blit.line_offset = bitmap.rowbytes(); + m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[0].raw_pixptr(0)); + m_blit.line_offset_zbuf = m_sprite_zbuf[0].rowbytes(); + + for (int GFX = 0; GFX < 4; GFX++) + { + if (m_tilemap[GFX]) + m_tilemap[GFX]->prepare(); + } + +#ifdef MAME_DEBUG +{ + if (machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) || machine().input().code_pressed(KEYCODE_C) || + machine().input().code_pressed(KEYCODE_V) || machine().input().code_pressed(KEYCODE_B)) + { + int msk = 0, val = 0; + + if (machine().input().code_pressed(KEYCODE_X)) val = 1; // priority 0 only + if (machine().input().code_pressed(KEYCODE_C)) val = 2; // "" 1 + if (machine().input().code_pressed(KEYCODE_V)) val = 4; // "" 2 + if (machine().input().code_pressed(KEYCODE_B)) val = 8; // "" 3 + if (machine().input().code_pressed(KEYCODE_Z)) val = 1|2|4|8; // All of the above priorities + + if (machine().input().code_pressed(KEYCODE_Q)) msk |= val << 0; // for layer 0 + if (machine().input().code_pressed(KEYCODE_W)) msk |= val << 4; // for layer 1 + if (machine().input().code_pressed(KEYCODE_E)) msk |= val << 8; // for layer 2 + if (machine().input().code_pressed(KEYCODE_R)) msk |= val << 12; // for layer 3 + if (machine().input().code_pressed(KEYCODE_A)) msk |= val << 16; // for sprites + if (msk != 0) layers_ctrl &= msk; + +#if 1 + /* Show the video registers (cave_videoregs) */ + popmessage("%04X %04X %04X %04X %04X %04X %04X %04X", + m_videoregs[0][0], m_videoregs[0][1], m_videoregs[0][2], m_videoregs[0][3], + m_videoregs[0][4], m_videoregs[0][5], m_videoregs[0][6], m_videoregs[0][7]); +#endif + /* Show the scroll / flags registers of the selected layer */ + if ((m_tilemap[0]) && (msk & 0x000f)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[0]->vregs(0),m_tilemap[0]->vregs(1),m_tilemap[0]->vregs(2)); + if ((m_tilemap[1]) && (msk & 0x00f0)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[1]->vregs(0),m_tilemap[1]->vregs(1),m_tilemap[1]->vregs(2)); + if ((m_tilemap[2]) && (msk & 0x0f00)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[2]->vregs(0),m_tilemap[2]->vregs(1),m_tilemap[2]->vregs(2)); + if ((m_tilemap[3]) && (msk & 0xf000)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[3]->vregs(0),m_tilemap[3]->vregs(1),m_tilemap[3]->vregs(2)); + } + + /* Show the row / "column" scroll enable flags, when they change state */ + m_rasflag = 0; + for (int GFX = 0; GFX < 4; GFX++) + { + if (m_tilemap[GFX]) + { + m_rasflag |= (m_tilemap[GFX]->vregs(0) & 0x4000) ? 0x0001 << (4*GFX) : 0; + m_rasflag |= (m_tilemap[GFX]->vregs(1) & 0x4000) ? 0x0002 << (4*GFX) : 0; + } + } + + if (m_rasflag != m_old_rasflag) + { + popmessage("Line Effect: 0:%c%c 1:%c%c 2:%c%c 3:%c%c", + (m_rasflag & 0x0001) ? 'x' : ' ', (m_rasflag & 0x0002) ? 'y' : ' ', + (m_rasflag & 0x0010) ? 'x' : ' ', (m_rasflag & 0x0020) ? 'y' : ' ', + (m_rasflag & 0x0100) ? 'x' : ' ', (m_rasflag & 0x0200) ? 'y' : ' ', + (m_rasflag & 0x1000) ? 'x' : ' ', (m_rasflag & 0x2000) ? 'y' : ' '); + m_old_rasflag = m_rasflag; + } +} +#endif + + sprite_check(0, 0, screen, cliprect); + + bitmap.fill(m_palette[0]->pen_color(m_background_pen[0]), cliprect); + + /* + Tiles and sprites are ordered by priority (0 back, 3 front) with + sprites going below tiles of their same priority. + + Sprites with the same priority are ordered by their place in + sprite RAM (last sprite is the frontmost). + + Tiles with the same priority are ordered by the priority of their layer. + + Tiles with the same priority *and* the same priority of their layer + are ordered by layer (0 back, 2 front) + */ + for (int pri = 0; pri <= 3; pri++) // tile / sprite priority + { + if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(0, pri); + + for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer + { + if (layers_ctrl & (1 << (pri + 0))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 0); + if (layers_ctrl & (1 << (pri + 4))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 1); + if (layers_ctrl & (1 << (pri + 8))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 2); + if (layers_ctrl & (1 << (pri + 12))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 3); + } + } + return 0; +} + + + +/**************************************************************/ + +void cave_state::get_sprite_info(int chip) +{ + if (m_videoregs[chip] == nullptr) + return; + + const int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; + + if (m_kludge == 3) /* mazinger metmqstr */ + { + if (machine().video().skip_this_frame() == 0) + { + m_spriteram_bank[chip] = m_spriteram_bank_delay[chip]; + (this->*m_get_sprite_info)(chip); + } + m_spriteram_bank_delay[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; + } + else + { + if (machine().video().skip_this_frame() == 0) + { + m_spriteram_bank[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; + (this->*m_get_sprite_info)(chip); + } + } +} + +void cave_state::device_post_load() +{ + for (int chip = 0; chip < 4; chip++) + get_sprite_info(chip); +} + + +// Poka Poka Satan: 3 screens * (1 Sprite chip + 1 Tilemap chip) + +u32 ppsatan_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip) +{ + m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); + m_blit.line_offset = bitmap.rowbytes(); + m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[chip].raw_pixptr(0)); + m_blit.line_offset_zbuf = m_sprite_zbuf[chip].rowbytes(); + + m_tilemap[chip]->prepare(); + + sprite_check(chip, chip, screen, cliprect); + + bitmap.fill(m_palette[chip]->pen_color(m_background_pen[chip]), cliprect); + + for (int pri = 0; pri <= 3; pri++) // tile / sprite priority + { + (this->*m_sprite_draw)(chip, pri); + + for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer + tilemap_draw(chip, screen, bitmap, cliprect, pri, 0, pri2, chip); + } + + return 0; +} + +u32 ppsatan_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return screen_update_ppsatan_core(screen, bitmap, cliprect, 0); +} +u32 ppsatan_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + machine().crosshair().get_crosshair(1).set_screen(&screen); + return screen_update_ppsatan_core(screen, bitmap, cliprect, 1); +} +u32 ppsatan_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + machine().crosshair().get_crosshair(0).set_screen(&screen); + return screen_update_ppsatan_core(screen, bitmap, cliprect, 2); +} diff -Nru mame-0.263+dfsg.1/src/mame/be/bebox.cpp mame-0.264+dfsg.1/src/mame/be/bebox.cpp --- mame-0.263+dfsg.1/src/mame/be/bebox.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/be/bebox.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -52,7 +52,7 @@ map(0x800002F8, 0x800002FF).rw("ns16550_1", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); map(0x80000380, 0x80000387).rw("ns16550_2", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); map(0x80000388, 0x8000038F).rw("ns16550_3", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); - map(0x800003B0, 0x800003DF).m(m_vga, FUNC(cirrus_gd5428_device::io_map)); + map(0x800003B0, 0x800003DF).m(m_vga, FUNC(cirrus_gd5446_vga_device::io_map)); map(0x800003F0, 0x800003F7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); map(0x800003F0, 0x800003F7).m(m_smc37c78, FUNC(smc37c78_device::map)); map(0x800003F8, 0x800003FF).rw("ns16550_0", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); @@ -61,8 +61,8 @@ //map(0x800042E8, 0x800042EF).w("cirrus", FUNC(cirrus_device::cirrus_42E8_w)); map(0xBFFFFFF0, 0xBFFFFFFF).r(FUNC(bebox_state::bebox_interrupt_ack_r)); - map(0xC00A0000, 0xC00BFFFF).rw(m_vga, FUNC(cirrus_gd5428_device::mem_r), FUNC(cirrus_gd5428_device::mem_w)); - map(0xC1000000, 0xC11FFFFF).rw(m_vga, FUNC(cirrus_gd5428_device::mem_linear_r), FUNC(cirrus_gd5428_device::mem_linear_w)); + map(0xC00A0000, 0xC00BFFFF).rw(m_vga, FUNC(cirrus_gd5446_vga_device::mem_r), FUNC(cirrus_gd5446_vga_device::mem_w)); + map(0xC1000000, 0xC11FFFFF).rw(m_vga, FUNC(cirrus_gd5446_vga_device::mem_linear_r), FUNC(cirrus_gd5446_vga_device::mem_linear_w)); map(0xFFF00000, 0xFFF03FFF).bankr("bank2"); map(0xFFF04000, 0xFFFFFFFF).rw(FUNC(bebox_state::bebox_flash_r), FUNC(bebox_state::bebox_flash_w)); } @@ -187,9 +187,10 @@ /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480); - screen.set_screen_update(m_vga, FUNC(cirrus_gd5428_device::screen_update)); + screen.set_screen_update(m_vga, FUNC(cirrus_gd5446_vga_device::screen_update)); - CIRRUS_GD5428(config, m_vga, 0); + // was GD5428, assume mistake (GD5446 is PCI) + CIRRUS_GD5446_VGA(config, m_vga, 0); m_vga->set_screen("screen"); m_vga->set_vram_size(0x200000); diff -Nru mame-0.263+dfsg.1/src/mame/bfm/bfm_bd1.h mame-0.264+dfsg.1/src/mame/bfm/bfm_bd1.h --- mame-0.263+dfsg.1/src/mame/bfm/bfm_bd1.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/bfm/bfm_bd1.h 2024-03-25 14:00:46.000000000 +0000 @@ -37,10 +37,10 @@ virtual void device_post_load() override; private: - static const uint8_t AT_NORMAL = 0x00; - static const uint8_t AT_FLASH = 0x01; - static const uint8_t AT_BLANK = 0x02; - static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off + static constexpr uint8_t AT_NORMAL = 0x00; + static constexpr uint8_t AT_FLASH = 0x01; + static constexpr uint8_t AT_BLANK = 0x02; + static constexpr uint8_t AT_FLASHED = 0x80; // set when character should be blinked off std::unique_ptr > m_outputs; uint8_t m_port_val; diff -Nru mame-0.263+dfsg.1/src/mame/bfm/bfm_bda.h mame-0.264+dfsg.1/src/mame/bfm/bfm_bda.h --- mame-0.263+dfsg.1/src/mame/bfm/bfm_bda.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/bfm/bfm_bda.h 2024-03-25 14:00:46.000000000 +0000 @@ -34,10 +34,10 @@ virtual void device_post_load() override; private: - static const uint8_t AT_NORMAL = 0x00; - static const uint8_t AT_FLASH = 0x01; - static const uint8_t AT_BLANK = 0x02; - static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off + static constexpr uint8_t AT_NORMAL = 0x00; + static constexpr uint8_t AT_FLASH = 0x01; + static constexpr uint8_t AT_BLANK = 0x02; + static constexpr uint8_t AT_FLASHED = 0x80; // set when character should be blinked off std::unique_ptr > m_outputs; std::unique_ptr > m_brightness; diff -Nru mame-0.263+dfsg.1/src/mame/bmc/bmcpokr.cpp mame-0.264+dfsg.1/src/mame/bmc/bmcpokr.cpp --- mame-0.263+dfsg.1/src/mame/bmc/bmcpokr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/bmc/bmcpokr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -15,7 +15,7 @@ TODO: * Hopper hookup doesn't work properly. MAME counts far more "tickets - dispensed" than the number of coins/tickets the games are suppoed to + dispensed" than the number of coins/tickets the games are supposed to pay out. ***************************************************************************/ @@ -947,7 +947,7 @@ PORT_DIPSETTING( 0x18, "200 / 10" ) PORT_DIPSETTING( 0x08, "300 / 15" ) PORT_DIPSETTING( 0x00, "500 / 25" ) - PORT_DIPNAME( 0x60, 0x60, "Credits Per Key-Out" ) PORT_DIPLOCATION("DIP2:6,7") // 洗分洗分 + PORT_DIPNAME( 0x60, 0x60, "Credits Per Key-Out" ) PORT_DIPLOCATION("DIP2:6,7") // 洗分單位 PORT_DIPSETTING( 0x40, "10" ) PORT_DIPSETTING( 0x20, "20" ) PORT_DIPSETTING( 0x60, "30" ) diff -Nru mame-0.263+dfsg.1/src/mame/bmc/koftball.cpp mame-0.264+dfsg.1/src/mame/bmc/koftball.cpp --- mame-0.263+dfsg.1/src/mame/bmc/koftball.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/bmc/koftball.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -5,6 +5,9 @@ preliminary driver by Tomasz Slanina +TODO: jxzh has bad GFX and needs correct protection handling. For testing, one well-placed soft reset + will make it boot + -- MC68000P10 @@ -29,11 +32,13 @@ */ #include "emu.h" + #include "cpu/m68000/m68000.h" #include "machine/timer.h" #include "sound/okim6295.h" #include "sound/ymopl.h" #include "video/ramdac.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -57,6 +62,7 @@ m_palette(*this, "palette") { } + void jxzh(machine_config &config); void koftball(machine_config &config); void init_koftball(); @@ -80,6 +86,7 @@ template TILE_GET_INFO_MEMBER(get_tile_info); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_DEVICE_CALLBACK_MEMBER(interrupt); + void jxzh_mem(address_map &map); void koftball_mem(address_map &map); void ramdac_map(address_map &map); }; @@ -170,6 +177,36 @@ map(0x360000, 0x360001).w(FUNC(koftball_state::prot_w)); } +void koftball_state::jxzh_mem(address_map &map) +{ + map(0x000000, 0x03ffff).rom(); + map(0x200000, 0x20ffff).ram().share(m_main_ram); + + map(0x260000, 0x260fff).ram().w(FUNC(koftball_state::videoram_w<0>)).share(m_videoram[0]); + map(0x261000, 0x261fff).ram().w(FUNC(koftball_state::videoram_w<1>)).share(m_videoram[1]); + map(0x262000, 0x26ffff).ram(); + + map(0x280000, 0x28ffff).ram(); // unused ? + map(0x2a0000, 0x2a001f).nopw(); + map(0x2a0000, 0x2a001f).r(FUNC(koftball_state::random_number_r)); + map(0x2b0000, 0x2b0003).r(FUNC(koftball_state::random_number_r)); + map(0x2d8000, 0x2d8001).r(FUNC(koftball_state::random_number_r)); + map(0x2da000, 0x2da003).w("ymsnd", FUNC(ym2413_device::write)).umask16(0xff00); + + map(0x2db001, 0x2db001).w("ramdac", FUNC(ramdac_device::index_w)); + map(0x2db003, 0x2db003).w("ramdac", FUNC(ramdac_device::pal_w)); + map(0x2db005, 0x2db005).w("ramdac", FUNC(ramdac_device::mask_w)); + + map(0x2dc000, 0x2dc000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x2f0000, 0x2f0003).portr("INPUTS"); + map(0x300000, 0x300001).nopw(); + map(0x320000, 0x320001).nopw(); + map(0x340000, 0x340001).r(FUNC(koftball_state::prot_r)); + map(0x360000, 0x360001).w(FUNC(koftball_state::prot_w)); + map(0x380000, 0x380001).w(FUNC(koftball_state::prot_w)); + map(0x3a0000, 0x3a0001).w(FUNC(koftball_state::prot_w)); +} + void koftball_state::ramdac_map(address_map &map) { map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb666_w)); @@ -259,6 +296,13 @@ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50); } +void koftball_state::jxzh(machine_config &config) +{ + koftball(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &koftball_state::jxzh_mem); +} + ROM_START( koftball ) ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "ft5_v16_c5.u14", 0x000001, 0x10000, CRC(45c856e3) SHA1(0a25cfc2b09f1bf996f9149ee2a7d0a7e51794b7) ) @@ -270,10 +314,72 @@ ROM_LOAD16_BYTE( "ft5_v6_c1.u59", 0x40000, 0x20000, CRC(b33a008f) SHA1(c4fd40883fa1c1cbc58f7b342fed753c52f0cf59) ) ROM_LOAD16_BYTE( "ft5_v6_c2.u60", 0x40001, 0x20000, CRC(3dc22223) SHA1(dc74800c51de3b6a7fbf7214a1da1d2f3d2aea84) ) - ROM_REGION( 0x040000, "oki", 0 ) // Samples ROM_LOAD( "ft5_v6_c9.u21", 0x00000, 0x10000, CRC(f6216740) SHA1(3d1c795da2f8093e937107e3848cb96338536faf) ) +ROM_END + +/******************************************************************* +錦繡中華 (Jǐnxiù Zhōnghuá), BMC 1996 +Hardware Info by Guru +--------------------- + +BMC-A-41210 +|-------------------------------------------------| +|21.47727MHz 9 AR17961 uPC1242H 1| +| 4 3 2 1 0| +|T518A 6264 7805 W| +| 555 |-----| VOL A| +| 6264 |40817| HM86171 Y| +| |-----| |-| +| 62256 | +| |-----| LM324|-| +| 62256 |PLCC | 3567 | +| |68 | M| +| |-| GAL1 |-----| 3.579545MHz A| +| |6| 5 6116 GAL2 H| +| |8| J| +| |0| SCAP DIP1 O| +| |0| N| +| |0| 6 6116 G| +| |-| DIP2 | +|-------------------------------------------------| +Notes: + 68000 - Clock 10.738635MHz [21.47727/2] + AR17961 - Equivalent to OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock input 0.976239545MHz [21.47727/22]. Pin 7 HIGH + 3567 - Equivalent to Yamaha YM2413 OPLL FM Synthesis Sound Chip. Clock input 3.579545MHz + 61256 - 32kB x8-bit SRAM + 6264 - 8kB x8-bit SRAM + 6116 - 2kB x8-bit SRAM (both backed-up by 5.5V Supercap) + DIP1/2 - 8-position DIP Switch + GAL1/2 - LATTICE GAL16V8B PLD + uPC1242H - NEC uPC1242H Audio Power Amp + LM324 - LM324 Quad Operational Amplifier + 555 - 555 Timer (provides master reset) + 7805 - LM7805 5V Linear Regulator + HM86171 - HMC HM86171-80 Color Palette RAMDAC + 40817 - BMC QFP100 Custom Chip marked 'BMC VDB40817' + PLCC68 - Unknown PLCC68 IC. Surface scratched but likely to be BMC B816140 (CPLD) + T518A - Mitsumi PST518A Master Reset IC (TO92) + SCAP - 5.5V 0.1F Supercap + 5/6 - 27C1001 EPROM (main program) + 1/2/3/4 - 23C4000 mask ROM (gfx) + 9 - 23C2000 mask ROM (OKI samples) + +*******************************************************************/ +ROM_START( jxzh ) + ROM_REGION( 0x200000, "maincpu", 0 ) // 68000 Code + ROM_LOAD16_BYTE( "bmc_m5k.u14", 0x000001, 0x20000, CRC(43b67d0a) SHA1(f421c71165d79881c208d332416f1c82057f5680) ) + ROM_LOAD16_BYTE( "bmc_m6k.u15", 0x000000, 0x20000, CRC(410ee342) SHA1(2b83e0fc2c5f9a2d745755572eba751bfac107f5) ) + + ROM_REGION( 0x200000, "tiles", 0 ) + ROM_LOAD16_BYTE( "bmc_mj9601-3.u61", 0x000000, 0x80000, CRC(b0c66e6f) SHA1(7539178d3bd4c012f0dd2f642e5a02303779109d) ) + ROM_LOAD16_BYTE( "bmc_mj9601-4.u58", 0x000001, 0x80000, CRC(04a307f1) SHA1(8a45de790305c3cc4285a91d19b95d696d31bd11) ) + ROM_LOAD16_BYTE( "bmc_mj9601-1.u59", 0x100000, 0x80000, CRC(184b8ba8) SHA1(0b84b9540ff72a57982a8f9e107a6d8d9314fdd1) ) + ROM_LOAD16_BYTE( "bmc_mj9601-2.u60", 0x100001, 0x80000, CRC(f82e0f34) SHA1(4051c7b24f865cf7fb77eb89dde79cb30bdba7a0) ) + + ROM_REGION( 0x040000, "oki", 0 ) // Samples + ROM_LOAD( "bmc_mj9601-9.u21", 0x00000, 0x40000, CRC(0ffcae13) SHA1(f8501c7c8a8bebf5da95aa3b275dd514f1014971) ) ROM_END #if NVRAM_HACK @@ -318,7 +424,8 @@ #endif } -} // Anonymous namespace +} // anonymous namespace -GAME( 1995, koftball, 0, koftball, koftball, koftball_state, init_koftball, ROT0, "BMC", "King of Football", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1995, koftball, 0, koftball, koftball, koftball_state, init_koftball, ROT0, "BMC", "King of Football", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1996, jxzh, 0, jxzh, koftball, koftball_state, empty_init, ROT0, "BMC", "Jinxiu Zhonghua", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/brother/lw840.cpp mame-0.264+dfsg.1/src/mame/brother/lw840.cpp --- mame-0.263+dfsg.1/src/mame/brother/lw840.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/brother/lw840.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,14 +145,14 @@ // screen updates uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint16_t port7_r() + uint8_t port7_r() { auto row = keyboard & 0x0f; if(row <= 8) return io_kbrow[row]->read(); // seems to be able to control power-on self test if not 0xff - return 0xffff; + return 0xff; } uint16_t keyboard_r() { diff -Nru mame-0.263+dfsg.1/src/mame/capcom/blktiger.cpp mame-0.264+dfsg.1/src/mame/capcom/blktiger.cpp --- mame-0.263+dfsg.1/src/mame/capcom/blktiger.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/blktiger.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -269,8 +269,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -495,8 +493,6 @@ } -// machine - /************************************************** Protection comms between main cpu and i8751 diff -Nru mame-0.263+dfsg.1/src/mame/capcom/cbasebal.cpp mame-0.264+dfsg.1/src/mame/capcom/cbasebal.cpp --- mame-0.263+dfsg.1/src/mame/capcom/cbasebal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/cbasebal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -100,8 +100,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -255,8 +253,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/capcom/commando.cpp mame-0.264+dfsg.1/src/mame/capcom/commando.cpp --- mame-0.263+dfsg.1/src/mame/capcom/commando.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/commando.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -239,8 +239,6 @@ }; -// video - template void commando_state::videoram_w(offs_t offset, uint8_t data) { @@ -351,8 +349,6 @@ } -// machine - // Memory Maps void commando_state::main_map(address_map &map) diff -Nru mame-0.263+dfsg.1/src/mame/capcom/exedexes.cpp mame-0.264+dfsg.1/src/mame/capcom/exedexes.cpp --- mame-0.263+dfsg.1/src/mame/capcom/exedexes.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/exedexes.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -96,8 +96,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -307,8 +305,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(exedexes_state::scanline) { const int scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/capcom/gng.cpp mame-0.264+dfsg.1/src/mame/capcom/gng.cpp --- mame-0.263+dfsg.1/src/mame/capcom/gng.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/gng.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,8 +106,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -235,8 +233,6 @@ } -// machine - void gng_state::bankswitch_w(uint8_t data) { if (data == 4) diff -Nru mame-0.263+dfsg.1/src/mame/capcom/gunsmoke.cpp mame-0.264+dfsg.1/src/mame/capcom/gunsmoke.cpp --- mame-0.263+dfsg.1/src/mame/capcom/gunsmoke.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/gunsmoke.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -152,8 +152,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -337,8 +335,6 @@ } -// machine - // Read/Write Handlers uint8_t gunsmoke_state::protection_r(offs_t offset) diff -Nru mame-0.263+dfsg.1/src/mame/capcom/higemaru.cpp mame-0.264+dfsg.1/src/mame/capcom/higemaru.cpp --- mame-0.263+dfsg.1/src/mame/capcom/higemaru.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/higemaru.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -81,8 +81,6 @@ }; -// video - void higemaru_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -220,8 +218,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(higemaru_state::scanline) { int scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/capcom/mitchell.cpp mame-0.264+dfsg.1/src/mame/capcom/mitchell.cpp --- mame-0.263+dfsg.1/src/mame/capcom/mitchell.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/mitchell.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -341,8 +341,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -543,8 +541,6 @@ } -// machine - /************************************* * * EEPROM diff -Nru mame-0.263+dfsg.1/src/mame/capcom/sonson.cpp mame-0.264+dfsg.1/src/mame/capcom/sonson.cpp --- mame-0.263+dfsg.1/src/mame/capcom/sonson.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/sonson.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -271,8 +269,6 @@ } -// machine - void sonson_state::sh_irqtrigger_w(int state) { // setting bit 0 low then high triggers IRQ on the sound CPU diff -Nru mame-0.263+dfsg.1/src/mame/capcom/srumbler.cpp mame-0.264+dfsg.1/src/mame/capcom/srumbler.cpp --- mame-0.263+dfsg.1/src/mame/capcom/srumbler.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/srumbler.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -84,8 +84,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -237,8 +235,6 @@ } -// machine - void srumbler_state::bankswitch_w(uint8_t data) { /* diff -Nru mame-0.263+dfsg.1/src/mame/capcom/vulgus.cpp mame-0.264+dfsg.1/src/mame/capcom/vulgus.cpp --- mame-0.263+dfsg.1/src/mame/capcom/vulgus.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/capcom/vulgus.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -74,13 +74,15 @@ m_bgvideoram(*this, "bgvideoram") { } - void vulgus(machine_config &config); + void vulgus(machine_config &config) ATTR_COLD; protected: - virtual void video_start() override; + required_device m_maincpu; + + virtual void video_start() override ATTR_COLD; + void main_map(address_map &map) ATTR_COLD; private: - required_device m_maincpu; required_device m_audiocpu; required_device m_gfxdecode; required_device m_palette; @@ -103,19 +105,35 @@ TILE_GET_INFO_MEMBER(get_fg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info); - void palette(palette_device &palette) const; + void palette(palette_device &palette) const ATTR_COLD; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); INTERRUPT_GEN_MEMBER(vblank_irq); - void main_map(address_map &map); - void sound_map(address_map &map); + void sound_map(address_map &map) ATTR_COLD; }; +class _1942iti_state : public vulgus_state +{ +public: + _1942iti_state(const machine_config &mconfig, device_type type, const char *tag) : + vulgus_state(mconfig, type, tag), + m_rombank(*this, "rombank") + { } + + void _1942iti(machine_config &config) ATTR_COLD; + +protected: + virtual void machine_start() override ATTR_COLD; + +private: + required_memory_bank m_rombank; + + void _1942iti_main_map(address_map &map) ATTR_COLD; +}; -// video /*************************************************************************** @@ -223,6 +241,13 @@ save_item(NAME(m_palette_bank)); } +void _1942iti_state::machine_start() +{ + vulgus_state::machine_start(); + + m_rombank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000); +} + /*************************************************************************** @@ -315,8 +340,6 @@ } -// machine - INTERRUPT_GEN_MEMBER(vulgus_state::vblank_irq) { device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h - vblank @@ -342,6 +365,14 @@ map(0xe000, 0xefff).ram(); } +void _1942iti_state::_1942iti_main_map(address_map &map) +{ + main_map(map); + + map(0x8000, 0xbfff).bankr(m_rombank); + map(0xc806, 0xc806).lw8(NAME([this] (uint8_t data) { m_rombank->set_entry(data & 0x03); })); +} + void vulgus_state::sound_map(address_map &map) { map(0x0000, 0x1fff).rom(); @@ -479,7 +510,6 @@ - void vulgus_state::vulgus(machine_config &config) { // basic machine hardware @@ -511,6 +541,12 @@ AY8910(config, "ay2", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.25); // 1.5 MHz } +void _1942iti_state::_1942iti(machine_config &config) +{ + vulgus(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &_1942iti_state::_1942iti_main_map); +} /*************************************************************************** @@ -675,10 +711,53 @@ ROM_LOAD( "82s129_8n.bin", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used) ROM_END +// Same PCB as 'mach9' +ROM_START( 1942iti ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "2764.n4", 0x00000, 0x2000, CRC(0720ef77) SHA1(59466c22f8c37b80762c95049521fc5d31cf0932) ) + ROM_LOAD( "2764.n5", 0x02000, 0x2000, CRC(9353a860) SHA1(4ed19fc1f4f87e95bcad988b2f9851ed7604e586) ) + ROM_LOAD( "2764.n6", 0x04000, 0x2000, CRC(2b2faee6) SHA1(bcd2e5675b863df8be8bc813e25f4aa65a969359) ) + ROM_LOAD( "2764.n7", 0x06000, 0x2000, CRC(bd3cbb4c) SHA1(9da177d68d39b56375975b8700cc0cc8b48211fe) ) + ROM_LOAD( "daugther_27128.3", 0x10000, 0x4000, CRC(835f7b24) SHA1(24b66827f08c43fbf5b9517d638acdfc38e1b1e7) ) + ROM_LOAD( "daugther_2764.2", 0x14000, 0x2000, CRC(9eca91e1) SHA1(48ccb608519debb681fa4f78985a074e05040edc) ) + ROM_LOAD( "daugther_27128.1", 0x18000, 0x4000, CRC(c661c8eb) SHA1(d5acf045d5773b01430bb54bc92ccd291318d2d7) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "27128.c11", 0x00000, 0x4000, CRC(bd87f06b) SHA1(821f85cf157f81117eeaba0c3cf0337eac357e58) ) + + ROM_REGION( 0x2000, "chars", 0 ) + ROM_LOAD( "2764.d3", 0x00000, 0x2000, CRC(6ebca191) SHA1(0dbddadde54a0ab66994c4a8726be05c6ca88a0e) ) + + ROM_REGION( 0xc000, "tiles", 0 ) + ROM_LOAD( "bottom_2764.a2", 0x00000, 0x2000, CRC(3884d9eb) SHA1(5cbd9215fa5ba5a61208b383700adc4428521aed) ) + ROM_LOAD( "bottom_2764.a3", 0x02000, 0x2000, CRC(999cf6e0) SHA1(5b8b685038ec98b781908b92eb7fb9506db68544) ) + ROM_LOAD( "bottom_2764.a4", 0x04000, 0x2000, CRC(8edb273a) SHA1(85fdd4c690ed31e6396e3c16aa02140ee7ea2d61) ) + ROM_LOAD( "bottom_2764.a5", 0x06000, 0x2000, CRC(3a2726c3) SHA1(187c92ef591febdcbd1d42ab850e0cbb62c00873) ) + ROM_LOAD( "bottom_2764.a6", 0x08000, 0x2000, CRC(1bd3d8bb) SHA1(ef4dce605eb4dc8035985a415315ec61c21419c6) ) + ROM_LOAD( "bottom_2764.a7", 0x0a000, 0x2000, CRC(658f02c4) SHA1(f087d69e49e38cf3107350cde18fcf85a8fa04f0) ) + + ROM_REGION( 0x10000, "sprites", 0 ) + ROM_LOAD( "bottom_27128.n2", 0x00000, 0x4000, CRC(2528bec6) SHA1(29f7719f18faad6bd1ec6735cc24e69168361470) ) + ROM_LOAD( "bottom_27128.n3", 0x04000, 0x4000, CRC(f89287aa) SHA1(136fff6d2a4f48a488fc7c620213761459c3ada0) ) + ROM_LOAD( "bottom_27128.n4", 0x08000, 0x4000, CRC(024418f8) SHA1(145b8d5d6c8654cd090955a98f6dd8c8dbafe7c1) ) + ROM_LOAD( "bottom_27128.n5", 0x0c000, 0x4000, CRC(e2c7e489) SHA1(d4b5d575c021f58f6966df189df94e08c5b3621c) ) + + ROM_REGION( 0x0800, "proms", 0 ) + ROM_LOAD( "bottom_tbp24s10n.e8", 0x00000, 0x0100, CRC(6dbdf73c) SHA1(d335c9a0aa5ada2cd75f6e7125956536afde1b4c) ) // red component + ROM_LOAD( "bottom_tbp24s10n.e9", 0x00100, 0x0100, CRC(e5c2e1d0) SHA1(a9bd1e0cc330e8174b9a064fba45a5a4c9ecb5c0) ) // green component + ROM_LOAD( "tbp24s10n.e10", 0x00200, 0x0100, CRC(dc7312a1) SHA1(810174ba1266de83fb238be786a6244229fc30f5) ) // blue component + ROM_LOAD( "tbp24s10n.d1", 0x00300, 0x0100, CRC(6047d91b) SHA1(1ce025f9524c1033e48c5294ee7d360f8bfebe8d) ) // char lookup table + ROM_LOAD( "bottom_tbp24s10n.j2", 0x00400, 0x0100, CRC(f6fad943) SHA1(b0a24ea7805272e8ebf72a99b08907bc00d5f82f) ) // sprite lookup table + ROM_LOAD( "bottom_tbp24s10n.c9", 0x00500, 0x0100, CRC(4858968d) SHA1(20b5dbcaa1a4081b3139e7e2332d8fe3c9e55ed6) ) // tile lookup table + ROM_LOAD( "tbp24s10n.j9", 0x00600, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) // interrupt timing? (not used) + ROM_LOAD( "bottom_82s129.n8", 0x00700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used) +ROM_END + } // anonymous namespace -GAME( 1984, vulgus, 0, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, vulgusa, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT90, "Capcom", "Vulgus (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, vulgusj, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (Japan?)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, mach9, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "bootleg (ITISA)", "Mach-9 (bootleg of Vulgus)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, vulgus, 0, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, vulgusa, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT90, "Capcom", "Vulgus (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, vulgusj, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (Japan?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, mach9, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "bootleg (Itisa)", "Mach-9 (bootleg of Vulgus)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, 1942iti, 1942, _1942iti, vulgus, _1942iti_state, empty_init, ROT270, "bootleg (Itisa)", "1942 (Itisa bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) diff -Nru mame-0.263+dfsg.1/src/mame/casio/cfx9850.cpp mame-0.264+dfsg.1/src/mame/casio/cfx9850.cpp --- mame-0.263+dfsg.1/src/mame/casio/cfx9850.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/casio/cfx9850.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -38,10 +38,10 @@ public: cfx9850_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") , m_video_ram(*this, "video_ram") , m_display_ram(*this, "display_ram") , m_ko_port(*this, "KO%u", 1) - , m_maincpu(*this, "maincpu") , m_ko(0) , m_port(0) , m_opt(0) @@ -49,11 +49,13 @@ void cfx9850(machine_config &config); +protected: + required_device m_maincpu; + private: required_shared_ptr m_video_ram; required_shared_ptr m_display_ram; required_ioport_array<12> m_ko_port; - required_device m_maincpu; u16 m_ko; // KO lines KO1 - KO14 u8 m_port; // PORT lines PORT0 - PORT7 (serial I/O) @@ -74,7 +76,7 @@ void cfx9850_state::cfx9850_mem(address_map &map) { - map(0x000000, 0x007fff).rom(); + map(0x000000, 0x007fff).mirror(0x008000).rom(); map(0x080000, 0x0807ff).ram().share("video_ram"); // map(0x100000, 0x10ffff) // some memory mapped i/o??? // map(0x110000, 0x11ffff) // some memory mapped i/o??? @@ -251,10 +253,11 @@ void cfx9850_state::cfx9850_palette(palette_device &palette) const { - palette.set_pen_color(0, 0xff, 0xff, 0xff); - palette.set_pen_color(1, 0x00, 0x00, 0xff); - palette.set_pen_color(2, 0x00, 0xff, 0x00); - palette.set_pen_color(3, 0xff, 0x00, 0x00); + // Referenced from screenshots in "fx-9750G PLUS User's Guide" + palette.set_pen_color(0, 0xbb, 0xdd, 0xaa); + palette.set_pen_color(1, 0x22, 0x55, 0xaa); + palette.set_pen_color(2, 0x22, 0xaa, 0x55); + palette.set_pen_color(3, 0xff, 0x55, 0x22); } @@ -309,10 +312,44 @@ } -ROM_START(cfx9850) - ROM_REGION(0x8000, "maincpu", 0) +class cfx9850gb_state : public cfx9850_state +{ +public: + cfx9850gb_state(const machine_config &mconfig, device_type type, const char *tag) + : cfx9850_state(mconfig, type, tag) + { } + + void cfx9850gb(machine_config &config); + void cfx9850gb_mem(address_map &map); +}; + +void cfx9850gb_state::cfx9850gb_mem(address_map &map) +{ + map(0x000000, 0x007fff).mirror(0x008000).rom(); + map(0x080000, 0x0807ff).ram().share("video_ram"); +// map(0x100000, 0x10ffff) // some memory mapped i/o??? +// map(0x110000, 0x11ffff) // some memory mapped i/o??? + map(0x200000, 0x2fffff).rom().region("bios", 0); + map(0x400000, 0x40f7ff).ram(); + map(0x40f800, 0x40ffff).ram().share("display_ram"); + map(0x410000, 0x41ffff).ram(); +// map(0xe10000, 0xe1ffff) // some memory mapped i/o??? +} + +void cfx9850gb_state::cfx9850gb(machine_config &config) +{ + cfx9850(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cfx9850gb_state::cfx9850gb_mem); +} + + +#define ROM_MAINCPU \ + ROM_REGION(0x8000, "maincpu", 0) \ ROM_LOAD("hcd62121.bin", 0x0000, 0x8000, CRC(e72075f8) SHA1(f50d176e1c225dab69abfc67702c9dfb296b6a78)) +ROM_START(cfx9850) + ROM_MAINCPU + ROM_REGION(0x80000, "bios", 0) // Unknown yet which rom is which version. ROM_SYSTEM_BIOS(0, "rom1", "rom1, version unknown") @@ -321,7 +358,18 @@ ROMX_LOAD("cfx9850b.bin", 0x00000, 0x80000, CRC(cd3c497f) SHA1(1d1aa38205eec7aba3ed6bef7389767e38afe075), ROM_BIOS(1)) ROM_END +ROM_START(cfx9850gb) + ROM_MAINCPU + + ROM_REGION(0x100000, "bios", 0) + // White model + // Back case revision: G359-21 + // PCB revision: PWB-GY355-E4 RJA509401-1 / PWB-GY357-1 RJA509402-1 + ROM_LOAD("r27v802d-34.lsi2", 0x00000, 0x100000, CRC(7ad44c51) SHA1(7cde6074758b5ae474b4eb3ee7396dbfb481ddcf)) +ROM_END + } // anonymous namespace -COMP(1996, cfx9850, 0, 0, cfx9850, cfx9850, cfx9850_state, empty_init, "Casio", "CFX-9850G", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP(1996, cfx9850, 0, 0, cfx9850, cfx9850, cfx9850_state, empty_init, "Casio", "CFX-9850G", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP(1996, cfx9850gb, cfx9850, 0, cfx9850gb, cfx9850, cfx9850gb_state, empty_init, "Casio", "CFX-9850GB Plus", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) diff -Nru mame-0.263+dfsg.1/src/mame/casio/pickytlk.cpp mame-0.264+dfsg.1/src/mame/casio/pickytlk.cpp --- mame-0.263+dfsg.1/src/mame/casio/pickytlk.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/casio/pickytlk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,204 @@ +// license:BSD-3-Clause +// copyright-holders:QUFB +/*************************************************************************** + + Driver for Casio Picky Talk + + Missing inputs, and I/O callbacks copied from CFX9850G need to be reviewed. + + Some points of interest can be accessed under the debugger: + + 1. bpset 0x200328 + 2. ip=3fe (clock screen) + 3. ip=410 (main screen) + + Hardware + -------- + + Super Picky Talk - Forest of Gurutan (JD-370): + + - PCB revision: A140947-1 Z835-1 + - LSI1 (CPU): Unknown (instruction set compatible with Hitachi HCD62121) + - LSI3 (Static RAM): NEC D441000LGZ (1M-bit, 128K-word by 8-bit) + - LSI5 (Mask ROM): NEC D23C8000XGX-C64 (8M-bit, 1M-word by 8-bit, pin compatible with AMD AM29F800B) + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/hcd62121/hcd62121.h" + +#include "emupal.h" +#include "screen.h" + + +namespace { + +class pickytlk_state : public driver_device +{ +public: + pickytlk_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_video_ram(*this, "video_ram") + , m_display_ram(*this, "display_ram") + , m_maincpu(*this, "maincpu") + , m_ko(0) + , m_port(0) + , m_opt(0) + { } + + void pickytlk(machine_config &config); + +private: + void kol_w(u8 data); + void koh_w(u8 data); + void port_w(u8 data); + void opt_w(u8 data); + u8 ki_r(); + u8 in0_r(); + void pickytlk_palette(palette_device &palette) const; + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void pickytlk_mem(address_map &map); + + required_shared_ptr m_video_ram; + required_shared_ptr m_display_ram; + required_device m_maincpu; + + u16 m_ko; // KO lines + u8 m_port; // PORT lines (serial I/O) + u8 m_opt; // OPT lines (contrast) +}; + +void pickytlk_state::pickytlk_mem(address_map &map) +{ + map(0x000000, 0x007fff).mirror(0x008000).rom(); + map(0x080000, 0x0807ff).ram().share("video_ram"); +// map(0x100000, 0x10ffff) // some memory mapped i/o??? +// map(0x110000, 0x11ffff) // some memory mapped i/o??? + map(0x200000, 0x2fffff).rom().region("mask_rom", 0); + map(0x400000, 0x4007ff).ram().share("display_ram"); + map(0x400800, 0x41ffff).ram(); +// map(0xe10000, 0xe1ffff) // some memory mapped i/o??? +} + +void pickytlk_state::kol_w(u8 data) +{ + m_ko = (m_ko & 0xff00) | data; + logerror("%s: KO is now %04x\n", machine().describe_context(), m_ko); +} + +void pickytlk_state::koh_w(u8 data) +{ + m_ko = (m_ko & 0x00ff) | (u16(data) << 8); + logerror("%s: KO is now %04x\n", machine().describe_context(), m_ko); +} + +void pickytlk_state::port_w(u8 data) +{ + m_port = data; + logerror("%s: PORT is now %02x\n", machine().describe_context(), m_port); +} + +void pickytlk_state::opt_w(u8 data) +{ + m_opt = data; + logerror("%s: OPT is now %02x\n", machine().describe_context(), m_opt); +} + +u8 pickytlk_state::ki_r() +{ + // TODO + return 0; +} + +u8 pickytlk_state::in0_r() +{ + // battery level? + // bit4 -> if reset CPU keeps restarting (several unknown instructions before jumping to 0) + // perhaps a battery present check? + // bit 5 -> 0 = low battery + + // --XX ---- VDET + // ---- -X-- data-in + return 0x30 & ~0x00; +} + +void pickytlk_state::pickytlk_palette(palette_device &palette) const +{ + palette.set_pen_color(0, 0xee, 0xee, 0xcc); + palette.set_pen_color(1, 0x11, 0x33, 0x99); + palette.set_pen_color(2, 0x33, 0xcc, 0x77); + palette.set_pen_color(3, 0xee, 0x77, 0x33); +} + +u32 pickytlk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + u16 offset = 0; + + for (int i = 0; i < 16; i++) + { + int const x = i * 8; + + for (int j = 0; j < 64; j++) + { + u16 *const row = &bitmap.pix(63 - j); + + u8 const data1 = m_display_ram[offset]; + u8 const data2 = m_display_ram[offset + 0x400]; + + for (int b = 0; b < 8; b++) + { + row[x + b] = (BIT(data1, b) << 1) | BIT(data2, b); + } + + offset++; + } + } + + return 0; +} + + +static INPUT_PORTS_START(pickytlk) + // TODO +INPUT_PORTS_END + + +void pickytlk_state::pickytlk(machine_config &config) +{ + HCD62121(config, m_maincpu, 4300000); /* X1 - 4.3 MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &pickytlk_state::pickytlk_mem); + m_maincpu->kol_cb().set(FUNC(pickytlk_state::kol_w)); + m_maincpu->koh_cb().set(FUNC(pickytlk_state::koh_w)); + m_maincpu->port_cb().set(FUNC(pickytlk_state::port_w)); + m_maincpu->opt_cb().set(FUNC(pickytlk_state::opt_w)); + m_maincpu->ki_cb().set(FUNC(pickytlk_state::ki_r)); + m_maincpu->in0_cb().set(FUNC(pickytlk_state::in0_r)); + + // TODO: Touchpad layout + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_size(128, 64); + screen.set_visarea(0, 127, 0, 63); + screen.set_screen_update(FUNC(pickytlk_state::screen_update)); + screen.set_palette("palette"); + + // TODO: Verify amount of colors and palette. Colors can be changed by changing the contrast. + PALETTE(config, "palette", FUNC(pickytlk_state::pickytlk_palette), 4); +} + + +ROM_START(pickytlk) + ROM_REGION(0x8000, "maincpu", 0) + ROM_LOAD("cpu.lsi1", 0x0000, 0x8000, CRC(d58efff9) SHA1(a8d2c2a331d79c5299274e2f2d180deda60a5aed)) + + ROM_REGION(0x100000, "mask_rom", 0) + ROM_LOAD("d23c8000xgx-c64.lsi5", 0x00000, 0x100000, CRC(6ed6feae) SHA1(f9a63db3d048da0954cab052690deb01ec384b22)) +ROM_END + +} // anonymous namespace + + +// "CASIO スーパーピッキートーク「グルタンの森」はやわかりビデオ" has copyright dates 1997,1998,1999 +COMP(1997, pickytlk, 0, 0, pickytlk, pickytlk, pickytlk_state, empty_init, "Casio", "Super Picky Talk - Forest of Gurutan", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) diff -Nru mame-0.263+dfsg.1/src/mame/cave/cavepc.cpp mame-0.264+dfsg.1/src/mame/cave/cavepc.cpp --- mame-0.263+dfsg.1/src/mame/cave/cavepc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/cavepc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,157 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/************************************************************************************************** + + CAVE PC hardware + placeholder file for information + +TODO: +- Cannot continue without a proper Athlon 64 X2 core (uses lots of unsupported RDMSR / WRMSR) + +*************************************************************************************************** + + Cave used a one-off PC platform for + + Deathsmiles II (c)2009 + + According to + http://forum.arcadeotaku.com/viewtopic.php?f=26&t=9851 + It uses a ASUS M3A78-EM motherboard (boot screen is shown) + http://www.asus.com/Motherboards/M3A78EM/ + + fitted with + AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache + 2048MB (2GB) 800MHz DDR + + and a custom JVS I/O board providing security etc. + 'CV2000XP Rev 2.0' + + The game is contained on a + Transcend 2GB 300x UDMA Compact Flash Card + plugged into an adapter board + with 'Windows(r) Embedded Standard' + + There don't appear to be any dedicated video / sound boards so it + presumably uses the onboard capabilities of the board + 'Integrated ATI Radeon(tm) HD 3200 GPU' + 'Realtek(r) ALC1200 8 -Channel High Definition Audio CODEC' + + There should be at least 3 game revisions? + + Pictures of the hardware can be seen at + http://ikotsu.blogspot.co.uk/2010/03/deathsmiles-ii-pos-arcade-pc.html + however this revision is using a Gigabyte motherboard instead, possibly + different boards were used? + appears to be this one + http://www.gigabyte.com/products/product-page.aspx?pid=3016#ov + GA-MA78GPM-UD2H (rev. 1.0) + + The JVS board is said to be quite problematic, and the game will boot + to an error screen if it isn't functioning correctly. + http://forum.arcadeotaku.com/viewtopic.php?f=26&t=14850&start=60 + +*/ + + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "machine/pci.h" + + +namespace { + +class cavepc_state : public driver_device +{ +public: + cavepc_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + + void cavepc(machine_config &config); + +private: + required_device m_maincpu; + void cavepc_io(address_map &map); + void cavepc_map(address_map &map); +}; + +/*****************************************************************************/ + +void cavepc_state::cavepc_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000e0000, 0x000fffff).rom().region("bios", 0xe0000); + map(0xfff00000, 0xffffffff).rom().region("bios", 0); +} + +void cavepc_state::cavepc_io(address_map &map) +{ +} + +/*****************************************************************************/ + + +static INPUT_PORTS_START(cavepc) +INPUT_PORTS_END + + +void cavepc_state::cavepc(machine_config &config) +{ + PENTIUM3(config, m_maincpu, 200'000'000); /* AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache ! */ + m_maincpu->set_addrmap(AS_PROGRAM, &cavepc_state::cavepc_map); + m_maincpu->set_addrmap(AS_IO, &cavepc_state::cavepc_io); + + PCI_ROOT(config, "pci", 0); + // ... +} + + +/*****************************************************************************/ + +/* + +Deathshmiles II (2009/10/14 MASTER VER 4.00) + +CAVE's venture into PC based hardware platforms. The game did not +sell that well and was plagued by BSODs and hardware issues. The +motherboard bios version that shipped out with the game is F2 on +a Gigabyte GA-MA78GPM-UD2H board +( http://www.gigabyte.com/products/product-page.aspx?pid=3016#ov ) + +The following versions are known to have existed. + +1.00 - released 2009/05/14 +2.00 +3.00 - sometimes scrolls the text "2ND UPDATE MASTER VER 3.00" at + the bottom of the title screen + +The archive contains the following: + +./images, documentaiton +./cf_card_2gb, a dd image of the 2GB CF FLASH card +./usb_drive, the game is updated using a USB drive and will not + start if it is not present +./motherboard manual +./motherboard bios download version F2 + +*/ + +ROM_START(deathsm2) + ROM_REGION32_LE(0x100000, "bios", 0) + ROM_LOAD( "ma78gu2h.f2", 0x000000, 0x100000, CRC(c85742c4) SHA1(9e2a4b4a2137d1a19bf4cce20a3e2642fc6c6e05) ) + + DISK_REGION( "cfcard" ) + DISK_IMAGE( "ds2_4.0", 0, SHA1(111c2c7a3b987d47f4b6666a8ba9c5d9552b9653) ) + + DISK_REGION( "usb" ) // the USB stick used to upgrade the game to Version 4.00 MUST be present for it to run once upgraded + DISK_IMAGE( "cave_ds2_usb", 0, SHA1(b601985c7f6e6a20b0b7999167b7ccdd12ab80d0) ) +ROM_END + +} // anonymous namespace + + +/*****************************************************************************/ + +GAME(2009, deathsm2, 0, cavepc, cavepc, cavepc_state, empty_init, ROT0, "Cave", "Deathsmiles II: Makai no Merry Christmas (2009/10/14 MASTER VER 4.00)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/cave/cv1k.cpp mame-0.264+dfsg.1/src/mame/cave/cv1k.cpp --- mame-0.263+dfsg.1/src/mame/cave/cv1k.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/cv1k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,1077 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Luca Elia, MetalliC +/* + +Cave CV1000 hardware + +U2 flash rom note: + +Cave often programmed the u2 roms onto defective flash chips, programming around the bad blocks. +As a result these are highly susceptible to failure, blocks around the known bad blocks appear to +decay at an alarming rate in some cases, and in others data has clearly been programmed over +blocks that were already going bad. - this is why the same game often has different u2 roms +in the different sets at the moment. - these will be reconstructed at some point. + +The flash roms do contain a 'bad block' table, so it should be possible to rebuild a 'clean' +flash ROM for each game by comparing multiple dumps of each game and ensuring no other data has +decayed. Naturally this is not an ideal situation for the less common games! + +-------------------------------------------------------------------------------- + +Games by Cave ID number: +ID is labeled on U13 chip, not always +Serial is on a sticker on PCB, eg. "CAVE DS-10104" + +ID Serial PCB Title +------------------------------------- +CA011 - B Mushihime-Sama +CA??? MHN B Mushihime-Sama Cave Matsuri 1.5 +CA012 - B Ibara +CA012B IB B Ibara Kuro Black Label +CA013 E B Espgaluda II +CA??? M B Puzzle! Mushihime-Tama +CA014 CA B Pink Sweets: Ibara Sorekara +CA015 CA B Mushihime-Sama Futari +CA015B MFBA/MMB B Mushihime-Sama Futari Black Label +CA016 MP B Muchi Muchi Pork! +CA017 DS B Deathsmiles +CA017B DSB D Deathsmiles Black Label +CA019 DD D DoDonPachi DaiFukkatsu +CA019B DDB D DoDonPachi DaiFukkatsu Black Label +CA021 AK D Akai Katana +CA??? SDO D DoDonPachi SaiDaiOuJou + +CMDL01 - Medal Mahjong Moukari Bancho +?????? - Pirates of Gappori: http://web.archive.org/web/20090907145501/http://www.cave.co.jp/gameonline/gappori/ +?????? - Uhauha Ooku: http://web.archive.org/web/20141104001322/http://www.cave.co.jp/gameonline/oooku/ + +Note: CA018 - Deathsmiles II: Makai no Merry Christmas on PC based platform (see cavepc.cpp) + CA020 - DoDonPachi DaiOuJou Tamashii on PGM2 platform + + +PCB CV1000-B / CV1000-D ++--------------------------------------------+ +| | +| | +| | +| VOL | +| | ++-+ +-----+ +-----+ X3 | + | | U24 | | U23 | | ++-+ +-----+ +-----+ +------+ | +| |Yamaha| | +| U25* U26* |YMZ770| | +| | | | +|J D5 +------+ | +|A D2 | +|M D3 +-----+ +-----+ | +|M D4 P2* | U7 | | U6 | | +|A D1 +-----+ +-----+ | +| +-------+ | +|C |P4 JTAG| | +|o +-------+ +-------+ | +|n |Altera | +--+ | +|n D6 |Cyclone| | | | +|e X1 S1 | | |U1| | +|c S3 +---------+ +-------+ | | | +|t | | +--+ | +|e | Hitachi | | +|r | | S2 | +| | SH3 | +-----------------+ | +| | | | P3 | | +| +---------+ +-----------------+ | ++-+ X2 | + | +--+ +--+ +---+ U27 | ++-+ | | | | |U13| | +|+-+ |U2| |U4| +---+ | +||P| | | | | __ | +||8| U12* +--+ +--+ U10 / \ | +|+-+ |C126| | +| P5* P7* \__/ | ++--------------------------------------------+ + +* Denotes not populated + + CPU: Hitachi 6417709S SH3 clocked at 102.4MHz (12.800MHz * 8) +Sound: Yamaha YMZ770C-F clocked at 16.384MHz +Other: Altera Cyclone EP1C12 FPGA + Altera EPM7032 (MAX 7000 Series) at U13 + +OSC: + X1 12.800MHz (SH3 clock derived from this) + X2 32.768kHz (Used by the RTC) + X3 16.384MHz (Yamaha YMZ770C-F clock) + +Memory: + U6 (SDRAM) MT46V16M16 ? 4 MBit x 16 x 4 banks, DDR RAM (256 MBit) + U7 (SDRAM) MT46V16M16 ? 4 MBit x 16 x 4 banks, DDR RAM (256 MBit) + U1 (SDRAM) MT48LC2M32 ? 512K x 32 x 4 banks, (64 MBit) for CV1000-B + U1 (SDRAM) IS42S32400 - 1024K x 32 x 4 banks, (128 MBit) for CV1000-D + +Roms: + U4 (FLASH) 29LV160BB 16M-Bit CMOS 3.0V, Boot device, FPGA bit file, main program code for CV1000-B + U4 (FLASH) S29JL032H 32M-Bit CMOS 3.0V, Boot device, FPGA bit file, main program code for CV1000-D + U2 (FLASH) K9F1G08U0M 128M x 8 Bit / 64M x 16 Bit NAND. Graphics data. + U23-U24 (FLASH) MBM 29DL321, 32M-Bit CMOS 3.0V. Sound data. + U25-U26 (FLASH) MBM 29DL321, not populated + +Battery: + C126 CR2450, Powers the RTC (Real Time Clock) U10. Look at the garden clock in Ibara. NOT present on CV1000-D + +Dipswitches & Push Buttons: + S1 (DIL SWITCH) Half Pitch DIL Switch x 1, function unknown + S2 (DIL SWITCH) Half Pitch DIL Switch x 4, SW1=Setup, other switches unknown + S3 (MICRO PUSH BUTTON) Test switch, same as on the JAMMA connector + +Connectors: + P2 (IDC CONNECTOR 20 PIN) function unknown, P2 is not always mounted + P4 (IDC CONNECTOR 14 PIN) JTAG connector + P8 (IDC CONNECTOR 10 PIN) Advanced User Debugger + P3 (CONNECTOR) Most likely an expansion port, P3 is not always mounted + P5 (CONNECTOR) D9 serial connector. Used for the mahjong Touchscreen titles. Also mounted on early Mushihime-Sama PCB's + P7 (CONNECTOR) Network port pinout. Never seen mounted on any PCB. + +Misc: + U27 (SUPERVISOR) MAX 690S 3.0V Microprocessor Supervisory Circuit. + U10 (RTC & EEPROM) RTC 9701, Serial RTC Module with EEPROM 4 kbit (256x16 bit), controlled by Altera EPM7032 U13. + U12 (RS-232 TRANSCEIVER) MAX 3244E RS-232 Transceiver, only mounted when P5 is mounted. + D1-D6 (LED) Status LED's. D6 lights up at power on then shuts off, D2 indicates coinage. + +Note: * The Altera EPM7032 usually stamped / labeled with the Cave game ID number as listed above. + * U4, U23, U24 flash ROMs will vary by manufacturer but will be compatible with flash ROM listed. + * The game logic does a manufacturer check on U2. K9F1G08U0M and two other device codes are allowed. + Trying to replace U2 with a flash ROM from another manufacturer does not work. Allowed devices are: + - Manufacturer ID: 0x98, ID code: 0x76 + - Manufacturer ID: 0x98, ID code: 0x79 + - Manufacturer ID: 0xEC, ID code: 0xF1 <- This is K9F1G08U0M + * There are two known CV1000-B PCB revisions. The newer one has some minor hardware differences + and uses an updated FPGA firmware, they are not compatible with eachother. + * The CV1000-D revision PCB has double the RAM at U1, double the ROM at U4 and no battery. + The CV1000-D is used for Dodonpachi Daifukkatsu and later games. Commonly referred to as SH3B PCB. + +Information by The Sheep, rtw, Ex-Cyber, BrianT, Guru & buffi + +------------------------------------------------------ + +To enter service mode in most cases hold down Service (F2) for a few seconds + (I believe it's the test button on the PCB) +Some games also use the test dipswitch as an alternative method. + +Common game codes: + - During boot hold P1 Right+A+B+C and P2 Left+A+B+C - Forcibly initialise non-volatile data (EEPROM or NAND settings area) + - During boot hold P1 A and P2 A - Reset random numbers generator at each game start. Probably was used during testing or/and competition events. + +TODO: + +Improve Blending precision? + - I'm not sure what precision the original HW mixes with, source data is 555 RGB with 1 bit transparency (16-bits) + and the real VRAM is also clearly in this format. The Alpha values supplied however are 8bpp, and the 'Tint' + values use 0x20 for 'normal' (not 0x1f) + +Overall screen brightness / contrast (see test mode) + - Could convert ram back to 16-bit and use a palette lookup at the final blit.. probably easiest / quickest. + +Touchscreen + - Used for mmmbanc, needs SH3 serial support. + +Remaining Video issues + - mmpork startup screen flicker - the FOR USE IN JAPAN screen doesn't appear on the real PCB until after the graphics are fully loaded, it still displays 'please wait' until that point. + - Sometimes the 'sprites' in mushisam lag by a frame vs the 'backgrounds' is this a timing problem, does the real game do it? + - End of Blit should send IRQ1. (one game has a valid irq routine that looks like it was used for profiling, but nothing depends on it) + +Timing + - Correct CPU slowdown emulation and flags (and speed of RAM). Most slowdown seems due to SH-3 uncached RAM access wait states, which is not implemented. + +31/12/2021: + Akai Katana and Dodonpachi Saidaioujou removed at the request of the + current rightholder, exA-Arcadia (legal@exa.ac). + +*/ + +#include "emu.h" + +#include "ep1c12.h" + +#include "cpu/sh/sh3comn.h" +#include "cpu/sh/sh4.h" +#include "machine/nandflash.h" +#include "machine/rtc9701.h" +#include "sound/ymz770.h" + +#include "screen.h" +#include "speaker.h" + +namespace { + +class cv1k_state : public driver_device +{ +public: + cv1k_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_blitter(*this, "blitter"), + m_nand(*this, "nand"), + m_eeprom(*this, "eeprom"), + m_ram(*this, "mainram"), + m_rombase(*this, "maincpu"), + m_eepromout(*this, "EEPROMOUT"), + m_idleramoffs(0), + m_idlepc(0) + { } + + void cv1k(machine_config &config); + void cv1k_d(machine_config &config); + + void init_mushisam(); + void init_ibara(); + void init_espgal2(); + void init_mushitam(); + void init_pinkswts(); + void init_deathsml(); + void init_ddpdfk(); + +protected: + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_blitter; + required_device m_nand; + required_device m_eeprom; + + required_shared_ptr m_ram; + required_region_ptr m_rombase; + + uint8_t flash_io_r(offs_t offset); + void flash_io_w(offs_t offset, uint8_t data); + uint8_t serial_rtc_eeprom_r(offs_t offset); + void serial_rtc_eeprom_w(offs_t offset, uint8_t data); + uint64_t flash_port_e_r(); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + required_ioport m_eepromout; + + uint32_t m_idleramoffs; + uint32_t m_idlepc; + + uint64_t speedup_r(); + void install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_typed); + + void cv1k_d_map(address_map &map); + void cv1k_map(address_map &map); + void cv1k_port(address_map &map); +}; + + +/**************************************************************************/ + +uint32_t cv1k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + m_blitter->draw_screen(bitmap,cliprect); + return 0; +} + + +// FLASH interface + +uint64_t cv1k_state::flash_port_e_r() +{ + return ((!m_nand->is_busy() ? 0x20 : 0x00)) | 0xdf; +} + + +uint8_t cv1k_state::flash_io_r(offs_t offset) +{ + switch (offset) + { + default: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + // logerror("flash_io_r offset %04x\n", offset); + return 0xff; + + case 0x00: + return m_nand->data_r(); + } +} + +void cv1k_state::flash_io_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + default: + case 0x03: + logerror("unknown flash_io_w offset %04x data %02x\n", offset, data); // 03 enable/disable fgpa access? + break; + + case 0x00: + m_nand->data_w(data); + break; + + case 0x01: + m_nand->command_w(data); + break; + + case 0x2: + m_nand->address_w(data); + break; + } +} + + +// ibarablk uses the rtc to render the clock in the first attract demo +// if this code returns bad values it has gfx corruption. the ibarablka set doesn't do this?! +uint8_t cv1k_state::serial_rtc_eeprom_r(offs_t offset) +{ + switch (offset) + { + case 0x01: + return 0xfe | m_eeprom->read_bit(); + + default: + return 0; + } +} + +void cv1k_state::serial_rtc_eeprom_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0x01: + m_eepromout->write(data, 0xff); + break; + case 0x03: + // Set CE pin of NAND to !(data & 0x01). Unlikely to matter for emulation, since it's just hardware + // handling of who accesses the shared data bus. + break; + + default: + logerror("unknown serial_rtc_eeprom_w access offset %02x data %02x\n", offset, data); + break; + } +} + + +void cv1k_state::cv1k_map(address_map &map) +{ + map(0x00000000, 0x003fffff).rom().region("maincpu", 0).nopw(); // mmmbanc writes here on startup for some reason.. + map(0x0c000000, 0x0c7fffff).ram().share("mainram");// work RAM + map(0x10000000, 0x10000007).rw(FUNC(cv1k_state::flash_io_r), FUNC(cv1k_state::flash_io_w)); + map(0x10400000, 0x10400007).w("ymz770", FUNC(ymz770_device::write)); + map(0x10c00000, 0x10c00007).rw(FUNC(cv1k_state::serial_rtc_eeprom_r), FUNC(cv1k_state::serial_rtc_eeprom_w)); +// map(0x18000000, 0x18000057) // blitter, installed on reset + map(0xf0000000, 0xf0ffffff).ram(); // mem mapped cache (sh3 internal?) +} + +void cv1k_state::cv1k_d_map(address_map &map) +{ + map(0x00000000, 0x003fffff).rom().region("maincpu", 0).nopw(); // mmmbanc writes here on startup for some reason.. + map(0x0c000000, 0x0cffffff).ram().share("mainram"); // work RAM + map(0x10000000, 0x10000007).rw(FUNC(cv1k_state::flash_io_r), FUNC(cv1k_state::flash_io_w)); + map(0x10400000, 0x10400007).w("ymz770", FUNC(ymz770_device::write)); + map(0x10c00000, 0x10c00007).rw(FUNC(cv1k_state::serial_rtc_eeprom_r), FUNC(cv1k_state::serial_rtc_eeprom_w)); +// map(0x18000000, 0x18000057) // blitter, installed on reset + map(0xf0000000, 0xf0ffffff).ram(); // mem mapped cache (sh3 internal?) +} + +void cv1k_state::cv1k_port(address_map &map) +{ + map(SH3_PORT_C, SH3_PORT_C+7).portr("PORT_C"); + map(SH3_PORT_D, SH3_PORT_D+7).portr("PORT_D"); + map(SH3_PORT_E, SH3_PORT_E+7).r(FUNC(cv1k_state::flash_port_e_r)); + map(SH3_PORT_F, SH3_PORT_F+7).portr("PORT_F"); + map(SH3_PORT_L, SH3_PORT_L+7).portr("PORT_L"); + map(SH3_PORT_J, SH3_PORT_J+7).rw(m_blitter, FUNC(ep1c12_device::fpga_r), FUNC(ep1c12_device::fpga_w)); +} + + +static INPUT_PORTS_START( cv1k_base ) + PORT_START("DSW") // 18000050.l (18000050.b + 3 i.e. MSB + 3, is shown as DIPSW) + // note: physical switch have default/Off position marked as "ON" which is a bit confusing + PORT_DIPUNUSED_DIPLOC( 0x01, 0x00, "S2:1" ) + PORT_DIPUNUSED_DIPLOC( 0x02, 0x00, "S2:2" ) + PORT_DIPUNUSED_DIPLOC( 0x04, 0x00, "S2:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, 0x00, "S2:4" ) + PORT_BIT(0xfffffff0, IP_ACTIVE_HIGH, IPT_UNKNOWN) + + PORT_START("PORT_C") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service coin + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) // Test Button on JAMMA Edge + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) // TODO: IMPLEMENT COIN ERROR! + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("PORT_D") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + + PORT_START("PORT_F") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // S3 Test Push Button + PORT_BIT( 0xfd, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("PORT_L") // 4000134.b, 4000136.b + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START( "EEPROMOUT" ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, write_bit) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, set_clock_line) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, set_cs_line) +INPUT_PORTS_END + +static INPUT_PORTS_START( cv1k ) + PORT_INCLUDE( cv1k_base ) + + PORT_MODIFY("PORT_F") + PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) // S3 Test Push Button +INPUT_PORTS_END + +static INPUT_PORTS_START( cv1ks ) + PORT_INCLUDE( cv1k_base ) + + PORT_MODIFY("DSW") + PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_HIGH, "S2:1") + PORT_DIPNAME( 0x02, 0x00, "Special Mode" ) PORT_DIPLOCATION("S2:2") // also require hold P1 A+B while booting + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) +INPUT_PORTS_END + +void cv1k_state::machine_reset() +{ + m_blitter->set_rambase(reinterpret_cast(m_ram.target())); + m_blitter->install_handlers( 0x18000000, 0x18000057 ); + m_blitter->reset(); +} + +void cv1k_state::cv1k(machine_config &config) +{ + /* basic machine hardware */ + SH3BE(config, m_maincpu, 12.8_MHz_XTAL*8); // 102.4MHz + m_maincpu->set_md(0, 0); // none of this is verified + m_maincpu->set_md(1, 0); // (the sh3 is different to the sh4 anyway, should be changed) + m_maincpu->set_md(2, 0); + m_maincpu->set_md(3, 0); + m_maincpu->set_md(4, 0); + m_maincpu->set_md(5, 1); + m_maincpu->set_md(6, 0); + m_maincpu->set_md(7, 1); + m_maincpu->set_md(8, 0); + m_maincpu->set_sh4_clock(12.8_MHz_XTAL*8); // 102.4MHz + m_maincpu->set_addrmap(AS_PROGRAM, &cv1k_state::cv1k_map); + m_maincpu->set_addrmap(AS_IO, &cv1k_state::cv1k_port); + m_maincpu->set_vblank_int("screen", FUNC(cv1k_state::irq2_line_hold)); // irq2 actually asserted at V-sync pulse, not at V-blank + + RTC9701(config, m_eeprom); + SAMSUNG_K9F1G08U0M(config, m_nand, 0); + + /* video hardware */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh(HZ_TO_ATTOSECONDS(60.024)); // measured from ibara PCB rates - 60.024Hz, 262 total lines + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(512, 512); + screen.set_visarea(0, 320-1, 0, 240-1); + screen.set_screen_update(FUNC(cv1k_state::screen_update)); + + SPEAKER(config, "mono").front_center(); + YMZ770(config, "ymz770", 16.384_MHz_XTAL).add_route(1, "mono", 1.0); // only Right output used, Left is not connected + + EP1C12(config, m_blitter, 0); + m_blitter->set_cpu(m_maincpu); + m_blitter->port_r_callback().set_ioport("DSW"); + m_blitter->set_mainramsize(0x800000); +} + +void cv1k_state::cv1k_d(machine_config &config) +{ + cv1k(config); + + /* basic machine hardware */ + SH3BE(config.replace(), m_maincpu, 12.8_MHz_XTAL*8); // 102.4MHz + m_maincpu->set_md(0, 0); // none of this is verified + m_maincpu->set_md(1, 0); // (the sh3 is different to the sh4 anyway, should be changed) + m_maincpu->set_md(2, 0); + m_maincpu->set_md(3, 0); + m_maincpu->set_md(4, 0); + m_maincpu->set_md(5, 1); + m_maincpu->set_md(6, 0); + m_maincpu->set_md(7, 1); + m_maincpu->set_md(8, 0); + m_maincpu->set_sh4_clock(12.8_MHz_XTAL*8); // 102.4MHz + m_maincpu->set_addrmap(AS_PROGRAM, &cv1k_state::cv1k_d_map); + m_maincpu->set_addrmap(AS_IO, &cv1k_state::cv1k_port); + m_maincpu->set_vblank_int("screen", FUNC(cv1k_state::irq2_line_hold)); + + m_blitter->set_mainramsize(0x1000000); +} + + + +/************************************************** + +All roms are flash roms with no labels, so keep the + version numbers attached to the roms that differ + - roms which differ have also been prefixed with + the MAME set names to aid readability and prevent + accidental misloading of sets with the wrong + CRCs which causes issues with the speedups. + +**************************************************/ + +ROM_START( mushisam ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("mushisam_u4", 0x000000, 0x200000, CRC(15321b30) SHA1(d2cd714ff2299eeab6f9a7c219dfb559c8f98b45) ) // (2004/10/12.MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) +ROM_END + +ROM_START( mushisama ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("mushisama_u4", 0x000000, 0x200000, CRC(0b5b30b2) SHA1(35fd1bb1561c30b311b4325bc8f4628f2fccd20b) ) // (2004/10/12 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) +ROM_END + +ROM_START( mushisamb ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("mushisamb_u4", 0x000000, 0x200000, CRC(9f1c7f51) SHA1(f82ae72ec03687904ca7516887080be92365a5f3) ) // (2004/10/12 MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) +ROM_END + +ROM_START( espgal2 ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "espgal2_u4", 0x000000, 0x200000, CRC(2cb37c03) SHA1(da438efc497f72aa345d2cdb0143d269e51576d3) ) // (2005/11/14.MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) +ROM_END + +ROM_START( espgal2a ) // newer CV1000-B PCB revision, updated FPGA firmware, no changes in game code or data + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "espgal2a_u4", 0x000000, 0x200000, CRC(843608b8) SHA1(2f5fcd38e76df531a923cd9956104cef5185aaa9) ) // (2005/11/14 MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) +ROM_END + +ROM_START( espgal2b ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "espgal2b_u4", 0x000000, 0x200000, CRC(09c908bb) SHA1(7d6031fd3542b3e1d296ff218feb40502fd78694) ) // (2005/11/14 MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) +ROM_END + +ROM_START( mushitam ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("mushitam_u4", 0x000000, 0x200000, CRC(c49eb6b1) SHA1(c40ee5de89e3f1cb49ac19687657dd2b42a88d81) ) // (2005/09/09.MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(6feeb9a1) SHA1(992711c80e660c32f97b343c2ce8184fddd7364e) ) +ROM_END + +ROM_START( mushitama ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("mushitama_u4", 0x000000, 0x200000, CRC(4a23e6c8) SHA1(d44c287bb88e6d413a8d35d75bc1b4928ad52cdf) ) // (2005/09/09 MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) +// ROM_LOAD("mushitama_u2", 0x000000, 0x8400000, CRC(3f93ff82) SHA1(6f6c250aa7134016ffb288d056bc937ea311f538) ) // recycled ROM - only unused areas differ + ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(6feeb9a1) SHA1(992711c80e660c32f97b343c2ce8184fddd7364e) ) +ROM_END + +ROM_START( futari15 ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("futari15_u4", 0x000000, 0x200000, CRC(e8c5f128) SHA1(45fb8066fdbecb83fdc2e14555c460d0c652cd5f) ) // (2006/12/8.MAST VER. 1.54.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) +ROM_END + +ROM_START( futari15a ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("futari15a_u4", 0x000000, 0x200000, CRC(a609cf89) SHA1(56752fae9f42fa852af8ee2eae79e25ec7f17953) ) // (2006/12/8 MAST VER 1.54) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) +// ROM_LOAD("futari15a_u2", 0x000000, 0x8400000, CRC(b9d815f9) SHA1(6b6f668b0bbb087ffac65e4f0d8bd9d5b28eeb28) ) // recycled ROM - only unused areas differ + ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) + ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) +ROM_END + +ROM_START( futari10 ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "futari10_u4", 0x000000, 0x200000, CRC(b127dca7) SHA1(e1f518bc72fc1cdf69aefa89eafa4edaf4e84778) ) // (2006/10/23 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "futari10_u2", 0x000000, 0x8400000, CRC(78ffcd0c) SHA1(0e2937edec15ce3f5741b72ebd3bbaaefffb556e) ) // (2006/10/23 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) +ROM_END + +ROM_START( futaribl ) // Title screen shows (c) 2007 despite the 2009 "master" date - Also prints "Another Ver" to the title screen - reworked & re-released for the Chinese market + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "futaribli_u4", 0x000000, 0x200000, CRC(1971dd16) SHA1(e75993f2978cbaaf925b4b8bb33d094a5a7cebf0) ) // (2009/11/27 INTERNATIONAL BL) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) +ROM_END + +ROM_START( futariblj ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "futariblk_u4", 0x000000, 0x200000, CRC(b9467b6d) SHA1(64782807fe69acb4ae028e36c5c689d8bd9b7857) ) // (2007/12/11 BLACK LABEL VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) // (2007/12/11 BLACK LABEL VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) +ROM_END + +// for newer revision CV1000-B PCB +ROM_START( ibara ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ibara_u4", 0x000000, 0x200000, CRC(d5fb6657) SHA1(4b2c9057cc765054232f520ee1c93495bc6b301e) ) // '06. 3. 7 ver. shown at service menu in special mode, still same as ibarao (2005/03/22 MASTER VER..) text at normal boot + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) // (2005/03/22 MASTER VER..) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(ee5e585d) SHA1(7eeba4ee693060e927f8c46b16e39227c6a62392) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(f0aa3cb6) SHA1(f9d137cd879e718811b2d21a0af2a9c6b7dca2f9) ) +ROM_END + +// for original/older revision CV1000-B PCB +ROM_START( ibarao ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ibarao_u4", 0x000000, 0x200000, CRC(8e6c155d) SHA1(38ac2107dc7824836e2b4e04c7180d5ae43c9b79) ) // (2005/03/22 MASTER VER..) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) // (2005/03/22 MASTER VER..) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(ee5e585d) SHA1(7eeba4ee693060e927f8c46b16e39227c6a62392) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(f0aa3cb6) SHA1(f9d137cd879e718811b2d21a0af2a9c6b7dca2f9) ) +ROM_END + +ROM_START( ibarablk ) // Title screen shows (c) 2005 despite the 2006 "master" date + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ibarablk_u4", 0x000000, 0x200000, CRC(ee1f1f77) SHA1(ac276f3955aa4dde2544af4912819a7ae6bcf8dd) ) // (2006/02/06. MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "ibarablk_u2", 0x000000, 0x8400000, CRC(5e46be44) SHA1(bed5f1bf452f2cac58747ecabec3c4392566a3a7) ) // (2006/02/06. MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.) +ROM_END + +ROM_START( ibarablka ) // Title screen shows (c) 2005 despite the 2006 "master" date + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ibarablka_u4", 0x000000, 0x200000, CRC(a9d43839) SHA1(507696e616608c05893c7ac2814b3365e9cb0720) ) // (2006/02/06 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "ibarablka_u2", 0x000000, 0x8400000, CRC(33400d96) SHA1(09c22b5431ac3726bf88c56efd970f56793f825a) ) // (2006/02/06 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.) +ROM_END + +ROM_START( deathsml ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(1a7b98bf) SHA1(07798a4a846e5802756396b34df47d106895c1f1) ) // (2007/10/09 MASTER VER) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(59ef5d78) SHA1(426e506b6d88948aa55aec71c0db6e91da3d490d) ) // (2007/10/09 MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(aab718c8) SHA1(0e636c46d06151abd6f73232bc479dafcafe5327) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(83881d84) SHA1(6e2294b247dfcbf0ced155dc45c706f29052775d) ) +ROM_END + +ROM_START( mmpork ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(d06cfa42) SHA1(5707feb4b3e5265daf5926f38c38612b24106f1f) ) // (2007/ 4/17 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(1ee961b8) SHA1(81a2eba704ac1cf7fc44fa7c6a3f50e3570c104f) ) // (2007/ 4/17 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4a4b36df) SHA1(5db5ce6fa47e5ca3263d4bd19315890c6d29df66) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(ce83d07b) SHA1(a5947467c8f5b7c4b0ad8e32df2ee29b787e355f) ) +ROM_END + +ROM_START( mmmbanc ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u4", 0x0000, 0x200000, CRC(5589d8c6) SHA1(43fbdb0effe2bc0e7135698757b6ee50200aecde) ) // (2007/06/05 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(2e38965a) SHA1(2b58d1cd1a3dbc261d4a46805d2ea015fe22c444) ) // (2007/06/05 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4caaa1bf) SHA1(9b92c13eac05601da4d9bb3eb727c156974e9f0c) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(8e3a51ba) SHA1(e34cf9acb13c3d8ca6cd1306b060b1d429872abd) ) +ROM_END + +ROM_START( pinkswts ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "pinkswts_u4", 0x0000, 0x200000, CRC(5d812c9e) SHA1(db821ec3892fd150513749d64a8b60bf147f3275) ) // (2006/04/06 MASTER VER....) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "pinkswts_u2", 0x000000, 0x8400000, CRC(a2fa5363) SHA1(5be327534840871592df523ac82ee1927bd79d67) ) // (2006/04/06 MASTER VER....) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) +ROM_END + +ROM_START( pinkswtsa ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "pnkswtsa_u4", 0x0000, 0x200000, CRC(ee3339b2) SHA1(995988d370731a7074b49ce8752525dadf06a954) ) // (2006/04/06 MASTER VER...) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "pnkswtsa_u2", 0x000000, 0x8400000, CRC(829a862e) SHA1(8c0ee2a0eb33b68869252fd68aed74820a904287) ) // (2006/04/06 MASTER VER...) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) +ROM_END + +ROM_START( pinkswtsb ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "pnkswtsb_u4", 0x0000, 0x200000, CRC(68bcc009) SHA1(2fef544b93c61161a37365f868b431d8262e4b21) ) // (2006/04/06 MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) +// ROM_LOAD( "pnkswtsb_u2", 0x000000, 0x8400000, BAD_DUMP CRC(a5666ed9) SHA1(682e06c84990225bc6bb0c9f38b5f46c4e36b430) ) // (2006/04/06 MASTER VER.) + ROM_LOAD( "pnkswtsx_u2", 0x000000, 0x8400000, CRC(91e4deb2) SHA1(893cb10d6f805df7cb4a1bb709a3ea6de147b7e9) ) // (2006/xx/xx MASTER VER.) and (2006/04/06 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) +ROM_END + +ROM_START( pinkswtsx ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "pnkswtsx_u4", 0x0000, 0x200000, CRC(8fe05bf0) SHA1(5cd45ac0e74690787c83d3fb383a65ed7cd47104) ) // (2006/xx/xx MASTER VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "pnkswtsx_u2", 0x000000, 0x8400000, CRC(91e4deb2) SHA1(893cb10d6f805df7cb4a1bb709a3ea6de147b7e9) ) // (2006/xx/xx MASTER VER.) and (2006/04/06 MASTER VER.) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) +ROM_END + +// modification based on 2006/04/06 MASTER VER.... +// This set is dumped from bootleg PCB with pre-patched Suicide Club hack, These CRC32 checksums are matches compares to authors homepage's one. +ROM_START( pinkswtssc ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "suicideclub.u4", 0x0000, 0x200000, CRC(5e03662f) SHA1(b974204b8dcd55fc1b7775f7c1806150919caff3) ) // (2017/10/31 SUICIDECLUB VER.) + ROM_RELOAD(0x200000,0x200000) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "suicideclub.u2", 0x000000, 0x8400000, CRC(32324608) SHA1(cec1416c943520cb3f91eb295e2ba864a0db7d45) ) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) +ROM_END + +ROM_START( ddpdfk ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ddpdfk_u4", 0x0000, 0x400000, CRC(9976d699) SHA1(9dfe9d1daf6f638cafce8cdc5230209e2bcb7522) ) // (2008/06/23 MASTER VER 1.5) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "ddpdfk_u2", 0x000000, 0x8400000, CRC(84a51a4f) SHA1(291a6279c0746d2eb8630e7d6d886043f0cfdd94) ) // (2008/06/23 MASTER VER 1.5) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(a6178c2c) SHA1(7742ad1de2e4b0d0206ad11d467ea35da36352df) ) +ROM_END + +ROM_START( ddpdfk10 ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "ddpdfk10_u4", 0x0000, 0x400000, CRC(a3d650b2) SHA1(46a7551760e18c2cecd372c3f4be16f6600efc2c) ) // (2008/05/16 MASTER VER) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "ddpdfk10_u2", 0x000000, 0x8400000, CRC(d349cb2a) SHA1(c364c36b69b93f8f62390f185d044f51056669ff) ) // (2008/05/16 MASTER VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(a6178c2c) SHA1(7742ad1de2e4b0d0206ad11d467ea35da36352df) ) +ROM_END + +ROM_START( dsmbl ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(77fc5ad1) SHA1(afe044fc16e9494143c876879b033caccd08cf22) ) // (2008/10/06 MEGABLACK LABEL VER) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(d6b85b7a) SHA1(4674f6ad07f6a03904ca3d05060816b8fe061add) ) // (2008/10/06 MEGABLACK LABEL VER) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a9536a6a) SHA1(4b9dcaf6803b1fcfdf73ae9daabc4508fec71631) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(3b673326) SHA1(1ae847eb4e752fef1d72081d82344f0ad0537c31) ) +ROM_END + +ROM_START( dfkbl ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(8092ca9d) SHA1(75e16cd7c8d0f9c715115ce12da5c245fbcd2416) ) // (2010/1/18 BLACK LABEL) + + ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) + ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(29f9d73a) SHA1(ed978ab5e3ad8c05e7778a91bfb5aaa17b0f72d9) ) + + ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) + ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(36d4093b) SHA1(4aed7e2f7c0d2c9bceeb110a9907d8d99d55f4c3) ) + ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(31f9eb0a) SHA1(322158779e969bb321241065dd49c1167b91ff6c) ) +ROM_END + +// ROM_START( akatana ) +// ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) +// ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(613fd380) SHA1(6e28480eef3b483d00b42d811a9d2c7fa1097924) ) // (2010/ 8/13 MASTER VER.) + +// ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) +// ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(89a2e1a5) SHA1(e6f4ec974406283665697fdd52bd606d0337dd11) ) + +// ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) +// ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(34a67e24) SHA1(78a7e82123b86311f1116a80c39f147b8b695549) ) +// ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(10760fed) SHA1(b70f4506c00f3901ff38f5efd4b897af1afc7a0c) ) +// ROM_END + +// ROM_START( ddpsdoj ) +// ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) +// ROM_LOAD16_WORD_SWAP("u4", 0x000000, 0x400000, CRC(e2a4411c) SHA1(f8b2b6326dd8eeae99b8b1ab2bd5a3f0b9c7f027) ) +// ROM_IGNORE( 0x000100 ) // Flash extra bytes + +// ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) +// ROM_LOAD("u2", 0x000000, 0x8400000, CRC(668e4cd6) SHA1(da0b10865df3a3e46cf8a109ca88a551faba4483) ) + +// ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) +// ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(ac94801c) SHA1(cbcc6d5d89860bc961967e1d3b7c329adaf200c5) ) +// ROM_IGNORE( 0x000100 ) // Flash extra bytes +// ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(f593045b) SHA1(91b92870d0dd2a7817cb0059cc750e2393686f4c) ) +// ROM_IGNORE( 0x000100 ) // Flash extra bytes +// ROM_END + +uint64_t cv1k_state::speedup_r() +{ + const offs_t pc = m_maincpu->pc(); + + if (pc == m_idlepc || pc == m_idlepc + 2) + m_maincpu->spin_until_time(attotime::from_usec(10)); + + return m_ram[m_idleramoffs / 8]; +} + +void cv1k_state::install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_typed) +{ + m_idleramoffs = idleramoff; + m_idlepc = idlepc; + + m_maincpu->sh2drc_set_options(SH2DRC_FASTEST_OPTIONS); + + m_maincpu->sh2drc_add_pcflush(idlepc+2); + + m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000000+m_idleramoffs, 0xc000000+m_idleramoffs+7, read64smo_delegate(*this, FUNC(cv1k_state::speedup_r))); + + m_maincpu->sh2drc_add_fastram(0x00000000, 0x003fffff, true, m_rombase); + + m_maincpu->sh2drc_add_fastram(0x0c000000, 0x0c000000+m_idleramoffs-1, false, m_ram); + m_maincpu->sh2drc_add_fastram(0x0c000000+m_idleramoffs+8, is_typed ? 0x0cffffff : 0x0c7fffff, false, m_ram + ((m_idleramoffs+8)/8)); +} + + +void cv1k_state::init_mushisam() +{ + install_speedups(0x024d8, 0xc04a2aa, false); +} + +void cv1k_state::init_ibara() +{ + install_speedups(0x022f0, 0xc04a0aa, false); +} + +void cv1k_state::init_espgal2() +{ + install_speedups(0x02310, 0xc05177a, false); +} + +void cv1k_state::init_mushitam() +{ + install_speedups(0x0022f0, 0xc04a0da, false); +} + +void cv1k_state::init_pinkswts() +{ + install_speedups(0x02310, 0xc05176a, false); +} + +void cv1k_state::init_deathsml() +{ + install_speedups(0x02310, 0xc0519a2, false); +} + +void cv1k_state::init_ddpdfk() +{ + install_speedups(0x02310, 0xc1d1346, true); +} + + +} // anonymous namespace + + +// The black label versions are intentionally not set as clones, they were re-releases with different game codes, not bugfixes. + +// CA011 Mushihime-Sama +GAME( 2004, mushisam, 0, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12.MASTER VER.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2004, mushisama, mushisam, cv1k, cv1k, cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2004, mushisamb, mushisam, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER)", MACHINE_IMPERFECT_TIMING ) + +// CA012 Ibara +GAME( 2005, ibara, 0, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER.., '06. 3. 7 ver.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2005, ibarao, ibara, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER..)", MACHINE_IMPERFECT_TIMING ) + +// CA012B Ibara Kuro Black Label +GAME( 2006, ibarablk, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06. MASTER VER.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, ibarablka, ibarablk, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) + +// CA013 Espgaluda II +GAME( 2005, espgal2, 0, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14.MASTER VER.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2005, espgal2a, espgal2, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, newer CV1000-B PCB)", MACHINE_IMPERFECT_TIMING ) +GAME( 2005, espgal2b, espgal2, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, original CV1000-B PCB)", MACHINE_IMPERFECT_TIMING ) + +// CA??? Puzzle! Mushihime-Tama +GAME( 2005, mushitam, 0, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09.MASTER VER)", MACHINE_IMPERFECT_TIMING ) +GAME( 2005, mushitama, mushitam, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09 MASTER VER)", MACHINE_IMPERFECT_TIMING ) + +// CA014 Pink Sweets: Ibara Sorekara +GAME( 2006, pinkswts, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER....)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, pinkswtsa, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER...)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, pinkswtsb, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, pinkswtsx, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/xx/xx MASTER VER.)", MACHINE_IMPERFECT_TIMING ) // defaults to freeplay, possibly bootlegged from show/dev version? +GAME( 2017, pinkswtssc, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "bootleg (Four Horsemen)", "Pink Sweets: Suicide Club (2017/10/31 SUICIDECLUB VER., bootleg)", MACHINE_IMPERFECT_TIMING ) // dumped from bootleg with pre-patched hack + +// CA015 Mushihime-Sama Futari +GAME( 2006, futari15, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, futari15a, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", MACHINE_IMPERFECT_TIMING ) +GAME( 2006, futari10, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) + +// CA015B Mushihime-Sama Futari Black Label +GAME( 2007, futaribl, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label - Another Ver (2009/11/27 INTERNATIONAL BL)", MACHINE_IMPERFECT_TIMING ) // re-released for Chinese market +GAME( 2007, futariblj, futaribl, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", MACHINE_IMPERFECT_TIMING ) + +// CA016 Muchi Muchi Pork! +GAME( 2007, mmpork, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Muchi Muchi Pork! (2007/ 4/17 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) + +// CA017 Deathsmiles +GAME( 2007, deathsml, 0, cv1k, cv1k, cv1k_state, init_deathsml, ROT0, "Cave (AMI license)", "Deathsmiles (2007/10/09 MASTER VER)", MACHINE_IMPERFECT_TIMING ) + +// CA017B Deathsmiles Black Label +GAME( 2008, dsmbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave (AMI license)", "Deathsmiles MegaBlack Label (2008/10/06 MEGABLACK LABEL VER)", MACHINE_IMPERFECT_TIMING ) + +// CA019 Do-Don-Pachi Dai-Fukkatsu +GAME( 2008, ddpdfk, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.5 (2008/06/23 MASTER VER 1.5)", MACHINE_IMPERFECT_TIMING ) +GAME( 2008, ddpdfk10, ddpdfk, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.0 (2008/05/16 MASTER VER)", MACHINE_IMPERFECT_TIMING ) + +// CA019B Do-Don-Pachi Dai-Fukkatsu Black Label +GAME( 2010, dfkbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave", "DoDonPachi Dai-Fukkatsu Black Label (2010/1/18 BLACK LABEL)", MACHINE_IMPERFECT_TIMING ) + +// CA021 Akai Katana +//GAME( 2010, akatana, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave", "Akai Katana (2010/ 8/13 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) + +// CA??? DoDonPachi SaiDaiOuJou +//GAME( 2012, ddpsdoj, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave", "DoDonPachi SaiDaiOuJou (2012/ 4/20)", MACHINE_IMPERFECT_TIMING ) + +// CMDL01 Medal Mahjong Moukari Bancho +GAME( 2007, mmmbanc, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT0, "Cave (AMI license)", "Medal Mahjong Moukari Bancho (2007/06/05 MASTER VER.)", MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,991 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Luca Elia, MetalliC +// emulation of Altera Cyclone EP1C12 FPGA programmed as a blitter + +#include "emu.h" +#include "ep1c12.h" + +#include "screen.h" + +#define LOG_DEBUG (1U << 1) + +//#define VERBOSE (LOG_DEBUG) +#include "logmacro.h" + +#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) + + +DEFINE_DEVICE_TYPE(EP1C12, ep1c12_device, "ep1c12", "EP1C12 Blitter") + +static constexpr int EP1C_VRAM_CLK_NANOSEC = 13; +static constexpr int EP1C_SRAM_CLK_NANOSEC = 20; +static constexpr int EP1C_VRAM_H_LINE_PERIOD_NANOSEC = 63600; +static constexpr int EP1C_VRAM_H_LINE_DURATION_NANOSEC = 2160; +static constexpr int EP1C_FRAME_DURATION_NANOSEC = 16666666; +static constexpr int EP1C_DRAW_OPERATION_SIZE_BYTES = 20; +static constexpr int EP1C_CLIP_OPERATION_SIZE_BYTES = 2; + +// When looking at VRAM viewer in Special mode in Muchi Muchi Pork, draws 32 pixels outside of +// the "clip area" is visible. This is likely why the frame buffers will have at least a 32 pixel offset +// from the VRAM borders or other buffers in all games. +static constexpr int EP1C_CLIP_MARGIN = 32; + +ep1c12_device::ep1c12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, EP1C12, tag, owner, clock) + , device_video_interface(mconfig, *this) + , m_ram16(nullptr), m_gfx_size(0), m_bitmaps(nullptr), m_use_ram(nullptr) + , m_main_ramsize(0), m_main_rammask(0), m_ram16_copy(nullptr), m_work_queue(nullptr) + , m_maincpu(*this, finder_base::DUMMY_TAG) + , m_port_r_cb(*this, 0) +{ + m_blitter_request = nullptr; + m_blitter_delay_timer = nullptr; + m_blitter_busy = 0; + m_gfx_addr = 0; + m_gfx_scroll_x = 0; + m_gfx_scroll_y = 0; + m_gfx_clip_x = 0; + m_gfx_clip_y = 0; + m_gfx_addr_shadowcopy = 0; + m_gfx_clip_x_shadowcopy = 0; + m_gfx_clip_y_shadowcopy = 0; + m_blit_delay_ns = 0; + m_blit_idle_op_bytes = 0; +} + +TIMER_CALLBACK_MEMBER(ep1c12_device::blitter_delay_callback) +{ + m_blitter_busy = 0; +} + + +void ep1c12_device::device_start() +{ + m_gfx_size = 0x2000 * 0x1000; + m_bitmaps = std::make_unique(0x2000, 0x1000); + m_clip = m_bitmaps->cliprect(); + m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); + +#if DEBUG_VRAM_VIEWER + m_debug_vram_view_en = false; + m_prev_screen_width = m_curr_screen_width = screen().width(); + m_prev_screen_height = m_curr_screen_height = screen().height(); + m_prev_screen_visarea = m_curr_screen_visarea = screen().visible_area(); +#endif + + m_ram16_copy = std::make_unique(m_main_ramsize / 2); + + m_blitter_delay_timer = timer_alloc(FUNC(ep1c12_device::blitter_delay_callback), this); + m_blitter_delay_timer->adjust(attotime::never); + + m_firmware_pos = 0; + m_firmware.clear(); + m_firmware.resize(290405, 0); + m_firmware_port = 0; + m_firmware_version = -1; + + save_item(NAME(m_gfx_addr)); + save_item(NAME(m_gfx_scroll_x)); + save_item(NAME(m_gfx_scroll_y)); + save_item(NAME(m_gfx_clip_x)); + save_item(NAME(m_gfx_clip_y)); + save_item(NAME(m_gfx_addr_shadowcopy)); + save_item(NAME(m_gfx_clip_x_shadowcopy)); + save_item(NAME(m_gfx_clip_y_shadowcopy)); + save_pointer(NAME(m_ram16_copy), m_main_ramsize/2); + save_item(NAME(*m_bitmaps)); + save_item(NAME(m_firmware_pos)); + save_item(NAME(m_firmware_port)); + save_item(NAME(m_firmware)); + save_item(NAME(m_firmware_version)); + save_item(NAME(m_blit_delay_ns)); + save_item(NAME(m_blit_idle_op_bytes)); +} + +void ep1c12_device::device_reset() +{ + m_use_ram = m_ram16_copy.get(); + m_work_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_HIGH_FREQ); + + // cache table to avoid divides in blit code, also pre-clamped + for (int y = 0; y < 0x40; y++) + { + for (int x = 0; x < 0x20; x++) + { + colrtable[x][y] = std::min((x * y) / 0x1f, 0x1f); + colrtable_rev[x ^ 0x1f][y] = std::min((x * y) / 0x1f, 0x1f); + } + } + + // preclamped add table + for (int y = 0; y < 0x20; y++) + { + for (int x = 0; x < 0x20; x++) + { + colrtable_add[x][y] = std::min((x + y), 0x1f); + } + } + + m_blitter_busy = 0; +} + +// TODO: get these into the device class without ruining performance +u8 ep1c12_device::colrtable[0x20][0x40]; +u8 ep1c12_device::colrtable_rev[0x20][0x40]; +u8 ep1c12_device::colrtable_add[0x20][0x20]; + +inline u16 ep1c12_device::READ_NEXT_WORD(offs_t *addr) +{ +// u16 data = space.read_word(*addr); // going through the memory system is 'more correct' but noticeably slower + const u16 data = m_use_ram[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)]; + + *addr += 2; + + return data; +} + +inline u16 ep1c12_device::COPY_NEXT_WORD(address_space &space, offs_t *addr) +{ +// u16 data = space.read_word(*addr); // going through the memory system is 'more correct' but noticeably slower + const u16 data = m_ram16[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)]; + m_ram16_copy[((*addr & m_main_rammask) >> 1) ^ NATIVE_ENDIAN_VALUE_LE_BE(3, 0)] = data; + + *addr += 2; + + return data; +} + +/* + Upload command + This command uploads gfx data to VRAM, from Main CPU RAM. + + Offset Bits Description + fedcba98 76543210 + 00 0010---- -------- 0x2 for upload + ----0000 00000000 Fixed for upload? + 02 00000000 00000000 "" + 04 10011001 10011001 "" + 06 10011001 10011001 "" + 08 ---xxxxx xxxxxxxx Destination X start position + 0a ----xxxx xxxxxxxx Destination Y start position + 0c ---xxxxx xxxxxxxx Source Width + 0e ----xxxx xxxxxxxx Source Height + 10...10 + (Width * Height * 2) Source GFX data (ARGB1555 format) +*/ + +inline void ep1c12_device::gfx_upload_shadow_copy(address_space &space, offs_t *addr) +{ + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + + const u32 dimx = (COPY_NEXT_WORD(space, addr) & 0x1fff) + 1; + const u32 dimy = (COPY_NEXT_WORD(space, addr) & 0x0fff) + 1; + + for (u32 y = 0; y < dimy; y++) + { + for (u32 x = 0; x < dimx; x++) + { + COPY_NEXT_WORD(space, addr); + } + } + + // Time spent on uploads is mostly due to Main RAM accesses. + // The Blitter will send BREQ requests to the SH-3, to access Main RAM + // and then write it to VRAM. + // The number of bytes to read are the sum of a 16b fixed header and the pixel + // data (2 byte per pixel). RAM accesses are 32bit, so divide by four for clocks. + // + // TODO: There's additional overhead to these request thats are not included. The BREQ + // assertion also puts CPU into WAIT, if it needs uncached RAM accesses. + int num_sram_clk = (16 + dimx * dimy * 2 ) / 4; + m_blit_delay_ns += num_sram_clk * EP1C_SRAM_CLK_NANOSEC; + m_blit_idle_op_bytes = 0; +} + +inline void ep1c12_device::gfx_upload(offs_t *addr) +{ + // 0x20000000 + READ_NEXT_WORD(addr); + READ_NEXT_WORD(addr); + + // 0x99999999 + READ_NEXT_WORD(addr); + READ_NEXT_WORD(addr); + + u32 dst_x_start = READ_NEXT_WORD(addr); + u32 dst_y_start = READ_NEXT_WORD(addr); + + u32 dst_p = 0; + dst_x_start &= 0x1fff; + dst_y_start &= 0x0fff; + + const u32 dimx = (READ_NEXT_WORD(addr) & 0x1fff) + 1; + const u32 dimy = (READ_NEXT_WORD(addr) & 0x0fff) + 1; + + logerror("GFX COPY: DST %02X,%02X,%03X DIM %02X,%03X\n", dst_p,dst_x_start,dst_y_start, dimx,dimy); + + for (u32 y = 0; y < dimy; y++) + { + u32 *dst = &m_bitmaps->pix(dst_y_start + y, 0); + dst += dst_x_start; + + for (u32 x = 0; x < dimx; x++) + { + const u16 pendat = READ_NEXT_WORD(addr); + // real hw would upload the gfxword directly, but our VRAM is 32-bit, so convert it. + //dst[dst_x_start + x] = pendat; + *dst++ = ((pendat & 0x8000) << 14) | ((pendat & 0x7c00) << 9) | ((pendat & 0x03e0) << 6) | ((pendat & 0x001f) << 3); // --t- ---- rrrr r--- gggg g--- bbbb b--- format + //dst[dst_x_start + x] = ((pendat & 0x8000) << 14) | ((pendat & 0x7c00) << 6) | ((pendat & 0x03e0) << 3) | ((pendat & 0x001f) << 0); // --t- ---- ---r rrrr ---g gggg ---b bbbb format + } + } +} + +#define draw_params m_bitmaps.get(), &m_clip, &m_bitmaps->pix(0,0),src_x,src_y, x,y, dimx,dimy, flipy, s_alpha, d_alpha, &tint_clr + + +const ep1c12_device::blitfunction ep1c12_device::f0_ti1_tr1_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d0, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d0, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d1, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d1, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d2, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d2, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d3, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d3, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d4, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d4, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d5, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d5, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d6, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d6, + ep1c12_device::draw_sprite_f0_ti1_tr1_s0_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s1_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s2_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s3_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s4_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s5_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s6_d7, ep1c12_device::draw_sprite_f0_ti1_tr1_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f0_ti1_tr0_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d0, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d0, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d1, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d1, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d2, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d2, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d3, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d3, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d4, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d4, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d5, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d5, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d6, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d6, + ep1c12_device::draw_sprite_f0_ti1_tr0_s0_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s1_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s2_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s3_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s4_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s5_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s6_d7, ep1c12_device::draw_sprite_f0_ti1_tr0_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f1_ti1_tr1_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d0, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d0, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d1, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d1, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d2, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d2, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d3, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d3, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d4, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d4, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d5, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d5, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d6, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d6, + ep1c12_device::draw_sprite_f1_ti1_tr1_s0_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s1_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s2_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s3_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s4_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s5_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s6_d7, ep1c12_device::draw_sprite_f1_ti1_tr1_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f1_ti1_tr0_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d0, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d0, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d1, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d1, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d2, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d2, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d3, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d3, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d4, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d4, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d5, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d5, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d6, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d6, + ep1c12_device::draw_sprite_f1_ti1_tr0_s0_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s1_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s2_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s3_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s4_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s5_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s6_d7, ep1c12_device::draw_sprite_f1_ti1_tr0_s7_d7, +}; + + +const ep1c12_device::blitfunction ep1c12_device::f0_ti0_tr1_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d0, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d0, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d1, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d1, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d2, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d2, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d3, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d3, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d4, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d4, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d5, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d5, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d6, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d6, + ep1c12_device::draw_sprite_f0_ti0_tr1_s0_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s1_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s2_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s3_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s4_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s5_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s6_d7, ep1c12_device::draw_sprite_f0_ti0_tr1_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f0_ti0_tr0_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d0, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d0, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d1, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d1, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d2, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d2, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d3, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d3, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d4, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d4, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d5, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d5, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d6, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d6, + ep1c12_device::draw_sprite_f0_ti0_tr0_s0_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s1_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s2_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s3_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s4_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s5_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s6_d7, ep1c12_device::draw_sprite_f0_ti0_tr0_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f1_ti0_tr1_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d0, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d0, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d1, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d1, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d2, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d2, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d3, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d3, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d4, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d4, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d5, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d5, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d6, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d6, + ep1c12_device::draw_sprite_f1_ti0_tr1_s0_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s1_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s2_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s3_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s4_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s5_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s6_d7, ep1c12_device::draw_sprite_f1_ti0_tr1_s7_d7, +}; + +const ep1c12_device::blitfunction ep1c12_device::f1_ti0_tr0_blit_funcs[64] = +{ + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d0, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d0, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d1, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d1, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d2, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d2, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d3, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d3, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d4, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d4, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d5, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d5, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d6, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d6, + ep1c12_device::draw_sprite_f1_ti0_tr0_s0_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s1_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s2_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s3_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s4_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s5_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s6_d7, ep1c12_device::draw_sprite_f1_ti0_tr0_s7_d7, +}; + +/* + Calculate number of VRAM row accesses a draw will perform. + Source data will typically be aligned well with VRAM, but this is not the case for the destination. + As an example, drawing a 64x32 pixel image will usually read from two VRAM rows for source data, + but if the destination start coordinate is (x=10, y=10), each of the 32x32px chunks of source data will + touch 4 rows of destination VRAM, leading to a total of 8 destination VRAM accesses. +*/ +inline u16 calculate_vram_accesses(u16 start_x, u16 start_y, u16 dimx, u16 dimy) +{ + int x_rows = 0; + int num_vram_rows = 0; + for (int x_pixels = dimx; x_pixels > 0; x_pixels -= 32) + { + x_rows++; + if (((start_x & 31) + std::min(32, x_pixels)) > 32) + x_rows++; // Drawing across multiple horizontal VRAM row boundaries. + } + for (int y_pixels = dimy; y_pixels > 0; y_pixels -= 32) + { + num_vram_rows += x_rows; + if (((start_y & 31) + std::min(32, y_pixels)) > 32) + num_vram_rows += x_rows; // Drawing across multiple vertical VRAM row boundaries. + } + return num_vram_rows; +} + +/* + Draw command + This command draws gfx data. + + Offset Bits Description + fedcba98 76543210 + 00 0001---- -------- 0x1 for draw + ----x--- -------- Flip X + -----x-- -------- Flip Y + ------x- -------- Enable Blending + -------x -------- Enable Transparent + -------- -xxx---- Source Blending mode + -------- -----xxx Destination Blending mode + 02 xxxxxxxx -------- Source Alpha value + -------- xxxxxxxx Destination Alpha value + 04 ---xxxxx xxxxxxxx Source X start position + 06 ----xxxx xxxxxxxx Source Y start position + 08 sxxxxxxx xxxxxxxx Destination X start position + 0a sxxxxxxx xxxxxxxx Destination Y start position + 0c ---xxxxx xxxxxxxx Source Width + 0e ----xxxx xxxxxxxx Source Height + 10 -------- xxxxxxxx Source Red multiplication (0x80 = 100%) + 12 xxxxxxxx -------- Source Green multiplication (0x80 = 100%) + -------- xxxxxxxx Source Blue multiplication (0x80 = 100%) + + Blending mode (description from ibara test mode) + 000 +alpha + 001 +source + 010 +destination + 100 -alpha + 101 -source + 110 -destination + others are reserved/disable? +*/ + +inline void ep1c12_device::gfx_draw_shadow_copy(address_space &space, offs_t *addr) +{ + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + u16 src_x_start = COPY_NEXT_WORD(space, addr); + u16 src_y_start = COPY_NEXT_WORD(space, addr); + u16 dst_x_start = COPY_NEXT_WORD(space, addr); + u16 dst_y_start = COPY_NEXT_WORD(space, addr); + u16 src_dimx = (COPY_NEXT_WORD(space, addr) & 0x1fff) + 1; + u16 src_dimy = (COPY_NEXT_WORD(space, addr) & 0x0fff) + 1; + COPY_NEXT_WORD(space, addr); + COPY_NEXT_WORD(space, addr); + + // Calculate Blitter delay for the Draw operation. + // On real hardware, the Blitter will read operations into a FIFO queue + // by asserting BREQ on the SH3 and then reading from Main RAM. + // Since the reads are done concurrently to executions of operations, its + // ok to estimate the delay all at once instead for emulation purposes. + + u16 dst_x_end = dst_x_start + src_dimx - 1; + u16 dst_y_end = dst_y_start + src_dimy - 1; + + // Sprites fully outside of clipping area should not be drawn. + if (dst_x_start > m_clip.max_x || dst_x_end < m_clip.min_x || dst_y_start > m_clip.max_y || dst_y_end < m_clip.min_y) + { + idle_blitter(EP1C_DRAW_OPERATION_SIZE_BYTES); + return; + } + + // Clip the blitter operations, to have the calculations only respect the area being written. + // It's not 100% clear this is how this is performed, but it is clear that there should be some amount of clipping + // applied here to match the hardware. This way seems most likely, and maps well to the delays seen on hardware. + // One example of this being utilized heavily is the transparent fog in Mushihimesama Futari Stage 1. This is drawn as + // 256x256 sprites, with large parts clipped away. + dst_x_start = std::max(dst_x_start, (u16)m_clip.min_x); + dst_y_start = std::max(dst_y_start, (u16)m_clip.min_y); + dst_x_end = std::min(dst_x_end, (u16)m_clip.max_x); + dst_y_end = std::min(dst_y_end, (u16)m_clip.max_y); + src_dimx = dst_x_end - dst_x_start + 1; + src_dimy = dst_y_end - dst_y_start + 1; + + m_blit_idle_op_bytes = 0; // Blitter no longer idle. + + // VRAM data is laid out in 32x32 pixel rows. Calculate amount of rows accessed. + int src_num_vram_rows = calculate_vram_accesses(src_x_start, src_y_start, src_dimx, src_dimy); + int dst_num_vram_rows = calculate_vram_accesses(dst_x_start, dst_y_start, src_dimx, src_dimy); + + // Since draws are done 4 pixels at the time, extend the draw area to coordinates aligned for this. + // Doing this after VRAM calculations simplify things a bit, and these extensions will never make the + // destination area span additional VRAM rows. + dst_x_start -= dst_x_start & 3; + dst_x_end += (4 - ((dst_x_end + 1) & 3)) & 3; + u16 dst_dimx = dst_x_end - dst_x_start + 1; + u16 dst_dimy = dst_y_end - dst_y_start + 1; + + // Number of VRAM CLK cycles needed to draw a sprite is sum of: + // - Number of pixels read from source divided by 4 (Each CLK reads 4 pixels, since 32bit DDR). + // - Number of pixels read from destination divided by 4. + // - Pixels written to destination divided by 4. + // - VRAM access overhead: + // - 6 CLK of overhead after each read from a source VRAM row. + // - 20 CLK of overhead between read and write of each destination VRAM row. + // - 11 CLK of overhead after each write to a destination VRAM row. + // - 12 CLK of additional overhead per sprite at the end of writing. + // Note: Details are from https://buffis.com/docs/CV1000_Blitter_Research_by_buffi.pdf + // There may be mistakes. + u32 num_vram_clk = src_dimx * src_dimy / 4 + dst_dimx * dst_dimy / 2 + src_num_vram_rows * 6 + dst_num_vram_rows * (20 + 11) + 12; + m_blit_delay_ns += num_vram_clk * EP1C_VRAM_CLK_NANOSEC; +} + +inline void ep1c12_device::gfx_draw(offs_t *addr) +{ + clr_t tint_clr; + bool tinted = false; + + const u16 attr = READ_NEXT_WORD(addr); + const u16 alpha = READ_NEXT_WORD(addr); + u16 src_x = READ_NEXT_WORD(addr); + u16 src_y = READ_NEXT_WORD(addr); + const u16 dst_x_start = READ_NEXT_WORD(addr); + const u16 dst_y_start = READ_NEXT_WORD(addr); + const u16 w = READ_NEXT_WORD(addr); + const u16 h = READ_NEXT_WORD(addr); + const u16 tint_r = READ_NEXT_WORD(addr); + const u16 tint_gb = READ_NEXT_WORD(addr); + + // 0: +alpha + // 1: +source + // 2: +dest + // 3: * + // 4: -alpha + // 5: -source + // 6: -dest + // 7: * + + const u8 d_mode = attr & 0x0007; + const u8 s_mode = (attr & 0x0070) >> 4; + + const bool trans = attr & 0x0100; + bool blend = attr & 0x0200; + + const bool flipy = attr & 0x0400; + const bool flipx = attr & 0x0800; + + const u8 d_alpha = ((alpha & 0x00ff) ) >> 3; + const u8 s_alpha = ((alpha & 0xff00) >> 8) >> 3; + +// int src_p = 0; + src_x = src_x & 0x1fff; + src_y = src_y & 0x0fff; + + + const int x = (dst_x_start & 0x7fff) - (dst_x_start & 0x8000); + const int y = (dst_y_start & 0x7fff) - (dst_y_start & 0x8000); + + const int dimx = (w & 0x1fff) + 1; + const int dimy = (h & 0x0fff) + 1; + + // convert parameters to clr + + tint_to_clr(tint_r & 0x00ff, (tint_gb >> 8) & 0xff, tint_gb & 0xff, &tint_clr); + + /* interestingly this gets set to 0x20 for 'normal' not 0x1f */ + + if (tint_clr.r != 0x20) + tinted = true; + + if (tint_clr.g != 0x20) + tinted = true; + + if (tint_clr.b != 0x20) + tinted = true; + + // surprisingly frequent, need to verify if it produces a worthwhile speedup tho. + if ((s_mode == 0 && s_alpha == 0x1f) && (d_mode == 4 && d_alpha == 0x1f)) + blend = false; + + if (tinted) + { + if (!flipx) + { + if (trans) + { + if (!blend) + { + draw_sprite_f0_ti1_tr1_plain(draw_params); + } + else + { + f0_ti1_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + else + { + if (!blend) + { + draw_sprite_f0_ti1_tr0_plain(draw_params); + } + else + { + f0_ti1_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + } + else // flipx + { + if (trans) + { + if (!blend) + { + draw_sprite_f1_ti1_tr1_plain(draw_params); + } + else + { + f1_ti1_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + else + { + if (!blend) + { + draw_sprite_f1_ti1_tr0_plain(draw_params); + } + else + { + f1_ti1_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + } + } + else + { + if (blend == 0 && tinted == 0) + { + if (!flipx) + { + if (trans) + { + draw_sprite_f0_ti0_tr1_simple(draw_params); + } + else + { + draw_sprite_f0_ti0_tr0_simple(draw_params); + } + } + else + { + if (trans) + { + draw_sprite_f1_ti0_tr1_simple(draw_params); + } + else + { + draw_sprite_f1_ti0_tr0_simple(draw_params); + } + + } + + return; + } + + //printf("smode %d dmode %d\n", s_mode, d_mode); + + if (!flipx) + { + if (trans) + { + if (!blend) + { + draw_sprite_f0_ti0_plain(draw_params); + } + else + { + f0_ti0_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + else + { + if (!blend) + { + draw_sprite_f0_ti0_tr0_plain(draw_params); + } + else + { + f0_ti0_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + } + else // flipx + { + if (trans) + { + if (!blend) + { + draw_sprite_f1_ti0_plain(draw_params); + } + else + { + f1_ti0_tr1_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + else + { + if (!blend) + { + draw_sprite_f1_ti0_tr0_plain(draw_params); + } + else + { + f1_ti0_tr0_blit_funcs[s_mode | (d_mode << 3)](draw_params); + } + } + } + } + +} + + +void ep1c12_device::gfx_create_shadow_copy(address_space &space) +{ + offs_t addr = m_gfx_addr & 0x1fffffff; + + m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, + m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); + while (1) + { + // request commands from main CPU RAM + const u16 data = COPY_NEXT_WORD(space, &addr); + + switch (data & 0xf000) + { + case 0x0000: + case 0xf000: + return; + + case 0xc000: + if (COPY_NEXT_WORD(space, &addr)) // cliptype + m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, + m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); + else + m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); + idle_blitter(EP1C_CLIP_OPERATION_SIZE_BYTES); + break; + + case 0x2000: + addr -= 2; + gfx_upload_shadow_copy(space, &addr); + break; + + case 0x1000: + addr -= 2; + gfx_draw_shadow_copy(space, &addr); + break; + + default: + popmessage("GFX op = %04X", data); + return; + } + } +} + + +void ep1c12_device::gfx_exec() +{ + offs_t addr = m_gfx_addr_shadowcopy & 0x1fffffff; + m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, + m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); + +// logerror("GFX EXEC: %08X\n", addr); + + while (1) + { + // request commands from main CPU RAM + const u16 data = READ_NEXT_WORD(&addr); + + switch (data & 0xf000) + { + case 0x0000: + case 0xf000: + return; + + case 0xc000: + if (READ_NEXT_WORD(&addr)) // cliptype + m_clip.set(m_gfx_clip_x_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_x_shadowcopy + 320 - 1 + EP1C_CLIP_MARGIN, + m_gfx_clip_y_shadowcopy - EP1C_CLIP_MARGIN, m_gfx_clip_y_shadowcopy + 240 - 1 + EP1C_CLIP_MARGIN); + else + m_clip.set(0, 0x2000 - 1, 0, 0x1000 - 1); + break; + + case 0x2000: + addr -= 2; + gfx_upload(&addr); + break; + + case 0x1000: + addr -= 2; + gfx_draw(&addr); + break; + + default: + popmessage("GFX op = %04X", data); + return; + } + } +} + +void *ep1c12_device::blit_request_callback(void *param, int threadid) +{ + ep1c12_device *object = reinterpret_cast(param); + object->gfx_exec(); + return nullptr; +} + + +u32 ep1c12_device::gfx_ready_r() +{ + return m_blitter_busy ? 0x00000000 : 0x00000010; +} + +void ep1c12_device::gfx_exec_w(address_space &space, offs_t offset, u32 data, u32 mem_mask) +{ + if (ACCESSING_BITS_0_7) + { + if (data & 1) + { + // make sure we've not already got a request running + if (m_blitter_request) + { + int result; + do + { + result = osd_work_item_wait(m_blitter_request, 1000); + } while (result == 0); + osd_work_item_release(m_blitter_request); + } + + m_gfx_clip_x_shadowcopy = m_gfx_clip_x; + m_gfx_clip_y_shadowcopy = m_gfx_clip_y; + + // Create a copy of the blit list so we can safely thread it. + // Copying the Blitter operations will also estimate the delay needed for processing. + m_blit_delay_ns = 0; + gfx_create_shadow_copy(space); + + // Every EP1C_VRAM_H_LINE_PERIOD_NANOSEC, the Blitter will block other operations, due + // to fetching a horizontal line from VRAM for output. + m_blit_delay_ns += std::floor( m_blit_delay_ns / EP1C_VRAM_H_LINE_PERIOD_NANOSEC ) * EP1C_VRAM_H_LINE_DURATION_NANOSEC; + + // Check if Blitter takes longer than a frame to render. + // In practice, there's a bit less time than this to allow for lack of slowdown but + // for debugging purposes this is an ok approximation. + if (m_blit_delay_ns > EP1C_FRAME_DURATION_NANOSEC) + LOGDBG("Blitter delay! Blit duration %lld ns.\n", m_blit_delay_ns); + + m_blitter_busy = 1; + m_blitter_delay_timer->adjust(attotime::from_nsec(m_blit_delay_ns)); + + m_gfx_addr_shadowcopy = m_gfx_addr; + m_blitter_request = osd_work_item_queue(m_work_queue, blit_request_callback, (void*)this, 0); + } + } +} + +void ep1c12_device::draw_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + if (m_blitter_request) + { + int result; + do + { + result = osd_work_item_wait(m_blitter_request, 1000); + } while (result == 0); + osd_work_item_release(m_blitter_request); + } + + bitmap.fill(0, cliprect); + +#if DEBUG_VRAM_VIEWER + int curr_width = m_curr_screen_width; + int curr_height = m_curr_screen_height; + rectangle curr_visarea = m_curr_screen_visarea; + + if (machine().input().code_pressed_once(KEYCODE_T)) m_debug_vram_view_en = !m_debug_vram_view_en; + if (m_debug_vram_view_en) + { + curr_width = 8192; + curr_height = 4096; + curr_visarea.set(0, curr_width - 1, 0, curr_height - 1); + } + if ((m_prev_screen_height != curr_height) || (m_prev_screen_width != curr_width)) + { + screen().configure(curr_width, curr_height, curr_visarea, screen().refresh_attoseconds()); + m_prev_screen_height = curr_height; + m_prev_screen_width = curr_width; + } +#endif + + int scroll_x = -m_gfx_scroll_x; + int scroll_y = -m_gfx_scroll_y; + +#if DEBUG_VRAM_VIEWER + if (m_debug_vram_view_en) + copybitmap(bitmap, *m_bitmaps, 0, 0, 0, 0, cliprect); + else +#endif + copyscrollbitmap(bitmap, *m_bitmaps, 1, &scroll_x, 1, &scroll_y, cliprect); +} + + +u32 ep1c12_device::blitter_r(offs_t offset, u32 mem_mask) +{ + switch (offset * 4) + { + case 0x10: + return gfx_ready_r(); + + case 0x24: + return 0xffffffff; + + case 0x28: + return 0xffffffff; + + case 0x50: + return m_port_r_cb(); + + default: + logerror("unknownblitter_r %08x %08x\n", offset*4, mem_mask); + break; + + } + return 0; +} + +void ep1c12_device::blitter_w(address_space &space, offs_t offset, u32 data, u32 mem_mask) +{ + switch (offset * 4) + { + case 0x04: + gfx_exec_w(space, offset, data, mem_mask); + break; + + case 0x08: + COMBINE_DATA(&m_gfx_addr); + break; + + case 0x14: + COMBINE_DATA(&m_gfx_scroll_x); + break; + + case 0x18: + COMBINE_DATA(&m_gfx_scroll_y); + break; + + case 0x24: // Some sort of handshake at start of IRQ's. + case 0x28: // Related to coins entered. + case 0x30: // Contrast (test menu). + case 0x34: // Brightness (test menu). + case 0x38: // V offset (test menu). + case 0x3c: // H offset (test menu). + break; + + case 0x40: + COMBINE_DATA(&m_gfx_clip_x); + break; + + case 0x44: + COMBINE_DATA(&m_gfx_clip_y); + break; + + } +} + +void ep1c12_device::install_handlers(int addr1, int addr2) +{ + address_space &space = m_maincpu->space(AS_PROGRAM); + + space.install_read_handler(addr1, addr2, emu::rw_delegate(*this, FUNC(ep1c12_device::blitter_r)), 0xffffffffffffffffU); + space.install_write_handler(addr1, addr2, emu::rw_delegate(*this, FUNC(ep1c12_device::blitter_w)), 0xffffffffffffffffU); +} + +u64 ep1c12_device::fpga_r() +{ + return 0xff; +} + +void ep1c12_device::fpga_w(offs_t offset, u64 data, u64 mem_mask) +{ + if (ACCESSING_BITS_0_7) + { + // data & 0x08 = CE + // data & 0x10 = CLK + // data & 0x20 = DATA + + if ((data & 0x08) && !(m_firmware_port & 0x10) && (data & 0x10)) + { + if (m_firmware_pos < 2323240 && (data & 0x20)) + m_firmware[m_firmware_pos >> 3] |= 1 << (m_firmware_pos & 7); + m_firmware_pos++; + } + + m_firmware_port = data; + + if (m_firmware_pos == 2323240) + { + u8 checksum = 0; + for (u8 c : m_firmware) + checksum += c; + + switch (checksum) + { + case 0x03: m_firmware_version = FW_A; break; + case 0x3e: m_firmware_version = FW_B; break; + case 0xf9: m_firmware_version = FW_C; break; + case 0xe1: m_firmware_version = FW_D; break; + default: m_firmware_version = -1; break; + } + + if (m_firmware_version < 0) + logerror("Unrecognized firmware version\n"); + else + logerror("Detected firmware version %c\n", 'A' + m_firmware_version); + } + } +} diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12.h mame-0.264+dfsg.1/src/mame/cave/ep1c12.h --- mame-0.263+dfsg.1/src/mame/cave/ep1c12.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,893 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Luca Elia, MetalliC +/* emulation of Altera Cyclone EP1C12 FPGA programmed as a blitter */ +#ifndef MAME_CAVE_EP1C12_H +#define MAME_CAVE_EP1C12_H + +#pragma once + +#define DEBUG_VRAM_VIEWER 0 // VRAM viewer for debug + +class ep1c12_device : public device_t, public device_video_interface +{ +public: + ep1c12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + template void set_cpu(T &&maintag) { m_maincpu.set_tag(std::forward(maintag)); } + auto port_r_callback() { return m_port_r_cb.bind(); } + void set_rambase(u16* rambase) { m_ram16 = rambase; } + + inline u16 READ_NEXT_WORD(offs_t *addr); + + void set_mainramsize(size_t ramsize) + { + m_main_ramsize = ramsize; + m_main_rammask = ramsize - 1; + } + + static void *blit_request_callback(void *param, int threadid); + + u64 fpga_r(); + void fpga_w(offs_t offset, u64 data, u64 mem_mask = ~0); + + void draw_screen(bitmap_rgb32 &bitmap, const rectangle &cliprect); + + u16* m_ram16; + u32 m_gfx_addr; + u32 m_gfx_scroll_x, m_gfx_scroll_y; + u32 m_gfx_clip_x, m_gfx_clip_y; + + int m_gfx_size; + std::unique_ptr m_bitmaps; + rectangle m_clip; + + u16* m_use_ram; + size_t m_main_ramsize; // type D has double the main ram + size_t m_main_rammask; + + void install_handlers(int addr1, int addr2); + + u32 blitter_r(offs_t offset, u32 mem_mask = ~0); + void blitter_w(address_space &space, offs_t offset, u32 data, u32 mem_mask = ~0); + u32 m_gfx_addr_shadowcopy; + u32 m_gfx_clip_x_shadowcopy, m_gfx_clip_y_shadowcopy; + std::unique_ptr m_ram16_copy; + inline void gfx_upload_shadow_copy(address_space &space, offs_t *addr); + inline void gfx_create_shadow_copy(address_space &space); + inline u16 COPY_NEXT_WORD(address_space &space, offs_t *addr); + inline void gfx_draw_shadow_copy(address_space &space, offs_t *addr); + inline void gfx_upload(offs_t *addr); + inline void gfx_draw(offs_t *addr); + void gfx_exec(); + u32 gfx_ready_r(); + void gfx_exec_w(address_space &space, offs_t offset, u32 data, u32 mem_mask = ~0); + +protected: + // Number of bytes that are read each time Blitter fetches operations from SRAM. + static inline constexpr int OPERATION_CHUNK_SIZE_BYTES = 64; + + // Approximate time it takes to fetch a chunk of operations. + // This is composed of the time that the Blitter holds the Bus Request (BREQ) signal + // of the SH-3, as well as the overhead between requests. + static inline constexpr int OPERATION_READ_CHUNK_INTERVAL_NS = 700; + + // The firmware versions + enum { + // Used by ibara & mushisama + FW_A, // Byte checksum 03 + + // Used by espgal2 + FW_B, // Byte checksum 3e + + // Used by espgal2a, mushitama and mushisamb + FW_C, // Byte checksum f9 + + // Used by everything else + FW_D, // Byte checksum e1 + }; + + struct clr_t + { + // clr_t to r5g5b5 + u32 to_pen() const + { + // --t- ---- rrrr r--- gggg g--- bbbb b--- format + return (r << (16 + 3)) | (g << (8 + 3)) | (b << 3); + + // --t- ---- ---r rrrr ---g gggg ---b bbbb format + //return (r << 16) | (g << 8) | b; + } + + + void add_with_clr_mul_fixed(const clr_t &clr0, u8 mulfixed_val, const clr_t &mulfixed_clr0) + { + r = colrtable_add[clr0.r][colrtable[mulfixed_clr0.r][mulfixed_val]]; + g = colrtable_add[clr0.g][colrtable[mulfixed_clr0.g][mulfixed_val]]; + b = colrtable_add[clr0.b][colrtable[mulfixed_clr0.b][mulfixed_val]]; + } + + void add_with_clr_mul_3param(const clr_t &clr0, const clr_t &clr1, const clr_t &clr2) + { + r = colrtable_add[clr0.r][colrtable[clr2.r][clr1.r]]; + g = colrtable_add[clr0.g][colrtable[clr2.g][clr1.g]]; + b = colrtable_add[clr0.b][colrtable[clr2.b][clr1.b]]; + } + + void add_with_clr_square(const clr_t &clr0, const clr_t &clr1) + { + r = colrtable_add[clr0.r][colrtable[clr1.r][clr1.r]]; + g = colrtable_add[clr0.r][colrtable[clr1.g][clr1.g]]; + b = colrtable_add[clr0.r][colrtable[clr1.b][clr1.b]]; + } + + void add_with_clr_mul_fixed_rev(const clr_t &clr0, u8 val, const clr_t &clr1) + { + r = colrtable_add[clr0.r][colrtable_rev[val][clr1.r]]; + g = colrtable_add[clr0.g][colrtable_rev[val][clr1.g]]; + b = colrtable_add[clr0.b][colrtable_rev[val][clr1.b]]; + } + + void add_with_clr_mul_rev_3param(const clr_t &clr0, const clr_t &clr1, const clr_t &clr2) + { + r = colrtable_add[clr0.r][colrtable_rev[clr2.r][clr1.r]]; + g = colrtable_add[clr0.g][colrtable_rev[clr2.g][clr1.g]]; + b = colrtable_add[clr0.b][colrtable_rev[clr2.b][clr1.b]]; + } + + void add_with_clr_mul_rev_square(const clr_t &clr0, const clr_t &clr1) + { + r = colrtable_add[clr0.r][colrtable_rev[(clr1.r)][(clr1.r)]]; + g = colrtable_add[clr0.g][colrtable_rev[(clr1.g)][(clr1.g)]]; + b = colrtable_add[clr0.b][colrtable_rev[(clr1.b)][(clr1.b)]]; + } + + + void add(const clr_t &clr0, const clr_t &clr1) + { + //r = clr0.r + clr1.r; + //g = clr0.g + clr1.g; + //b = clr0.b + clr1.b; + + // use pre-clamped lookup table + r = colrtable_add[clr0.r][clr1.r]; + g = colrtable_add[clr0.g][clr1.g]; + b = colrtable_add[clr0.b][clr1.b]; + } + + + void mul(const clr_t &clr1) + { + r = colrtable[r][clr1.r]; + g = colrtable[g][clr1.g]; + b = colrtable[b][clr1.b]; + } + + void square(const clr_t &clr1) + { + r = colrtable[clr1.r][clr1.r]; + g = colrtable[clr1.g][clr1.g]; + b = colrtable[clr1.b][clr1.b]; + } + + void mul_3param(const clr_t &clr1, const clr_t &clr2) + { + r = colrtable[clr2.r][clr1.r]; + g = colrtable[clr2.g][clr1.g]; + b = colrtable[clr2.b][clr1.b]; + } + + void mul_rev(const clr_t &clr1) + { + r = colrtable_rev[r][clr1.r]; + g = colrtable_rev[g][clr1.g]; + b = colrtable_rev[b][clr1.b]; + } + + void mul_rev_square(const clr_t &clr1) + { + r = colrtable_rev[clr1.r][clr1.r]; + g = colrtable_rev[clr1.g][clr1.g]; + b = colrtable_rev[clr1.b][clr1.b]; + } + + + void mul_rev_3param(const clr_t &clr1, const clr_t &clr2) + { + r = colrtable_rev[clr2.r][clr1.r]; + g = colrtable_rev[clr2.g][clr1.g]; + b = colrtable_rev[clr2.b][clr1.b]; + } + + void mul_fixed(u8 val, const clr_t &clr0) + { + r = colrtable[val][clr0.r]; + g = colrtable[val][clr0.g]; + b = colrtable[val][clr0.b]; + } + + void mul_fixed_rev(u8 val, const clr_t &clr0) + { + r = colrtable_rev[val][clr0.r]; + g = colrtable_rev[val][clr0.g]; + b = colrtable_rev[val][clr0.b]; + } + + void copy(const clr_t &clr0) + { + r = clr0.r; + g = clr0.g; + b = clr0.b; + } + +#ifdef LSB_FIRST + u8 b, g, r, t; +#else + u8 t, r, g, b; +#endif + }; + + union colour_t + { + clr_t trgb; + u32 data; + }; + + typedef void (*blitfunction)( + bitmap_rgb32 *, + const rectangle *, + u32 *gfx, + int src_x, + int src_y, + const int dst_x_start, + const int dst_y_start, + int dimx, + int dimy, + const bool flipy, + const u8 s_alpha, + const u8 d_alpha, + //int tint, + const clr_t *); + + +#define BLIT_FUNCTION static void +#define BLIT_PARAMS bitmap_rgb32 *bitmap, const rectangle *clip, u32 *gfx, int src_x, int src_y, const int dst_x_start, const int dst_y_start, int dimx, int dimy, const bool flipy, const u8 s_alpha, const u8 d_alpha, const clr_t *tint_clr + + BLIT_FUNCTION draw_sprite_f0_ti0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f1_ti0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr1_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti1_tr0_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr1_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_plain(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d0(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d1(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d2(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d3(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d4(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d5(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d6(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s0_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s1_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s2_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s3_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s4_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s5_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s6_d7(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti1_tr0_s7_d7(BLIT_PARAMS); + + BLIT_FUNCTION draw_sprite_f0_ti0_tr1_simple(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f0_ti0_tr0_simple(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr1_simple(BLIT_PARAMS); + BLIT_FUNCTION draw_sprite_f1_ti0_tr0_simple(BLIT_PARAMS); + + static inline void pen_to_clr(u32 pen, clr_t *clr) + { + // --t- ---- rrrr r--- gggg g--- bbbb b--- format + clr->r = (pen >> (16+3));// & 0x1f; + clr->g = (pen >> (8+3));// & 0x1f; + clr->b = (pen >> 3);// & 0x1f; + + // --t- ---- ---r rrrr ---g gggg ---b bbbb format + // clr->r = (pen >> 16) & 0x1f; + // clr->g = (pen >> 8) & 0x1f; + // clr->b = (pen >> 0) & 0x1f; + + }; + + // convert separate r,g,b biases (0..80..ff) to clr_t (-1f..0..1f) + void tint_to_clr(u8 r, u8 g, u8 b, clr_t *clr) + { + clr->r = r>>2; + clr->g = g>>2; + clr->b = b>>2; + }; + + // (1|s|d) * s_factor * s + (1|s|d) * d_factor * d + // 0: +alpha + // 1: +source + // 2: +dest + // 3: * + // 4: -alpha + // 5: -source + // 6: -dest + // 7: * + + virtual void device_start() override; + virtual void device_reset() override; + + // Called when a Blitter operation does not cause any draws/uploads to be performed. + // If multiple draws in a row are performed outside of an active clipping area, + // the Blitter will be reading operations from SRAM in 64 byte chunks, but not + // actually performing any work. + // This will still be visible from the CPU as Blitter being busy, until the + // operation list has exited. + // + // TODO: Having 64 bytes of non-drawing operations in a row will only cause the Blitter + // to idle if the operations are read from the same 64 byte chunk (and not split between two). + // More proper handling of this would be to change the reads from SRAM to be done 64 bytes at the time + // into a FIFO, but that's a fair amount of work. + void idle_blitter(u8 operation_size_bytes) + { + m_blit_idle_op_bytes += operation_size_bytes; + if (m_blit_idle_op_bytes >= OPERATION_CHUNK_SIZE_BYTES) + { + m_blit_idle_op_bytes -= OPERATION_CHUNK_SIZE_BYTES; + m_blit_delay_ns += OPERATION_READ_CHUNK_INTERVAL_NS; + } + } + + TIMER_CALLBACK_MEMBER(blitter_delay_callback); + + osd_work_queue *m_work_queue; + osd_work_item *m_blitter_request; + + // blit timing + emu_timer *m_blitter_delay_timer; + int m_blitter_busy; + u64 m_blit_delay_ns; + u16 m_blit_idle_op_bytes; + + // fpga firmware + std::vector m_firmware; + int m_firmware_pos; + u8 m_firmware_port; + int m_firmware_version; + + // debug vram viewer +#ifdef DEBUG_VRAM_VIEWER + bool m_debug_vram_view_en; + int m_prev_screen_width; + int m_prev_screen_height; + rectangle m_prev_screen_visarea; + int m_curr_screen_width; + int m_curr_screen_height; + rectangle m_curr_screen_visarea; +#endif + + static u8 colrtable[0x20][0x40]; + static u8 colrtable_rev[0x20][0x40]; + static u8 colrtable_add[0x20][0x20]; + + static const blitfunction f0_ti1_tr1_blit_funcs[64]; + static const blitfunction f0_ti1_tr0_blit_funcs[64]; + static const blitfunction f1_ti1_tr1_blit_funcs[64]; + static const blitfunction f1_ti1_tr0_blit_funcs[64]; + static const blitfunction f0_ti0_tr1_blit_funcs[64]; + static const blitfunction f0_ti0_tr0_blit_funcs[64]; + static const blitfunction f1_ti0_tr1_blit_funcs[64]; + static const blitfunction f1_ti0_tr0_blit_funcs[64]; + + // internal states + required_device m_maincpu; + devcb_read32 m_port_r_cb; +}; + + +DECLARE_DEVICE_TYPE(EP1C12, ep1c12_device) + +#endif // MAME_CAVE_EP1C12_H diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit0.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit0.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit0.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit0.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* Non-Flipped, Non-Tinted, Transparent */ +#define FLIPX 0 +#define TINT 0 +#define TRANSPARENT 1 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f0_ti0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr1_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit1.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit1.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit1.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* Non-Flipped, Non-Tinted, Non-Transparent */ +#define FLIPX 0 +#define TINT 0 +#define TRANSPARENT 0 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti0_tr0_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit2.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit2.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit2.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* X-Flipped, Non-Tinted, Transparent */ +#define FLIPX 1 +#define TINT 0 +#define TRANSPARENT 1 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f1_ti0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr1_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit3.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit3.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit3.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* X-Flipped, Non-Tinted, Non-Transparent */ +#define FLIPX 1 +#define TINT 0 +#define TRANSPARENT 0 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti0_tr0_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit4.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit4.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit4.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit4.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* Non-Flipped, Tinted, Transparent */ +#define FLIPX 0 +#define TINT 1 +#define TRANSPARENT 1 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr1_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit5.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit5.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit5.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit5.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* Non-Flipped, Tinted, Non-Transparent */ +#define FLIPX 0 +#define TINT 1 +#define TRANSPARENT 0 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f0_ti1_tr0_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit6.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit6.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit6.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit6.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* X-Flipped, Tinted, Transparent */ +#define FLIPX 1 +#define TINT 1 +#define TRANSPARENT 1 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr1_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit7.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit7.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit7.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit7.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,559 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +#include "emu.h" + +#define REALLY_SIMPLE 0 +/* X-Flipped, Tinted, Non-Transparent */ +#define FLIPX 1 +#define TINT 1 +#define TRANSPARENT 0 + +#include "ep1c12.h" + +/* Special Case */ +#define BLENDED 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_plain +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef BLENDED + +/* Regular Cases*/ +#define BLENDED 1 + +#define _SMODE 0 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 0 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d0 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/////// + + +#define _SMODE 0 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 1 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d1 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +//// + + +#define _SMODE 0 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 2 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d2 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 3 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d3 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 4 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d4 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 5 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d5 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + +#define _SMODE 0 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 6 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d6 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +/// + + +#define _SMODE 0 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s0_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 1 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s1_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 2 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s2_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 3 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s3_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 4 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s4_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 5 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s5_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 6 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s6_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#define _SMODE 7 +#define _DMODE 7 +#define FUNCNAME draw_sprite_f1_ti1_tr0_s7_d7 +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef _SMODE +#undef _DMODE + +#undef BLENDED + +#undef FLIPX +#undef TINT +#undef TRANSPARENT +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit8.cpp mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit8.cpp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12_blit8.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12_blit8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,42 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/* Special case 'Really Simple' blitters, no blending, no tinting etc.*/ + +#include "emu.h" +#include "ep1c12.h" + + +#define REALLY_SIMPLE 1 +#define BLENDED 0 + +#define TRANSPARENT 1 +#define FLIPX 0 +#define FUNCNAME draw_sprite_f0_ti0_tr1_simple +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef FLIPX + +#define FLIPX 1 +#define FUNCNAME draw_sprite_f1_ti0_tr1_simple +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef FLIPX +#undef TRANSPARENT + + +#define TRANSPARENT 0 +#define FLIPX 0 +#define FUNCNAME draw_sprite_f0_ti0_tr0_simple +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef FLIPX + +#define FLIPX 1 +#define FUNCNAME draw_sprite_f1_ti0_tr0_simple +#include "ep1c12in.ipp" +#undef FUNCNAME +#undef FLIPX +#undef TRANSPARENT + +#undef BLENDED +#undef REALLY_SIMPLE diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12in.ipp mame-0.264+dfsg.1/src/mame/cave/ep1c12in.ipp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12in.ipp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12in.ipp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,155 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/* blitter function */ + +void ep1c12_device::FUNCNAME(BLIT_PARAMS) +{ + int yf; + +#if REALLY_SIMPLE == 0 + colour_t s_clr; +#endif + +#if BLENDED == 1 + colour_t d_clr; + +#if _SMODE == 2 +#if _DMODE != 0 + colour_t clr0; +#endif +#elif _SMODE == 0 +#if _DMODE != 0 +#if _DMODE != 5 +#if _DMODE != 1 + colour_t clr0; +#endif +#endif +#endif +#else + colour_t clr0; +#endif + +#endif + +#if REALLY_SIMPLE == 1 +#if TRANSPARENT == 1 + u32 pen; +#endif +#else + u32 pen; +#endif + u32 *bmp; + +#if FLIPX == 1 + src_x += (dimx-1); +#endif + + if (flipy) { yf = -1; src_y += (dimy-1); } + else { yf = +1; } + + int starty = 0; + const int dst_y_end = dst_y_start + dimy; + + if (dst_y_start < clip->min_y) + starty = clip->min_y - dst_y_start; + + if (dst_y_end > clip->max_y) + dimy -= (dst_y_end-1) - clip->max_y; + + // check things are safe to draw (note, if the source would wrap round an edge of the 0x2000*0x1000 vram we don't draw.. not sure what the hw does anyway) + // ddpdfk triggers this on boss explosions so it needs fixing +#if FLIPX == 1 + if ((src_x & 0x1fff) < ((src_x-(dimx-1)) & 0x1fff)) + { + // popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx); + return; + } +#else + if ((src_x & 0x1fff) > ((src_x+(dimx-1)) & 0x1fff)) + { + // popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx); + return; + } +#endif + + int startx = 0; + const int dst_x_end = dst_x_start + dimx; + + if (dst_x_start < clip->min_x) + startx = clip->min_x - dst_x_start; + + if (dst_x_end > clip->max_x) + dimx -= (dst_x_end-1) - clip->max_x; + +#if BLENDED == 1 +#if _SMODE == 0 +#if _DMODE == 0 + const u8* salpha_table = colrtable[s_alpha]; + const u8* dalpha_table = colrtable[d_alpha]; +#endif + +#if _DMODE == 5 + const u8* salpha_table = colrtable[s_alpha]; +#endif +#if _DMODE == 1 + const u8* salpha_table = colrtable[s_alpha]; +#endif + +#endif + +#if _SMODE == 2 +#if _DMODE == 0 + const u8* dalpha_table = colrtable[d_alpha]; +#endif +#endif +#endif + + for (int y = starty; y < dimy; y++) + { + bmp = &bitmap->pix(dst_y_start + y, dst_x_start+startx); + const int ysrc_index = ((src_y + yf * y) & 0x0fff) * 0x2000; + u32* gfx2 = gfx + ysrc_index; + + #if FLIPX == 1 + gfx2 += (src_x - startx); + #else + gfx2 += (src_x + startx); + #endif + +#if 1 + const u32* end = bmp + (dimx - startx); +#else + // maybe we can do some SSE type optimizations on larger blocks? right now this just results in more code and slower compiling tho. + + const int width = dimx-startx; + const u32* end = bmp+(width); + + if (width<0) return; + + int bigblocks = width>>3; + + while (bigblocks) + { + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + #include "ep1c12pixel.ipp" + + bigblocks--; + } +#endif + while (bmp < end) + { + #include "ep1c12pixel.ipp" + } + + } + +// g_profiler.stop(); +} + +#undef LOOP_INCREMENTS diff -Nru mame-0.263+dfsg.1/src/mame/cave/ep1c12pixel.ipp mame-0.264+dfsg.1/src/mame/cave/ep1c12pixel.ipp --- mame-0.263+dfsg.1/src/mame/cave/ep1c12pixel.ipp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/ep1c12pixel.ipp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,193 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/* This is the inner-most loop code (per-pixel) and thus the most performance sensitive part */ + +#if FLIPX == 1 +#define LOOP_INCREMENTS \ + bmp++; \ + gfx2--; +#else + +#define LOOP_INCREMENTS \ + bmp++; \ + gfx2++; +#endif + + +/*************** REALLY SIMPLE INNER LOOP, NON-BLENDED, NON-TINTED, SIMPLEST CASE ****************/ +#if REALLY_SIMPLE == 1 + +#if TRANSPARENT == 1 + pen = *gfx2; + if (pen & 0x20000000) + { + *bmp = pen; +#else + *bmp = *gfx2; +#endif + +/*************** REGULAR INNER LOOPS ****************/ +#else // NOT REALLY_SIMPLE + + pen = *gfx2; + +#if TRANSPARENT == 1 + if (pen & 0x20000000) + { +#endif + + // convert source to clr + pen_to_clr(pen, &s_clr.trgb); + //s_clr.data = (pen >> 3); // using the union is actually significantly slower than our pen_to_clr to function! + // source * intesity and clamp + +#if TINT == 1 + s_clr.trgb.mul(*tint_clr); +#endif + + #if BLENDED == 1 + + // convert destination to clr + pen_to_clr(*bmp, &d_clr.trgb); + //d_clr.data = *bmp >> 3; // using the union is actually significantly slower than our pen_to_clr to function! + #if _SMODE == 0 + //g_profiler.start(PROFILER_USER7); + + #if _DMODE == 0 + //g_profiler.start(PROFILER_USER1); + // this is used extensively in the games (ingame, futari title screens etc.) + + s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][dalpha_table[(d_clr.trgb.r)]]; + s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][dalpha_table[(d_clr.trgb.g)]]; + s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][dalpha_table[(d_clr.trgb.b)]]; + #elif _DMODE == 1 + //g_profiler.start(PROFILER_USER2); + // futari ~7% + s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][colrtable[(s_clr.trgb.r)][(d_clr.trgb.r)]]; + s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][colrtable[(s_clr.trgb.g)][(d_clr.trgb.g)]]; + s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][colrtable[(s_clr.trgb.b)][(d_clr.trgb.b)]]; + #elif _DMODE == 2 + //g_profiler.start(PROFILER_USER3); + clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); + s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 3 + //g_profiler.start(PROFILER_USER4); + clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + + #elif _DMODE == 4 + //g_profiler.start(PROFILER_USER5); + clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); + s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); + #elif _DMODE == 5 + // futari black character select ~13% + //g_profiler.start(PROFILER_USER6); + s_clr.trgb.r = colrtable_add[salpha_table[(s_clr.trgb.r)]][colrtable_rev[(s_clr.trgb.r)][(d_clr.trgb.r)]]; + s_clr.trgb.g = colrtable_add[salpha_table[(s_clr.trgb.g)]][colrtable_rev[(s_clr.trgb.g)][(d_clr.trgb.g)]]; + s_clr.trgb.b = colrtable_add[salpha_table[(s_clr.trgb.b)]][colrtable_rev[(s_clr.trgb.b)][(d_clr.trgb.b)]]; + + #elif _DMODE == 6 + //g_profiler.start(PROFILER_USER7); + clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); + s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 7 + //g_profiler.start(PROFILER_USER8); + clr0.trgb.mul_fixed(s_alpha, s_clr.trgb); + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + #endif + + //g_profiler.stop(); + #elif _SMODE == 1 + //g_profiler.start(PROFILER_USER6); + clr0.trgb.square(s_clr.trgb); + + #elif _SMODE == 2 + // g_profiler.start(PROFILER_USER4); + #if _DMODE == 0 + // this is used heavily on espgal2 highscore screen (~28%) optimized to avoid use of temp clr0 variable + s_clr.trgb.r = colrtable_add[colrtable[(d_clr.trgb.r)][(s_clr.trgb.r)]][dalpha_table[(d_clr.trgb.r)]]; + s_clr.trgb.g = colrtable_add[colrtable[(d_clr.trgb.g)][(s_clr.trgb.g)]][dalpha_table[(d_clr.trgb.g)]]; + s_clr.trgb.b = colrtable_add[colrtable[(d_clr.trgb.b)][(s_clr.trgb.b)]][dalpha_table[(d_clr.trgb.b)]]; + #elif _DMODE == 1 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add_with_clr_mul_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); + #elif _DMODE == 2 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 3 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + + #elif _DMODE == 4 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); + #elif _DMODE == 5 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add_with_clr_mul_rev_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); + #elif _DMODE == 6 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 7 + clr0.trgb.mul_3param(s_clr.trgb, d_clr.trgb); + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + #endif + //g_profiler.stop(); + + #elif _SMODE == 3 + //g_profiler.start(PROFILER_USER1); + clr0.trgb.copy(s_clr.trgb); + + #elif _SMODE == 4 + //g_profiler.start(PROFILER_USER2); + clr0.trgb.mul_fixed_rev(s_alpha, s_clr.trgb); + #elif _SMODE == 5 + //g_profiler.start(PROFILER_USER3); + clr0.trgb.mul_rev_square(s_clr.trgb); + #elif _SMODE == 6 + //g_profiler.start(PROFILER_USER4); + clr0.trgb.mul_rev_3param(s_clr.trgb, d_clr.trgb); + #elif _SMODE == 7 + //g_profiler.start(PROFILER_USER5); + clr0.trgb.copy(s_clr.trgb); + #endif + + +// smode 0/2 cases are already split up and handled above. +#if _SMODE != 2 +#if _SMODE != 0 + + #if _DMODE == 0 + s_clr.trgb.add_with_clr_mul_fixed(clr0.trgb, d_alpha, d_clr.trgb); + #elif _DMODE == 1 + s_clr.trgb.add_with_clr_mul_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); + #elif _DMODE == 2 + s_clr.trgb.add_with_clr_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 3 + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + + #elif _DMODE == 4 + s_clr.trgb.add_with_clr_mul_fixed_rev(clr0.trgb, d_alpha, d_clr.trgb); + #elif _DMODE == 5 + s_clr.trgb.add_with_clr_mul_rev_3param(clr0.trgb, d_clr.trgb, s_clr.trgb); + #elif _DMODE == 6 + s_clr.trgb.add_with_clr_mul_rev_square(clr0.trgb, d_clr.trgb); + #elif _DMODE == 7 + s_clr.trgb.add(clr0.trgb, d_clr.trgb); + #endif + + //g_profiler.stop(); +#endif +#endif + + #endif + + // write result + *bmp = s_clr.trgb.to_pen() | (pen & 0x20000000); + //*bmp = (s_clr.data << 3) | (pen & 0x20000000); // using the union is actually significantly slower than our to_pen function! + +#endif // END NOT REALLY SIMPLE + +#if TRANSPARENT == 1 + } +#endif + LOOP_INCREMENTS diff -Nru mame-0.263+dfsg.1/src/mame/cave/fstgfish.cpp mame-0.264+dfsg.1/src/mame/cave/fstgfish.cpp --- mame-0.263+dfsg.1/src/mame/cave/fstgfish.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cave/fstgfish.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,150 @@ +// license:BSD-3-Clause +// copyright-holders: +/************************************************************************************************** + +Festival: Goldfish Scoop (c) 2008 CAVE/PLABI/SEVENGEARS/cavia + +PCIe era with Gigabyte GA-G31M-S2L (rev. 1.1/2.0), connected cards doesn't matter as long as the +CV1000XP/CV2000XP is connected thru USB. + +- Intel G31 + ICH7 +- IT8718 Super I/O +GA-G31M-S2L/GA-G31M-S2C datasheet reports these two (mutually exclusive?) +- RTL8111C (PCIe Integrated Gigabit Ethernet Controller) +- RTL8102E (PCIe Fast Ethernet NIC) + +Notes: +- CF card looks sysprep-ed, can't boot in shutms11. +- Following are drivers found in C:\WINDOWS\INF folder: +\- Several OEM*.inf files, targeting the chipset above; +\- eGalax Touchscreen Controller (VID=0eef, PID=0001/0002) +\- Renesas USB serial ports driver (VID=045b, PID=0020) + +=================================================================================================== + +Technical +========= + +The system consists of a standard motherboard and the CV1000XP board. +(ETA: alt setup seen with CV2000XP Rev. 1.0 on it) + +The CV1000XP has the following connectors and switches. + +IDC connectors. + +CN1: goes to the F_PANEL (Front Panel Header) on the motherboard. + Power switch, Reset switch, IDE LED, Sleep LED +CN2: goes to the F_USB1 header on the motherboard. This supplies + 5V as well. The 5V is always on regardless it is used for the + soft start. + +Molex connector. + +CN7: Standard molex, although it is plugged in it has no effect since + JP3 is in the position where power is taken from the F_USB1 connector. + +Switches: + +SW1 : Soft power off +SW5 : Reset + +Hacking +======= + +Game boots up on the HW but cannot be controlled due to lack of +touch screen. + +On a standard XP machine the game boots with an error due +to the missing CV1000XP card. + +Connecting directly into the CV1000XP CN2 with a standard +USB cable results in the message: USB device not recognized. Attempts to +increase the current on the 5V have not been succesful. + +Make a dd of the image, and write to an SSD disk, +the game will boot happily. Rename cvgame.exe to +goldfish.exe and copy in cmd.exe as cvgame.exe will +get us a command prompt. + +PS2 keyboard is working, USB keyboard and mouse have been +disabled in BIOS. BIOS is easily accessible using: DEL + +Use portmon to log the serial connection to the CV1000XP (COM3) +then start up the game. This gives a nice log of the communication. + +**************************************************************************************************/ + + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "machine/pci.h" + + +namespace { + +class fstgfish_state : public driver_device +{ +public: + fstgfish_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + + void fstgfish(machine_config &config); + +private: + required_device m_maincpu; + void main_io(address_map &map); + void main_map(address_map &map); +}; + +/*****************************************************************************/ + +void fstgfish_state::main_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000e0000, 0x000fffff).rom().region("bios", 0x60000); + map(0xfff80000, 0xffffffff).rom().region("bios", 0); +} + +void fstgfish_state::main_io(address_map &map) +{ +} + +/*****************************************************************************/ + + +static INPUT_PORTS_START(fstgfish) +INPUT_PORTS_END + + +void fstgfish_state::fstgfish(machine_config &config) +{ + PENTIUM3(config, m_maincpu, 200'000'000); /* Intel Core 2 Duo, 333/266/200 FSB clocks */ + m_maincpu->set_addrmap(AS_PROGRAM, &fstgfish_state::main_map); + m_maincpu->set_addrmap(AS_IO, &fstgfish_state::main_io); + + PCI_ROOT(config, "pci", 0); + // ... +} + +ROM_START(fstgfish) + ROM_REGION32_LE(0x80000, "bios", 0) + ROM_LOAD( "g31ms2l.f7", 0x000000, 0x80000, CRC(4f92f678) SHA1(c29ce14f093b5d6ef308f674fe4d514eb10e4742) ) + + DISK_REGION( "cfcard" ) + // CF with Windows XP embedded + DISK_IMAGE( "x11_15305", 0, SHA1(67bce99fb55760d0c06d698e68656eebbda8a28f) ) + + // H8S/2218 on CV2000XP board, assume with internal ROM + ROM_REGION(0x20000, "cv2000xp", ROMREGION_ERASEFF) + ROM_LOAD( "h8s2218.bin", 0x000000, 0x20000, NO_DUMP ) +ROM_END + +} // anonymous namespace + + +/*****************************************************************************/ + +GAME(2008, fstgfish, 0, fstgfish, fstgfish, fstgfish_state, empty_init, ROT0, "Cave", "Festival: Goldfish Scoop", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/chess/ave_arb.cpp mame-0.264+dfsg.1/src/mame/chess/ave_arb.cpp --- mame-0.263+dfsg.1/src/mame/chess/ave_arb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/ave_arb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -95,7 +95,7 @@ required_device m_board; required_device m_via; memory_share_creator m_extram; - required_device m_dac; + required_device m_dac; optional_device m_cart; required_ioport_array<2> m_inputs; diff -Nru mame-0.263+dfsg.1/src/mame/chess/cking_triomphe.cpp mame-0.264+dfsg.1/src/mame/chess/cking_triomphe.cpp --- mame-0.263+dfsg.1/src/mame/chess/cking_triomphe.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/cking_triomphe.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -55,7 +55,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u16 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/chess/compuchess.cpp mame-0.264+dfsg.1/src/mame/chess/compuchess.cpp --- mame-0.263+dfsg.1/src/mame/chess/compuchess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/compuchess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -505,6 +505,6 @@ SYST( 1977, cmpchess, 0, 0, cmpchess, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka CompuChess I SYST( 1978, cmpchess2, 0, 0, cmpchess2, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess: The Second Edition", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag Industries)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1979, cncchess, 0, 0, cncchess, cncchess, cmpchess_state, empty_init, "Conic", "Computer Chess (Conic, model 7011)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/chess/conic_cchess2.cpp mame-0.264+dfsg.1/src/mame/chess/conic_cchess2.cpp --- mame-0.263+dfsg.1/src/mame/chess/conic_cchess2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/conic_cchess2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -70,7 +70,7 @@ required_device_array m_pia; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<8> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/chess/conic_cchess3.cpp mame-0.264+dfsg.1/src/mame/chess/conic_cchess3.cpp --- mame-0.263+dfsg.1/src/mame/chess/conic_cchess3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/conic_cchess3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -58,7 +58,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; void main_map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/mame/chess/excal_ivant.cpp mame-0.264+dfsg.1/src/mame/chess/excal_ivant.cpp --- mame-0.263+dfsg.1/src/mame/chess/excal_ivant.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/excal_ivant.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,348 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Excalibur Ivan The Terrible + +The chess engine is by Ron Nelson, similar to the one in Excalibur Mirage. + +Hardware notes: +- PCB label: EXCALIBUR ELECTRONICS, INC. 6/28/96, IVANT +- Hitachi H8/3256 MCU (mode 1), 20MHz XTAL +- 8-bit DAC (8L503 resistor array), KA8602 amplifier, 1MB ROM (custom label) +- LCD with 5 7segs and custom segments +- no LEDs, button sensors chessboard + +The MCU used here is a HD6433256A33P from Excalibur Mirage, the internal ROM +is disabled. There's also a newer version on a H8/3216. The first version was +produced in a CXG factory. + +TODO: +- it does a cold boot at every reset, so nvram won't work properly unless MAME + adds some kind of auxillary autosave state feature at power-off + +BTANB: +- sound is scratchy like a tape recorder and has spikes here and there, verified + with a digital capture, final (analog) output on the real thing sounds a bit + better than MAME though + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/h8/h8325.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "excal_ivant.lh" + + +namespace { + +class ivant_state : public driver_device +{ +public: + ivant_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rombank(*this, "rombank"), + m_board(*this, "board"), + m_lcd_pwm(*this, "lcd_pwm"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0), + m_out_lcd(*this, "s%u.%u", 0U, 0U) + { } + + void ivant(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices/pointers + required_device m_maincpu; + required_memory_bank m_rombank; + required_device m_board; + required_device m_lcd_pwm; + required_device m_dac; + required_ioport_array<3> m_inputs; + output_finder<2, 24> m_out_lcd; + + u16 m_inp_mux = 0; + u32 m_latch = 0; + u32 m_lcd_segs = 0; + u8 m_lcd_com = 0; + emu_timer *m_irqtimer; + + void main_map(address_map &map); + + // I/O handlers + void lcd_pwm_w(offs_t offset, u8 data); + void update_lcd(); + void lcd_com_w(offs_t offset, u8 data, u8 mem_mask); + + void latch_w(offs_t offset, u8 data); + u8 read_inputs(); + + TIMER_CALLBACK_MEMBER(update_irq) { read_inputs(); } + + u8 p4_r(); + void p4_w(u8 data); + void p5_w(u8 data); + u8 p6_r(); + void p6_w(u8 data); +}; + +void ivant_state::machine_start() +{ + m_out_lcd.resolve(); + m_rombank->configure_entries(0, 64, memregion("rombank")->base(), 0x4000); + + // periodically check for interrupts + m_irqtimer = timer_alloc(FUNC(ivant_state::update_irq), this); + attotime period = attotime::from_msec(1); + m_irqtimer->adjust(period, 0, period); + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_latch)); + save_item(NAME(m_lcd_segs)); + save_item(NAME(m_lcd_com)); +} + +void ivant_state::machine_reset() +{ + m_dac->write(0x80); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// LCD + +void ivant_state::lcd_pwm_w(offs_t offset, u8 data) +{ + m_out_lcd[offset & 0x3f][offset >> 6] = data; +} + +void ivant_state::update_lcd() +{ + for (int i = 0; i < 2; i++) + { + // LCD common is 0/1/Hi-Z + const u32 data = BIT(m_lcd_com, i + 2) ? (BIT(m_lcd_com, i) ? ~m_lcd_segs : m_lcd_segs) : 0; + m_lcd_pwm->write_row(i, data); + } +} + +void ivant_state::lcd_com_w(offs_t offset, u8 data, u8 mem_mask) +{ + // P70,P71: LCD common + m_lcd_com = mem_mask << 2 | (data & 3); + update_lcd(); +} + + +// misc + +void ivant_state::latch_w(offs_t offset, u8 data) +{ + // a0-a2,d0-d3: 4*74259 + u32 mask = 1 << offset; + for (int i = 0; i < 4; i++) + { + m_latch = (m_latch & ~mask) | (BIT(data, i) ? mask : 0); + mask <<= 8; + } + + // 74259(all) Q0,Q1: DAC data + m_dac->write(bitswap<8>(m_latch,0,8,16,24,1,9,17,25)); + + // 74259(all) Q2-Q7: LCD segments + m_lcd_segs = 0; + for (int i = 0; i < 4; i++) + m_lcd_segs |= (m_latch >> (i * 8 + 2) & 0x3f) << (i * 6); + + update_lcd(); + + // 74259(2) Q4-Q7, 74259(3) Q2-Q6: input mux low + m_inp_mux = (m_inp_mux & 0x200) | (~m_latch >> 22 & 0x1f0) | (~m_latch >> 20 & 0xf); + read_inputs(); +} + +u8 ivant_state::read_inputs() +{ + u8 data = 0; + + // read buttons + for (int i = 0; i < 2; i++) + if (BIT(m_inp_mux, i + 8)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i, true); + + // P64-P66 are also IRQ pins (the ON button is IRQ0) + for (int i = 0; i < 3; i++) + m_maincpu->set_input_line(INPUT_LINE_IRQ0 + i, BIT(data, i + 4) ? ASSERT_LINE : CLEAR_LINE); + + return ~data; +} + +u8 ivant_state::p4_r() +{ + // P47: multiplexed inputs part + return (read_inputs() & 0x80) | 0x7f; +} + +void ivant_state::p4_w(u8 data) +{ + // P40-P45: ROM bank + m_rombank->set_entry(~data & 0x3f); +} + +void ivant_state::p5_w(u8 data) +{ + // P54: KA8602 mute + m_dac->set_output_gain(0, (data & 0x10) ? 0.0 : 1.0); + + // P55: input mux high bit + m_inp_mux = (m_inp_mux & 0x1ff) | BIT(~data, 5) << 9; + read_inputs(); +} + +u8 ivant_state::p6_r() +{ + // P60-P66: multiplexed inputs part + return read_inputs() | 0x80; +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void ivant_state::main_map(address_map &map) +{ + map(0x0000, 0x0007).mirror(0xfff8).w(FUNC(ivant_state::latch_w)); + map(0x0000, 0x7fff).rom(); + map(0x8000, 0xbfff).bankr(m_rombank); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( ivant ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_LEFT) PORT_NAME("No / Left") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Mode") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Black / White") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Yes / Right") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Set Up / King") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Verify / Queen") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Multi-Move / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F2) PORT_NAME("Off / Save") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_C) PORT_NAME("On / Clear") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Move / Pawn") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Hint / Knight") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Level / Rook") + + PORT_START("IN.2") + PORT_CONFNAME( 0x08, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x08, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) + PORT_BIT(0xf7, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void ivant_state::ivant(machine_config &config) +{ + // basic machine hardware + H83256(config, m_maincpu, 20_MHz_XTAL); + m_maincpu->set_mode(1); + m_maincpu->set_addrmap(AS_PROGRAM, &ivant_state::main_map); + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(h83256_device::nvram_set_battery)); + m_maincpu->standby_cb().append([this](int state) { if (state) m_lcd_pwm->clear(); }); + m_maincpu->read_port4().set(FUNC(ivant_state::p4_r)); + m_maincpu->write_port4().set(FUNC(ivant_state::p4_w)); + m_maincpu->write_port5().set(FUNC(ivant_state::p5_w)); + m_maincpu->read_port6().set(FUNC(ivant_state::p6_r)); + m_maincpu->read_port7().set_ioport("IN.2").invert(); + m_maincpu->write_port7().set(FUNC(ivant_state::lcd_com_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + //m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_lcd_pwm).set_size(2, 24); + m_lcd_pwm->output_x().set(FUNC(ivant_state::lcd_pwm_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920/5, 697/5); + screen.set_visarea_full(); + + config.set_default_layout(layout_excal_ivant); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_R2R(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( ivant ) + ROM_REGION16_BE( 0x8000, "maincpu", 0 ) + ROM_LOAD("at27c256r.ic11", 0x0000, 0x8000, CRC(51a97959) SHA1(ea595001fd5eaa07ade96307a8d89d5fb44682ab) ) // no label + + ROM_REGION16_BE( 0x100000, "rombank", 0 ) + ROM_LOAD("1996_701e_excalibur_ivan_t.ic2", 0x000000, 0x100000, CRC(f7c386a1) SHA1(357ca0b0c0b1409d33876b6fa00c5ad74b2643fc) ) + + ROM_REGION( 109652, "screen", 0 ) + ROM_LOAD("emirage.svg", 0, 109652, CRC(6840c49e) SHA1(a9c91143c5bea5ab41fe323e719da4a46ab9d631) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1996, ivant, 0, 0, ivant, ivant, ivant_state, empty_init, "Excalibur Electronics", "Ivan The Terrible", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/chess/excal_mirage.cpp mame-0.264+dfsg.1/src/mame/chess/excal_mirage.cpp --- mame-0.263+dfsg.1/src/mame/chess/excal_mirage.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/excal_mirage.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,609 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/******************************************************************************* + +Excalibur Mirage + +It's Excalibur's first chess computer, and also Ron Nelson's official return to +chess programming. The x/y motorized magnet is similar to the one used in +Fidelity Phantom (and Milton Bradley Phantom before that). + +Before moving a piece, wait until the computer is done with its own move. After +capturing a piece, select the captured piece from the MAME sensorboard spawn +block and place it anywhere on a free spot at the designated box at the edge +of the chessboard. + +Hardware notes: +- PCB label: EXCALIBUR ELECTRONICS, INC. 6/5/96, MIRAGE, 00-55052-000 +- Hitachi H8/3256 MCU (only 32KB out of 48KB internal ROM used), either mask ROM + or OTP ROM, 20MHz XTAL +- 2*L293DNE motor drivers, 2 DC motors (like a plotter), electromagnet under the + chessboard for automatically moving the pieces +- LCD with 5 7segs and custom segments +- piezo, button sensors chessboard + +There's also a version with a fake wood housing instead of black plastic, it's +most likely the same hardware. + +TODO: +- like fphantom, sensorboard undo buffer fills up pretty quickly +- dump/add OTP version, maybe they improved the motor drift issue? +- it does a cold boot at every reset, so nvram won't work properly unless MAME + adds some kind of auxillary autosave state feature at power-off + +BTANB: +- Motors gradually drift, causing it to place/pick up pieces off-center. It + recalibrates itself once in a while but it's not enough. MAME's sensorboard + device can't deal with it, so there's a workaround (see realign_magnet_pos). + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/h8/h8325.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "excal_mirage.lh" + + +namespace { + +class mirage_state : public driver_device +{ +public: + mirage_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_lcd_pwm(*this, "lcd_pwm"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0), + m_out_lcd(*this, "s%u.%u", 0U, 0U), + m_piece_hand(*this, "cpu_hand"), + m_out_motor(*this, "motor%u", 0U), + m_out_pos(*this, "pos_%c", unsigned('x')) + { } + + void mirage(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(on_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_lcd_pwm; + required_device m_dac; + required_ioport_array<3> m_inputs; + output_finder<2, 24> m_out_lcd; + output_finder<> m_piece_hand; + output_finder<5> m_out_motor; + output_finder<2> m_out_pos; + + u16 m_inp_mux = 0; + u32 m_lcd_segs = 0; + u8 m_lcd_com = 0; + + u8 m_magnet = 0; + u8 m_pieces_map[0x40][0x40] = { }; + + u8 m_motor_control[2] = { }; + u32 m_motor_max[2] = { }; + u32 m_motor_pos[2] = { }; + s32 m_motor_drift[2] = { }; + u8 m_motor_quad[2] = { }; + + attotime m_motor_period; + attotime m_motor_remain[2]; + emu_timer *m_motor_timer[2]; + + void clear_board(int state); + void init_motors(); + + void get_scaled_pos(double *x, double *y); + void output_magnet_pos(); + void realign_magnet_pos(); + void update_piece(u8 magnet); + + TIMER_CALLBACK_MEMBER(motor_count); + void motor_control(int m, u8 control); + + // I/O handlers + void lcd_pwm_w(offs_t offset, u8 data); + void update_lcd(); + template void lcd_segs_w(u8 data); + + u8 p4_r(); + u8 p5_r(); + void p5_w(u8 data); + u8 p6_r(); + void p6_w(u8 data); + u8 p7_r(); + void p7_w(offs_t offset, u8 data, u8 mem_mask); +}; + + + +/******************************************************************************* + Initialization +*******************************************************************************/ + +void mirage_state::machine_start() +{ + init_motors(); + + // resolve handlers + m_out_lcd.resolve(); + m_piece_hand.resolve(); + m_out_motor.resolve(); + m_out_pos.resolve(); + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_lcd_segs)); + save_item(NAME(m_lcd_com)); + + save_item(NAME(m_magnet)); + save_item(NAME(m_pieces_map)); + save_item(NAME(m_motor_control)); + save_item(NAME(m_motor_pos)); + save_item(NAME(m_motor_drift)); + save_item(NAME(m_motor_quad)); + save_item(NAME(m_motor_remain)); +} + +void mirage_state::machine_reset() +{ + memset(m_motor_drift, 0, sizeof(m_motor_drift)); + output_magnet_pos(); +} + +void mirage_state::clear_board(int state) +{ + memset(m_pieces_map, 0, sizeof(m_pieces_map)); + m_piece_hand = 0; + m_board->clear_board(); +} + + + +/******************************************************************************* + Motor Sim +*******************************************************************************/ + +void mirage_state::init_motors() +{ + m_motor_period = attotime::from_usec(800); + + for (int i = 0; i < 2; i++) + { + m_motor_timer[i] = timer_alloc(FUNC(mirage_state::motor_count), this); + m_motor_remain[i] = m_motor_period / 2; + } + + m_motor_max[1] = 1500 - 1; + m_motor_pos[1] = 1480; + + m_motor_max[0] = 2020 - 1; + m_motor_pos[0] = 24; +} + +void mirage_state::get_scaled_pos(double *x, double *y) +{ + // 176 counts per square + *x = std::clamp(double(int(m_motor_pos[0]) - 20) / (176.0 / 4.0) + 2.0, 0.0, 48.0); + *y = std::clamp(double(int(m_motor_pos[1]) - 160) / (176.0 / 4.0) + 2.0, 0.0, 32.0); +} + +void mirage_state::output_magnet_pos() +{ + double x, y; + get_scaled_pos(&x, &y); + + // put active state on x bit 11 + const int active = m_magnet ? 0x800 : 0; + m_out_pos[0] = int(x * 25.0 + 0.5) | active; + m_out_pos[1] = int(y * 25.0 + 0.5); +} + +void mirage_state::realign_magnet_pos() +{ + // compensate for gradual drift, see BTANB + for (int i = 0; i < 2; ) + { + double pos[2]; + get_scaled_pos(&pos[0], &pos[1]); + + const double limit = 1.0 / 11.0; // 4 counts + int inc = 0; + + if ((round(pos[i]) - pos[i]) > limit && m_motor_pos[i] < m_motor_max[i] - 4) + inc = 1; + else if ((round(pos[i]) - pos[i]) < -limit && m_motor_pos[i] > 4) + inc = -1; + else + i++; + + if (inc != 0) + { + m_motor_pos[i] += inc * 4; + m_motor_drift[i] -= inc; + + logerror("motor %C drift error (%d total)\n", 'X' + i, m_motor_drift[i]); + } + } +} + +void mirage_state::update_piece(u8 magnet) +{ + if (magnet == m_magnet) + return; + + realign_magnet_pos(); + + m_magnet = magnet; + output_magnet_pos(); + + double dx, dy; + get_scaled_pos(&dx, &dy); + + int mx = dx + 0.5; + int my = dy + 0.5; + + // convert motors position into board coordinates + int x = mx / 4 - 2; + int y = 7 - (my / 4); + + if (x < 0) + x += 12; + + const bool valid_pos = (mx & 3) == 2 && (my & 3) == 2; + + // sensorboard handling is almost the same as fidelity/phantom.cpp + if (magnet) + { + if (valid_pos) + { + // pick up piece, unless it was picked up by the user + const int pos = (y << 4 & 0xf0) | (x & 0x0f); + if (pos != m_board->get_handpos()) + { + m_piece_hand = m_board->read_piece(x, y); + + if (m_piece_hand != 0) + { + m_board->write_piece(x, y, 0); + m_board->refresh(); + } + } + } + else + { + // pick up piece from internal pieces map + m_piece_hand = m_pieces_map[my][mx]; + m_pieces_map[my][mx] = 0; + } + } + else if (m_piece_hand != 0) + { + if (valid_pos) + { + // collision with piece on board (user interference) + if (m_board->read_piece(x, y) != 0) + popmessage("Collision at %c%d!", x + 'A', y + 1); + else + { + m_board->write_piece(x, y, m_piece_hand); + m_board->refresh(); + } + } + else + { + // collision with internal pieces map (shouldn't happen) + if (m_pieces_map[my][mx] != 0) + popmessage("Internal collision!"); + else + m_pieces_map[my][mx] = m_piece_hand; + } + + m_piece_hand = 0; + } +} + +TIMER_CALLBACK_MEMBER(mirage_state::motor_count) +{ + const int m = param ? 1 : 0; + assert(m_motor_control[m] & 2); + + // 1 quarter rotation per period + int inc = 0; + if (m_motor_control[m] & 1) + { + if (m_motor_pos[m] < m_motor_max[m]) + inc = 1; + } + else if (m_motor_pos[m] > 0) + inc = -1; + + m_motor_remain[m] = m_motor_period; + + if (inc == 0) + return; + + m_motor_pos[m] += inc; + m_motor_timer[m]->adjust(m_motor_period, m); + + output_magnet_pos(); + + // update quadrature encoder + static const u8 lut_quad[4] = { 0,1,3,2 }; + m_motor_quad[m] = lut_quad[m_motor_pos[m] & 3]; + + m_maincpu->set_input_line(INPUT_LINE_IRQ1 + m, (m_motor_quad[m] & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void mirage_state::motor_control(int m, u8 control) +{ + if (control == m_motor_control[m]) + return; + + // remember remaining time + if (m_motor_control[m] & 2 && !m_motor_timer[m]->remaining().is_never()) + { + m_motor_remain[m] = m_motor_timer[m]->remaining(); + m_motor_timer[m]->adjust(attotime::never); + } + + // invert remaining time if direction flipped + if ((m_motor_control[m] ^ control) & 1) + m_motor_remain[m] = m_motor_period - m_motor_remain[m]; + + m_motor_control[m] = control; + + // (re)start the timer + if (control & 2) + m_motor_timer[m]->adjust(m_motor_remain[m], m); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// LCD + +void mirage_state::lcd_pwm_w(offs_t offset, u8 data) +{ + m_out_lcd[offset & 0x3f][offset >> 6] = data; +} + +void mirage_state::update_lcd() +{ + u32 lcd_segs = (m_lcd_segs & 0xfff000) | bitswap<12>(m_lcd_segs,7,6,5,4,3,2,1,0,8,9,10,11); + + for (int i = 0; i < 2; i++) + { + // LCD common is 0/1/Hi-Z + const u32 data = BIT(m_lcd_com, i + 2) ? (BIT(m_lcd_com, i) ? ~lcd_segs : lcd_segs) : 0; + m_lcd_pwm->write_row(i, data); + } +} + +template +void mirage_state::lcd_segs_w(u8 data) +{ + // P1x, P2x, P3x: LCD segments + const u8 shift = 8 * N; + m_lcd_segs = (m_lcd_segs & ~(0xff << shift)) | (data << shift); + update_lcd(); + + // P1x,P20-P23: input mux (chessboard) + m_inp_mux = (m_inp_mux & 0x3000) | bitswap<12>(~m_lcd_segs,18,19,8,9,10,11,12,13,14,15,16,17); +} + + +// misc + +INPUT_CHANGED_MEMBER(mirage_state::on_button) +{ + m_maincpu->set_input_line(INPUT_LINE_IRQ0, newval ? ASSERT_LINE : CLEAR_LINE); +} + +u8 mirage_state::p4_r() +{ + // P40-P47: multiplexed inputs + u8 data = 0; + + // read buttons + for (int i = 0; i < 2; i++) + if (BIT(m_inp_mux, i + 12)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 12; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i); + + return bitswap<8>(~data,7,6,5,4,0,1,2,3); +} + +u8 mirage_state::p5_r() +{ + // P55: motor Y quadrature B + return ~(BIT(m_motor_quad[1], 1) << 5); +} + +void mirage_state::p5_w(u8 data) +{ + // P52: speaker out + m_dac->write(BIT(~data, 2)); + + // P53: motor Y direction + // P54: motor Y on + motor_control(1, data >> 3 & 3); + + for (int i = 0; i < 2; i++) + m_out_motor[i] = BIT(data, i + 3); +} + +u8 mirage_state::p6_r() +{ + // P63: battery status + // P64: on/off button (IRQ0) + u8 data = m_inputs[2]->read() << 3 & 0x18; + + // P65: motor X quadrature A (IRQ1) + // P66: motor Y quadrature A (IRQ2) + data |= m_motor_quad[0] << 5 & 0x20; + data |= m_motor_quad[1] << 6 & 0x40; + + return ~data; +} + +void mirage_state::p6_w(u8 data) +{ + // P60,P61: input mux (buttons) + m_inp_mux = (m_inp_mux & 0xfff) | (~data << 12 & 0x3000); +} + +u8 mirage_state::p7_r() +{ + // P73: motor X quadrature B + return ~(BIT(m_motor_quad[0], 1) << 3); +} + +void mirage_state::p7_w(offs_t offset, u8 data, u8 mem_mask) +{ + // P70,P71: LCD common + m_lcd_com = mem_mask << 2 | (data & 3); + update_lcd(); + + // P74: motor X direction + // P75: motor X on + motor_control(0, data >> 4 & 3); + + // P76: electromagnet + update_piece(BIT(data, 6)); + + for (int i = 0; i < 3; i++) + m_out_motor[i + 2] = BIT(data, i + 4); + + // P77: motor board power? +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( mirage ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Hint / Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Takeback / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Move / Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clear") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Level / Rook") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Verify / Queen") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Setup / King") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Replay") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Auto / Stop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Multi-Move / Right") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Black / White / Left") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Mode") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.2") + PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x01, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, mirage_state, on_button, 0) PORT_NAME("On / Off") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void mirage_state::mirage(machine_config &config) +{ + // basic machine hardware + H83256(config, m_maincpu, 20_MHz_XTAL); + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(h83256_device::nvram_set_battery)); + m_maincpu->standby_cb().append([this](int state) { if (state) m_lcd_pwm->clear(); }); + m_maincpu->write_port1().set(FUNC(mirage_state::lcd_segs_w<1>)); + m_maincpu->write_port2().set(FUNC(mirage_state::lcd_segs_w<2>)); + m_maincpu->write_port3().set(FUNC(mirage_state::lcd_segs_w<0>)); + m_maincpu->read_port4().set(FUNC(mirage_state::p4_r)); + m_maincpu->read_port5().set(FUNC(mirage_state::p5_r)); + m_maincpu->write_port5().set(FUNC(mirage_state::p5_w)); + m_maincpu->read_port6().set(FUNC(mirage_state::p6_r)); + m_maincpu->write_port6().set(FUNC(mirage_state::p6_w)); + m_maincpu->read_port7().set(FUNC(mirage_state::p7_r)); + m_maincpu->write_port7().set(FUNC(mirage_state::p7_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->set_size(8+4, 8); + m_board->clear_cb().set(FUNC(mirage_state::clear_board)); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + //m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_lcd_pwm).set_size(2, 24); + m_lcd_pwm->output_x().set(FUNC(mirage_state::lcd_pwm_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920/5, 697/5); + screen.set_visarea_full(); + + config.set_default_layout(layout_excal_mirage); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( emirage ) + ROM_REGION( 0xc000, "maincpu", 0 ) + ROM_LOAD("1996_7012_excalibur_hd6433256a33p.ic1", 0x0000, 0xc000, CRC(41eed8ea) SHA1(8b5370814d2bfc2d5fcb4ee86c30d676517bcd3a) ) + + ROM_REGION( 109652, "screen", 0 ) + ROM_LOAD("emirage.svg", 0, 109652, CRC(6840c49e) SHA1(a9c91143c5bea5ab41fe323e719da4a46ab9d631) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1996, emirage, 0, 0, mirage, mirage, mirage_state, empty_init, "Excalibur Electronics", "Mirage (Excalibur)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff -Nru mame-0.263+dfsg.1/src/mame/chess/regence.cpp mame-0.264+dfsg.1/src/mame/chess/regence.cpp --- mame-0.263+dfsg.1/src/mame/chess/regence.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/regence.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -68,7 +68,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; bool m_power = false; diff -Nru mame-0.263+dfsg.1/src/mame/chess/tasc.cpp mame-0.264+dfsg.1/src/mame/chess/tasc.cpp --- mame-0.263+dfsg.1/src/mame/chess/tasc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/tasc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -267,23 +267,23 @@ static INPUT_PORTS_START( tasc ) PORT_START("IN.0") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("PLAY") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_START("IN.1") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACK") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Back") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_START("IN.2") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MENU") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Menu") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Left Clock") PORT_START("IN.3") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENTER") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Right Clock") PORT_START("CPU") diff -Nru mame-0.263+dfsg.1/src/mame/chess/yeno_301xl.cpp mame-0.264+dfsg.1/src/mame/chess/yeno_301xl.cpp --- mame-0.263+dfsg.1/src/mame/chess/yeno_301xl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/yeno_301xl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,241 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger, Sean Riddle -/******************************************************************************* - -Yeno 301 XL - -NOTE: It triggers an IRQ when the power switch is changed from ON to SAVE. -If this is not done, NVRAM won't save properly. - -It's by the same programmer as Chess King Triomphe / Counter Gambit, also using -the TRAP interrupt for the beeper routine. Intelligent Software did not exist -anymore in 1988. - -Hardware notes: -- PCB label: WSE 8108A -- Hitachi HD63B01X0P, 8MHz XTAL -- 8*8 chessboard buttons, 16+1 LEDs, piezo - -Yeno 309 XT is on the same PCB, and has the same MCU ROM. - -TODO: -- if/when MAME supports an exit callback, hook up power-off switch to that - -*******************************************************************************/ - -#include "emu.h" - -#include "cpu/m6800/m6801.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" - -#include "speaker.h" - -// internal artwork -#include "yeno_301xl.lh" - - -namespace { - -class y301xl_state : public driver_device -{ -public: - y301xl_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_board(*this, "board"), - m_display(*this, "display"), - m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(power_off); - - void y301xl(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_board; - required_device m_display; - required_device m_dac; - required_ioport_array<2> m_inputs; - - emu_timer *m_standbytimer; - u16 m_inp_mux = 0; - - // I/O handlers - u8 input_r(); - void control_w(u8 data); - void board_w(u8 data); - - TIMER_CALLBACK_MEMBER(set_standby); -}; - -void y301xl_state::machine_start() -{ - m_standbytimer = timer_alloc(FUNC(y301xl_state::set_standby), this); - - // register for savestates - save_item(NAME(m_inp_mux)); -} - - - -/******************************************************************************* - Power -*******************************************************************************/ - -void y301xl_state::machine_reset() -{ - m_maincpu->set_input_line(HD6301_IRQ1_LINE, CLEAR_LINE); - m_maincpu->set_input_line(M6801_STBY_LINE, CLEAR_LINE); -} - -TIMER_CALLBACK_MEMBER(y301xl_state::set_standby) -{ - m_maincpu->set_input_line(M6801_STBY_LINE, ASSERT_LINE); -} - -INPUT_CHANGED_MEMBER(y301xl_state::power_off) -{ - if (newval && !m_maincpu->standby()) - { - // IRQ1 when power switch is set to SAVE, followed by STBY after a short delay - m_maincpu->set_input_line(HD6301_IRQ1_LINE, ASSERT_LINE); - m_standbytimer->adjust(attotime::from_msec(50)); - } -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -u8 y301xl_state::input_r() -{ - // P20-P27: multiplexed inputs - u8 data = 0; - - // read buttons - for (int i = 0; i < 2; i++) - if (BIT(m_inp_mux, i + 8)) - data |= m_inputs[i]->read(); - - // read chessboard - for (int i = 0; i < 8; i++) - if (BIT(m_inp_mux, i)) - data |= m_board->read_file(i); - - return ~data; -} - -void y301xl_state::control_w(u8 data) -{ - // P40,P41: input mux (buttons) - m_inp_mux = (m_inp_mux & 0xff) | (~data << 8 & 0x300); - - // P42: green led (direct) - // P44,P45: led select - m_display->write_my(bitswap<3>(~data,2,5,4)); - - // P47: speaker out - m_dac->write(BIT(~data, 7)); -} - -void y301xl_state::board_w(u8 data) -{ - // P60-P67: input mux (chessboard), led data - m_inp_mux = (m_inp_mux & 0x300) | (data ^ 0xff); - m_display->write_mx(~data); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( y301xl ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Set Up") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Black") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("White") - - PORT_START("POWER") // needs to be triggered for nvram to work - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, y301xl_state, power_off, 0) PORT_NAME("Power Off") -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -void y301xl_state::y301xl(machine_config &config) -{ - // basic machine hardware - HD6301X0(config, m_maincpu, 8_MHz_XTAL); - m_maincpu->nvram_enable_backup(true); - m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301x0_cpu_device::nvram_set_battery)); - m_maincpu->standby_cb().append([this](int state) { if (state) m_display->clear(); }); - m_maincpu->in_p2_cb().set(FUNC(y301xl_state::input_r)); - m_maincpu->out_p4_cb().set(FUNC(y301xl_state::control_w)); - m_maincpu->out_p6_cb().set(FUNC(y301xl_state::board_w)); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - m_board->set_nvram_enable(true); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2+1, 8); - config.set_default_layout(layout_yeno_301xl); - - // sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( y301xl ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD("yeno_301_xl_hd63b01x0c70p", 0x0000, 0x1000, CRC(6da5ee23) SHA1(f37298c56c5130783c86fb03fab78d86c20467e5) ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, y301xl, 0, 0, y301xl, y301xl, y301xl_state, empty_init, "Yeno / Bray Research", "301 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/chess/yeno_532xl.cpp mame-0.264+dfsg.1/src/mame/chess/yeno_532xl.cpp --- mame-0.263+dfsg.1/src/mame/chess/yeno_532xl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/chess/yeno_532xl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,281 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Mr. Lars -/******************************************************************************* - -Yeno 532 XL - -This is the only Yeno chesscomputer that has a common CPU with external EPROM, -others are based on a 1-chip MCU. The 532 XL chess engine is by Ulf Rathsman. - -Hardware notes: -- R65C02P4 @ 4 MHz -- 32KB ROM (MBM27C256H-10) -- 8KB battery-backed RAM (HY6264LP-10) -- HD61603, 2 4*7seg LCD screens -- TTL, piezo, 8*8+7 LEDs, button sensors - -The software searches for an opening book ROM in 0x4000-0x7fff, it looks like -it's compatible with Conchess L16 / Mephisto HG240. Though the hardware does -not have an edge connector or empty ROM socket for it. - -*******************************************************************************/ - -#include "emu.h" - -#include "cpu/m6502/r65c02.h" -#include "machine/nvram.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/hd61603.h" -#include "video/pwm.h" - -#include "speaker.h" - -// internal artwork -#include "yeno_532xl.lh" - - -namespace { - -class y532xl_state : public driver_device -{ -public: - y532xl_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_lcd(*this, "lcd"), - m_display(*this, "display"), - m_board(*this, "board"), - m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0), - m_out_digit(*this, "digit%u", 0U), - m_out_lcd(*this, "lcd%u", 0U) - { } - - // machine configs - void y532xl(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_lcd; - required_device m_display; - required_device m_board; - required_device m_dac; - required_ioport_array<3> m_inputs; - output_finder<8> m_out_digit; - output_finder<64> m_out_lcd; - - u8 m_led_data = 0; - u8 m_cb_mux = 0xff; - u8 m_control = 0xff; - - // address maps - void main_map(address_map &map); - - // I/O handlers - void update_display(); - void lcd_seg_w(u64 data); - u8 input_r(); - void cb_w(u8 data); - void led_w(u8 data); - void control_w(offs_t offset, u8 data); -}; - -void y532xl_state::machine_start() -{ - m_out_digit.resolve(); - m_out_lcd.resolve(); - - // register for savestates - save_item(NAME(m_led_data)); - save_item(NAME(m_cb_mux)); - save_item(NAME(m_control)); -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -void y532xl_state::update_display() -{ - m_display->matrix(~(m_control << 8 | m_cb_mux), m_led_data); -} - -void y532xl_state::lcd_seg_w(u64 data) -{ - // output individual segments - for (int i = 0; i < 64; i++) - m_out_lcd[i] = BIT(data, i); - - // output digits - for (int i = 0; i < 8; i++) - { - u8 digit_data = bitswap<8>(data,7,3,2,4,5,6,0,1); - m_out_digit[i] = (i & 3) ? digit_data : digit_data & 0x7f; // no DP for last digit - data >>= 8; - } -} - -u8 y532xl_state::input_r() -{ - u8 data = 0; - - // read side panel buttons - for (int i = 0; i < 3; i++) - if (BIT(~m_control, i)) - data |= m_inputs[i]->read(); - - // read chessboard sensors - for (int i = 0; i < 8; i++) - if (BIT(~m_cb_mux, i)) - data |= m_board->read_file(i); - - return data; -} - -void y532xl_state::cb_w(u8 data) -{ - // d0-d3: lcd data (see control_w) - // d0-d7: chessboard input mux - m_cb_mux = data; - update_display(); -} - -void y532xl_state::led_w(u8 data) -{ - // d0-d7: led data - m_led_data = data; - update_display(); -} - -void y532xl_state::control_w(offs_t offset, u8 data) -{ - u8 prev = m_control; - - // a0-a2,d0: 74259 - u8 mask = 1 << offset; - m_control = (m_control & ~mask) | ((data & 1) ? mask : 0); - - // Q0-Q2: button input mux - // Q0: select side leds - update_display(); - - // Q3,Q4: speaker out - m_dac->write(m_control >> 3 & 3); - - // Q7 rising edge: write to lcd - if (~prev & m_control & 0x80) - m_lcd->data_w(m_cb_mux & 0xf); -} - - - -/******************************************************************************* - Address Maps -*******************************************************************************/ - -void y532xl_state::main_map(address_map &map) -{ - map(0x0000, 0x1fff).ram().share("nvram"); - map(0x2000, 0x2000).w(FUNC(y532xl_state::cb_w)); - map(0x2080, 0x2080).w(FUNC(y532xl_state::led_w)); - map(0x2100, 0x2100).r(FUNC(y532xl_state::input_r)); - map(0x2180, 0x2187).w(FUNC(y532xl_state::control_w)); - map(0x8000, 0xffff).rom(); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( y532xl ) - PORT_START("IN.0") - PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Show Move") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game / Clear Board") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Up") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Multi Move") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Teach") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Take Back") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Forward") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A / 1 / Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B / 2 / Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C / 3 / Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D / 4 / Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E / 5 / Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F / 6 / King") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G / 7 / Black") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H / 8 / White") -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -void y532xl_state::y532xl(machine_config &config) -{ - // basic machine hardware - R65C02(config, m_maincpu, 4_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &y532xl_state::main_map); - - const attotime nmi_period = attotime::from_hz(4_MHz_XTAL / 0x2000); - m_maincpu->set_periodic_int(FUNC(y532xl_state::nmi_line_pulse), nmi_period); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - m_board->set_nvram_enable(true); - - // video hardware - HD61603(config, m_lcd, 0); - m_lcd->write_segs().set(FUNC(y532xl_state::lcd_seg_w)); - - PWM_DISPLAY(config, m_display).set_size(9, 8); - config.set_default_layout(layout_yeno_532xl); - - // sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_2BIT_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.125); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( y532xl ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("532xl_00674.u9", 0x8000, 0x8000, CRC(8ded1df6) SHA1(6bcbebb8e1fde472e1ccd0036cb3f00b27f72d89) ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, y532xl, 0, 0, y532xl, y532xl, y532xl_state, empty_init, "Yeno", "532 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/cirsa/neptunp2.cpp mame-0.264+dfsg.1/src/mame/cirsa/neptunp2.cpp --- mame-0.263+dfsg.1/src/mame/cirsa/neptunp2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cirsa/neptunp2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -43,13 +43,14 @@ Unidesa/Cirsa/Europea Atlantis Unidesa/Cirsa/Europea Bingo Lotto + Unidesa/Cirsa/Europea Charleston Unidesa/Cirsa/Europea Extra Cash Unidesa/Cirsa/Europea Mississippi Casino Unidesa/Cirsa/Europea Oklahoma Express Unidesa/Cirsa/Europea Ruleta de la Fortuna -The "960606-3" version of this hardware was used in several fruit -machines released for the UK market by BGT Gaming Technology Ltd +The "960606-3" version of this hardware was also used in several fruit +machines released for the UK market by BGT Gaming Technology Ltd. (a division of Cirsa?). @@ -154,6 +155,8 @@ to connector P14 for diagnostics and configuration. Sometimes this display is externally exposed so it shows game texts and messages to the players. + Most games (with or without video) have their serial number hardcoded on the program ROMs. + */ #include "emu.h" @@ -374,6 +377,7 @@ ROM_LOAD( "la_perla_del_caribe_bq_graf.-es_bg1-2-2_v_g-3f019.u1", 0x4000200, 0x2000100, CRC(2dd9db7f) SHA1(a6fc4ebaf536933bc901699c21d65ad1eb7baaad) ) ROM_LOAD( "la_perla_del_caribe_bq_graf.-es_bg1-2-2_v_g-3f019.u2", 0x6000300, 0x2000100, CRC(c391c42c) SHA1(a3416f6ed0de7898cf7205fc88499cc27eb9471d) ) + // Reels PCB 2000401-3 ROM_REGION( 0x2000, "reels", 0 ) ROM_LOAD( "pic16f76.u11", 0x0000, 0x2000, NO_DUMP ) // 8KB internal ROM, undumped @@ -408,13 +412,80 @@ ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) ROM_REGION( 0x104, "plds", 0 ) - ROM_LOAD( "pat_062_tibpal16l8-25cn.bin", 0x000, 0x104, NO_DUMP ) // "PAT 062", protected + ROM_LOAD( "pat_062_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 062", protected ROM_END -// '61509960606-5 PCB (exactly the same as '960606-5', but with better quality connectors) and 'CB1 (CS4)' security counters module. -// CPLD labeled as 'PD18'. There's a sticker on the PCB with the date '26/01/2007'. -// There's a small piggyback PCB with a LS14 connected to the 75188 and 75189 sockets (usually not populated on other games). -// This model has the Samsung VFD display (1x16) exposed to the player (on other games it's usually hidden, just for operator use). +// '960606-5 PCB and 'CB1 (CS4)' security counters module. CPLD labeled as 'PD03'. This is mechanical. +ROM_START( ccorsarioa ) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "c_corsarios_50_b-hm0023_b_5.01_cat_b-0082.u2", 0x000000, 0x080000, CRC(b262a36d) SHA1(6c403e5418cde12da87148a44084c7a8866c5005) ) + ROM_LOAD( "c_corsarios_50_b-hm0023_b_5.01_cat_b-0082.u3", 0x080000, 0x080000, CRC(fda606f4) SHA1(5f17fe5139e15c738b0c6e354f43221a3a60d807) ) + + ROM_REGION( 0x100000, "oki", 0 ) + ROM_LOAD( "cirsa_corsario_50_hm0023_s127_1.0_b-82.u14", 0x000000, 0x080000, CRC(f15ccc6b) SHA1(08f2f0129634075297d4a6b9697ba5bd0c8455ce) ) + ROM_LOAD( "cirsa_corsario_50_hm0023_s128_1.0_b-82.u15", 0x080000, 0x080000, CRC(061dc7c8) SHA1(a9c8da9c2e7cecd8800974ce70546cc60391cfe8) ) + + ROM_REGION( 0x800, "eeprom", 0 ) + ROM_LOAD( "24lc16b.u10", 0x000, 0x800, CRC(4254a4e1) SHA1(8d3aeb29a63bbdb8de8c33806af73a6aba910e30) ) + + ROM_REGION( 0x800, "counters", 0 ) + ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) + + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD( "pat_062_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 062", protected +ROM_END + +// '960606-5 PCB and 'CB1 (CS4)' security counters module. CPLD labeled as 'PD18'. This is mechanical. +ROM_START( charles ) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "charles1_catalana_b-h240151_v2.1_b-256_europea_iesa.u2", 0x000000, 0x100000, CRC(41df7dc2) SHA1(b7045bb52f098022e07bd7f303e247e9390348ff) ) + + ROM_REGION( 0x100000, "oki", 0 ) + ROM_LOAD( "s-1.0_otp_char.u14", 0x000000, 0x100000, CRC(4b10093e) SHA1(872a4b7f4abcb302163a2ca77149599c1d338c1b) ) + + ROM_REGION( 0x800, "eeprom", 0 ) + ROM_LOAD( "24c16.u10", 0x000, 0x800, CRC(9ec16fc3) SHA1(dc4dccc766aceb4fc6a009ffc45a7dbdf6d16d32) ) + + ROM_REGION( 0x800, "counters", 0 ) + ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) + + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD( "pat_063_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 063/1", protected +ROM_END + +/* '960606-5 PCB and 'CB1 (CS4)' security counters module. CPLD labeled as 'PD18'. This is mechanical. + A complete manual with schematics can be downloaded from https://www.recreativas.org/manuales + There's a newer model running on CPU PCB 2060608-3 (different ROMs, undumped). */ +ROM_START( gladiador ) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "cirsa_gladiadores_b-m240891_v1.0_caa_b-82.u2", 0x000000, 0x100000, CRC(a34148d1) SHA1(5401cd1b6b7ec00c0ed9579fe24ecee71834d219) ) + + ROM_REGION( 0x100000, "oki", 0 ) + ROM_LOAD( "s-431_otp.u14", 0x000000, 0x100000, CRC(5d0d36ec) SHA1(3cafe09fc8d802abb0197c1ed89d3ad07f9a67f7) ) + + ROM_REGION( 0x800, "eeprom", 0 ) + ROM_LOAD( "24c16.u10", 0x000, 0x800, CRC(a38693a9) SHA1(bad306f3e50dbb60cbf59a09f1e4720576bb3983) ) + + ROM_REGION( 0x800, "counters", 0 ) + ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) + + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD( "pat_063_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 063/1", protected + + // Two reels PCBs 615092000401-3 + ROM_REGION( 0x2000, "reels", 0) + ROM_LOAD( "pic16f76_lower.u11", 0x000, 0x2000, NO_DUMP ) // 8KB internal ROM, undumped + ROM_LOAD( "pic16f76_upper.u11", 0x000, 0x2000, NO_DUMP ) // 8KB internal ROM, undumped + + // "Lower Additional Game" PCB 615032060623-2 + ROM_REGION( 0x4000, "lower", 0) + ROM_LOAD( "pic16f630.u11", 0x000, 0x4000, NO_DUMP ) // 16KB internal ROM, undumped +ROM_END + +/* '61509960606-5 PCB (exactly the same as '960606-5', but with better quality connectors) and 'CB1 (CS4)' security counters module. + CPLD labeled as 'PD18'. There's a sticker on the PCB with the date '26/01/2007'. + There's a small piggyback PCB with a LS14 connected to the 75188 and 75189 sockets (usually not populated on other games). + This model has the Samsung VFD display (1x16) exposed to the player (on other games it's usually hidden, just for operator use). */ ROM_START( mltpoints ) ROM_REGION( 0x100000, "maincpu", 0 ) ROM_LOAD( "c_multi_points_ro_v1.0_caa_03bf9e68_checksum.u2", 0x000000, 0x100000, CRC(26c5a62c) SHA1(e376eb84a75e4ac0b3beb5b1bd0aaf7bd0c3b3cc) ) @@ -453,7 +524,7 @@ ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) ROM_REGION( 0x104, "plds", 0 ) - ROM_LOAD( "pat_063_tibpal16l8-25cn.bin", 0x000, 0x104, NO_DUMP ) // "PAT 063", protected + ROM_LOAD( "pat_063_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 063", protected ROM_END // '960606-5 PCB and 'CB1 (CS4)' security counters module. It was found with most sockets unpopulated. This is mechanical. @@ -502,7 +573,7 @@ ROM_LOAD( "cirsa_cs-4.bin", 0x000, 0x800, NO_DUMP ) ROM_REGION( 0x104, "plds", 0 ) - ROM_LOAD( "pat_063_tibpal16l8-25cn.bin", 0x000, 0x104, NO_DUMP ) // "PAT 063", protected + ROM_LOAD( "pat_063_tibpal16l8-25cn.u6", 0x000, 0x104, NO_DUMP ) // "PAT 063", protected ROM_END ROM_START( bg_ddb ) @@ -511,8 +582,8 @@ ROM_RELOAD(0x80000,0x80000) ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) - /* there were sound roms in the 'CoinWorld Ding Dong Bells' set which might belong here, otherwise - roms are probably missing */ + /* There were sound ROMs in the 'CoinWorld Ding Dong Bells' set which might belong here, otherwise + ROMs are probably missing */ ROM_REGION( 0x800, "eeprom", 0 ) ROM_LOAD( "24lc16b.u10", 0x000, 0x800, NO_DUMP ) @@ -540,7 +611,7 @@ ROM_RELOAD(0x80000,0x80000) ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) - /* probably missing */ + // probably missing ROM_REGION( 0x800, "eeprom", 0 ) ROM_LOAD( "24lc16b.u10", 0x000, 0x800, NO_DUMP ) @@ -558,7 +629,7 @@ ROM_RELOAD(0x80000,0x80000) ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) - /* probably missing */ + // probably missing ROM_REGION( 0x800, "eeprom", 0 ) ROM_LOAD( "24lc16b.u10", 0x000, 0x800, NO_DUMP ) @@ -575,18 +646,21 @@ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS // Video games on Cirsa "960606-5" CPU PCB + "IS040302-3" VGA SOC-Legacy PCB (or similar video PCB) -GAME( 2003, neptunp2, 0, neptunp2_video, neptunp2, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Neptune's Pearls 2", MACHINE_IS_SKELETON ) // Year from legal registry date -GAME( 2008, perlacrb, 0, neptunp2_video, neptunp2, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "La Perla del Caribe (V1.0, Catalonia)", MACHINE_IS_SKELETON ) +GAME( 2003, neptunp2, 0, neptunp2_video, neptunp2, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Neptune's Pearls 2", MACHINE_IS_SKELETON ) // Year from legal registry date +GAME( 2008, perlacrb, 0, neptunp2_video, neptunp2, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "La Perla del Caribe (V1.0, Catalonia)", MACHINE_IS_SKELETON ) // Screenless games on Cirsa "960606-5" CPU PCB -GAME( 1999, ccorsario, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Corsarios (Cirsa slot machine)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB -GAME( 2006, mltpoints, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Multi Points", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from manual -GAME( 1999, rockroll, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Rock 'n' Roll", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from parts' manual and sticker on PCB -GAME( 2001?, unk960606, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "unknown 960606-5 based machine (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB -GAME( 2001?, unk960606b, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa/Europea", "unknown 960606-5 based machine (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB +GAME( 1999, ccorsario, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Corsarios (Cirsa slot machine, V6.0D)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB +GAME( 1999, ccorsarioa, ccorsario, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Corsarios (Cirsa slot machine, V5.10D, Catalonia)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB +GAME( 2002?, charles, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa/Europea", "Charleston (V2.1, Catalonia)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB +GAME( 2008, gladiador, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Gladiadores (V1.0, CAA)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from manual +GAME( 2006, mltpoints, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Multi Points (V1.0, CAA)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from manual +GAME( 1999, rockroll, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "Rock 'n' Roll", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from parts' manual and sticker on PCB +GAME( 2001?, unk960606, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa", "unknown 960606-5 based machine (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB +GAME( 2001?, unk960606b, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "Unidesa/Cirsa/Europea", "unknown 960606-5 based machine (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) // Year taken from sticker on PCB // BGT Fruit Machines -GAME( 199?, bg_ddb, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Ding Dong Bells (BGT)", MACHINE_IS_SKELETON_MECHANICAL ) -GAME( 199?, bg_barmy, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Barmy Army (BGT)", MACHINE_IS_SKELETON_MECHANICAL ) -GAME( 199?, bg_max, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Max A Million (BGT) (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) -GAME( 199?, bg_maxa, bg_max,neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Max A Million (BGT) (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_ddb, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Ding Dong Bells (BGT)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_barmy, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Barmy Army (BGT)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_max, 0, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Max A Million (BGT) (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_maxa, bg_max, neptunp2_no_video, c960606, neptunp2_state, empty_init, ROT0, "BGT", "Max A Million (BGT) (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.263+dfsg.1/src/mame/comad/funybubl.cpp mame-0.264+dfsg.1/src/mame/comad/funybubl.cpp --- mame-0.263+dfsg.1/src/mame/comad/funybubl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/comad/funybubl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -124,8 +124,6 @@ }; -// video - rgb_t funybubl_state::r6b6g6(uint32_t raw) { return rgb_t(pal6bit(raw >> 12), pal6bit(raw >> 0), pal6bit(raw >> 6)); @@ -216,8 +214,6 @@ } -// machine - void funybubl_state::vidram_bank_w(uint8_t data) { m_vrambank.select(data & 1); diff -Nru mame-0.263+dfsg.1/src/mame/comad/galspnbl.cpp mame-0.264+dfsg.1/src/mame/comad/galspnbl.cpp --- mame-0.263+dfsg.1/src/mame/comad/galspnbl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/comad/galspnbl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -122,8 +122,6 @@ }; -// video - void galspnbl_state::palette(palette_device &palette) const { @@ -216,8 +214,6 @@ } -// machine - void galspnbl_state::soundcommand_w(offs_t offset, uint8_t data) { m_soundlatch->write(data); diff -Nru mame-0.263+dfsg.1/src/mame/comad/zerozone.cpp mame-0.264+dfsg.1/src/mame/comad/zerozone.cpp --- mame-0.263+dfsg.1/src/mame/comad/zerozone.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/comad/zerozone.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,8 +119,6 @@ }; -// video - void zerozone_state::tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_vram[offset]); @@ -160,8 +158,6 @@ -// machine - void zerozone_state::sound_w(uint8_t data) { m_soundlatch->write(data); diff -Nru mame-0.263+dfsg.1/src/mame/commodore/chessmate.cpp mame-0.264+dfsg.1/src/mame/commodore/chessmate.cpp --- mame-0.263+dfsg.1/src/mame/commodore/chessmate.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/commodore/chessmate.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,7 +85,7 @@ required_device m_maincpu; required_device m_miot; required_device m_display; - required_device m_dac; + required_device m_dac; optional_ioport_array<5> m_inputs; u8 m_inp_mux = 0; @@ -320,5 +320,5 @@ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS SYST( 1978, chmate, 0, 0, chmate, chmate, chmate_state, empty_init, "Commodore", "Chessmate", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, ccmk2, chmate, 0, mk2, mk2, chmate_state, empty_init, "Novag", "Chess Champion: MK II (ver. 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 1st version (jukebox model), aka version B -SYST( 1979, ccmk2a, chmate, 0, mk2a, mk2a, chmate_state, empty_init, "Novag", "Chess Champion: MK II (ver. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, ccmk2, chmate, 0, mk2, mk2, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 1st version (jukebox model), aka version B +SYST( 1979, ccmk2a, chmate, 0, mk2a, mk2a, chmate_state, empty_init, "Novag Industries", "Chess Champion: MK II (ver. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/cvs/galaxia.cpp mame-0.264+dfsg.1/src/mame/cvs/galaxia.cpp --- mame-0.263+dfsg.1/src/mame/cvs/galaxia.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cvs/galaxia.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ }; -// video - static constexpr uint8_t SPRITE_PEN_BASE = 0x10; static constexpr uint8_t STAR_PEN = 0x18; static constexpr uint8_t BULLET_PEN = 0x19; @@ -357,8 +355,6 @@ } -// machine - void galaxia_state::vblank_irq(int state) { if (state) diff -Nru mame-0.263+dfsg.1/src/mame/cvs/quasar.cpp mame-0.264+dfsg.1/src/mame/cvs/quasar.cpp --- mame-0.263+dfsg.1/src/mame/cvs/quasar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cvs/quasar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -92,8 +92,6 @@ }; -// video - /*************************************************************************** Zaccaria S2650 games share various levels of design with the Century Video @@ -265,8 +263,6 @@ } -// machine - /************************************************************************ Quasar memory layout diff -Nru mame-0.263+dfsg.1/src/mame/cxg/chess2001.cpp mame-0.264+dfsg.1/src/mame/cxg/chess2001.cpp --- mame-0.263+dfsg.1/src/mame/cxg/chess2001.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/chess2001.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -59,7 +59,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u16 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/cxg/computachess.cpp mame-0.264+dfsg.1/src/mame/cxg/computachess.cpp --- mame-0.263+dfsg.1/src/mame/cxg/computachess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/computachess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,7 +98,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/cxg/dominator.cpp mame-0.264+dfsg.1/src/mame/cxg/dominator.cpp --- mame-0.263+dfsg.1/src/mame/cxg/dominator.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/dominator.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -69,7 +69,7 @@ required_device m_board; required_device m_lcd; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; output_finder<8> m_out_digit; output_finder<2, 52> m_out_lcd; @@ -79,7 +79,7 @@ void galaxy_map(address_map &map); // I/O handlers - void lcd_s_w(offs_t offset, u64 data); + void lcd_output_w(offs_t offset, u64 data); void control_w(u8 data); void leds_w(offs_t offset, u8 data); u8 input_r(offs_t offset); @@ -99,7 +99,7 @@ // LC7582 LCD -void dominator_state::lcd_s_w(offs_t offset, u64 data) +void dominator_state::lcd_output_w(offs_t offset, u64 data) { // output individual segments for (int i = 0; i < 52; i++) @@ -131,9 +131,9 @@ void dominator_state::control_w(u8 data) { - // d2: LC7582 CE - // d1: LC7582 CLK // d0: LC7582 DATA + // d1: LC7582 CLK + // d2: LC7582 CE m_lcd->data_w(BIT(data, 0)); m_lcd->clk_w(BIT(data, 1)); m_lcd->ce_w(BIT(data, 2)); @@ -267,7 +267,7 @@ // video hardware LC7582(config, m_lcd, 0); - m_lcd->write_segs().set(FUNC(dominator_state::lcd_s_w)); + m_lcd->write_segs().set(FUNC(dominator_state::lcd_output_w)); PWM_DISPLAY(config, m_display).set_size(8+1, 8); config.set_default_layout(layout_cxg_dominator); diff -Nru mame-0.263+dfsg.1/src/mame/cxg/professor.cpp mame-0.264+dfsg.1/src/mame/cxg/professor.cpp --- mame-0.263+dfsg.1/src/mame/cxg/professor.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/professor.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,7 +14,7 @@ Hardware notes: - PCB label: 243 600 001 - Hitachi HD63B01Y0P, 8MHz XTAL -- Sanyo LC7580, LCD with custom segments +- Sanyo LC7580, LCD with 5 7segs and custom segments - 8*8 chessboard buttons, 16 LEDs, piezo *******************************************************************************/ @@ -63,14 +63,14 @@ required_device m_board; required_device m_lcd; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<3> m_inputs; output_finder<2, 52> m_out_lcd; u16 m_inp_mux = 0; // I/O handlers - void lcd_s_w(offs_t offset, u64 data); + void lcd_output_w(offs_t offset, u64 data); template void leds_w(u8 data); void control_w(u8 data); u8 input_r(); @@ -98,7 +98,7 @@ m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); } -void professor_state::lcd_s_w(offs_t offset, u64 data) +void professor_state::lcd_output_w(offs_t offset, u64 data) { for (int i = 0; i < 52; i++) m_out_lcd[offset][i] = BIT(data, i); @@ -119,9 +119,9 @@ // P23: speaker out m_dac->write(BIT(data, 3)); - // P26: LC7580 CE - // P25: LC7580 CLK // P24: LC7580 DATA + // P25: LC7580 CLK + // P26: LC7580 CE m_lcd->data_w(BIT(data, 4)); m_lcd->clk_w(BIT(data, 5)); m_lcd->ce_w(BIT(data, 6)); @@ -170,7 +170,7 @@ PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("Reset") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Position") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Color") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Test") @@ -198,8 +198,8 @@ HD6301Y0(config, m_maincpu, 8_MHz_XTAL); m_maincpu->nvram_enable_backup(true); m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301y_cpu_device::nvram_set_battery)); - m_maincpu->standby_cb().append(m_lcd, FUNC(lc7580_device::inh_w)); m_maincpu->standby_cb().append([this](int state) { if (state) m_display->clear(); }); + m_maincpu->standby_cb().append(m_lcd, FUNC(lc7580_device::inh_w)); m_maincpu->out_p1_cb().set(FUNC(professor_state::leds_w<0>)); m_maincpu->out_p4_cb().set(FUNC(professor_state::leds_w<1>)); m_maincpu->out_p2_cb().set(FUNC(professor_state::control_w)); @@ -213,7 +213,7 @@ // video hardware LC7580(config, m_lcd, 0); - m_lcd->write_segs().set(FUNC(professor_state::lcd_s_w)); + m_lcd->write_segs().set(FUNC(professor_state::lcd_output_w)); m_lcd->nvram_enable_backup(true); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); @@ -239,8 +239,8 @@ ROM_REGION( 0x4000, "maincpu", 0 ) ROM_LOAD("1988_107_newcrest_hd6301y0j76p", 0x0000, 0x4000, CRC(681456c7) SHA1(99f8ab7369dbc2c93335affc38838295a8a2c5f3) ) - ROM_REGION( 61763, "screen", 0 ) - ROM_LOAD("scprof.svg", 0, 61763, CRC(2c26e603) SHA1(028b6406ff2aa89af75dc4133d3cb9a1bbcb846d) ) + ROM_REGION( 61580, "screen", 0 ) + ROM_LOAD("scprof.svg", 0, 61580, CRC(6ebdf57c) SHA1(b0c01f1f251a569a2503a1053d7e676b1e6d9b0a) ) ROM_END } // anonymous namespace diff -Nru mame-0.263+dfsg.1/src/mame/cxg/senterprise.cpp mame-0.264+dfsg.1/src/mame/cxg/senterprise.cpp --- mame-0.263+dfsg.1/src/mame/cxg/senterprise.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/senterprise.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,6 +1,6 @@ // license:BSD-3-Clause // copyright-holders:hap -// thanks-to:Sean Riddle +// thanks-to:Sean Riddle, Berger /******************************************************************************* CXG Super Enterprise @@ -13,14 +13,20 @@ TODO: - if/when MAME supports an exit callback, hook up power-off switch to that -- dump/add model 210.C (it has two small LCDs like Sphinx Galaxy) Hardware notes: -- PCB label (Super Crown): CXG 218-600-001 + +Super Crown: +- PCB label: CXG 218-600-001 - Hitachi HD6301Y0P (mode 2), 8MHz XTAL - 2KB battery-backed RAM (HM6116LP-3) - chessboard buttons, 24 LEDs, piezo +Super Enterprise (model 210.C): +- PCB label: 210C 600-002 +- Sanyo LC7580, same LCDs as Sphinx Galaxy +- rest is same as above + 210 MCU is used in: - CXG Super Enterprise (model 210, black/brown/blue) - CXG Advanced Star Chess (model 211) @@ -39,16 +45,20 @@ #include "machine/nvram.h" #include "machine/sensorboard.h" #include "sound/dac.h" +#include "video/lc7580.h" #include "video/pwm.h" #include "speaker.h" // internal artwork #include "cxg_senterprise.lh" +#include "cxg_senterprisec.lh" namespace { +// model 210 / shared + class senterp_state : public driver_device { public: @@ -67,15 +77,16 @@ protected: virtual void machine_start() override; + virtual void machine_reset() override; -private: // devices/pointers required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; - required_ioport_array<2> m_inputs; + required_device m_dac; + required_ioport_array<3> m_inputs; + emu_timer *m_standbytimer; u8 m_inp_mux = 0; void main_map(address_map &map); @@ -83,28 +94,91 @@ // I/O handlers u8 input1_r(); u8 input2_r(); - void control_w(u8 data); + void leds_w(u8 data); void mux_w(u8 data); + + TIMER_CALLBACK_MEMBER(set_standby); }; void senterp_state::machine_start() { + m_standbytimer = timer_alloc(FUNC(senterp_state::set_standby), this); + + // register for savestates save_item(NAME(m_inp_mux)); } +// model 210.C + +class senterpc_state : public senterp_state +{ +public: + senterpc_state(const machine_config &mconfig, device_type type, const char *tag) : + senterp_state(mconfig, type, tag), + m_lcd(*this, "lcd"), + m_out_digit(*this, "digit%u", 0U), + m_out_lcd(*this, "s%u.%u", 0U, 0U) + { } + + void senterpc(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_lcd; + output_finder<8> m_out_digit; + output_finder<2, 52> m_out_lcd; + + void lcd_output_w(offs_t offset, u64 data); + void lcd_w(u8 data); +}; + +void senterpc_state::machine_start() +{ + senterp_state::machine_start(); + + // resolve handlers + m_out_digit.resolve(); + m_out_lcd.resolve(); +} + + /******************************************************************************* - I/O + Power *******************************************************************************/ +void senterp_state::machine_reset() +{ + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + m_maincpu->set_input_line(M6801_STBY_LINE, CLEAR_LINE); +} + +TIMER_CALLBACK_MEMBER(senterp_state::set_standby) +{ + m_maincpu->set_input_line(M6801_STBY_LINE, ASSERT_LINE); +} + INPUT_CHANGED_MEMBER(senterp_state::power_off) { - // NMI when power switch is set to SAVE, which will trigger standby mode if (newval && !m_maincpu->standby()) - m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); + { + // NMI when power switch is set to SAVE, followed by STBY (internal or STBY pin) + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_standbytimer->adjust(attotime::from_msec(10)); + } } + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// common + u8 senterp_state::input1_r() { u8 data = 0; @@ -114,8 +188,9 @@ if (m_inp_mux & m_inputs[i]->read()) data |= 1 << i; - // P26,P27: freq sel - return ~data ^ 0x80; + // P26,P27: freq sel (senterp) + data |= m_inputs[2]->read(); + return ~data; } u8 senterp_state::input2_r() @@ -130,11 +205,8 @@ return ~data; } -void senterp_state::control_w(u8 data) +void senterp_state::leds_w(u8 data) { - // P22: speaker out - m_dac->write(BIT(data, 2)); - // P23-P25: led select m_display->write_my(~data >> 3 & 7); } @@ -147,6 +219,49 @@ } +// LCD (senterpc) + +void senterpc_state::lcd_output_w(offs_t offset, u64 data) +{ + // output individual segments + for (int i = 0; i < 52; i++) + m_out_lcd[offset][i] = BIT(data, i); + + // unscramble digit 7segs + static const u8 seg2digit[4*7] = + { + 0x03, 0x04, 0x00, 0x40, 0x41, 0x02, 0x42, + 0x05, 0x06, 0x07, 0x48, 0x44, 0x45, 0x46, + 0x0c, 0x0d, 0x0b, 0x0a, 0x4a, 0x4c, 0x4b, + 0x0e, 0x0f, 0x10, 0x50, 0x4d, 0x4e, 0x4f + }; + + for (int i = 0; i < 8; i++) + { + u8 digit = 0; + for (int seg = 0; seg < 7; seg++) + { + u8 bit = seg2digit[7 * (i & 3) + seg] + 26 * (i >> 2); + digit |= m_out_lcd[BIT(bit, 6)][bit & 0x3f] << seg; + } + m_out_digit[i] = digit; + } +} + +void senterpc_state::lcd_w(u8 data) +{ + // P22: LC7580 DATA + // P26: LC7580 CLK + // P27: LC7580 CE + m_lcd->data_w(BIT(data, 2)); + m_lcd->clk_w(BIT(data, 6)); + m_lcd->ce_w(BIT(data, 7)); + + // P22+P27: piezo + m_dac->write(BIT(data, 2) & BIT(~data, 7)); +} + + /******************************************************************************* Address Maps @@ -184,10 +299,25 @@ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Enter Position") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_START("IN.2") + PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_CUSTOM) // freq sel + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) // " + PORT_START("POWER") // needs to be triggered for nvram to work PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, senterp_state, power_off, 0) PORT_NAME("Power Off") INPUT_PORTS_END +static INPUT_PORTS_START( senterpc ) + PORT_INCLUDE( senterp ) + + PORT_MODIFY("IN.1") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Replay") + + PORT_MODIFY("IN.2") + PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + /******************************************************************************* @@ -203,7 +333,8 @@ m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301y0_cpu_device::nvram_set_battery)); m_maincpu->standby_cb().append([this](int state) { if (state) m_display->clear(); }); m_maincpu->in_p2_cb().set(FUNC(senterp_state::input1_r)); - m_maincpu->out_p2_cb().set(FUNC(senterp_state::control_w)); + m_maincpu->out_p2_cb().set(FUNC(senterp_state::leds_w)); + m_maincpu->out_p2_cb().append(m_dac, FUNC(dac_1bit_device::write)).bit(2); m_maincpu->in_p5_cb().set(FUNC(senterp_state::input2_r)); m_maincpu->out_p6_cb().set(FUNC(senterp_state::mux_w)); @@ -223,6 +354,22 @@ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); } +void senterpc_state::senterpc(machine_config &config) +{ + senterp(config); + + // basic machine hardware + m_maincpu->standby_cb().append(m_lcd, FUNC(lc7580_device::inh_w)); + m_maincpu->out_p2_cb().set(FUNC(senterpc_state::leds_w)); + m_maincpu->out_p2_cb().append(FUNC(senterpc_state::lcd_w)); + + // video hardware + LC7580(config, m_lcd, 0); + m_lcd->write_segs().set(FUNC(senterpc_state::lcd_output_w)); + + config.set_default_layout(layout_cxg_senterprisec); +} + /******************************************************************************* @@ -234,6 +381,11 @@ ROM_LOAD("1985_210_newcrest_hd6301y0a14p", 0x0000, 0x4000, CRC(871719c8) SHA1(8c0f5bef2573b9cbebe87be3a899fec6308603be) ) ROM_END +ROM_START( senterpc ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD("1986_210c_cxg_systems_hd6301y0b27p", 0x0000, 0x4000, CRC(5bb67dd6) SHA1(753c33643a5c45e899d0f4743d3ccf7a0728bd48) ) +ROM_END + } // anonymous namespace @@ -242,5 +394,6 @@ Drivers *******************************************************************************/ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, senterp, 0, 0, senterp, senterp, senterp_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1986, senterp, 0, 0, senterp, senterp, senterp_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, senterpc, senterp, 0, senterpc, senterpc, senterpc_state, empty_init, "CXG Systems / Newcrest Technology", "Super Enterprise (model 210.C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/cxg/sphinx40.cpp mame-0.264+dfsg.1/src/mame/cxg/sphinx40.cpp --- mame-0.263+dfsg.1/src/mame/cxg/sphinx40.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cxg/sphinx40.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -282,7 +282,7 @@ PIA6821(config, m_pia); m_pia->writepa_handler().set(FUNC(sphinx40_state::cb_mux_w)); m_pia->writepb_handler().set(FUNC(sphinx40_state::cb_leds_w)); - m_pia->cb2_handler().set("dac", FUNC(dac_bit_interface::write)); + m_pia->cb2_handler().set("dac", FUNC(dac_1bit_device::write)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); diff -Nru mame-0.263+dfsg.1/src/mame/cybiko/cybiko.cpp mame-0.264+dfsg.1/src/mame/cybiko/cybiko.cpp --- mame-0.263+dfsg.1/src/mame/cybiko/cybiko.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cybiko/cybiko.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -118,12 +118,12 @@ map(0xe00000, 0xefffff).r(FUNC(cybiko_state::cybikoxt_key_r)); } -void cybiko_state::serflash_w(uint16_t data) +void cybiko_state::serflash_w(uint8_t data) { - m_flash1->cs_w ((data & 0x10) ? 0 : 1); + m_flash1->cs_w((data & 0x10) ? 0 : 1); } -uint16_t cybiko_state::clock_r() +uint8_t cybiko_state::clock_r() { if (m_rtc->sda_r()) { @@ -133,13 +133,13 @@ return 0x04; } -void cybiko_state::clock_w(uint16_t data) +void cybiko_state::clock_w(uint8_t data) { m_rtc->scl_w((data & 0x02) ? 1 : 0); m_rtc->sda_w((data & 0x01) ? 0 : 1); } -uint16_t cybiko_state::xtclock_r() +uint8_t cybiko_state::xtclock_r() { if (m_rtc->sda_r()) { @@ -149,13 +149,13 @@ return 0; } -void cybiko_state::xtclock_w(uint16_t data) +void cybiko_state::xtclock_w(uint8_t data) { m_rtc->scl_w((data & 0x02) ? 1 : 0); m_rtc->sda_w((data & 0x40) ? 0 : 1); } -uint16_t cybiko_state::xtpower_r() +uint8_t cybiko_state::xtpower_r() { // bit 7 = on/off button // bit 6 = battery charged if "1" @@ -172,7 +172,7 @@ return 0x00; } -uint16_t cybiko_state::port0_r() +uint8_t cybiko_state::port0_r() { // bit 3 = on/off button return 0x08; diff -Nru mame-0.263+dfsg.1/src/mame/cybiko/cybiko.h mame-0.264+dfsg.1/src/mame/cybiko/cybiko.h --- mame-0.263+dfsg.1/src/mame/cybiko/cybiko.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/cybiko/cybiko.h 2024-03-25 14:00:46.000000000 +0000 @@ -20,7 +20,7 @@ #include "bus/rs232/rs232.h" #include "cpu/h8/h8s2245.h" -#include "cpu/h8/h8s2320.h" +#include "cpu/h8/h8s2329.h" #include "imagedev/snapquik.h" @@ -61,15 +61,15 @@ void cybikoxt(machine_config &config); private: - void serflash_w(uint16_t data); - uint16_t clock_r(); - void clock_w(uint16_t data); - uint16_t xtclock_r(); - void xtclock_w(uint16_t data); - uint16_t xtpower_r(); + void serflash_w(uint8_t data); + uint8_t clock_r(); + void clock_w(uint8_t data); + uint8_t xtclock_r(); + void xtclock_w(uint8_t data); + uint8_t xtpower_r(); uint16_t adc1_r(); uint16_t adc2_r(); - uint16_t port0_r(); + uint8_t port0_r(); uint16_t cybiko_lcd_r(offs_t offset, uint16_t mem_mask = ~0); void cybiko_lcd_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/brkthru.cpp mame-0.264+dfsg.1/src/mame/dataeast/brkthru.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/brkthru.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/brkthru.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -221,8 +221,6 @@ }; -// video - /*************************************************************************** @@ -432,8 +430,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/bwing.cpp mame-0.264+dfsg.1/src/mame/dataeast/bwing.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/bwing.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/bwing.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Acho A. Tang, Alex W. Jackson +// copyright-holders: Acho A. Tang, Alex W. Jackson + /***************************************************************************** B-Wings (c) 1984 Data East Corporation @@ -22,48 +23,356 @@ - "RGB dip-switch" looks kludgy at best; *****************************************************************************/ -// Directives + #include "emu.h" -#include "bwing.h" #include "cpu/m6502/deco16.h" #include "cpu/m6809/m6809.h" +#include "machine/gen_latch.h" #include "sound/ay8910.h" #include "sound/dac.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class bwing_state : public driver_device +{ +public: + bwing_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_subcpu(*this, "subcpu"), + m_audiocpu(*this, "audiocpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_soundlatch(*this, "soundlatch"), + m_videoram(*this, "videoram"), + m_spriteram(*this, "spriteram"), + m_paletteram(*this, "paletteram"), + m_fgscrollram(*this, "fgscrollram"), + m_bgscrollram(*this, "bgscrollram"), + m_gfxram(*this, "gfxram", 0x6000, ENDIANNESS_BIG), + m_vramview(*this, "vramview") { } + + void init_bwing(); + void bwing(machine_config &config); + DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); + DECLARE_INPUT_CHANGED_MEMBER(tilt_pressed); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + virtual void device_post_load() override; + +private: + required_device m_maincpu; + required_device m_subcpu; + required_device m_audiocpu; + required_device m_gfxdecode; + required_device m_palette; + required_device m_soundlatch; + + required_shared_ptr m_videoram; + required_shared_ptr m_spriteram; + required_shared_ptr m_paletteram; + required_shared_ptr m_fgscrollram; + required_shared_ptr m_bgscrollram; + memory_share_creator m_gfxram; + memory_view m_vramview; + + // video-related + tilemap_t *m_charmap = nullptr; + tilemap_t *m_fgmap = nullptr; + tilemap_t *m_bgmap = nullptr; + uint8_t m_sreg[8]{}; + uint8_t m_palatch = 0U; + uint8_t m_mapmask = 0U; + + // sound-related + uint8_t m_p3_nmimask = 0U; + uint8_t m_p3_u8f_d = 0; + + void p3_u8f_w(uint8_t data); + void p3_nmimask_w(uint8_t data); + void p3_nmiack_w(uint8_t data); + void p1_ctrl_w(offs_t offset, uint8_t data); + void p2_ctrl_w(offs_t offset, uint8_t data); + void videoram_w(offs_t offset, uint8_t data); + void fgscrollram_w(offs_t offset, uint8_t data); + void bgscrollram_w(offs_t offset, uint8_t data); + template void gfxram_w(offs_t offset, uint8_t data); + void scrollreg_w(offs_t offset, uint8_t data); + void paletteram_w(offs_t offset, uint8_t data); + + TILE_GET_INFO_MEMBER(get_fgtileinfo); + TILE_GET_INFO_MEMBER(get_bgtileinfo); + TILE_GET_INFO_MEMBER(get_charinfo); + TILEMAP_MAPPER_MEMBER(scan_cols); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bmp, const rectangle &clip, uint8_t *ram, int pri); + + INTERRUPT_GEN_MEMBER(p3_interrupt); + void bank_map(address_map &map); + void p1_map(address_map &map); + void p2_map(address_map &map); + void p3_io_map(address_map &map); + void p3_map(address_map &map); +}; + + +void bwing_state::videoram_w(offs_t offset, uint8_t data) +{ + m_videoram[offset] = data; + m_charmap->mark_tile_dirty(offset); +} + + +void bwing_state::fgscrollram_w(offs_t offset, uint8_t data) +{ + m_fgscrollram[offset] = data; + m_fgmap->mark_tile_dirty(offset); +} + + +void bwing_state::bgscrollram_w(offs_t offset, uint8_t data) +{ + m_bgscrollram[offset] = data; + m_bgmap->mark_tile_dirty(offset); +} + + +template +void bwing_state::gfxram_w(offs_t offset, uint8_t data) +{ + offset += (Which * 0x2000); + m_gfxram[offset] = data; + int whichgfx = (offset & 0x1000) ? 3 : 2; + m_gfxdecode->gfx(whichgfx)->mark_dirty((offset & 0xfff) / 32); +} + + +void bwing_state::scrollreg_w(offs_t offset, uint8_t data) +{ + m_sreg[offset] = data; + + switch (offset) + { + case 6: m_palatch = data; break; // one of the palette components is latched through I/O(yike) + + case 7: + m_mapmask = data; + m_vramview.select(data >> 6); + break; + } +} + + +void bwing_state::paletteram_w(offs_t offset, uint8_t data) +{ + static const float rgb[4][3] = { + {0.85f, 0.95f, 1.00f}, + {0.90f, 1.00f, 1.00f}, + {0.80f, 1.00f, 1.00f}, + {0.75f, 0.90f, 1.10f} + }; + + m_paletteram[offset] = data; + + int r = ~data & 7; + int g = ~(data >> 4) & 7; + int b = ~m_palatch & 7; + + r = ((r << 5) + (r << 2) + (r >> 1)); + g = ((g << 5) + (g << 2) + (g >> 1)); + b = ((b << 5) + (b << 2) + (b >> 1)); + + int i; + + if ((i = ioport("EXTRA")->read()) < 4) + { + r = (float)r * rgb[i][0]; + g = (float)g * rgb[i][1]; + b = (float)b * rgb[i][2]; + if (r > 0xff) r = 0xff; + if (g > 0xff) g = 0xff; + if (b > 0xff) b = 0xff; + } + + m_palette->set_pen_color(offset, rgb_t(r, g, b)); +} + +//**************************************************************************** +// Initializations + +TILE_GET_INFO_MEMBER(bwing_state::get_fgtileinfo) +{ + tileinfo.set(2, m_fgscrollram[tile_index] & 0x7f, m_fgscrollram[tile_index] >> 7, 0); +} + +TILE_GET_INFO_MEMBER(bwing_state::get_bgtileinfo) +{ + tileinfo.set(3, m_bgscrollram[tile_index] & 0x7f, m_bgscrollram[tile_index] >> 7, 0); +} + +TILE_GET_INFO_MEMBER(bwing_state::get_charinfo) +{ + tileinfo.set(0, m_videoram[tile_index], 0, 0); +} + +TILEMAP_MAPPER_MEMBER(bwing_state::scan_cols) +{ + return (row & 0xf) | ((col & 0xf) << 4) | ((row & 0x30) << 4) | ((col & 0x30) << 6); +} + + +void bwing_state::video_start() +{ + m_charmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_charinfo)), TILEMAP_SCAN_COLS, 8, 8, 32, 32); + m_fgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_fgtileinfo)), tilemap_mapper_delegate(*this, FUNC(bwing_state::scan_cols)), 16, 16, 64, 64); + m_bgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_bgtileinfo)), tilemap_mapper_delegate(*this, FUNC(bwing_state::scan_cols)), 16, 16, 64, 64); + + m_charmap->set_transparent_pen(0); + m_fgmap->set_transparent_pen(0); + + for (int i = 0; i < 8; i++) + m_sreg[i] = 0; +} + +//**************************************************************************** +// Realtime + +void bwing_state::draw_sprites(bitmap_ind16 &bmp, const rectangle &clip, uint8_t *ram, int pri) +{ + gfx_element *gfx = m_gfxdecode->gfx(1); + + for (int i = 0; i < 0x200; i += 4) + { + int const attrib = ram[i]; + int code = ram[i + 1]; + int y = ram[i + 2]; + int x = ram[i + 3]; + int const color = (attrib >> 3) & 1; + + if (!(attrib & 1) || color != pri) + continue; + + code += (attrib << 3) & 0x100; + y -= (attrib << 1) & 0x100; + x -= (attrib << 2) & 0x100; + + int fx = attrib & 0x04; + int fy = ~attrib & 0x02; + + // normal/cocktail + if (m_mapmask & 0x20) + { + fx = !fx; + fy = !fy; + x = 240 - x; + y = 240 - y; + } + + // single/double + if (!(attrib & 0x10)) + gfx->transpen(bmp, clip, code, color, fx, fy, x, y, 0); + else + gfx->zoom_transpen(bmp, clip, code, color, fx, fy, x, y, 1 << 16, 2 << 16, 0); + } +} + + +uint32_t bwing_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + unsigned flip, x, y, shiftx; + + if (m_mapmask & 0x20) + { + flip = TILEMAP_FLIPX; + shiftx = -8; + } + else + { + flip = TILEMAP_FLIPY; + shiftx = 8; + } + + // draw background + if (!(m_mapmask & 1)) + { + m_bgmap->set_flip(flip); + x = ((m_sreg[1] << 2 & 0x300) + m_sreg[2] + shiftx) & 0x3ff; + m_bgmap->set_scrollx(0, x); + y = (m_sreg[1] << 4 & 0x300) + m_sreg[3]; + m_bgmap->set_scrolly(0, y); + m_bgmap->draw(screen, bitmap, cliprect, 0, 0); + } + else + bitmap.fill(m_palette->black_pen(), cliprect); + + // draw low priority sprites + draw_sprites(bitmap, cliprect, m_spriteram, 0); + + // draw foreground + if (!(m_mapmask & 2)) + { + m_fgmap->set_flip(flip); + x = ((m_sreg[1] << 6 & 0x300) + m_sreg[4] + shiftx) & 0x3ff; + m_fgmap->set_scrollx(0, x); + y = (m_sreg[1] << 8 & 0x300) + m_sreg[5]; + m_fgmap->set_scrolly(0, y); + m_fgmap->draw(screen, bitmap, cliprect, 0, 0); + } + + // draw high priority sprites + draw_sprites(bitmap, cliprect, m_spriteram, 1); + + // draw text layer +// if (m_mapmask & 4) + { + m_charmap->set_flip(flip); + m_charmap->draw(screen, bitmap, cliprect, 0, 0); + } + return 0; +} //**************************************************************************** // Interrupt Handlers -INTERRUPT_GEN_MEMBER(bwing_state::bwp3_interrupt) +INTERRUPT_GEN_MEMBER(bwing_state::p3_interrupt) { - if (!m_bwp3_nmimask) + if (!m_p3_nmimask) device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } //**************************************************************************** // Memory and I/O Handlers -void bwing_state::bwp3_u8F_w(uint8_t data) +void bwing_state::p3_u8f_w(uint8_t data) { - m_bwp3_u8F_d = data; // prepares custom chip for various operations + m_p3_u8f_d = data; // prepares custom chip for various operations } -void bwing_state::bwp3_nmimask_w(uint8_t data) +void bwing_state::p3_nmimask_w(uint8_t data) { - m_bwp3_nmimask = data & 0x80; + m_p3_nmimask = data & 0x80; } -void bwing_state::bwp3_nmiack_w(uint8_t data) +void bwing_state::p3_nmiack_w(uint8_t data) { m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } -void bwing_state::bwp1_ctrl_w(offs_t offset, uint8_t data) +void bwing_state::p1_ctrl_w(offs_t offset, uint8_t data) { switch (offset) { @@ -102,7 +411,7 @@ } -void bwing_state::bwp2_ctrl_w(offs_t offset, uint8_t data) +void bwing_state::p2_ctrl_w(offs_t offset, uint8_t data) { switch (offset) { @@ -120,13 +429,13 @@ // CPU Memory Maps // Main CPU -void bwing_state::bwp1_map(address_map &map) +void bwing_state::p1_map(address_map &map) { map(0x0000, 0x07ff).ram().share("sharedram"); map(0x0800, 0x0fff).ram(); - map(0x1000, 0x13ff).ram().w(FUNC(bwing_state::videoram_w)).share("videoram"); + map(0x1000, 0x13ff).ram().w(FUNC(bwing_state::videoram_w)).share(m_videoram); map(0x1400, 0x17ff).ram(); - map(0x1800, 0x19ff).ram().share("spriteram"); + map(0x1800, 0x19ff).ram().share(m_spriteram); map(0x1a00, 0x1aff).ram().w(FUNC(bwing_state::paletteram_w)).share("paletteram"); map(0x1b00, 0x1b00).portr("DSW0"); map(0x1b01, 0x1b01).portr("DSW1"); @@ -134,48 +443,45 @@ map(0x1b03, 0x1b03).portr("IN1"); map(0x1b04, 0x1b04).portr("IN2"); map(0x1b00, 0x1b07).w(FUNC(bwing_state::scrollreg_w)); - map(0x1c00, 0x1c07).ram().w(FUNC(bwing_state::bwp1_ctrl_w)); - map(0x2000, 0x3fff).m(m_vrambank, FUNC(address_map_bank_device::amap8)); + map(0x1c00, 0x1c07).ram().w(FUNC(bwing_state::p1_ctrl_w)); + map(0x2000, 0x3fff).view(m_vramview); + m_vramview[0](0x2000, 0x2fff).ram().w(FUNC(bwing_state::fgscrollram_w)).share(m_fgscrollram); + m_vramview[0](0x3000, 0x3fff).ram().w(FUNC(bwing_state::bgscrollram_w)).share(m_bgscrollram); + m_vramview[1](0x2000, 0x3fff).ram().w(FUNC(bwing_state::gfxram_w<0>)); + m_vramview[2](0x2000, 0x3fff).ram().w(FUNC(bwing_state::gfxram_w<1>)); + m_vramview[3](0x2000, 0x3fff).ram().w(FUNC(bwing_state::gfxram_w<2>)); map(0x4000, 0xffff).rom(); // "B-Wings US" writes to 9631-9632(debug?) } -// Banked video RAM -void bwing_state::bank_map(address_map &map) -{ - map(0x0000, 0x0fff).ram().w(FUNC(bwing_state::fgscrollram_w)).share("fgscrollram"); - map(0x1000, 0x1fff).ram().w(FUNC(bwing_state::bgscrollram_w)).share("bgscrollram"); - map(0x2000, 0x7fff).ram().w(FUNC(bwing_state::gfxram_w)).share("gfxram"); -} - // Sub CPU -void bwing_state::bwp2_map(address_map &map) +void bwing_state::p2_map(address_map &map) { map(0x0000, 0x07ff).ram().share("sharedram"); map(0x0800, 0x0fff).ram(); - map(0x1800, 0x1803).w(FUNC(bwing_state::bwp2_ctrl_w)); + map(0x1800, 0x1803).w(FUNC(bwing_state::p2_ctrl_w)); map(0xa000, 0xffff).rom(); } // Sound CPU -void bwing_state::bwp3_map(address_map &map) +void bwing_state::p3_map(address_map &map) { map(0x0000, 0x01ff).ram(); map(0x0200, 0x0200).w("dac", FUNC(dac_byte_interface::data_w)); - map(0x1000, 0x1000).w(FUNC(bwing_state::bwp3_nmiack_w)); + map(0x1000, 0x1000).w(FUNC(bwing_state::p3_nmiack_w)); map(0x2000, 0x2000).w("ay1", FUNC(ay8912_device::data_w)); map(0x4000, 0x4000).w("ay1", FUNC(ay8912_device::address_w)); map(0x6000, 0x6000).w("ay2", FUNC(ay8912_device::data_w)); map(0x8000, 0x8000).w("ay2", FUNC(ay8912_device::address_w)); map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); - map(0xd000, 0xd000).w(FUNC(bwing_state::bwp3_nmimask_w)); + map(0xd000, 0xd000).w(FUNC(bwing_state::p3_nmimask_w)); map(0xe000, 0xffff).rom().region("audiocpu", 0); } -void bwing_state::bwp3_io_map(address_map &map) +void bwing_state::p3_io_map(address_map &map) { - map(0x00, 0x00).portr("VBLANK").w(FUNC(bwing_state::bwp3_u8F_w)); + map(0x00, 0x00).portr("VBLANK").w(FUNC(bwing_state::p3_u8f_w)); } //**************************************************************************** @@ -220,7 +526,7 @@ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x00, "5" ) PORT_DIPSETTING( 0x01, "3" ) - PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:2,3") /* Listed as "Not Used" in the manual */ + PORT_DIPNAME( 0x06, 0x06, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:2,3") // Listed as "Not Used" in the manual PORT_DIPSETTING( 0x00, "40000" ) PORT_DIPSETTING( 0x02, "20000 80000" ) PORT_DIPSETTING( 0x04, "20000 60000" ) @@ -231,13 +537,13 @@ PORT_DIPNAME( 0x10, 0x10, "Enemy Missiles" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) - PORT_DIPNAME( 0x20, 0x20, "Freeze" ) PORT_DIPLOCATION("SW2:6") /* Listed as "Not Used" in the manual */ + PORT_DIPNAME( 0x20, 0x20, "Freeze" ) PORT_DIPLOCATION("SW2:6") // Listed as "Not Used" in the manual PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, "Country" ) PORT_DIPLOCATION("SW2:7") /* Listed as "Not Used" in the manual */ + PORT_DIPNAME( 0x40, 0x00, "Country" ) PORT_DIPLOCATION("SW2:7") // Listed as "Not Used" in the manual PORT_DIPSETTING( 0x00, "Japan/US" ) PORT_DIPSETTING( 0x40, "Japan Only" ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") /* Listed as "Not Used" in the manual */ + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") // Listed as "Not Used" in the manual PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -325,8 +631,8 @@ }; static GFXDECODE_START( gfx_bwing ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x00, 1 ) // chars - GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0x20, 2 ) // sprites + GFXDECODE_ENTRY( "chars", 0, charlayout, 0x00, 1 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0x20, 2 ) GFXDECODE_RAM( "gfxram", 0, ram_tilelayout, 0x10, 2 ) // foreground tiles GFXDECODE_RAM( "gfxram", 0x1000, ram_tilelayout, 0x30, 2 ) // background tiles GFXDECODE_END @@ -338,12 +644,10 @@ { save_item(NAME(m_palatch)); save_item(NAME(m_mapmask)); - save_item(NAME(m_bwp3_nmimask)); - save_item(NAME(m_bwp3_u8F_d)); + save_item(NAME(m_p3_nmimask)); + save_item(NAME(m_p3_u8f_d)); save_item(NAME(m_sreg)); - - machine().save().register_postload(save_prepost_delegate(FUNC(bwing_state::bwing_postload), this)); } void bwing_state::machine_reset() @@ -351,11 +655,11 @@ m_palatch = 0; m_mapmask = 0; - m_bwp3_nmimask = 0; - m_bwp3_u8F_d = 0; + m_p3_nmimask = 0; + m_p3_u8f_d = 0; } -void bwing_state::bwing_postload() +void bwing_state::device_post_load() { m_gfxdecode->gfx(2)->mark_all_dirty(); m_gfxdecode->gfx(3)->mark_all_dirty(); @@ -365,20 +669,18 @@ void bwing_state::bwing(machine_config &config) { // basic machine hardware - MC6809E(config, m_maincpu, 2000000); - m_maincpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp1_map); - - MC6809E(config, m_subcpu, 2000000); - m_subcpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp2_map); + MC6809E(config, m_maincpu, 2'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, &bwing_state::p1_map); - DECO16(config, m_audiocpu, 2000000); - m_audiocpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp3_map); - m_audiocpu->set_addrmap(AS_IO, &bwing_state::bwp3_io_map); - m_audiocpu->set_periodic_int(FUNC(bwing_state::bwp3_interrupt), attotime::from_hz(1000)); + MC6809E(config, m_subcpu, 2'000'000); + m_subcpu->set_addrmap(AS_PROGRAM, &bwing_state::p2_map); - config.set_maximum_quantum(attotime::from_hz(18000)); // high enough? + DECO16(config, m_audiocpu, 2'000'000); + m_audiocpu->set_addrmap(AS_PROGRAM, &bwing_state::p3_map); + m_audiocpu->set_addrmap(AS_IO, &bwing_state::p3_io_map); + m_audiocpu->set_periodic_int(FUNC(bwing_state::p3_interrupt), attotime::from_hz(1'000)); - ADDRESS_MAP_BANK(config, "vrambank").set_map(&bwing_state::bank_map).set_options(ENDIANNESS_BIG, 8, 15, 0x2000); + config.set_maximum_quantum(attotime::from_hz(18'000)); // high enough? // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -411,25 +713,25 @@ ROM_START( bwings ) // Top Board(SCU-01) - ROM_REGION( 0x10000, "maincpu", 0 ) // main CPU + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "bw_bv-02-.10a",0x04000, 0x04000, CRC(6074a86b) SHA1(0ce1bd74450144fd3c6556787d6c5c5d4531d830) ) // different ROM_LOAD( "bw_bv-01.7a", 0x08000, 0x04000, CRC(b960c707) SHA1(086cb0f22fb59922bf0369bf6b382a241d979ec3) ) ROM_LOAD( "bw_bv-00-.4a", 0x0c000, 0x04000, CRC(1f83804c) SHA1(afd5eb0822db4fd982062945ca27e66ed9680645) ) // different - ROM_REGION( 0x10000, "sub", 0 ) // sub CPU + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bw_bv-06-.10d",0x0a000, 0x02000, CRC(eca00fcb) SHA1(c7affbb900e3940257f8cebc91266328a4a5dca3) ) // different ROM_LOAD( "bw_bv-05-.9d", 0x0c000, 0x02000, CRC(1e393300) SHA1(8d847256eb5dbccf5f524ec3aa836073d70b4edc) ) // different ROM_LOAD( "bw_bv-04-.7d", 0x0e000, 0x02000, CRC(6548c5bb) SHA1(d12cc8d0d5692c3de766f5c42c818dd8f685760a) ) // different - ROM_REGION( 0x2000, "audiocpu", 0 ) // sound CPU(encrypted) + ROM_REGION( 0x2000, "audiocpu", 0 ) // encrypted ROM_LOAD( "bw_bv-03.13a", 0x00000, 0x02000, CRC(e8ac9379) SHA1(aaf5c20aa33ed05747a8a27739e9d09e094a518d) ) // Bottom Board(CCU-01) - ROM_REGION( 0x01000, "gfx1", 0 ) // chars + ROM_REGION( 0x01000, "chars", 0 ) ROM_LOAD( "bw_bv-10.5c", 0x00000, 0x01000, CRC(edca6901) SHA1(402c80e7519cf3a43b9fef52c9923961220a48b6) ) // Middle Board(MCU-01) - ROM_REGION( 0x0c000, "gfx2", 0 ) // sprites + ROM_REGION( 0x0c000, "sprites", 0 ) ROM_LOAD( "bw_bv-07.1l", 0x00000, 0x04000, CRC(3d5ab2be) SHA1(2b3a039914ebfcc3993da74853a67546fc22c191) ) ROM_LOAD( "bw_bv-08.1k", 0x04000, 0x04000, CRC(7a585f1e) SHA1(99e5d947b6b1fa96b90c676a282376d67fc377f0) ) ROM_LOAD( "bw_bv-09.1h", 0x08000, 0x04000, CRC(a14c0b57) SHA1(5033354793d77922f5ef7f268cbe212e551efadf) ) @@ -438,25 +740,25 @@ ROM_START( bwingso ) // Top Board(SCU-01) - ROM_REGION( 0x10000, "maincpu", 0 ) // main CPU + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "bw_bv-02.10a", 0x04000, 0x04000, CRC(5ce74ab5) SHA1(b414f0bbe1c4c5b4c810bb4b9fba16aaf86520ff) ) ROM_LOAD( "bw_bv-01.7a", 0x08000, 0x04000, CRC(b960c707) SHA1(086cb0f22fb59922bf0369bf6b382a241d979ec3) ) ROM_LOAD( "bw_bv-00.4a", 0x0c000, 0x04000, CRC(926bef63) SHA1(d4bd2e91fa0abc5e9472d4b684c076bdc3c29f5b) ) - ROM_REGION( 0x10000, "sub", 0 ) // sub CPU + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bw_bv-06.10d", 0x0a000, 0x02000, CRC(91a21a4c) SHA1(042eed60119a861f6b3ccfbe68d880f182a8a8e1) ) ROM_LOAD( "bw_bv-05.9d", 0x0c000, 0x02000, CRC(f283f39a) SHA1(9f7f4c39d49f4dfff73fe74cd457480e8a43a3c5) ) ROM_LOAD( "bw_bv-04.7d", 0x0e000, 0x02000, CRC(29ae75b6) SHA1(48c94e996857f2ac995bcd25f0e67b9f7c17d807) ) - ROM_REGION( 0x2000, "audiocpu", 0 ) // sound CPU(encrypted) + ROM_REGION( 0x2000, "audiocpu", 0 ) // encrypted ROM_LOAD( "bw_bv-03.13a", 0x00000, 0x02000, CRC(e8ac9379) SHA1(aaf5c20aa33ed05747a8a27739e9d09e094a518d) ) // Bottom Board(CCU-01) - ROM_REGION( 0x01000, "gfx1", 0 ) // chars + ROM_REGION( 0x01000, "chars", 0 ) ROM_LOAD( "bw_bv-10.5c", 0x00000, 0x01000, CRC(edca6901) SHA1(402c80e7519cf3a43b9fef52c9923961220a48b6) ) // Middle Board(MCU-01) - ROM_REGION( 0x0c000, "gfx2", 0 ) // sprites + ROM_REGION( 0x0c000, "sprites", 0 ) ROM_LOAD( "bw_bv-07.1l", 0x00000, 0x04000, CRC(3d5ab2be) SHA1(2b3a039914ebfcc3993da74853a67546fc22c191) ) ROM_LOAD( "bw_bv-08.1k", 0x04000, 0x04000, CRC(7a585f1e) SHA1(99e5d947b6b1fa96b90c676a282376d67fc377f0) ) ROM_LOAD( "bw_bv-09.1h", 0x08000, 0x04000, CRC(a14c0b57) SHA1(5033354793d77922f5ef7f268cbe212e551efadf) ) @@ -465,26 +767,26 @@ ROM_START( bwingsa ) // Top Board(SCU-01) - ROM_REGION( 0x10000, "maincpu", 0 ) // main CPU + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "bw_bv-02.10a", 0x04000, 0x04000, CRC(5ce74ab5) SHA1(b414f0bbe1c4c5b4c810bb4b9fba16aaf86520ff) ) ROM_LOAD( "bv02.bin", 0x06000, 0x02000, CRC(2f84654e) SHA1(11b5343219b46d03f686ea348181c509121b9e3c) ) // only the lower 8k is different ROM_LOAD( "bw_bv-01.7a", 0x08000, 0x04000, CRC(b960c707) SHA1(086cb0f22fb59922bf0369bf6b382a241d979ec3) ) ROM_LOAD( "bv00.bin", 0x0c000, 0x04000, CRC(0bbc1222) SHA1(cfdf621a423a5ce4ba44a980e683d2abf044d6b9) ) // different - ROM_REGION( 0x10000, "sub", 0 ) // sub CPU + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bw_bv-06.10d", 0x0a000, 0x02000, CRC(91a21a4c) SHA1(042eed60119a861f6b3ccfbe68d880f182a8a8e1) ) ROM_LOAD( "bw_bv-05.9d", 0x0c000, 0x02000, CRC(f283f39a) SHA1(9f7f4c39d49f4dfff73fe74cd457480e8a43a3c5) ) ROM_LOAD( "bw_bv-04.7d", 0x0e000, 0x02000, CRC(29ae75b6) SHA1(48c94e996857f2ac995bcd25f0e67b9f7c17d807) ) - ROM_REGION( 0x2000, "audiocpu", 0 ) // sound CPU(encrypted) + ROM_REGION( 0x2000, "audiocpu", 0 ) // encrypted ROM_LOAD( "bw_bv-03.13a", 0x00000, 0x02000, CRC(e8ac9379) SHA1(aaf5c20aa33ed05747a8a27739e9d09e094a518d) ) // Bottom Board(CCU-01) - ROM_REGION( 0x01000, "gfx1", 0 ) // chars + ROM_REGION( 0x01000, "chars", 0 ) ROM_LOAD( "bw_bv-10.5c", 0x00000, 0x01000, CRC(edca6901) SHA1(402c80e7519cf3a43b9fef52c9923961220a48b6) ) // Middle Board(MCU-01) - ROM_REGION( 0x0c000, "gfx2", 0 ) // sprites + ROM_REGION( 0x0c000, "sprites", 0 ) ROM_LOAD( "bw_bv-07.1l", 0x00000, 0x04000, CRC(3d5ab2be) SHA1(2b3a039914ebfcc3993da74853a67546fc22c191) ) ROM_LOAD( "bw_bv-08.1k", 0x04000, 0x04000, CRC(7a585f1e) SHA1(99e5d947b6b1fa96b90c676a282376d67fc377f0) ) ROM_LOAD( "bw_bv-09.1h", 0x08000, 0x04000, CRC(a14c0b57) SHA1(5033354793d77922f5ef7f268cbe212e551efadf) ) @@ -492,25 +794,25 @@ ROM_START( zaviga ) // Top Board(DE-0169-0) - ROM_REGION( 0x10000, "maincpu", 0 ) // main CPU + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "as04.10a", 0x04000, 0x04000, CRC(b79f5da2) SHA1(b39748666d3f7fb1ac46d282cce09fe9531df6b1) ) ROM_LOAD( "as02.7a", 0x08000, 0x04000, CRC(6addd16a) SHA1(940637c49bf9f38c77176ed2ae212048e9e7fd8f) ) ROM_LOAD( "as00.4a", 0x0c000, 0x04000, CRC(c6ae4af0) SHA1(6f6f14385b20f9c9c312f816036c608fe8514b00) ) - ROM_REGION( 0x10000, "sub", 0 ) // sub CPU + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "as08.10d", 0x0a000, 0x02000, CRC(b6187b3a) SHA1(d2d7c5b185f59986f45d8ec3ddf9b95364e57d96) ) ROM_LOAD( "as07.9d", 0x0c000, 0x02000, CRC(dc1170e3) SHA1(c8e4d1564fd272d726d0e4ffd4f33f67f1b37cd7) ) ROM_LOAD( "as06.7d", 0x0e000, 0x02000, CRC(ba888f84) SHA1(f94de8553cd4704d9b3349ded881a7cc62fa9b57) ) - ROM_REGION( 0x2000, "audiocpu", 0 ) // sound CPU(encrypted) + ROM_REGION( 0x2000, "audiocpu", 0 ) // encrypted ROM_LOAD( "as05.13a", 0x00000, 0x02000, CRC(afe9b0ac) SHA1(3c653cd4fff7f4e00971249900b5a810b6e74dfe) ) // Bottom Board(DE-0170-0) - ROM_REGION( 0x01000, "gfx1", 0 ) // chars + ROM_REGION( 0x01000, "chars", 0 ) ROM_LOAD( "as14.5c", 0x00000, 0x01000, CRC(62132c1d) SHA1(6b101e220a440488da17de8446f4e2c8ec7c7de9) ) // Middle Board(DE-0171-0) - ROM_REGION( 0x0c000, "gfx2", 0 ) // sprites + ROM_REGION( 0x0c000, "sprites", 0 ) ROM_LOAD( "as11.1l", 0x00000, 0x04000, CRC(aa84af24) SHA1(af4ff085dc44b3d1493ec1c8b4a8d18dccecc872) ) ROM_LOAD( "as12.1k", 0x04000, 0x04000, CRC(84af9041) SHA1(8fbd5995ca8e708cd7fb9cdfcdb174e12084f526) ) ROM_LOAD( "as13.1h", 0x08000, 0x04000, CRC(15d0922b) SHA1(b8d715a9e610531472d516c19f6035adbce93c84) ) @@ -519,25 +821,25 @@ ROM_START( zavigaj ) // Top Board(DE-0169-0) - ROM_REGION( 0x10000, "maincpu", 0 ) // main CPU + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "as04.10a", 0x04000, 0x04000, CRC(b79f5da2) SHA1(b39748666d3f7fb1ac46d282cce09fe9531df6b1) ) ROM_LOAD( "as02.7a", 0x08000, 0x04000, CRC(6addd16a) SHA1(940637c49bf9f38c77176ed2ae212048e9e7fd8f) ) ROM_LOAD( "as00.4a", 0x0c000, 0x04000, CRC(c6ae4af0) SHA1(6f6f14385b20f9c9c312f816036c608fe8514b00) ) - ROM_REGION( 0x10000, "sub", 0 ) // sub CPU + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "as08.10d", 0x0a000, 0x02000, CRC(b6187b3a) SHA1(d2d7c5b185f59986f45d8ec3ddf9b95364e57d96) ) ROM_LOAD( "as07.9d", 0x0c000, 0x02000, CRC(dc1170e3) SHA1(c8e4d1564fd272d726d0e4ffd4f33f67f1b37cd7) ) ROM_LOAD( "as06-.7d", 0x0e000, 0x02000, CRC(b02d270c) SHA1(beea3d44d367543b5b5075c5892580e690691e75) ) // different - ROM_REGION( 0x2000, "audiocpu", 0 ) // sound CPU(encrypted) + ROM_REGION( 0x2000, "audiocpu", 0 ) // encrypted ROM_LOAD( "as05.13a", 0x00000, 0x02000, CRC(afe9b0ac) SHA1(3c653cd4fff7f4e00971249900b5a810b6e74dfe) ) // Bottom Board(DE-0170-0) - ROM_REGION( 0x01000, "gfx1", 0 ) // chars + ROM_REGION( 0x01000, "chars", 0 ) ROM_LOAD( "as14.5c", 0x00000, 0x01000, CRC(62132c1d) SHA1(6b101e220a440488da17de8446f4e2c8ec7c7de9) ) // Middle Board(DE-0171-0) - ROM_REGION( 0x0c000, "gfx2", 0 ) // sprites + ROM_REGION( 0x0c000, "sprites", 0 ) ROM_LOAD( "as11.1l", 0x00000, 0x04000, CRC(aa84af24) SHA1(af4ff085dc44b3d1493ec1c8b4a8d18dccecc872) ) ROM_LOAD( "as12.1k", 0x04000, 0x04000, CRC(84af9041) SHA1(8fbd5995ca8e708cd7fb9cdfcdb174e12084f526) ) ROM_LOAD( "as13.1h", 0x08000, 0x04000, CRC(15d0922b) SHA1(b8d715a9e610531472d516c19f6035adbce93c84) ) @@ -560,12 +862,14 @@ rom[j - (0x10 - 0x5)] = rom[j - (0x10 - 0xa)] = rom[j - (0x10 - 0x7)]; } +} // anonymous namespace + //**************************************************************************** // Game Entries -GAME( 1984, bwings, 0, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "B-Wings (Japan new Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, bwings, 0, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "B-Wings (Japan new Ver.)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, bwingso, bwings, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "B-Wings (Japan old Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, bwingsa, bwings, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "B-Wings (Alt Ver.?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, bwingsa, bwings, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "B-Wings (Alt Ver.?)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, zaviga, 0, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "Zaviga", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, zavigaj, zaviga, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "Zaviga (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, zaviga, 0, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "Zaviga", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, zavigaj, zaviga, bwing, bwing, bwing_state, init_bwing, ROT90, "Data East Corporation", "Zaviga (Japan)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/bwing.h mame-0.264+dfsg.1/src/mame/dataeast/bwing.h --- mame-0.263+dfsg.1/src/mame/dataeast/bwing.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/bwing.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Acho A. Tang, Alex W. Jackson -/*************************************************************************** - - B-Wings - -***************************************************************************/ - -#include "machine/bankdev.h" -#include "machine/gen_latch.h" -#include "emupal.h" -#include "tilemap.h" - -#define BW_DEBUG 0 - -class bwing_state : public driver_device -{ -public: - bwing_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_subcpu(*this, "sub"), - m_audiocpu(*this, "audiocpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_vrambank(*this, "vrambank"), - m_soundlatch(*this, "soundlatch"), - m_videoram(*this, "videoram"), - m_spriteram(*this, "spriteram"), - m_paletteram(*this, "paletteram"), - m_fgscrollram(*this, "fgscrollram"), - m_bgscrollram(*this, "bgscrollram"), - m_gfxram(*this, "gfxram") { } - - void init_bwing(); - void bwing(machine_config &config); - DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); - DECLARE_INPUT_CHANGED_MEMBER(tilt_pressed); - -private: - /* device */ - required_device m_maincpu; - required_device m_subcpu; - required_device m_audiocpu; - required_device m_gfxdecode; - required_device m_palette; - required_device m_vrambank; - required_device m_soundlatch; - - /* memory pointers */ - required_shared_ptr m_videoram; - required_shared_ptr m_spriteram; - required_shared_ptr m_paletteram; - required_shared_ptr m_fgscrollram; - required_shared_ptr m_bgscrollram; - required_shared_ptr m_gfxram; - - /* video-related */ - tilemap_t *m_charmap = nullptr; - tilemap_t *m_fgmap = nullptr; - tilemap_t *m_bgmap = nullptr; - unsigned m_sreg[8]{}; - unsigned m_palatch = 0U; - unsigned m_mapmask = 0U; - - /* sound-related */ - int m_bwp3_nmimask = 0; - int m_bwp3_u8F_d = 0; - - void bwp3_u8F_w(uint8_t data); - void bwp3_nmimask_w(uint8_t data); - void bwp3_nmiack_w(uint8_t data); - void bwp1_ctrl_w(offs_t offset, uint8_t data); - void bwp2_ctrl_w(offs_t offset, uint8_t data); - void videoram_w(offs_t offset, uint8_t data); - void fgscrollram_w(offs_t offset, uint8_t data); - void bgscrollram_w(offs_t offset, uint8_t data); - void gfxram_w(offs_t offset, uint8_t data); - void scrollreg_w(offs_t offset, uint8_t data); - void paletteram_w(offs_t offset, uint8_t data); - - TILE_GET_INFO_MEMBER(get_fgtileinfo); - TILE_GET_INFO_MEMBER(get_bgtileinfo); - TILE_GET_INFO_MEMBER(get_charinfo); - TILEMAP_MAPPER_MEMBER(scan_cols); - - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - void bwing_postload(); - - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites( bitmap_ind16 &bmp, const rectangle &clip, uint8_t *ram, int pri ); - - INTERRUPT_GEN_MEMBER(bwp3_interrupt); - void bank_map(address_map &map); - void bwp1_map(address_map &map); - void bwp2_map(address_map &map); - void bwp3_io_map(address_map &map); - void bwp3_map(address_map &map); -}; diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/bwing_v.cpp mame-0.264+dfsg.1/src/mame/dataeast/bwing_v.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/bwing_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/bwing_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Acho A. Tang, Alex W. Jackson -/***************************************************************************** - -B-Wings (c) 1984 Data East Corporation -Zaviga (c) 1984 Data East Corporation - -drivers by Acho A. Tang -revised by Alex W. Jackson - -*****************************************************************************/ -// Directives - -#include "emu.h" -#include "bwing.h" - - -//**************************************************************************** -// Exports - - -void bwing_state::videoram_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - m_charmap->mark_tile_dirty(offset); -} - - -void bwing_state::fgscrollram_w(offs_t offset, uint8_t data) -{ - m_fgscrollram[offset] = data; - m_fgmap->mark_tile_dirty(offset); -} - - -void bwing_state::bgscrollram_w(offs_t offset, uint8_t data) -{ - m_bgscrollram[offset] = data; - m_bgmap->mark_tile_dirty(offset); -} - - -void bwing_state::gfxram_w(offs_t offset, uint8_t data) -{ - m_gfxram[offset] = data; - int whichgfx = (offset & 0x1000) ? 3 : 2; - m_gfxdecode->gfx(whichgfx)->mark_dirty((offset & 0xfff) / 32); -} - - -void bwing_state::scrollreg_w(offs_t offset, uint8_t data) -{ - m_sreg[offset] = data; - - switch (offset) - { - case 6: m_palatch = data; break; // one of the palette components is latched through I/O(yike) - - case 7: - m_mapmask = data; - m_vrambank->set_bank(data >> 6); - break; - } -} - - -void bwing_state::paletteram_w(offs_t offset, uint8_t data) -{ - static const float rgb[4][3] = { - {0.85f, 0.95f, 1.00f}, - {0.90f, 1.00f, 1.00f}, - {0.80f, 1.00f, 1.00f}, - {0.75f, 0.90f, 1.10f} - }; - int r, g, b, i; - - m_paletteram[offset] = data; - - r = ~data & 7; - g = ~(data >> 4) & 7; - b = ~m_palatch & 7; - - r = ((r << 5) + (r << 2) + (r >> 1)); - g = ((g << 5) + (g << 2) + (g >> 1)); - b = ((b << 5) + (b << 2) + (b >> 1)); - - if ((i = ioport("EXTRA")->read()) < 4) - { - r = (float)r * rgb[i][0]; - g = (float)g * rgb[i][1]; - b = (float)b * rgb[i][2]; - if (r > 0xff) r = 0xff; - if (g > 0xff) g = 0xff; - if (b > 0xff) b = 0xff; - } - - m_palette->set_pen_color(offset, rgb_t(r, g, b)); -} - -//**************************************************************************** -// Initializations - -TILE_GET_INFO_MEMBER(bwing_state::get_fgtileinfo) -{ - tileinfo.set(2, m_fgscrollram[tile_index] & 0x7f, m_fgscrollram[tile_index] >> 7, 0); -} - -TILE_GET_INFO_MEMBER(bwing_state::get_bgtileinfo) -{ - tileinfo.set(3, m_bgscrollram[tile_index] & 0x7f, m_bgscrollram[tile_index] >> 7, 0); -} - -TILE_GET_INFO_MEMBER(bwing_state::get_charinfo) -{ - tileinfo.set(0, m_videoram[tile_index], 0, 0); -} - -TILEMAP_MAPPER_MEMBER(bwing_state::scan_cols) -{ - return (row & 0xf) | ((col & 0xf) << 4) | ((row & 0x30) << 4) | ((col & 0x30) << 6); -} - - -void bwing_state::video_start() -{ - int i; - - m_charmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_charinfo)), TILEMAP_SCAN_COLS, 8, 8, 32, 32); - m_fgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_fgtileinfo)), tilemap_mapper_delegate(*this, FUNC(bwing_state::scan_cols)), 16, 16, 64, 64); - m_bgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bwing_state::get_bgtileinfo)), tilemap_mapper_delegate(*this, FUNC(bwing_state::scan_cols)), 16, 16, 64, 64); - - m_charmap->set_transparent_pen(0); - m_fgmap->set_transparent_pen(0); - - for (i = 0; i < 8; i++) - m_sreg[i] = 0; -} - -//**************************************************************************** -// Realtime - -void bwing_state::draw_sprites( bitmap_ind16 &bmp, const rectangle &clip, uint8_t *ram, int pri ) -{ - int attrib, fx, fy, code, x, y, color, i; - gfx_element *gfx = m_gfxdecode->gfx(1); - - for (i = 0; i < 0x200; i += 4) - { - attrib = ram[i]; - code = ram[i + 1]; - y = ram[i + 2]; - x = ram[i + 3]; - color = (attrib >> 3) & 1; - - if (!(attrib & 1) || color != pri) - continue; - - code += (attrib << 3) & 0x100; - y -= (attrib << 1) & 0x100; - x -= (attrib << 2) & 0x100; - - fx = attrib & 0x04; - fy = ~attrib & 0x02; - - // normal/cocktail - if (m_mapmask & 0x20) - { - fx = !fx; - fy = !fy; - x = 240 - x; - y = 240 - y; - } - - // single/double - if (!(attrib & 0x10)) - gfx->transpen(bmp,clip, code, color, fx, fy, x, y, 0); - else - gfx->zoom_transpen(bmp,clip, code, color, fx, fy, x, y, 1<<16, 2<<16, 0); - } -} - - -uint32_t bwing_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - unsigned flip, x, y, shiftx; - - if (m_mapmask & 0x20) - { - flip = TILEMAP_FLIPX; - shiftx = -8; - } - else - { - flip = TILEMAP_FLIPY; - shiftx = 8; - } - - // draw background - if (!(m_mapmask & 1)) - { - m_bgmap->set_flip(flip); - x = ((m_sreg[1]<<2 & 0x300) + m_sreg[2] + shiftx) & 0x3ff; - m_bgmap->set_scrollx(0, x); - y = (m_sreg[1]<<4 & 0x300) + m_sreg[3]; - m_bgmap->set_scrolly(0, y); - m_bgmap->draw(screen, bitmap, cliprect, 0, 0); - } - else - bitmap.fill(m_palette->black_pen(), cliprect); - - // draw low priority sprites - draw_sprites(bitmap, cliprect, m_spriteram, 0); - - // draw foreground - if (!(m_mapmask & 2)) - { - m_fgmap->set_flip(flip); - x = ((m_sreg[1] << 6 & 0x300) + m_sreg[4] + shiftx) & 0x3ff; - m_fgmap->set_scrollx(0, x); - y = (m_sreg[1] << 8 & 0x300) + m_sreg[5]; - m_fgmap->set_scrolly(0, y); - m_fgmap->draw(screen, bitmap, cliprect, 0, 0); - } - - // draw high priority sprites - draw_sprites(bitmap, cliprect, m_spriteram, 1); - - // draw text layer -// if (m_mapmask & 4) - { - m_charmap->set_flip(flip); - m_charmap->draw(screen, bitmap, cliprect, 0, 0); - } - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/cbuster.cpp mame-0.264+dfsg.1/src/mame/dataeast/cbuster.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/cbuster.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/cbuster.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -120,8 +120,6 @@ }; -// video - /******************************************************************************/ void cbuster_state::video_start() @@ -192,8 +190,6 @@ } -// machine - void cbuster_state::prot_w(offs_t offset, u16 data, u16 mem_mask) { data &= mem_mask; diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/compgolf.cpp mame-0.264+dfsg.1/src/mame/dataeast/compgolf.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/compgolf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/compgolf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -88,8 +88,6 @@ }; -// video - void compgolf_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -206,8 +204,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/darkseal.cpp mame-0.264+dfsg.1/src/mame/dataeast/darkseal.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/darkseal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/darkseal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -84,8 +84,6 @@ }; -// video - /************************************************************************** @@ -153,8 +151,6 @@ /******************************************************************************/ -// machine - /******************************************************************************/ void darkseal_state::irq_ack_w(uint16_t data) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/dassault.cpp mame-0.264+dfsg.1/src/mame/dataeast/dassault.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/dassault.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/dassault.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -294,8 +294,6 @@ }; -// video - /*************************************************************************** Desert Assault Video emulation - Bryan McPhail, mish@tendril.co.uk @@ -434,8 +432,6 @@ } -// machine - /**********************************************************************************/ void dassault_state::priority_w(offs_t offset, uint16_t data, uint16_t mem_mask) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/exprraid.cpp mame-0.264+dfsg.1/src/mame/dataeast/exprraid.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/exprraid.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/exprraid.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -306,8 +306,6 @@ }; -// video - void exprraid_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/firetrap.cpp mame-0.264+dfsg.1/src/mame/dataeast/firetrap.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/firetrap.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/firetrap.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -330,8 +330,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -555,8 +553,6 @@ } -// machine - void base_state::nmi_disable_w(uint8_t data) { m_nmi_enable = ~data & 1; diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/lemmings.cpp mame-0.264+dfsg.1/src/mame/dataeast/lemmings.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/lemmings.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/lemmings.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Bryan McPhail +// copyright-holders: Bryan McPhail + /*************************************************************************** Lemmings (c) 1991 Data East USA (DE-0357) @@ -11,74 +12,304 @@ arcade hardware. As prototype software it seems to have a couple of non-critical bugs, - the palette ram check and vram check both overrun their actual ramsize. + the palette RAM check and VRAM check both overrun their actual RAM size. Emulation by Bryan McPhail, mish@tendril.co.uk ***************************************************************************/ #include "emu.h" -#include "lemmings.h" + +#include "deco146.h" +#include "decospr.h" #include "cpu/m6809/m6809.h" #include "cpu/m68000/m68000.h" +#include "machine/gen_latch.h" #include "sound/okim6295.h" #include "sound/ymopm.h" +#include "video/bufsprite.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class lemmings_state : public driver_device +{ +public: + lemmings_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_bitmap0(2048, 256) + , m_maincpu(*this, "maincpu") + , m_audiocpu(*this, "audiocpu") + , m_deco146(*this, "ioprot") + , m_spriteram(*this, "spriteram%u", 1) + , m_sprgen(*this, "spritegen%u", 1) + , m_gfxdecode(*this, "gfxdecode") + , m_palette(*this, "palette") + , m_soundlatch(*this, "soundlatch") + , m_control_data(*this, "control_data") + , m_vram_data(*this, "vram_data") + , m_pixel_data(*this, "pixel_%u_data", 0) + , m_trackball_io(*this, "AN%u", 0) + { + } + + void lemmings(machine_config &config); + +protected: + virtual void video_start() override; + +private: + // video-related + bitmap_ind16 m_bitmap0{}; + tilemap_t *m_vram_tilemap = nullptr; + std::unique_ptr m_sprite_triple_buffer[2]{}; + std::unique_ptr m_vram_buffer{}; + + // devices + required_device m_maincpu; + required_device m_audiocpu; + required_device m_deco146; + required_device_array m_spriteram; + required_device_array m_sprgen; + required_device m_gfxdecode; + required_device m_palette; + required_device m_soundlatch; + + // memory pointers + required_shared_ptr m_control_data; + required_shared_ptr m_vram_data; + required_shared_ptr_array m_pixel_data; + + required_ioport_array<4> m_trackball_io; + + void control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + uint16_t trackball_r(offs_t offset); + void pixel_0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void pixel_1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + TILE_GET_INFO_MEMBER(get_tile_info); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void screen_vblank(int state); + void copy_bitmap(bitmap_rgb32 &bitmap, int *xscroll, int *yscroll, const rectangle &cliprect); + + uint16_t protection_region_0_146_r(offs_t offset); + void protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +/************************************************************************** + + There are two sets of sprites, the combination of custom chips 52 & 71. + There is a background pixel layer implemented with discrete logic + rather than a custom chip and a foreground VRAM tilemap layer that the + game mostly uses as a pixel layer (the VRAM format is arranged as + sequential pixels, rather than sequential characters). + +***************************************************************************/ + +TILE_GET_INFO_MEMBER(lemmings_state::get_tile_info) +{ + uint16_t const tile = m_vram_data[tile_index]; + tileinfo.set(2, + tile & 0x7ff, + (tile >> 12) & 0xf, + 0); +} -void lemmings_state::lemmings_control_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void lemmings_state::video_start() { - /* Offset==0 Pixel layer X scroll */ + m_vram_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(lemmings_state::get_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32); + + m_vram_tilemap->set_transparent_pen(0); + m_bitmap0.fill(0x100); + + m_vram_buffer = make_unique_clear(2048 * 64); // 64 bytes per VRAM character + m_gfxdecode->gfx(2)->set_source(m_vram_buffer.get()); + + m_sprgen[0]->alloc_sprite_bitmap(); + m_sprgen[1]->alloc_sprite_bitmap(); + + m_sprite_triple_buffer[0] = make_unique_clear(0x800 / 2); + m_sprite_triple_buffer[1] = make_unique_clear(0x800 / 2); + + save_item(NAME(m_bitmap0)); + save_pointer(NAME(m_vram_buffer), 2048 * 64); + save_pointer(NAME(m_sprite_triple_buffer[0]), 0x800 / 2, 0); + save_pointer(NAME(m_sprite_triple_buffer[1]), 0x800 / 2, 1); +} + +void lemmings_state::screen_vblank(int state) +{ + // rising edge + if (state) + { + for (int chip = 0; chip < 2; chip++) + std::copy_n(&m_spriteram[chip]->buffer()[0], 0x800 / 2, &m_sprite_triple_buffer[chip][0]); + } +} + +/******************************************************************************/ + +// RAM based +void lemmings_state::pixel_0_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + int const old = m_pixel_data[0][offset]; + COMBINE_DATA(&m_pixel_data[0][offset]); + int const src = m_pixel_data[0][offset]; + if (old == src) + return; + + int const sy = (offset << 1) >> 11; + int const sx = (offset << 1) & 0x7ff; + + if (sx > 2047 || sy > 255) + return; + + m_bitmap0.pix(sy, sx + 0) = ((src >> 8) & 0xf) | 0x100; + m_bitmap0.pix(sy, sx + 1) = ((src >> 0) & 0xf) | 0x100; +} + +// RAM based tiles for the FG tilemap +void lemmings_state::pixel_1_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_pixel_data[1][offset]); + int const src = m_pixel_data[1][offset]; + + int const sy = (offset << 1) >> 9; + int sx = (offset << 1) & 0x1ff; + + // Copy pixel to buffer for easier decoding later + int const tile = ((sx / 8) * 32) + (sy / 8); + m_gfxdecode->gfx(2)->mark_dirty(tile); + m_vram_buffer[(tile * 64) + ((sx & 7)) + ((sy & 7) * 8)] = (src >> 8) & 0xf; + + sx += 1; // Update both pixels in the word + m_vram_buffer[(tile * 64) + ((sx & 7)) + ((sy & 7) * 8)] = (src >> 0) & 0xf; +} + +void lemmings_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_vram_data[offset]); + m_vram_tilemap->mark_tile_dirty(offset); +} + + +void lemmings_state::copy_bitmap(bitmap_rgb32 &bitmap, int *xscroll, int *yscroll, const rectangle &cliprect) +{ + pen_t const *const paldata = m_palette->pens(); + + for (int y = cliprect.top(); y < cliprect.bottom(); y++) + { + uint32_t *const dst = &bitmap.pix(y, 0); + + for (int x = cliprect.left(); x < cliprect.right(); x++) + { + uint16_t const src = m_bitmap0.pix((y - *yscroll) & 0xff, (x - *xscroll) & 0x7ff); + + if (src != 0x100) + dst[x] = paldata[src]; + } + } +} + +uint32_t lemmings_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + int x1 = -m_control_data[0]; + int x0 = -m_control_data[2]; + int y = 0; + rectangle rect(0, 0, cliprect.top(), cliprect.bottom()); + + // sprites are flipped relative to tilemaps + m_sprgen[0]->set_flip_screen(true); + m_sprgen[1]->set_flip_screen(true); + m_sprgen[0]->draw_sprites(bitmap, cliprect, m_sprite_triple_buffer[1].get(), 0x400); + m_sprgen[1]->draw_sprites(bitmap, cliprect, m_sprite_triple_buffer[0].get(), 0x400); + + bitmap.fill(m_palette->black_pen(), cliprect); + m_sprgen[0]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x300, 0xff); + + // Pixel layer can be windowed in hardware (two player mode) + if ((m_control_data[6] & 2) == 0) + { + copy_bitmap(bitmap, &x1, &y, cliprect); + } + else + { + rect.setx(0, 159); + copy_bitmap(bitmap, &x0, &y, rect); + + rect.setx(160, 319); + copy_bitmap(bitmap, &x1, &y, rect); + } + + m_sprgen[1]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x200, 0xff); + m_sprgen[0]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x300, 0xff); + m_vram_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_sprgen[1]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x200, 0xff); + return 0; +} + + +void lemmings_state::control_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + // Offset==0 Pixel layer X scroll if (offset == 4) - return; /* Watchdog or IRQ ack */ + return; // Watchdog or IRQ ack COMBINE_DATA(&m_control_data[offset]); } -uint16_t lemmings_state::lemmings_trackball_r(offs_t offset) +uint16_t lemmings_state::trackball_r(offs_t offset) { if ((offset & 2) == 0) return m_trackball_io[(offset & 1) | ((offset & 4) >> 1)]->read(); return 0; } -uint16_t lemmings_state::lem_protection_region_0_146_r(offs_t offset) +uint16_t lemmings_state::protection_region_0_146_r(offs_t offset) { - int real_address = 0 + (offset *2); - int deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; + int const real_address = 0 + (offset *2); + int const deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; uint8_t cs = 0; - uint16_t data = m_deco146->read_data( deco146_addr, cs ); + uint16_t data = m_deco146->read_data(deco146_addr, cs); return data; } -void lemmings_state::lem_protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void lemmings_state::protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - int real_address = 0 + (offset *2); - int deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; + int const real_address = 0 + (offset *2); + int const deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; uint8_t cs = 0; - m_deco146->write_data( deco146_addr, data, mem_mask, cs ); + m_deco146->write_data(deco146_addr, data, mem_mask, cs); } /******************************************************************************/ -void lemmings_state::lemmings_map(address_map &map) +void lemmings_state::main_map(address_map &map) { map(0x000000, 0x0fffff).rom(); map(0x100000, 0x10ffff).ram(); map(0x120000, 0x1207ff).ram().share("spriteram1"); map(0x140000, 0x1407ff).ram().share("spriteram2"); map(0x160000, 0x160fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x170000, 0x17000f).ram().w(FUNC(lemmings_state::lemmings_control_w)).share("control_data"); - map(0x190000, 0x19000f).r(FUNC(lemmings_state::lemmings_trackball_r)); - map(0x1a0000, 0x1a3fff).rw(FUNC(lemmings_state::lem_protection_region_0_146_r), FUNC(lemmings_state::lem_protection_region_0_146_w)).share("prot16ram"); /* Protection device */ - map(0x1c0000, 0x1c0001).w(m_spriteram[0], FUNC(buffered_spriteram16_device::write)); /* 1 written once a frame */ - map(0x1e0000, 0x1e0001).w(m_spriteram[1], FUNC(buffered_spriteram16_device::write)); /* 1 written once a frame */ - map(0x200000, 0x201fff).ram().w(FUNC(lemmings_state::lemmings_vram_w)).share("vram_data"); + map(0x170000, 0x17000f).ram().w(FUNC(lemmings_state::control_w)).share(m_control_data); + map(0x190000, 0x19000f).r(FUNC(lemmings_state::trackball_r)); + map(0x1a0000, 0x1a3fff).rw(FUNC(lemmings_state::protection_region_0_146_r), FUNC(lemmings_state::protection_region_0_146_w)).share("prot16ram"); // Protection device + map(0x1c0000, 0x1c0001).w(m_spriteram[0], FUNC(buffered_spriteram16_device::write)); // 1 written once a frame + map(0x1e0000, 0x1e0001).w(m_spriteram[1], FUNC(buffered_spriteram16_device::write)); // 1 written once a frame + map(0x200000, 0x201fff).ram().w(FUNC(lemmings_state::vram_w)).share(m_vram_data); map(0x202000, 0x202fff).ram(); - map(0x300000, 0x37ffff).ram().w(FUNC(lemmings_state::lemmings_pixel_0_w)).share("pixel_0_data"); - map(0x380000, 0x39ffff).ram().w(FUNC(lemmings_state::lemmings_pixel_1_w)).share("pixel_1_data"); + map(0x300000, 0x37ffff).ram().w(FUNC(lemmings_state::pixel_0_w)).share(m_pixel_data[0]); + map(0x380000, 0x39ffff).ram().w(FUNC(lemmings_state::pixel_1_w)).share(m_pixel_data[1]); } /******************************************************************************/ @@ -202,28 +433,24 @@ }; static GFXDECODE_START( gfx_lemmings ) - GFXDECODE_ENTRY( "gfx1", 0, sprite_layout, 512, 16 ) /* Sprites 16x16 */ - GFXDECODE_ENTRY( "gfx2", 0, sprite_layout, 768, 16 ) /* Sprites 16x16 */ - GFXDECODE_ENTRY( nullptr,0, charlayout, 0, 16 ) /* Dynamically modified */ + GFXDECODE_ENTRY( "sprites1", 0, sprite_layout, 512, 16 ) // Sprites 16x16 + GFXDECODE_ENTRY( "sprites2", 0, sprite_layout, 768, 16 ) // Sprites 16x16 + GFXDECODE_ENTRY( nullptr, 0, charlayout, 0, 16 ) // Dynamically modified GFXDECODE_END /******************************************************************************/ -void lemmings_state::machine_start() -{ -} - void lemmings_state::lemmings(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware M68000(config, m_maincpu, 28_MHz_XTAL / 2); // Data East 59 - m_maincpu->set_addrmap(AS_PROGRAM, &lemmings_state::lemmings_map); + m_maincpu->set_addrmap(AS_PROGRAM, &lemmings_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(lemmings_state::irq6_line_hold)); MC6809E(config, m_audiocpu, 32.22_MHz_XTAL / 24); // MC68B09EP; clock not verified m_audiocpu->set_addrmap(AS_PROGRAM, &lemmings_state::sound_map); - /* video hardware */ + // video hardware BUFFERED_SPRITERAM16(config, m_spriteram[0]); BUFFERED_SPRITERAM16(config, m_spriteram[1]); @@ -232,8 +459,8 @@ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529)); screen.set_size(40*8, 32*8); screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1); - screen.set_screen_update(FUNC(lemmings_state::screen_update_lemmings)); - screen.screen_vblank().set(FUNC(lemmings_state::screen_vblank_lemmings)); + screen.set_screen_update(FUNC(lemmings_state::screen_update)); + screen.screen_vblank().set(FUNC(lemmings_state::screen_vblank)); GFXDECODE(config, m_gfxdecode, m_palette, gfx_lemmings); PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 1024); @@ -253,7 +480,7 @@ m_deco146->set_use_magic_read_address_xor(true); m_deco146->soundlatch_irq_cb().set_inputline(m_audiocpu, M6809_FIRQ_LINE); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -272,7 +499,7 @@ /******************************************************************************/ ROM_START( lemmings ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ + ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "lemmings.5", 0x00000, 0x20000, CRC(e9a2b439) SHA1(873723a06d71bb41772951f451a75578b30267d5) ) ROM_LOAD16_BYTE( "lemmings.1", 0x00001, 0x20000, CRC(bf52293b) SHA1(47a1ed64bf02776db086fdce80997b8a0c068791) ) ROM_LOAD16_BYTE( "lemmings.6", 0x40000, 0x20000, CRC(0e3dc0ea) SHA1(533abf66ca4b578d03566d5de922dc5828c26eca) ) @@ -282,23 +509,26 @@ ROM_LOAD16_BYTE( "lemmings.8", 0xc0000, 0x20000, CRC(9166ce09) SHA1(7f0970cc07ebdbfc9a738342259d07d37b397161) ) ROM_LOAD16_BYTE( "lemmings.4", 0xc0001, 0x20000, CRC(aa845488) SHA1(d17ec80f43d2a0123e93fad83d4e1319eb18d7c7) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "lemmings.15", 0x00000, 0x10000, CRC(f0b24a35) SHA1(1aaeb1e6faee04d2e433161fd7aa965b58e3b8a7) ) - ROM_REGION( 0x40000, "gfx1", ROMREGION_ERASE00 ) /* 3bpp data but sprite chip expects 4 */ + ROM_REGION( 0x40000, "sprites1", ROMREGION_ERASE00 ) // 3bpp data but sprite chip expects 4 ROM_LOAD32_BYTE( "lemmings.9", 0x000003, 0x10000, CRC(e06442f5) SHA1(d9c8b681cce1d0257a0446bc820c7d679e2a1168) ) ROM_LOAD32_BYTE( "lemmings.10", 0x000002, 0x10000, CRC(36398848) SHA1(6c6956607f889c35367e6df4a32359042fad695e) ) ROM_LOAD32_BYTE( "lemmings.11", 0x000001, 0x10000, CRC(b46a54e5) SHA1(53b053346f80357aecff4ab888a8562f99cb318f) ) - ROM_REGION( 0x40000, "gfx2", ROMREGION_ERASE00 ) /* 3bpp data but sprite chip expects 4 */ + ROM_REGION( 0x40000, "sprites2", ROMREGION_ERASE00 ) // 3bpp data but sprite chip expects 4 ROM_LOAD32_BYTE( "lemmings.12", 0x000003, 0x10000, CRC(dc9047ff) SHA1(1bbe573fa51127a9e8b970a353f3cceab00f486a) ) ROM_LOAD32_BYTE( "lemmings.13", 0x000002, 0x10000, CRC(7cc15491) SHA1(73c1c11b2738f6679c70cae8ac4c55cdc9b8fc27) ) ROM_LOAD32_BYTE( "lemmings.14", 0x000001, 0x10000, CRC(c162788f) SHA1(e1f669efa59699cd1b7da71b112701ee79240c18) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "lemmings.16", 0x00000, 0x20000, CRC(f747847c) SHA1(00880fa6dff979e5d15daea61938bd18c768c92f) ) ROM_END +} // anonymous namespace + + /******************************************************************************/ GAME( 1991, lemmings, 0, lemmings, lemmings, lemmings_state, empty_init, ROT0, "Data East USA", "Lemmings (US prototype)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/lemmings.h mame-0.264+dfsg.1/src/mame/dataeast/lemmings.h --- mame-0.263+dfsg.1/src/mame/dataeast/lemmings.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/lemmings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -#include "video/bufsprite.h" -#include "decospr.h" -#include "deco146.h" -#include "machine/gen_latch.h" -#include "emupal.h" -#include "tilemap.h" - -class lemmings_state : public driver_device -{ -public: - lemmings_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_bitmap0(2048, 256) - , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") - , m_deco146(*this, "ioprot") - , m_spriteram(*this, "spriteram%u", 1) - , m_sprgen(*this, "spritegen%u", 1) - , m_gfxdecode(*this, "gfxdecode") - , m_palette(*this, "palette") - , m_soundlatch(*this, "soundlatch") - , m_control_data(*this, "control_data") - , m_vram_data(*this, "vram_data") - , m_pixel_data(*this, "pixel_%u_data", 0) - , m_trackball_io(*this, "AN%u", 0) - { - } - - void lemmings(machine_config &config); - -private: - /* video-related */ - bitmap_ind16 m_bitmap0{}; - tilemap_t *m_vram_tilemap = nullptr; - std::unique_ptr m_sprite_triple_buffer[2]{}; - std::unique_ptr m_vram_buffer{}; - - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - required_device m_deco146; - required_device_array m_spriteram; - required_device_array m_sprgen; - required_device m_gfxdecode; - required_device m_palette; - required_device m_soundlatch; - - /* memory pointers */ - required_shared_ptr m_control_data; - required_shared_ptr m_vram_data; - required_shared_ptr_array m_pixel_data; - - required_ioport_array<4> m_trackball_io; - - void lemmings_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t lemmings_trackball_r(offs_t offset); - void lemmings_pixel_0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void lemmings_pixel_1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void lemmings_vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - TILE_GET_INFO_MEMBER(get_tile_info); - virtual void machine_start() override; - virtual void video_start() override; - uint32_t screen_update_lemmings(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void screen_vblank_lemmings(int state); - void lemmings_copy_bitmap(bitmap_rgb32& bitmap, int* xscroll, int* yscroll, const rectangle& cliprect); - - uint16_t lem_protection_region_0_146_r(offs_t offset); - void lem_protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void lemmings_map(address_map &map); - void sound_map(address_map &map); -}; diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/lemmings_v.cpp mame-0.264+dfsg.1/src/mame/dataeast/lemmings_v.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/lemmings_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/lemmings_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -/*************************************************************************** - - Lemmings video emulation - Bryan McPhail, mish@tendril.co.uk - -********************************************************************* - - There are two sets of sprites, the combination of custom chips 52 & 71. - There is a background pixel layer implemented with discrete logic - rather than a custom chip and a foreground VRAM tilemap layer that the - game mostly uses as a pixel layer (the vram format is arranged as - sequential pixels, rather than sequential characters). - -***************************************************************************/ - -#include "emu.h" -#include "lemmings.h" - -#include - -/******************************************************************************/ - -TILE_GET_INFO_MEMBER(lemmings_state::get_tile_info) -{ - uint16_t tile = m_vram_data[tile_index]; - - tileinfo.set(2, - tile&0x7ff, - (tile>>12)&0xf, - 0); -} - -void lemmings_state::video_start() -{ - m_vram_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(lemmings_state::get_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32); - - m_vram_tilemap->set_transparent_pen(0); - m_bitmap0.fill(0x100); - - m_vram_buffer = make_unique_clear(2048 * 64); // 64 bytes per VRAM character - m_gfxdecode->gfx(2)->set_source(m_vram_buffer.get()); - - m_sprgen[0]->alloc_sprite_bitmap(); - m_sprgen[1]->alloc_sprite_bitmap(); - - m_sprite_triple_buffer[0] = make_unique_clear(0x800/2); - m_sprite_triple_buffer[1] = make_unique_clear(0x800/2); - - save_item(NAME(m_bitmap0)); - save_pointer(NAME(m_vram_buffer), 2048 * 64); - save_pointer(NAME(m_sprite_triple_buffer[0]), 0x800/2, 0); - save_pointer(NAME(m_sprite_triple_buffer[1]), 0x800/2, 1); -} - -void lemmings_state::screen_vblank_lemmings(int state) -{ - // rising edge - if (state) - { - for (int chip = 0; chip < 2; chip++) - std::copy_n(&m_spriteram[chip]->buffer()[0], 0x800/2, &m_sprite_triple_buffer[chip][0]); - } -} - -/******************************************************************************/ - -// RAM based -void lemmings_state::lemmings_pixel_0_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - int const old = m_pixel_data[0][offset]; - COMBINE_DATA(&m_pixel_data[0][offset]); - int const src = m_pixel_data[0][offset]; - if (old == src) - return; - - int const sy = (offset << 1) >> 11; - int const sx = (offset << 1) & 0x7ff; - - if (sx > 2047 || sy > 255) - return; - - m_bitmap0.pix(sy, sx + 0) = ((src >> 8) & 0xf) | 0x100; - m_bitmap0.pix(sy, sx + 1) = ((src >> 0) & 0xf) | 0x100; -} - -// RAM based tiles for the FG tilemap -void lemmings_state::lemmings_pixel_1_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - int sx, sy, src, tile; - - COMBINE_DATA(&m_pixel_data[1][offset]); - src = m_pixel_data[1][offset]; - - sy = (offset << 1) >> 9; - sx = (offset << 1) & 0x1ff; - - /* Copy pixel to buffer for easier decoding later */ - tile = ((sx / 8) * 32) + (sy / 8); - m_gfxdecode->gfx(2)->mark_dirty(tile); - m_vram_buffer[(tile * 64) + ((sx & 7)) + ((sy & 7) * 8)] = (src >> 8) & 0xf; - - sx += 1; /* Update both pixels in the word */ - m_vram_buffer[(tile * 64) + ((sx & 7)) + ((sy & 7) * 8)] = (src >> 0) & 0xf; -} - -void lemmings_state::lemmings_vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_vram_data[offset]); - m_vram_tilemap->mark_tile_dirty(offset); -} - - -void lemmings_state::lemmings_copy_bitmap(bitmap_rgb32& bitmap, int* xscroll, int* yscroll, const rectangle& cliprect) -{ - pen_t const *const paldata = m_palette->pens(); - - for (int y=cliprect.top(); yset_flip_screen(true); - m_sprgen[1]->set_flip_screen(true); - m_sprgen[0]->draw_sprites(bitmap, cliprect, m_sprite_triple_buffer[1].get(), 0x400); - m_sprgen[1]->draw_sprites(bitmap, cliprect, m_sprite_triple_buffer[0].get(), 0x400); - - bitmap.fill(m_palette->black_pen(), cliprect); - m_sprgen[0]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x300, 0xff); - - /* Pixel layer can be windowed in hardware (two player mode) */ - if ((m_control_data[6] & 2) == 0) - { - lemmings_copy_bitmap(bitmap, &x1, &y, cliprect); - } - else - { - rect.setx(0, 159); - lemmings_copy_bitmap(bitmap, &x0, &y, rect); - - rect.setx(160, 319); - lemmings_copy_bitmap(bitmap, &x1, &y, rect); - } - - m_sprgen[1]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x200, 0xff); - m_sprgen[0]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x300, 0xff); - m_vram_tilemap->draw(screen, bitmap, cliprect, 0, 0); - m_sprgen[1]->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x200, 0xff); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/metlclsh.cpp mame-0.264+dfsg.1/src/mame/dataeast/metlclsh.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/metlclsh.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/metlclsh.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -124,8 +124,6 @@ }; -// video - /*************************************************************************** -= Metal Clash =- @@ -368,8 +366,6 @@ } -// machine - /*************************************************************************** Memory Maps - CPU #1 diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/pcktgal.cpp mame-0.264+dfsg.1/src/mame/dataeast/pcktgal.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/pcktgal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/pcktgal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -93,8 +93,6 @@ }; -// video - void pcktgal_state::palette(palette_device &palette) const { @@ -169,8 +167,6 @@ } -// machine - /***************************************************************************/ void pcktgal_state::bank_w(uint8_t data) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/pktgaldx.cpp mame-0.264+dfsg.1/src/mame/dataeast/pktgaldx.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/pktgaldx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/pktgaldx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -162,8 +162,6 @@ void prg_map(address_map &map); }; -// video - uint32_t pktgaldx_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { @@ -234,8 +232,6 @@ } -// machine - /**********************************************************************************/ void base_state::oki_bank_w(uint16_t data) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/shootout.cpp mame-0.264+dfsg.1/src/mame/dataeast/shootout.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/shootout.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/shootout.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ void audio_map(address_map &map); }; -// video - void shootoutj_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -309,8 +307,6 @@ } -// machine - /*******************************************************************************/ void shootout_state::bankswitch_w(uint8_t data) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/sidepckt.cpp mame-0.264+dfsg.1/src/mame/dataeast/sidepckt.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/sidepckt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/sidepckt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -233,8 +233,6 @@ }; -// video - void sidepckt_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -387,8 +385,6 @@ } -// machine - //************************************************************************** // PROTECTION MCU //************************************************************************** diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/sshangha.cpp mame-0.264+dfsg.1/src/mame/dataeast/sshangha.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/sshangha.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/sshangha.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -178,8 +178,6 @@ }; -// video - /*************************************************************************** Uses Data East custom chip 55 for backgrounds, with a special 8bpp mode @@ -249,8 +247,6 @@ } -// machine - /******************************************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/stadhero.cpp mame-0.264+dfsg.1/src/mame/dataeast/stadhero.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/stadhero.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/stadhero.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -160,8 +160,6 @@ }; -// video - /******************************************************************************/ uint32_t stadhero_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -208,8 +206,6 @@ /******************************************************************************/ -// machine - /******************************************************************************/ void stadhero_state::int_ack_w(uint16_t data) diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/tryout.cpp mame-0.264+dfsg.1/src/mame/dataeast/tryout.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/tryout.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/tryout.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,6 @@ }; -// video - void tryout_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -352,8 +350,6 @@ } -// machine - void tryout_state::nmi_ack_w(uint8_t data) { m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/dataeast/vaportra.cpp mame-0.264+dfsg.1/src/mame/dataeast/vaportra.cpp --- mame-0.263+dfsg.1/src/mame/dataeast/vaportra.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dataeast/vaportra.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -95,8 +95,6 @@ }; -// video - /**************************************************************************** 2 Data East 55 chips for playfields (same as Dark Seal, etc) @@ -193,8 +191,6 @@ } -// machine - /******************************************************************************/ uint8_t vaportra_state::irq6_ack_r() diff -Nru mame-0.263+dfsg.1/src/mame/ddr/chessmst.cpp mame-0.264+dfsg.1/src/mame/ddr/chessmst.cpp --- mame-0.263+dfsg.1/src/mame/ddr/chessmst.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ddr/chessmst.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -71,7 +71,7 @@ required_device_array m_pio; required_device m_board; required_device m_led_pwm; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u16 m_matrix = 0; diff -Nru mame-0.263+dfsg.1/src/mame/ddr/chessmstdm.cpp mame-0.264+dfsg.1/src/mame/ddr/chessmstdm.cpp --- mame-0.263+dfsg.1/src/mame/ddr/chessmstdm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ddr/chessmstdm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -264,7 +264,7 @@ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Move Back") PORT_CODE(KEYCODE_LEFT) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board") PORT_CODE(KEYCODE_B) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Match / Time") PORT_CODE(KEYCODE_M) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Parameter / Information") PORT_CODE(KEYCODE_I) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Parameter / Information") PORT_CODE(KEYCODE_P) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Selection / Dialogue") PORT_CODE(KEYCODE_S) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function / Notation") PORT_CODE(KEYCODE_F) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) diff -Nru mame-0.263+dfsg.1/src/mame/ddr/sc2.cpp mame-0.264+dfsg.1/src/mame/ddr/sc2.cpp --- mame-0.263+dfsg.1/src/mame/ddr/sc2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ddr/sc2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -68,7 +68,7 @@ required_device m_maincpu; required_device m_pio; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_inputs; u8 m_inp_mux = 0; @@ -185,7 +185,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, sc2_state, reset_button, 0) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_P) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/dgrm/pokechmp.cpp mame-0.264+dfsg.1/src/mame/dgrm/pokechmp.cpp --- mame-0.263+dfsg.1/src/mame/dgrm/pokechmp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dgrm/pokechmp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -106,8 +106,6 @@ }; -// video - void pokechmp_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -178,8 +176,6 @@ } -// machine - void pokechmp_state::machine_start() { m_mainbank->configure_entries(0, 2, memregion("maincpu")->base(), 0x4000); diff -Nru mame-0.263+dfsg.1/src/mame/dooyong/gundealr.cpp mame-0.264+dfsg.1/src/mame/dooyong/gundealr.cpp --- mame-0.263+dfsg.1/src/mame/dooyong/gundealr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dooyong/gundealr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -170,8 +170,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -270,8 +268,6 @@ } -// machine - void gundealr_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data & 0x07); diff -Nru mame-0.263+dfsg.1/src/mame/dynax/ddenlovr.cpp mame-0.264+dfsg.1/src/mame/dynax/ddenlovr.cpp --- mame-0.263+dfsg.1/src/mame/dynax/ddenlovr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dynax/ddenlovr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -13274,13 +13274,13 @@ } // anonymous namespace -GAME( 1992, htengoku, 0, htengoku, htengoku, htengoku_state, empty_init, ROT180, "Dynax", "Hanafuda Hana Tengoku [BET] (Japan)", 0) +GAME( 1992, htengoku, 0, htengoku, htengoku, htengoku_state, empty_init, ROT180, "Dynax", "Hanafuda Hana Tengoku (Japan)", 0) GAME( 1992, mmpanic, 0, mmpanic, mmpanic, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Monkey Mole Panic (USA)", MACHINE_NO_COCKTAIL ) // "Waiwai Animal Land" (without the Jr.) should be the original Japanese version of Monkey Mole Panic -GAME( 1993, mjmyorn2, 0, mjmyornt, mjmyorn2, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Part 2 ~ Exotic Dream ~ [BET] (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings -GAME( 1992, mjmyornt, mjmyorn2, mjmyornt, mjmyornt, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient [BET] (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings +GAME( 1993, mjmyorn2, 0, mjmyornt, mjmyorn2, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Part 2 ~ Exotic Dream ~ (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings +GAME( 1992, mjmyornt, mjmyorn2, mjmyornt, mjmyornt, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings GAME( 1993, funkyfig, 0, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 1)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // scrolling, priority? GAME( 1993, funkyfiga, funkyfig, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 2)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // "" @@ -13293,12 +13293,12 @@ GAME( 1993, animaljrs, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Animalandia Jr. (Spanish)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND ) GAME( 1993, animaljrj, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Waiwai Animal Land Jr. (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1994, mjmyster, 0, mjmyster, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World [BET] (Japan, set 1)", MACHINE_NO_COCKTAIL ) -GAME( 1994, mjmywrld, mjmyster, mjmywrld, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World [BET] (Japan, set 2)", MACHINE_NO_COCKTAIL ) +GAME( 1994, mjmyster, 0, mjmyster, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 1)", MACHINE_NO_COCKTAIL ) +GAME( 1994, mjmywrld, mjmyster, mjmywrld, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 2)", MACHINE_NO_COCKTAIL ) -GAME( 1994, hginga, 0, hginga, hginga, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Ginga [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1994, hginga, 0, hginga, hginga, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Ginga (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1994, mjmyuniv, 0, mjmyuniv, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Universe [BET] (Japan, D85)", MACHINE_NO_COCKTAIL ) +GAME( 1994, mjmyuniv, 0, mjmyuniv, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Universe (Japan, D85)", MACHINE_NO_COCKTAIL ) GAME( 1994, quiz365, 0, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Quiz 365 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) GAME( 1994, quiz365t, quiz365, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon / Taito", "Quiz 365 (Hong Kong & Taiwan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION ) @@ -13309,12 +13309,12 @@ GAME( 1994, hparadis, 0, hparadis, hparadis, ddenlovr_state, empty_init, ROT0, "Dynax", "Super Hana Paradise (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1995, hgokou, 0, hgokou, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou [BET] (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1995, hgokbang, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Gokou Bangaihen [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1995, hgokou, 0, hgokou, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1995, hgokbang, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Gokou Bangaihen (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1995, mjdchuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Da Zhonghua Quan [BET] (Taiwan, D111)", MACHINE_NO_COCKTAIL ) +GAME( 1995, mjdchuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Da Zhonghua Quan (Taiwan, D111)", MACHINE_NO_COCKTAIL ) -GAME( 1995, mjschuka, 0, mjschuka, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong Super Dai Chuuka Ken [BET] (Japan, D115)", MACHINE_NO_COCKTAIL ) +GAME( 1995, mjschuka, 0, mjschuka, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong Super Dai Chuuka Ken (Japan, D115)", MACHINE_NO_COCKTAIL ) GAME( 1995, nettoqc, 0, nettoqc, nettoqc, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Nettoh Quiz Champion (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS ) GAME( 1995, ultrchmp, nettoqc, ultrchmp, ultrchmp, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Se Gye Hweng Dan Ultra Champion (Korea)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS ) @@ -13332,30 +13332,30 @@ GAME( 1996, akamaru, 0, akamaru, akamaru, ddenlovr_state, empty_init, ROT0, "Dynax (Nakanihon license)", "Panel & Variety Akamaru Q Joushou Dont-R", MACHINE_NO_COCKTAIL ) -GAME( 1996, janshinp, 0, janshinp, janshinp, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Janshin Plus [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1996, janshinp, 0, janshinp, janshinp, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Janshin Plus (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1996, dtoyoken, 0, dtoyoken, dtoyoken, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Dai Touyouken [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1996, dtoyoken, 0, dtoyoken, dtoyoken, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Dai Touyouken (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1996, sryudens, 0, sryudens, sryudens, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Mahjong Seiryu Densetsu [BET] (Japan, NM502)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, sryudens, 0, sryudens, sryudens, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Mahjong Seiryu Densetsu (Japan, NM502)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II [BET] (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II [BET] (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1996, mjflove, 0, mjflove, mjflove, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Mahjong Fantasic Love (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1997, mjmyorntr, 0, mjmyorntr, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Returns [BET] (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings +GAME( 1997, mjmyorntr, 0, mjmyorntr, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Returns (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings -GAME( 1997, hkagerou, 0, hkagerou, hkagerou, hanakanz_state, empty_init, ROT0, "Nakanihon / Dynax", "Hana Kagerou [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1997, hkagerou, 0, hkagerou, hkagerou, hanakanz_state, empty_init, ROT0, "Nakanihon / Dynax", "Hana Kagerou (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1998, mjchuuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Zhonghua Ernu [BET] (Taiwan)", MACHINE_NO_COCKTAIL ) +GAME( 1998, mjchuuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Zhonghua Ernu (Taiwan)", MACHINE_NO_COCKTAIL ) -GAME( 1998, mjreach1, 0, mjreach1, mjreach1, hanakanz_state, empty_init, ROT0, "Nihon System", "Mahjong Reach Ippatsu [BET] (Japan)", MACHINE_NO_COCKTAIL ) +GAME( 1998, mjreach1, 0, mjreach1, mjreach1, hanakanz_state, empty_init, ROT0, "Nihon System", "Mahjong Reach Ippatsu (Japan)", MACHINE_NO_COCKTAIL ) -GAME( 1999, jongtei, 0, jongtei, jongtei, hanakanz_state, empty_init, ROT0, "Dynax", "Mahjong Jong-Tei [BET] (Japan, NM532-01)", MACHINE_NO_COCKTAIL ) -GAME( 2000, jongteia, jongtei, jongteia, jongtei, hanakanz_state, empty_init, ROT0, "Dynax (Techno-Top license)", "Mahjong Jong-Tei [BET] (Japan, Techno-Top license)", MACHINE_NO_COCKTAIL ) +GAME( 1999, jongtei, 0, jongtei, jongtei, hanakanz_state, empty_init, ROT0, "Dynax", "Mahjong Jong-Tei (Japan, NM532-01)", MACHINE_NO_COCKTAIL ) +GAME( 2000, jongteia, jongtei, jongteia, jongtei, hanakanz_state, empty_init, ROT0, "Dynax (Techno-Top license)", "Mahjong Jong-Tei (Japan, Techno-Top license)", MACHINE_NO_COCKTAIL ) -GAME( 2000, mjgnight, 0, mjgnight, mjgnight, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Gorgeous Night [BET] (Japan, TSM003-01)", MACHINE_NO_COCKTAIL ) +GAME( 2000, mjgnight, 0, mjgnight, mjgnight, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Gorgeous Night (Japan, TSM003-01)", MACHINE_NO_COCKTAIL ) -GAME( 2002, daimyojn, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Dynax / Techno-Top / Techno-Planning", "Mahjong Daimyojin [BET] (Japan, T017-PB-00)", MACHINE_NO_COCKTAIL ) +GAME( 2002, daimyojn, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Dynax / Techno-Top / Techno-Planning", "Mahjong Daimyojin (Japan, T017-PB-00)", MACHINE_NO_COCKTAIL ) -GAME( 2004, momotaro, 0, daimyojn, daimyojn, hanakanz_state, init_momotaro, ROT0, "Techno-Top", "Mahjong Momotarou [BET] (Japan, T027-RB-01)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) +GAME( 2004, momotaro, 0, daimyojn, daimyojn, hanakanz_state, init_momotaro, ROT0, "Techno-Top", "Mahjong Momotarou (Japan, T027-RB-01)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/dynax/hnayayoi.cpp mame-0.264+dfsg.1/src/mame/dynax/hnayayoi.cpp --- mame-0.263+dfsg.1/src/mame/dynax/hnayayoi.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dynax/hnayayoi.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ }; -// video - /*************************************************************************** First version of the Dynax blitter. @@ -384,8 +382,6 @@ } -// machine - template uint8_t hnayayoi_state::keyboard_r() { @@ -1116,5 +1112,5 @@ GAME( 1987, hnayayoi, 0, hnayayoi, hnayayoi, hnayayoi_state, empty_init, ROT0, "Dyna Electronics", "Hana Yayoi (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, hnfubuki, hnayayoi, hnfubuki, hnfubuki, hnayayoi_state, init_hnfubuki, ROT0, "Dynax", "Hana Fubuki [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, hnfubuki, hnayayoi, hnfubuki, hnfubuki, hnayayoi_state, init_hnfubuki, ROT0, "Dynax", "Hana Fubuki (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, untoucha, 0, untoucha, untoucha, hnayayoi_state, empty_init, ROT0, "Dynax", "Untouchable (Ver. 2.10)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/dynax/royalmah.cpp mame-0.264+dfsg.1/src/mame/dynax/royalmah.cpp --- mame-0.263+dfsg.1/src/mame/dynax/royalmah.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/dynax/royalmah.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -6172,40 +6172,40 @@ // the original Janputer (Sanritsu) is not yet dumped, basically Royal Mahjong but non-BET type GAME( 1981, royalmj, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Nichibutsu", "Royal Mahjong (Japan, v1.13)", 0 ) -GAME( 1981?, openmj, royalmj, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Sapporo Mechanic", "Open Mahjong [BET] (Japan)", 0 ) +GAME( 1981?, openmj, royalmj, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Sapporo Mechanic", "Open Mahjong (Japan)", 0 ) GAME( 1982, royalmah, royalmj, royalmah, royalmah, royalmah_state, empty_init, ROT0, "bootleg", "Royal Mahjong (Falcon bootleg, v1.01)", 0 ) GAME( 1984?, chalgirl, 0, chalgirl, royalmah, royalmah_prgbank_state, init_chalgirl, ROT0, "bootleg", "Challenge Girl (Falcon bootleg)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING ) // verify ROM loading / banking, bad girl colors -GAME( 1983, seljan, 0, seljan, seljan, royalmah_state, empty_init, ROT0, "Jem / Dyna Corp", "Sel-Jan [BET] (Japan)", 0 ) +GAME( 1983, seljan, 0, seljan, seljan, royalmah_state, empty_init, ROT0, "Jem / Dyna Corp", "Sel-Jan (Japan)", 0 ) GAME( 1983, janyoup2, royalmj, janyoup2, janyoup2, royalmah_state, empty_init, ROT0, "Cosmo Denshi", "Janyou Part II (ver 7.03, July 1 1983)",0 ) GAME( 1985, tahjong, royalmj, tahjong, tahjong, royalmah_prgbank_state, init_tahjong, ROT0, "Bally Pond / Nasco", "Tahjong Yakitori (ver. 2-1)", 0 ) // 1985 Jun. 17 -GAME( 1981, janputer, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "bootleg (Paradise Denshi Ltd. / Mes)", "New Double Bet Mahjong (bootleg of Royal Mahjong) [BET]", 0 ) // MT #05392 +GAME( 1981, janputer, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "bootleg (Paradise Denshi Ltd. / Mes)", "New Double Bet Mahjong (bootleg of Royal Mahjong)", 0 ) // MT #05392 GAME( 1984, rkjanoh2, 0, rkjanoh2, royalmah, royalmah_prgbank_state, init_chalgirl, ROT0, "SNK / Dyna Corp", "Royal King Jang Oh 2 (v4.00 1984 Jun 10th)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING ) // never seems to set the palette bank? GAME( 1984, janoh, 0, janoh, royalmah, royalmah_state, empty_init, ROT0, "Toaplan", "Jan Oh (set 1)", MACHINE_NOT_WORKING ) GAME( 1984, janoha, janoh, janoha, royalmah, royalmah_state, empty_init, ROT0, "Toaplan", "Jan Oh (set 2)", MACHINE_NOT_WORKING ) // this one is complete? GAME( 1985, jansou, 0, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jansou (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) GAME( 1985, jansoua, jansou, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jansou (V 1.1)", 0 ) GAME( 1986, jangtaku, 0, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jang Taku (V 1.3)", 0 ) -GAME( 1986, dondenmj, 0, dondenmj, majs101b, royalmah_prgbank_state, init_dynax, ROT0, "Dyna Electronics", "Don Den Mahjong [BET] (Japan)", 0 ) -GAME( 1986, ippatsu, 0, ippatsu, ippatsu, royalmah_state, empty_init, ROT0, "Public Software / Paradais", "Ippatsu Gyakuten [BET] (Japan)", 0 ) +GAME( 1986, dondenmj, 0, dondenmj, majs101b, royalmah_prgbank_state, init_dynax, ROT0, "Dyna Electronics", "Don Den Mahjong (Japan)", 0 ) +GAME( 1986, ippatsu, 0, ippatsu, ippatsu, royalmah_state, empty_init, ROT0, "Public Software / Paradais", "Ippatsu Gyakuten (Japan)", 0 ) GAME( 1986, suzume, 0, suzume, suzume, royalmah_prgbank_state, init_suzume, ROT0, "Dyna Electronics", "Watashiha Suzumechan (Japan)", 0 ) GAME( 1986, jongshin, 0, jongshin, jongshin, royalmah_prgbank_state, init_jongshin, ROT0, "Dyna Electronics", "Jong Shin (Japan)", 0 ) GAME( 1986, mjsiyoub, 0, mjsiyoub, mjyarou, royalmah_prgbank_state, init_mjsiyoub, ROT0, "Visco", "Mahjong Shiyou (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING ) // MSM5205 isn't hooked up, colors need to be verified against original GAME( 1986, mjsenka, 0, mjsenka, mjyarou, royalmah_prgbank_state, init_mjsenka, ROT0, "Visco", "Mahjong Senka (Japan)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // never seems to set the palette bank? -GAME( 1986, mjyarou, 0, mjyarou, mjyarou, royalmah_prgbank_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 1)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? -GAME( 1986, mjyarou2, mjyarou, mjyarou, mjyarou, royalmah_prgbank_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 2)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? -GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_prgbank_state, init_tontonb, ROT0, "Xex", "Mahjong Club [BET] (Japan)", 0 ) -GAME( 1987, mjdiplob, 0, mjdiplob, mjdiplob, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Mahjong Diplomat [BET] (Japan)", 0 ) -GAME( 1987, tontonb, 0, tontonb, tontonb, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Tonton [BET] (Japan, set 1)", 0 ) -GAME( 1987, makaijan, 0, makaijan, makaijan, royalmah_prgbank_state, init_dynax, ROT0, "Dynax", "Makaijan [BET] (Japan)", 0 ) -GAME( 1988, majs101b, 0, majs101b, majs101b, royalmah_prgbank_state, init_dynax, ROT0, "Dynax", "Mahjong Studio 101 [BET] (Japan)", 0 ) -GAME( 1988, mjapinky, 0, mjapinky, mjapinky, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Almond Pinky [BET] (Japan)", 0 ) +GAME( 1986, mjyarou, 0, mjyarou, mjyarou, royalmah_prgbank_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou (Japan, set 1)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? +GAME( 1986, mjyarou2, mjyarou, mjyarou, mjyarou, royalmah_prgbank_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou (Japan, set 2)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? +GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_prgbank_state, init_tontonb, ROT0, "Xex", "Mahjong Club (Japan)", 0 ) +GAME( 1987, mjdiplob, 0, mjdiplob, mjdiplob, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Mahjong Diplomat (Japan)", 0 ) +GAME( 1987, tontonb, 0, tontonb, tontonb, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Tonton (Japan)", 0 ) +GAME( 1987, makaijan, 0, makaijan, makaijan, royalmah_prgbank_state, init_dynax, ROT0, "Dynax", "Makaijan (Japan)", 0 ) +GAME( 1988, majs101b, 0, majs101b, majs101b, royalmah_prgbank_state, init_dynax, ROT0, "Dynax", "Mahjong Studio 101 (Japan)", 0 ) +GAME( 1988, mjapinky, 0, mjapinky, mjapinky, royalmah_prgbank_state, init_tontonb, ROT0, "Dynax", "Almond Pinky (Japan)", 0 ) GAME( 1989, mjdejavu, 0, mjdejavu, mjdejavu, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu (Japan)", MACHINE_NOT_WORKING ) // MT #00964 GAME( 1989, mjdejav2, mjdejavu, mjdejavu, mjdejavu, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu 2 (Japan)", MACHINE_NOT_WORKING ) GAME( 1989, mjderngr, 0, mjderngr, mjderngr, royalmah_prgbank_state, init_dynax, ROT0, "Dynax", "Mahjong Derringer (Japan)", 0 ) -GAME( 1989, daisyari, 0, daisyari, daisyari, royalmah_prgbank_state, init_daisyari, ROT0, "Best System", "Daisyarin [BET] (Japan)", 0 ) -GAME( 1990, mjifb, 0, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...? [BET]", 0 ) -GAME( 1990, mjifb2, mjifb, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...? [BET](2921)", 0 ) -GAME( 1990, mjifb3, mjifb, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...? [BET](2931)", 0 ) +GAME( 1989, daisyari, 0, daisyari, daisyari, royalmah_prgbank_state, init_daisyari, ROT0, "Best System", "Daisyarin (Japan)", 0 ) +GAME( 1990, mjifb, 0, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...?", 0 ) +GAME( 1990, mjifb2, mjifb, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...? (2921)", 0 ) +GAME( 1990, mjifb3, mjifb, mjifb, mjifb, royalmah_prgbank_state, init_mjifb, ROT0, "Dynax", "Mahjong If...? (2931)", 0 ) GAME( 1991, mjvegasa, 0, mjvegasa, mjvegasa, royalmah_prgbank_state, init_mjvegasa, ROT0, "Dynax", "Mahjong Vegas (Japan, unprotected)", 0 ) GAME( 1991, mjvegas, mjvegasa, mjvegas, mjvegasa, royalmah_prgbank_state, init_mjvegas, ROT0, "Dynax", "Mahjong Vegas (Japan)", 0 ) GAME( 1992, cafetime, 0, cafetime, cafetime, royalmah_prgbank_state, init_cafetime, ROT0, "Dynax", "Mahjong Cafe Time", 0 ) diff -Nru mame-0.263+dfsg.1/src/mame/edevices/mugsmash.cpp mame-0.264+dfsg.1/src/mame/edevices/mugsmash.cpp --- mame-0.263+dfsg.1/src/mame/edevices/mugsmash.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/edevices/mugsmash.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,6 @@ }; -// video - void mugsmash_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) { // Each Sprite takes 16 bytes, 5 used? @@ -231,8 +229,6 @@ } -// machine - void mugsmash_state::reg2_w(offs_t offset, uint16_t data) { m_regs[1][offset] = data; diff -Nru mame-0.263+dfsg.1/src/mame/excellent/aquarium.cpp mame-0.264+dfsg.1/src/mame/excellent/aquarium.cpp --- mame-0.263+dfsg.1/src/mame/excellent/aquarium.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/excellent/aquarium.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -156,8 +156,6 @@ }; -// video - // TXT Layer TILE_GET_INFO_MEMBER(aquarium_state::get_txt_tile_info) { @@ -253,8 +251,6 @@ } -// machine - void aquarium_state::watchdog_w(u8 data) { m_watchdog->write_line_ck(BIT(data, 7)); diff -Nru mame-0.263+dfsg.1/src/mame/excellent/gcpinbal.cpp mame-0.264+dfsg.1/src/mame/excellent/gcpinbal.cpp --- mame-0.263+dfsg.1/src/mame/excellent/gcpinbal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/excellent/gcpinbal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -186,8 +186,6 @@ }; -// video - /*******************************************************************/ @@ -334,8 +332,6 @@ } -// machine - /*********************************************************** INTERRUPTS ***********************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/exidy/exidyttl.cpp mame-0.264+dfsg.1/src/mame/exidy/exidyttl.cpp --- mame-0.263+dfsg.1/src/mame/exidy/exidyttl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/exidy/exidyttl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -55,20 +55,11 @@ } void attack(machine_config &config); - void deathrac(machine_config &config); - void destdrby(machine_config &config); private: // devices required_device m_maincpu; required_device m_video; - - // driver_device overrides - virtual void machine_start() override; - virtual void machine_reset() override; - - virtual void video_start() override; - }; @@ -86,20 +77,6 @@ } - -void exidyttl_state::machine_start() -{ -} - -void exidyttl_state::machine_reset() -{ -} - - -void exidyttl_state::video_start() -{ -} - void exidyttl_state::attack(machine_config &config) { /* basic machine hardware */ @@ -115,25 +92,6 @@ m_video->set_threshold(0.30); } -void exidyttl_state::destdrby(machine_config &config) -{ - /* basic machine hardware */ - NETLIST_CPU(config, m_maincpu, netlist::config::DEFAULT_CLOCK()).set_source(netlist_attack); - - /* video hardware */ - SCREEN(config, "screen", SCREEN_TYPE_RASTER); - FIXFREQ(config, m_video).set_screen("screen"); - m_video->set_monitor_clock(MASTER_CLOCK); - m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL); - m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL); - m_video->set_fieldcount(1); - m_video->set_threshold(0.30); -} - -void exidyttl_state::deathrac(machine_config& config) -{ - destdrby(config); -} /*************************************************************************** @@ -154,7 +112,7 @@ ROM_LOAD( "attack.k6", 0x0000, 0x0100, CRC(e120839f) SHA1(74dc19a732238d35e467d814ead581a60463aaa2) ) ROM_END -ROM_START( attckexd2 ) // These are likely an overdump, but we are waiting for confirmation before removing the files +ROM_START( attckexd2 ) // These are likely an overdump, but confirmation is needed before removing the files ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) ROM_REGION( 0x0400, "roms", ROMREGION_ERASE00 ) @@ -254,24 +212,24 @@ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) ROM_REGION( 0x0400, "roms", ROMREGION_ERASE00 ) - ROM_LOAD( "6331-31.a11", 0x0000, 0x0020, CRC(f304a1fb) SHA1(0f029274bb99723ebcc271d761e1500ca50b2738) ) - ROM_LOAD( "6331-32.c12", 0x0000, 0x0020, CRC(f8dbd779) SHA1(55bdaf9eb1ba6185e20512c4874ebb625861508e) ) - ROM_LOAD( "6331-33.p14", 0x0000, 0x0020, CRC(2e83bf80) SHA1(02fcc1e879c06759a21ef4f004fe7aa790814112) ) + ROM_LOAD( "6331-31.11a", 0x0000, 0x0020, CRC(f304a1fb) SHA1(0f029274bb99723ebcc271d761e1500ca50b2738) ) + ROM_LOAD( "6331-32.12c", 0x0000, 0x0020, CRC(f8dbd779) SHA1(55bdaf9eb1ba6185e20512c4874ebb625861508e) ) + ROM_LOAD( "6331-33.14p", 0x0000, 0x0020, CRC(2e83bf80) SHA1(02fcc1e879c06759a21ef4f004fe7aa790814112) ) // Note: Image for 36 has all zeros in the second half, which is unused. This is verified correct from a real board. - // Other roms in this series (34,35) all have duplicate content in the second half - ROM_LOAD( "6331-36.e7", 0x0000, 0x0020, CRC(bb743b79) SHA1(8eb73782bcea7dbba7b75db32307e562248691bb) ) - ROM_LOAD( "6331-35.g7", 0x0000, 0x0020, CRC(5ed8cdd2) SHA1(d193d819ad634c43d648ce49073799b4df6dfd2f) ) - ROM_LOAD( "6331-36.r7", 0x0000, 0x0020, CRC(bb743b79) SHA1(8eb73782bcea7dbba7b75db32307e562248691bb) ) - ROM_LOAD( "6331-35.t7", 0x0000, 0x0020, CRC(5ed8cdd2) SHA1(d193d819ad634c43d648ce49073799b4df6dfd2f) ) - - ROM_LOAD( "6301-91.j10", 0x0000, 0x0100, CRC(c3823f0b) SHA1(42fe8c1e0f54b3f968a630dd564a8941410c5d86) ) - ROM_LOAD( "6301-91.v10", 0x0000, 0x0100, CRC(c3823f0b) SHA1(42fe8c1e0f54b3f968a630dd564a8941410c5d86) ) - ROM_LOAD( "6301-92.j5", 0x0000, 0x0100, CRC(82d7d25f) SHA1(d4b3a6655f91647545d493c2ff996daa66df0395) ) - ROM_LOAD( "6301-92.v5", 0x0000, 0x0100, CRC(82d7d25f) SHA1(d4b3a6655f91647545d493c2ff996daa66df0395) ) - ROM_LOAD( "6301-97.m11", 0x0000, 0x0100, CRC(2b02444f) SHA1(e1fc01f7271109515438542a223efc0042f794a5) ) - ROM_LOAD( "6301-98.l11", 0x0000, 0x0100, CRC(0bdaf1eb) SHA1(67976e73bfdc4d42a520212d020dd52d51667674) ) - ROM_LOAD( "6301-99.k11", 0x0000, 0x0100, CRC(34763c8f) SHA1(2012ace666e8b82a89a0c15511ee80173d9700bc) ) - ROM_LOAD( "6301-100.j11", 0x0000, 0x0100, CRC(d751bd57) SHA1(a6208af40661bf3cd50363d2ece38cd3b9f6a7a0) ) + // Other ROMs in this series (34,35) all have duplicate content in the second half + ROM_LOAD( "6331-36.7e", 0x0000, 0x0020, CRC(bb743b79) SHA1(8eb73782bcea7dbba7b75db32307e562248691bb) ) + ROM_LOAD( "6331-35.7g", 0x0000, 0x0020, CRC(5ed8cdd2) SHA1(d193d819ad634c43d648ce49073799b4df6dfd2f) ) + ROM_LOAD( "6331-36.7r", 0x0000, 0x0020, CRC(bb743b79) SHA1(8eb73782bcea7dbba7b75db32307e562248691bb) ) + ROM_LOAD( "6331-35.7t", 0x0000, 0x0020, CRC(5ed8cdd2) SHA1(d193d819ad634c43d648ce49073799b4df6dfd2f) ) + + ROM_LOAD( "6301-91.10j", 0x0000, 0x0100, CRC(c3823f0b) SHA1(42fe8c1e0f54b3f968a630dd564a8941410c5d86) ) + ROM_LOAD( "6301-91.10v", 0x0000, 0x0100, CRC(c3823f0b) SHA1(42fe8c1e0f54b3f968a630dd564a8941410c5d86) ) + ROM_LOAD( "6301-92.5j", 0x0000, 0x0100, CRC(82d7d25f) SHA1(d4b3a6655f91647545d493c2ff996daa66df0395) ) + ROM_LOAD( "6301-92.5v", 0x0000, 0x0100, CRC(82d7d25f) SHA1(d4b3a6655f91647545d493c2ff996daa66df0395) ) + ROM_LOAD( "6301-97.11m", 0x0000, 0x0100, CRC(2b02444f) SHA1(e1fc01f7271109515438542a223efc0042f794a5) ) + ROM_LOAD( "6301-98.11l", 0x0000, 0x0100, CRC(0bdaf1eb) SHA1(67976e73bfdc4d42a520212d020dd52d51667674) ) + ROM_LOAD( "6301-99.11k", 0x0000, 0x0100, CRC(34763c8f) SHA1(2012ace666e8b82a89a0c15511ee80173d9700bc) ) + ROM_LOAD( "6301-100.11j", 0x0000, 0x0100, CRC(d751bd57) SHA1(a6208af40661bf3cd50363d2ece38cd3b9f6a7a0) ) ROM_END #define rom_rhunting rom_deathrac @@ -279,8 +237,8 @@ } // anonymous namespace -GAME( 1977, attckexd, 0, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Attack (set 1) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, attckexd2, attckexd, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Attack (set 2) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, deathrac, 0, deathrac, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Death Race [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, destdrby, 0, destdrby, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Destruction Derby [TTL]", MACHINE_IS_SKELETON) -GAME( 1976, rhunting, deathrac, deathrac, 0, exidyttl_state, empty_init, ROT0, "bootleg", "Robot Hunting (bootleg of Death Race) [TTL]",MACHINE_IS_SKELETON ) +GAME( 1977, attckexd, 0, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Attack (set 1)", MACHINE_IS_SKELETON ) +GAME( 1977, attckexd2, attckexd, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Attack (set 2)", MACHINE_IS_SKELETON ) +GAME( 1976, deathrac, 0, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Death Race", MACHINE_IS_SKELETON ) +GAME( 1976, destdrby, 0, attack, 0, exidyttl_state, empty_init, ROT0, "Exidy", "Destruction Derby", MACHINE_IS_SKELETON) +GAME( 1976, rhunting, deathrac, attack, 0, exidyttl_state, empty_init, ROT0, "bootleg", "Robot Hunting (bootleg of Death Race)",MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/f32/crospang.cpp mame-0.264+dfsg.1/src/mame/f32/crospang.cpp --- mame-0.263+dfsg.1/src/mame/f32/crospang.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/f32/crospang.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -124,8 +124,6 @@ }; -// video - void crospang_state::tilebank_select_w(u16 data) { LOGTILEBANK("tilebank_select_w %04x\n", data); @@ -252,8 +250,6 @@ } -// machine - // main COU void crospang_state::base_map(address_map &map) diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/as12.cpp mame-0.264+dfsg.1/src/mame/fidelity/as12.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/as12.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/as12.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,7 +77,7 @@ // devices/pointers required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u16 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/bridgeb.cpp mame-0.264+dfsg.1/src/mame/fidelity/bridgeb.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/bridgeb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/bridgeb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -62,7 +62,7 @@ required_device m_z80pio; required_device_array m_dl1414; required_device m_led_pwm; - required_device m_dac; + required_device m_dac; required_ioport_array<8> m_inputs; output_finder<12> m_digits; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/card.cpp mame-0.264+dfsg.1/src/mame/fidelity/card.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/card.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/card.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -225,7 +225,7 @@ required_device m_i8243; required_device m_display; optional_device m_speech; - optional_device m_dac; + optional_device m_dac; required_ioport_array<8> m_inputs; u32 m_barcode = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/cc1.cpp mame-0.264+dfsg.1/src/mame/fidelity/cc1.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/cc1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/cc1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -243,7 +243,7 @@ PORT_INCLUDE( cc3 ) PORT_MODIFY("IN.1") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM / PB") PORT_CODE(KEYCODE_M) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM / PB") PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_P) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/cc10.cpp mame-0.264+dfsg.1/src/mame/fidelity/cc10.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/cc10.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/cc10.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -236,7 +236,7 @@ PORT_START("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/cc7.cpp mame-0.264+dfsg.1/src/mame/fidelity/cc7.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/cc7.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/cc7.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,7 +83,7 @@ // devices/pointers required_device m_maincpu; required_device m_display; - optional_device m_dac; + optional_device m_dac; required_ioport_array<4> m_inputs; u8 m_inp_mux = 0; @@ -174,12 +174,12 @@ PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_X) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F) @@ -205,14 +205,14 @@ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("GM") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("GM") PORT_CODE(KEYCODE_G) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_START("IN.3") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/chesster.cpp mame-0.264+dfsg.1/src/mame/fidelity/chesster.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/chesster.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/chesster.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ 8*(8+1) buttons, 8+8+1 LEDs 8KB RAM(UM6264-12), 32KB ROM(M27C256B) Ricoh RP65C02G CPU, 5MHz XTAL -8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label) +8-bit DAC (8L513 02 resistor array) timed via IRQ, 128KB ROM(AMI custom label) PCB label 510.1141C01 I/O is via TTL, memory map is similar to Designer Display @@ -51,17 +51,16 @@ m_rombank(*this, "rombank"), m_board(*this, "board"), m_display(*this, "display"), + m_dac(*this, "dac"), m_inputs(*this, "IN.0") { } - // machine configs void chesster(machine_config &config); void kishon(machine_config &config); - void init_chesster(); - protected: virtual void machine_start() override; + virtual void machine_reset() override; private: // devices/pointers @@ -69,13 +68,13 @@ required_memory_bank m_rombank; required_device m_board; required_device m_display; + required_device m_dac; required_ioport m_inputs; int m_numbanks = 0; u8 m_speech_bank = 0; u8 m_select = 0; - // address maps void main_map(address_map &map); // I/O handlers @@ -83,19 +82,22 @@ u8 input_r(offs_t offset); }; -void chesster_state::init_chesster() +void chesster_state::machine_start() { + // set up ROM banks (kishon's is 4 times larger) m_numbanks = memregion("rombank")->bytes() / 0x4000; m_rombank->configure_entries(0, m_numbanks, memregion("rombank")->base(), 0x4000); -} -void chesster_state::machine_start() -{ // register for savestates save_item(NAME(m_speech_bank)); save_item(NAME(m_select)); } +void chesster_state::machine_reset() +{ + m_dac->write(0x80); +} + /******************************************************************************* @@ -149,8 +151,8 @@ { map(0x0000, 0x1fff).ram(); map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(chesster_state::input_r), FUNC(chesster_state::control_w)); - map(0x4000, 0x7fff).bankr("rombank"); - map(0x6000, 0x6000).mirror(0x1fff).w("dac", FUNC(dac_byte_interface::data_w)); + map(0x4000, 0x7fff).bankr(m_rombank); + map(0x6000, 0x6000).mirror(0x1fff).w(m_dac, FUNC(dac_8bit_r2r_device::data_w)); map(0x8000, 0xffff).rom(); } @@ -198,7 +200,7 @@ // sound hardware SPEAKER(config, "speaker").front_center(); - DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2 + DAC_8BIT_R2R(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.5); } void chesster_state::kishon(machine_config &config) @@ -220,7 +222,7 @@ ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker ROM_REGION( 0x20000, "rombank", 0 ) - ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent + ROM_LOAD("101-1091b02.ic10", 0x00000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent ROM_END ROM_START( chesstera ) // model 6120, PCB label 510.1141C01 @@ -228,7 +230,7 @@ ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label ROM_REGION( 0x20000, "rombank", 0 ) - ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent + ROM_LOAD("101-1091a02.ic10", 0x00000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent ROM_END ROM_START( kishon ) // model 6120G or 6127(same), PCB label 510.1141C01 @@ -236,7 +238,7 @@ ROM_LOAD("gc_2.3.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256, GC 2.3 on sticker, also seen without label ROM_REGION( 0x80000, "rombank", 0 ) - ROM_LOAD("kishon_chesster_v2.6.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, 1-14-91, aka 101-1094A01 on 6127 + ROM_LOAD("kishon_chesster_v2.6.ic10", 0x00000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, 1-14-91, aka 101-1094A01 on 6127 ROM_END ROM_START( kishona ) // possibly Mephisto brand?, PCB label 510.1141C01 @@ -244,7 +246,7 @@ ROM_LOAD("german_chesster_v2.2.ic9", 0x8000, 0x8000, CRC(43e0cfcd) SHA1(961c7335f562b19fa96324c429ab70e8ab4d7647) ) // 27C256, 15.1.91 ROM_REGION( 0x80000, "rombank", 0 ) - ROM_LOAD("kishon_chesster_v2.6.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12 + ROM_LOAD("kishon_chesster_v2.6.ic10", 0x00000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12 ROM_END } // anonymous namespace @@ -255,8 +257,8 @@ Drivers *******************************************************************************/ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (v1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster (v2.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, kishona, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster (v2.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1990, chesster, 0, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger (v1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, empty_init, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, kishona, chesster, 0, kishon, chesster, chesster_state, empty_init, "Fidelity Electronics", "Kishon Chesster (v2.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/csc.cpp mame-0.264+dfsg.1/src/mame/fidelity/csc.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/csc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/csc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -227,8 +227,6 @@ namespace { -// CSC / shared - class csc_state : public driver_device { public: @@ -263,7 +261,7 @@ optional_device_array m_pia; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; optional_device m_speech; optional_region_ptr m_speech_rom; optional_region_ptr m_language; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/dames.cpp mame-0.264+dfsg.1/src/mame/fidelity/dames.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/dames.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/dames.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -60,7 +60,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/desdis.cpp mame-0.264+dfsg.1/src/mame/fidelity/desdis.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/desdis.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/desdis.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,7 +85,7 @@ optional_memory_bank m_rombank; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_select = 0; @@ -113,6 +113,7 @@ save_item(NAME(m_lcd_data)); } + // Designer Master class desmas_state : public desdis_state @@ -231,7 +232,7 @@ { map(0x0000, 0x1fff).ram(); map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w)); - map(0x4000, 0x7fff).bankr("rombank"); + map(0x4000, 0x7fff).bankr(m_rombank); map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w)); map(0x8000, 0xffff).rom(); } diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/eag68k.cpp mame-0.264+dfsg.1/src/mame/fidelity/eag68k.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/eag68k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/eag68k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -270,7 +270,7 @@ optional_device m_usart; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; optional_ioport_array<3> m_inputs; u8 m_select = 0; @@ -305,6 +305,7 @@ update_dsr(); } + // EAG V5 class eagv5_state : public eag_state @@ -336,6 +337,7 @@ u8 sub_ack_r(); }; + // Elite Premiere class premiere_state : public eag_state @@ -384,6 +386,7 @@ m_nvrambank->set_entry(bank); } + // Excel 68000 class excel68k_state : public eag_state diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/eldorado.cpp mame-0.264+dfsg.1/src/mame/fidelity/eldorado.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/eldorado.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/eldorado.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,7 +53,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; bool m_kp_select = false; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/elite.cpp mame-0.264+dfsg.1/src/mame/fidelity/elite.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/elite.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/elite.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -130,7 +130,7 @@ optional_memory_bank m_rombank; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_device m_speech; required_region_ptr m_speech_rom; required_region_ptr m_language; @@ -175,6 +175,7 @@ m_maincpu->set_unscaled_clock(xtal[newval % 3]); } + // EAG class eag_state : public elite_state @@ -370,7 +371,7 @@ void eag_state::eag2100_map(address_map &map) { eag_map(map); - map(0xa000, 0xbfff).bankr("rombank"); + map(0xa000, 0xbfff).bankr(m_rombank); } diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/excel.cpp mame-0.264+dfsg.1/src/mame/fidelity/excel.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/excel.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/excel.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -187,7 +187,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; optional_device m_speech; optional_region_ptr m_speech_rom; optional_ioport_array<3> m_inputs; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/msc.cpp mame-0.264+dfsg.1/src/mame/fidelity/msc.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/msc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/msc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,7 +65,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_led_select = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/phantom.cpp mame-0.264+dfsg.1/src/mame/fidelity/phantom.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/phantom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/phantom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,6 +10,15 @@ the outside. After Fidelity was taken over by H+G, it was rereleased in 1990 as the Mephisto Phantom. This is assumed to be identical. +At boot-up, the computer will do a self-test, the user can start playing after the +motor has moved to the upper-right corner. The computer will continue positioning +pieces though, so it may be a bit distracting. Or, just hold INSERT (on PC) for a +while to speed up MAME before starting a new game. + +After the user captures a piece, select the captured piece from the MAME sensorboard +spawn block and place it anywhere on a free spot at the designated box at the +edge of the chessboard. + Hardware notes: - PCB label 510.1128A01 - R65C02P4, XTAL marked 4.915200 @@ -24,18 +33,8 @@ Model 6126 has a dedicated PCB, this version also has a motion sensor at the front and 2 leds to mimic eyes, and the housing color theme is green instead of beige. -At boot-up, the computer will do a self-test, the user can start playing after the -motor has moved to the upper-right corner. The computer will continue positioning -pieces though, so it may be a bit distracting. Or, just hold INSERT (on PC) for a -while to speed up MAME before starting a new game. - -After the user captures a piece, select the captured piece from the MAME sensorboard -spawn block and place it anywhere on a free spot at the designated box at the -edge of the chessboard. - TODO: - sensorboard undo buffer goes out of control, probably not worth solving this issue -- cphantom artwork should be green instead of beige BTANB: - cphantom: As the manual suggests, the computer's move should be displayed on the @@ -90,7 +89,7 @@ // devices/pointers required_device m_maincpu; required_memory_bank m_rombank; - optional_device m_dac; + optional_device m_dac; required_device m_board; required_device m_display; optional_ioport_array<2> m_inputs; @@ -175,6 +174,7 @@ m_rombank->configure_entries(0, numbanks, memregion("rombank")->base(), 0x4000); } + // Chesster Phantom class chessterp_state : public phantom_state @@ -182,6 +182,7 @@ public: chessterp_state(const machine_config &mconfig, device_type type, const char *tag) : phantom_state(mconfig, type, tag), + m_speech(*this, "speech"), m_eye_led(*this, "eye_led") { } @@ -189,8 +190,10 @@ protected: virtual void machine_start() override; + virtual void machine_reset() override; private: + required_device m_speech; output_finder<> m_eye_led; virtual void main_map(address_map &map) override; @@ -210,6 +213,12 @@ save_item(NAME(m_select2)); } +void chessterp_state::machine_reset() +{ + phantom_state::machine_reset(); + m_speech->write(0x80); +} + TIMER_DEVICE_CALLBACK_MEMBER(chessterp_state::nmi_timer) { m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); @@ -531,14 +540,14 @@ map(0x2500, 0x2500).mirror(0x00ff).r(FUNC(phantom_state::hmotor_ff_clear_r)); map(0x2600, 0x2600).mirror(0x00ff).r(FUNC(phantom_state::vmotor_ff_clear_r)); map(0x2700, 0x2700).mirror(0x00ff).r(FUNC(phantom_state::irq_ack_r)); - map(0x4000, 0x7fff).bankr("rombank"); + map(0x4000, 0x7fff).bankr(m_rombank); map(0x8000, 0xffff).rom(); } void chessterp_state::main_map(address_map &map) { phantom_state::main_map(map); - map(0x2300, 0x2300).mirror(0x00ff).w("speech", FUNC(dac_byte_interface::data_w)); + map(0x2300, 0x2300).mirror(0x00ff).w(m_speech, FUNC(dac_8bit_r2r_device::data_w)); } @@ -625,7 +634,7 @@ // sound hardware config.device_remove("dac"); - DAC_8BIT_R2R(config, "speech").add_route(ALL_OUTPUTS, "speaker", 0.5); + DAC_8BIT_R2R(config, m_speech).add_route(ALL_OUTPUTS, "speaker", 0.5); } diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/sc12.cpp mame-0.264+dfsg.1/src/mame/fidelity/sc12.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/sc12.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/sc12.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,7 +98,7 @@ // devices/pointers required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/sc6.cpp mame-0.264+dfsg.1/src/mame/fidelity/sc6.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/sc6.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/sc6.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,7 +119,7 @@ required_region_ptr m_rom; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; optional_device m_cart; required_ioport m_inputs; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/sc8.cpp mame-0.264+dfsg.1/src/mame/fidelity/sc8.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/sc8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/sc8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -60,7 +60,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/sc9.cpp mame-0.264+dfsg.1/src/mame/fidelity/sc9.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/sc9.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/sc9.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -64,8 +64,6 @@ namespace { -// SC9 / shared - class sc9_state : public driver_device { public: @@ -93,7 +91,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/fidelity/vcc.cpp mame-0.264+dfsg.1/src/mame/fidelity/vcc.cpp --- mame-0.263+dfsg.1/src/mame/fidelity/vcc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/fidelity/vcc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -302,7 +302,7 @@ PORT_START("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G) diff -Nru mame-0.263+dfsg.1/src/mame/funworld/photoply.cpp mame-0.264+dfsg.1/src/mame/funworld/photoply.cpp --- mame-0.263+dfsg.1/src/mame/funworld/photoply.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/funworld/photoply.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,21 +1,21 @@ // license:BSD-3-Clause -// copyright-holders:Angelo Salese -/******************************************************************************************************* +// copyright-holders: Angelo Salese +/************************************************************************************************** -Photo Play (c) 199? Funworld +Photo Play (c) 1998? Funworld -TODO (old notes, to be resorted with new PCI conversion): -- BIOS CMOS doesn't save at all (needed for setting up the Hard Disk); -- DISK BOOT FAILURE after EEPROM checking (many unknown IDE cs1 reads/writes); -- Partition boot sector is missing from the CHD dump, protection? -- Detects CPU type as "-S 16 MHz"? Sometimes it detects it as 486SX, unknown repro - (after fiddling with CMOS settings anyway) -- VGA BIOS reports being a Cirrus Logic GD5436 / 5446, it is unknown what exactly this game uses. -- PCI hookups (SiS496/SiS497 according to POST), and improve/device-ify SiS85C49x; -- ISA bus cards are completely guessworked; +TODO: +- Implement microtouch as RS232 option; +- Reimplement Combo ISA card; - EEPROM timings are hacked (writes mostly fail otherwise); -- Eventually needs AudioDrive ES688 / ES1688 / ES1788 & ES1868 devices and serial ports "for linking" - before actually booting; +- AudioDrive ES688 / ES1688 / ES1788 & ES1868; +- photoply99nl: "Druk op het snijpunt van beide lijnen" -> "Press the intersection of both lines" + on Touch Screen calibration screen, except there aren't any on screen, gd5446 bug? +- 100 MHz gets detected as 66 by BIOS; +- Flush non-default scores/settings in dumps (cfr. photoply2ksp hi-scores, photoply2k4 that starts +up with 17 credits in) + +=================================================================================================== INFO ABOUT SECURITY DONGLES: @@ -57,26 +57,27 @@ #include "emu.h" -#include "pcshare.h" - +#include "bus/isa/isa_cards.h" +#include "bus/pci/pci_slot.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/sun_kbd.h" +#include "bus/rs232/terminal.h" #include "cpu/i386/i386.h" -#include "machine/eepromser.h" -#include "machine/lpci.h" -#include "machine/pckeybrd.h" -#include "machine/idectrl.h" -#include "video/pc_vga_cirrus.h" +#include "machine/pci.h" +#include "machine/sis85c496.h" +#include "machine/w83787f.h" namespace { -class photoply_state : public pcat_base_state +class photoply_state : public driver_device { public: - photoply_state(const machine_config &mconfig, device_type type, const char *tag) : - pcat_base_state(mconfig, type, tag), - m_eeprom(*this, "eeprom"), - m_main_bios(*this, "bios"), - m_video_bios(*this, "video_bios"), - m_ex_bios(*this, "ex_bios") + photoply_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") +// , m_eeprom(*this, "eeprom") { } @@ -84,95 +85,20 @@ void photoply_dx4_100(machine_config &config); private: - required_device m_eeprom; - - required_region_ptr m_main_bios; - required_region_ptr m_video_bios; - required_region_ptr m_ex_bios; - - std::unique_ptr m_shadow_ram; - - uint8_t bios_r(offs_t offset); - void bios_w(offs_t offset, uint8_t data); - void eeprom_w(uint8_t data); + required_device m_maincpu; +// required_device m_eeprom; - uint16_t m_pci_shadow_reg = 0; +// uint8_t bios_r(offs_t offset); +// void bios_w(offs_t offset, uint8_t data); +// void eeprom_w(uint8_t data); - void photoply_io(address_map &map); - void photoply_map(address_map &map); + static void winbond_superio_config(device_t *device); - virtual void machine_start() override; - virtual void machine_reset() override; - - uint32_t sis_pcm_r(int function, int reg, uint32_t mem_mask); - void sis_pcm_w(int function, int reg, uint32_t data, uint32_t mem_mask); + void main_io(address_map &map); + void main_map(address_map &map); }; -// regs 0x00-0x3f both devices below -// regs 0x40-0x7f SiS85C496 PCI & CPU Memory Controller (PCM) -// regs 0x80-0xff SiS85C497 AT Bus Controller & Megacell (ATM) -uint32_t photoply_state::sis_pcm_r(int function, int reg, uint32_t mem_mask) -{ - uint32_t r = 0; - - //printf("PCM %02x %08x\n",reg,mem_mask); - if(reg == 0) - { - // Device ID / Vendor ID - return 0x04961039; - } - - if(reg == 8) - { - // Device Class Code / Device Revision Identification - return 0x06000002; - } - - // Device Header Type - if(reg == 0xc) - return 0; - - if(reg == 0x44) - { - - if(ACCESSING_BITS_8_15) // reg 0x45 - r |= (m_pci_shadow_reg & 0xff00); - if(ACCESSING_BITS_0_7) // reg 0x44 - r |= (m_pci_shadow_reg & 0x00ff); - } - return r; -} - -void photoply_state::sis_pcm_w(int function, int reg, uint32_t data, uint32_t mem_mask) -{ - if(reg == 0x44) - { - - /* - * reg 0x45 - * shadow RAM control - * xxxx ---- - * ---- x--- Internal Cache Cacheable Area Control - * ---- -x-- PCI,ISA Master Access Shadow RAM Area Enable - * ---- --x- Shadow RAM Read Control (1=Enable) - * ---- ---x Shadow RAM Write Control (0=Enable) - */ - if(ACCESSING_BITS_8_15) - m_pci_shadow_reg = (data & 0xff00) | (m_pci_shadow_reg & 0x00ff); - - /* - * shadow RAM enable: - * bit 7: 0xf8000-0xfffff shadow RAM enable - * ... - * bit 0: 0xc0000-0xc7fff shadow RAM enable - */ - if(ACCESSING_BITS_0_7) // reg 0x44 - m_pci_shadow_reg = (data & 0x00ff) | (m_pci_shadow_reg & 0xff00); - - //printf("%04x\n",m_pci_shadow_reg); - } -} - +#if 0 uint8_t photoply_state::bios_r(offs_t offset) { uint8_t bit_mask = (offset & 0x38000) >> 15; @@ -208,19 +134,6 @@ return m_main_bios[offset & 0x1ffff]; } -void photoply_state::bios_w(offs_t offset, uint8_t data) -{ -// return m_bios[offset]; - - if((m_pci_shadow_reg & 0x100) == 0) - { - uint8_t bit_mask = (offset & 0x38000) >> 15; - - if(m_pci_shadow_reg & (1 << bit_mask)) - m_shadow_ram[offset] = data; - } -} - void photoply_state::eeprom_w(uint8_t data) { //logerror("Writing %X to EEPROM output port\n", data); @@ -231,126 +144,116 @@ // Bits 2-3 also seem to be used to bank something else. // Bits 4-7 are set for some writes, but may do nothing? } +#endif -void photoply_state::photoply_map(address_map &map) +void photoply_state::main_map(address_map &map) { - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(cirrus_gd5446_device::mem_r), FUNC(cirrus_gd5446_device::mem_w)); -// map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); -// map(0x000c8000, 0x000cffff).rom().region("ex_bios", 0); - map(0x000c0000, 0x000fffff).rw(FUNC(photoply_state::bios_r), FUNC(photoply_state::bios_w)); - map(0x00100000, 0x07ffffff).ram(); // 64MB RAM, guess! - map(0xfffe0000, 0xffffffff).lr8([this] (offs_t offset) { return m_main_bios[offset]; }, "bios_upper_r"); + map.unmap_value_high(); +// map(0x000c0000, 0x000fffff).rw(FUNC(photoply_state::bios_r), FUNC(photoply_state::bios_w)); } -void photoply_state::photoply_io(address_map &map) +void photoply_state::main_io(address_map &map) { - pcat32_io_common(map); - map(0x00e8, 0x00eb).noprw(); - - map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x0202, 0x0202).w(FUNC(photoply_state::eeprom_w)); -// map(0x0278, 0x027f).ram(); //parallel port 2 - map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); -// map(0x0378, 0x037f).ram(); //parallel port - map(0x03b0, 0x03df).m("vga", FUNC(cirrus_gd5446_device::io_map)); - - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); - - map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); - + map.unmap_value_high(); +// map(0x0202, 0x0202).w(FUNC(photoply_state::eeprom_w)); } static INPUT_PORTS_START( photoply ) INPUT_PORTS_END -void photoply_state::machine_start() -{ - m_shadow_ram = std::make_unique(0x40000); - save_pointer(NAME(m_shadow_ram), 0x40000); -} - -void photoply_state::machine_reset() +static void isa_com(device_slot_interface &device) { - m_pci_shadow_reg = 0; + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); +} + +static void isa_internal_devices(device_slot_interface &device) +{ + device.option_add("w83787f", W83787F); +} + +void photoply_state::winbond_superio_config(device_t *device) +{ + w83787f_device &fdc = *downcast(device); +// fdc.set_sysopt_pin(1); +// fdc.gp20_reset().set_inputline(":maincpu", INPUT_LINE_RESET); +// fdc.gp25_gatea20().set_inputline(":maincpu", INPUT_LINE_A20); + fdc.irq1().set(":pci:05.0", FUNC(sis85c496_host_device::pc_irq1_w)); + fdc.irq8().set(":pci:05.0", FUNC(sis85c496_host_device::pc_irq8n_w)); + fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); + fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); + fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); + fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); + fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); + fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); } -static const gfx_layout CGA_charlayout = -{ - 8,8, - 256, - 1, - { 0 }, - { 0,1,2,3,4,5,6,7 }, - { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 }, - 8*8 -}; - -static GFXDECODE_START( gfx_photoply ) - GFXDECODE_ENTRY( "video_bios", 0x6000+0xa5*8+7, CGA_charlayout, 0, 256 ) - // There's also a 8x16 entry (just after the 8x8) -GFXDECODE_END - void photoply_state::photoply(machine_config &config) { - // Basic machine hardware - I486DX4(config, m_maincpu, 75000000); // I486DX4, 75 or 100 Mhz - m_maincpu->set_addrmap(AS_PROGRAM, &photoply_state::photoply_map); - m_maincpu->set_addrmap(AS_IO, &photoply_state::photoply_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - GFXDECODE(config, "gfxdecode", "vga", gfx_photoply); - - ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - ide_controller_32_device &ide2(IDE_CONTROLLER_32(config, "ide2").options(ata_devices, nullptr, nullptr, true)); - ide2.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir7_w)); - - pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); - pcibus.set_device(5, FUNC(photoply_state::sis_pcm_r), FUNC(photoply_state::sis_pcm_w)); - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480); - screen.set_screen_update("vga", FUNC(cirrus_gd5446_device::screen_update)); - - cirrus_gd5446_device &vga(CIRRUS_GD5446(config, "vga", 0)); - vga.set_screen("screen"); - vga.set_vram_size(0x200000); - - - EEPROM_93C46_16BIT(config, "eeprom") - .write_time(attotime::from_usec(1)) - .erase_all_time(attotime::from_usec(10)); + I486DX4(config, m_maincpu, 75'000'000); // I486DX4, 75 or 100 Mhz + m_maincpu->set_addrmap(AS_PROGRAM, &photoply_state::main_map); + m_maincpu->set_addrmap(AS_IO, &photoply_state::main_io); + m_maincpu->set_irq_acknowledge_callback("pci:05.0:pic8259_master", FUNC(pic8259_device::inta_cb)); + + PCI_ROOT(config, "pci", 0); + SIS85C496_HOST(config, "pci:05.0", 0, "maincpu", 32*1024*1024); + + ISA16_SLOT(config, "superio", 0, "pci:05.0:isabus", isa_internal_devices, "w83787f", true).set_option_machine_config("w83787f", winbond_superio_config); + ISA16_SLOT(config, "isa1", 0, "pci:05.0:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa2", 0, "pci:05.0:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "pci:05.0:isabus", pc_isa16_cards, nullptr, false); + + // TODO: convert to Microtouch + rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, "logitech_mouse")); + serport0.rxd_handler().set("superio:w83787f", FUNC(w83787f_device::rxd1_w)); + serport0.dcd_handler().set("superio:w83787f", FUNC(w83787f_device::ndcd1_w)); + serport0.dsr_handler().set("superio:w83787f", FUNC(w83787f_device::ndsr1_w)); + serport0.ri_handler().set("superio:w83787f", FUNC(w83787f_device::nri1_w)); + serport0.cts_handler().set("superio:w83787f", FUNC(w83787f_device::ncts1_w)); + + rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); + serport1.rxd_handler().set("superio:w83787f", FUNC(w83787f_device::rxd2_w)); + serport1.dcd_handler().set("superio:w83787f", FUNC(w83787f_device::ndcd2_w)); + serport1.dsr_handler().set("superio:w83787f", FUNC(w83787f_device::ndsr2_w)); + serport1.ri_handler().set("superio:w83787f", FUNC(w83787f_device::nri2_w)); + serport1.cts_handler().set("superio:w83787f", FUNC(w83787f_device::ncts2_w)); + + PCI_SLOT(config, "pci:1", pci_cards, 10, 0, 1, 2, 3, "gd5446"); + PCI_SLOT(config, "pci:2", pci_cards, 11, 1, 2, 3, 0, nullptr); + PCI_SLOT(config, "pci:3", pci_cards, 12, 2, 3, 0, 1, nullptr); + +// EEPROM_93C46_16BIT(config, "eeprom") +// .write_time(attotime::from_usec(1)) +// .erase_all_time(attotime::from_usec(10)); } // We asume that every Photo Play from 1999 onwards use a DX4 100MHz instead of a 75MHz one (both were compatible, the latter were recommended) void photoply_state::photoply_dx4_100(machine_config &config) { photoply(config); - m_maincpu->set_clock(100000000); // 100MHz + m_maincpu->set_clock(100'000'000); } ROM_START(photoply98sp) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010, Funworld sticker: Sept 1998 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip, Funworld sticker: Sept 1998 ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - ROM_REGION(0x10000, "hdd_fw", 0) // Hard disk firmware ROM_LOAD("m2_at29c512.bin", 0x0000, 0x10000, CRC(22a1c9ce) SHA1(6b695ee56867176d1702273e68b5584db1b94e02) ) // Seagate ST31722A // Seagate ST31722A // 3303 CYL 1704MB 16 HEADS 63 SECTORS // Funworld label: Feb 1998 - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay98sp", 0, BAD_DUMP SHA1(c0d7964edaff6b99184ca64e76c41eaa07abe019) ) // From an operated HDD. A clean one must be recreated from the CDs ROM_END @@ -361,7 +264,7 @@ Winbond W83787IF (near Xtal 24.00 MHz) 3 x ISA + 2 x PCI */ ROM_START(photoply99sp) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT29C010A /* Multifunction board with a ESS AudioDrive chip ISA Sound + I/O (PP2000/CI-8000) @@ -378,10 +281,8 @@ ROM_LOAD("enhanced_bios_1.06.u13", 0x0000, 0x8000, CRC(d05e9d20) SHA1(854501b7b3bf988b10516109d058f7ca2aa07d3e) ) // Centos Combo I/O ROM BIOS for CI-8000/PP2000 v1.06, W27E257 /* Cirrus Logic PCI CL-GD5446-HC-A - 512MB RAM (2 x M5416258B-30J) + 512MB RAM (2 x M5416258B-30J) (??? -AS) Xtal 14.31818 MHz */ - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R /* The Photo Play 1999 parallel port dongle contains, under expoxy resin: -Atmel AT89C2051 MCU (2KBytes internal ROM) @@ -421,27 +322,24 @@ // Quantum Fireball EX3.2A // C/H/S: 3.2 - 6256/16/63 // Funworld label: 09.02.1999 - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay99sp", 0, BAD_DUMP SHA1(887e5b8c931d6122a1c3a8eda5cb919eb162eced) ) // From an operated HDD. A clean one must be recreated from the CDs ROM_END // BIOS not provided on this set ROM_START(photoply99nl) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT29C010A ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) ROM_LOAD("enhanced_bios_1.06.u13", 0x0000, 0x8000, CRC(d05e9d20) SHA1(854501b7b3bf988b10516109d058f7ca2aa07d3e) ) // Centos Combo I/O ROM BIOS for CI-8000/PP2000 v1.06, W27E257 - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay99nl", 0, BAD_DUMP SHA1(e3ff2a64f51e0ba07d08cd49cd56cdc866401b4f) ) // Recreated from the CDs using a VM ROM_END ROM_START(photoply2k) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787_alt.bin", 0x000000, 0x20000, CRC(e96d1bbc) SHA1(64d0726c4e9ecee8fddf4cc39d92aecaa8184d5c) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS (same string as 'photoply99sp' and 'photoply99sp' BIOSes, but different hash) ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip @@ -450,23 +348,17 @@ // ROM_RELOAD( 0x008000, 0x4000 ) // ROM_RELOAD( 0x00c000, 0x4000 ) - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.25.u2", 0x000000, 0x8000, CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a) ) // Cirrus Logic/Quadtel CL-GD5436/46 PCI VGA BIOS v1.25 - - DISK_REGION( "ide:0:hdd" ) - DISK_IMAGE( "pp201", 0, SHA1(23e1940d485d19401e7d0ad912ddad2cf2ea10b4) ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) + DISK_IMAGE( "pp201", 0, BAD_DUMP SHA1(23e1940d485d19401e7d0ad912ddad2cf2ea10b4) ) ROM_END ROM_START(photoply2ksp) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - /* The Photo Play 2000 parallel port dongle contains, under resin: Unknown MCU labeled "MARX(C)95,97 CBN/V/S" (UNDUMPED) 74HC00 */ @@ -475,44 +367,38 @@ // Western Digital PhD1000-00H // CHS: 2100,16,63 - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay2ksp", 0, BAD_DUMP SHA1(2b4b837d85bf8a41d832533afb9363fdb16f7a30) ) // From an operated HDD. A clean one must be recreated from the CDs ROM_END // BIOS not provided, might be different ROM_START(photoply2knl) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - /* The Photo Play 2000 parallel port dongle contains, under resin: Unknown MCU labeled "MARX(C)95,97 CBN/V/S" (UNDUMPED) 74HC00 */ ROM_REGION(0x800, "dongle", 0) ROM_LOAD("marx_cbn-v-s.bin", 0x000, 0x800, NO_DUMP ) // Size unknown - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay2knl", 0, BAD_DUMP SHA1(75aa190913e798d04db88325006c61965f5034ef) ) // Recreated from the CDs using a VM ROM_END // BIOS not provided, might be different ROM_START(photoply2k1it) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x000000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - - DISK_REGION( "ide:0:hdd" ) - DISK_IMAGE( "photoplay2k1it", 0, BAD_DUMP SHA1(274ea0ebc051d0f4846bc58a039d342241b4cc28) ) // Manually rebuilded by adding the resources for the folder C:\QP_MSTR from the 2001_NL version + DISK_REGION( "pci:05.0:ide1:0:hdd" ) + DISK_IMAGE( "photoplay2k1it", 0, BAD_DUMP SHA1(274ea0ebc051d0f4846bc58a039d342241b4cc28) ) // Manually rebuilt by adding the resources for the folder C:\QP_MSTR from the 2001_NL version // Recovery discs for Photo Play 2001 @@ -548,16 +434,13 @@ // BIOS not provided, might be different ROM_START(photoply2k1nl) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay2k1nl", 0, BAD_DUMP SHA1(87c9417119e9566f65db0f1b0f2182db7712c634) ) // Recreated from the CDs using a VM // Recovery discs for Photo Play 2001 @@ -594,37 +477,31 @@ // BIOS not provided, might be different ROM_START(photoply2k1mtnl) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay2k1mtnl", 0, BAD_DUMP SHA1(cfa25ce036be9c2379a104a3b50d2aefd851ceeb) ) // Recreated from the CDs using a VM ROM_END // BIOS not provided, might be different ROM_START(photoply2k2be) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT27C010 ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip ROM_LOAD("enhanced_bios_centos.bin", 0x0000, 0x8000, CRC(ee8ad003) SHA1(4814385117599a98da02155785d1e3fce4e485bd) ) // Centos CI-8000/PP2000 ROM BIOS Version 1.06, 27C256B - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x0000, 0x8000, CRC(61f8cac7) SHA1(6e54aadfe10dfa5c7e417a054e9a64499a99083c) ) // Cirrus Logic/Quadtel CL-GD5446 PCI VGA BIOS v1.31 , AT27C256R - - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) DISK_IMAGE( "photoplay2k2be", 0, BAD_DUMP SHA1(29719b5db60f4cc3787a3a9f6a5937226e282d46) ) // Recreated from the CDs using a VM ROM_END // BIOS not provided, might be different ROM_START(photoply2k4) - ROM_REGION(0x20000, "bios", 0) // Motherboard BIOS + ROM_REGION(0x20000, "pci:05.0", 0) // Motherboard BIOS ROM_LOAD("funworld_award_486e_w83787_alt.bin", 0x000000, 0x20000, BAD_DUMP CRC(e96d1bbc) SHA1(64d0726c4e9ecee8fddf4cc39d92aecaa8184d5c) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS (same string as 'photoply99sp' and 'photoply99sp' BIOSes, but different hash) ROM_REGION(0x8000, "ex_bios", ROMREGION_ERASE00 ) // Multifunction board with a ESS AudioDrive chip, M27128A @@ -633,10 +510,7 @@ // ROM_RELOAD( 0x008000, 0x4000 ) // ROM_RELOAD( 0x00c000, 0x4000 ) - ROM_REGION(0x8000, "video_bios", 0 ) - ROM_LOAD("cl-gd5446_pci_vga_bios_version_1.31.u2", 0x000000, 0x8000, BAD_DUMP CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a) ) // Cirrus Logic/Quadtel CL-GD5436/46 PCI VGA BIOS v1.25 - - DISK_REGION( "ide:0:hdd" ) + DISK_REGION( "pci:05.0:ide1:0:hdd" ) // CYLS:1023,HEADS:64,SECS:63,BPS:512. DISK_IMAGE( "pp2004", 0, SHA1(a3f8861cf91cf7e7446ec931f812e774ada20802) ) ROM_END @@ -644,15 +518,14 @@ } // anonymous namespace -// QA status from testing with pcipc (shutms11 too new for this) GAME( 1998, photoply98sp, 0, photoply, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 1998 (Spain)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // "Non system disk or I/O error" GAME( 1999, photoply99sp, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 1999 (Spain)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // "CON device not opened. System halted" before PTS-DOS -GAME( 1999, photoply99nl, photoply99sp, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 1999 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Boots to funworld logo, enter into an EULA screen that needs trackball inputs to accept +GAME( 1999, photoply99nl, photoply99sp, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 1999 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Boots to funworld logo, goes to touchscreen calibration menu GAME( 2000, photoply2k, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2000 (v2.01)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Fails PTS-DOS bootstrap around PC=7dc5, likely bad dump -GAME( 2000, photoply2ksp, photoply2k, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2000 (Spain)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Fails PTS-DOS bootstrap with various memory management errors (in German), likely bad dump -GAME( 2000, photoply2knl, photoply2k, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2000 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Punts in PTS-DOS after failing ES1868 detection, keyboard is unresponsive -GAME( 2001, photoply2k1it, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2001 (Italy)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Boots to funworld logo, draws a "TouchScreen Error" with countdown that will hard reset the machine +GAME( 2000, photoply2ksp, photoply2k, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2000 (Spain)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Attract mode +GAME( 2000, photoply2knl, photoply2k, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2000 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Punts in PTS-DOS after failing ES1868/microtouch detection, has diag inside for latter +GAME( 2001, photoply2k1it, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2001 (Italy)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Attract mode GAME( 2001, photoply2k1nl, photoply2k1it, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2001 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // "Non system disk or I/O error" -GAME( 2001, photoply2k1mtnl, photoply2k1it, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play Masters 2001 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Fails LOGO display at boot (bad dump?), fails touchscreen and ES1868 detection, draws a "TouchScreen Error" with countdown that will hard reset the machine -GAME( 2002, photoply2k2be, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2002 (Belgium)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Boots to funworld logo, draws a "TouchScreen Error" with countdown that will hard reset the machine -GAME( 2004, photoply2k4, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2004", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Boots to funworld logo, draws a "TouchScreen Error" with countdown that will hard reset the machine +GAME( 2001, photoply2k1mtnl, photoply2k1it, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play Masters 2001 (Netherlands)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Fails touchscreen and ES1868 detection, executes few seconds of attract mode then throws a red screen with "HDONGLE not found" +GAME( 2002, photoply2k2be, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2002 (Belgium)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Shows some sort of rebus indicating correct operation of touchscreen, hangs there +GAME( 2004, photoply2k4, 0, photoply_dx4_100, photoply, photoply_state, empty_init, ROT0, "Funworld", "Photo Play 2004", MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_UNEMULATED_PROTECTION ) // Attract mode, "I.G.O. Edition 4" with Nederlands/English options diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/blmbycar.cpp mame-0.264+dfsg.1/src/mame/gaelco/blmbycar.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/blmbycar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/blmbycar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -149,8 +149,6 @@ }; -// video - /*************************************************************************** Note: if MAME_DEBUG is defined, pressing Z with: @@ -259,8 +257,6 @@ } -// machine - /*************************************************************************** diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/glass.cpp mame-0.264+dfsg.1/src/mame/gaelco/glass.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/glass.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/glass.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -100,8 +100,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -278,8 +276,6 @@ } -// machine - void glass_state::shareram_w(offs_t offset, uint8_t data) { // why isn't there address map functionality for this? diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/targeth.cpp mame-0.264+dfsg.1/src/mame/gaelco/targeth.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/targeth.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/targeth.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,8 +145,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -272,8 +270,6 @@ } -// machine - static const gfx_layout tilelayout = { 16,16, // 16x16 tiles diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/thoop2.cpp mame-0.264+dfsg.1/src/mame/gaelco/thoop2.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/thoop2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/thoop2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -129,8 +129,6 @@ }; -// video - /*************************************************************************** Gaelco Type 1 Video Hardware Rev B @@ -335,8 +333,6 @@ } -// machine - void thoop2_state::machine_start() { m_okibank->configure_entries(0, 16, memregion("oki")->base(), 0x10000); diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/wrally.cpp mame-0.264+dfsg.1/src/mame/gaelco/wrally.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/wrally.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/wrally.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -212,8 +212,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -306,8 +304,6 @@ } -// machine - void wrally_state::machine_start() { m_okibank->configure_entries(0, 16, memregion("oki")->base(), 0x10000); diff -Nru mame-0.263+dfsg.1/src/mame/gaelco/xorworld.cpp mame-0.264+dfsg.1/src/mame/gaelco/xorworld.cpp --- mame-0.263+dfsg.1/src/mame/gaelco/xorworld.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gaelco/xorworld.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -92,8 +92,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -205,8 +203,6 @@ } -// machine - /**************************************************************** EEPROM read/write/control ****************************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/galaxian/galaxian.cpp mame-0.264+dfsg.1/src/mame/galaxian/galaxian.cpp --- mame-0.263+dfsg.1/src/mame/galaxian/galaxian.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/galaxian/galaxian.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10254,6 +10254,26 @@ ROM_LOAD( "6l.bpr", 0x0000, 0x0020, CRC(c3ac9467) SHA1(f382ad5a34d282056c78a5ec00c30ec43772bae2) ) ROM_END +ROM_START( galaxiamv ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "1-2708.bin", 0x0000, 0x0400, CRC(7fa16c70) SHA1(4dcfe25deb822a4de5014e2c1e013405efde4612) ) + ROM_LOAD( "2-2708.bin", 0x0400, 0x0400, CRC(afec8adb) SHA1(ca97a6919452958c8f33181e0be3f9c6f1bdf7ab) ) + ROM_LOAD( "3-2708.bin", 0x0800, 0x0400, CRC(770988b5) SHA1(c347d5725d9eb089464022a4528a3fef86a1284f) ) + ROM_LOAD( "4-2708.bin", 0x0c00, 0x0400, CRC(de7e7770) SHA1(b06043a1d898eb323ddabffd3d2a3b1f63df0e5e) ) + ROM_LOAD( "5-2708.bin", 0x1000, 0x0400, CRC(a916c919) SHA1(b3e264ff92687022a0f2f551d5df36db848b48eb) ) + ROM_LOAD( "6-2708.bin", 0x1400, 0x0400, CRC(9175882b) SHA1(d9943efcb9245af7f01aecc533a699bdefc7d283) ) + ROM_LOAD( "7-2708.bin", 0x1800, 0x0400, CRC(6a57f9e8) SHA1(7970d059679384833083a99ea7f59d14417eccc3) ) + ROM_LOAD( "8-2708.bin", 0x1c00, 0x0400, CRC(8eeb4c6f) SHA1(77140ea63677356624d12c399ea89f552a27bff1) ) + ROM_LOAD( "9-2708.bin", 0x2000, 0x0400, CRC(de598114) SHA1(b74d1ce826274296ecb7cb8a327ea51f560521b9) ) + ROM_LOAD( "10-2708.bin", 0x2400, 0x0400, CRC(9ec63321) SHA1(ee7c398529ad31ccf4b215ef923b8ff083ea47bf) ) + + ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_LOAD( "11-tms2516.bin", 0x0000, 0x0800, CRC(977e37cf) SHA1(88ff1e4edadf5cfc83413a1fe999aecf4ba72232) ) + ROM_LOAD( "12-tms2516.bin", 0x0800, 0x0800, CRC(d0ba22c9) SHA1(678b22d10e1ae7dcea068da838bf6bd648e9ee28) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "mmi6331.bin", 0x0000, 0x0020, CRC(24652bc4) SHA1(d89575f3749c75dc963317fe451ffeffd9856e4d) ) +ROM_END ROM_START( galaxianbl ) // looks to be a fairly plain set with modified bonus lives etc. ROM_REGION( 0x4000, "maincpu", 0 ) @@ -12825,7 +12845,7 @@ ROM_REGION( 0x0020, "proms", 0 ) // wasn't in the dump ROM_LOAD( "6l.bin", 0x0000, 0x0020, CRC(fd81e715) SHA1(eadafe88f26405e6540d4b248b940974e8c31145) ) - ROM_REGION( 0x0020, "proms2", 0 ) // NOT the colour prom? + ROM_REGION( 0x0020, "proms2", 0 ) // NOT the colour PROM? ROM_LOAD( "dkp.bin", 0x0000, 0x0020, CRC(97c473cc) SHA1(1bbb7f17b8d6a3a621e8c22d473eb26d4c1a750b) ) ROM_END @@ -12847,7 +12867,7 @@ ROM_COPY("gfx1",0x3800,0x2800,0x0800) ROM_COPY("gfx1",0x1800,0x0800,0x0800) - ROM_REGION( 0x0020, "proms", 0 ) // not dumped, but the standard moon cresta prom works + ROM_REGION( 0x0020, "proms", 0 ) // not dumped, but the standard Moon Cresta PROM works ROM_LOAD( "bagmanmc.clr", 0x0000, 0x0020, BAD_DUMP CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) ) ROM_END @@ -12865,6 +12885,33 @@ ROM_LOAD( "bagmanmc.clr", 0x0000, 0x0020, BAD_DUMP CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) ) ROM_END +// Found on a Moon Cresta PCB made by CIRSA +ROM_START( bagmanm3 ) + ROM_REGION( 0x6000, "maincpu", 0 ) + ROM_LOAD( "1-2-tms2564.bin", 0x0000, 0x2000, CRC(90e5ae76) SHA1(d572eee43476c689d0d958ac23e2277a2ce077cb) ) + ROM_LOAD( "3-4-tms2564.bin", 0x2000, 0x2000, CRC(f68fc60d) SHA1(c10aef39cf33c87974fefd347185ea7342470022) ) + ROM_LOAD( "5a.bin", 0x4000, 0x0800, CRC(99992ffb) SHA1(33e34143bc515e645030fd3cf6e926225c1e6e00) ) + ROM_LOAD( "5b.bin", 0x4800, 0x0800, CRC(838c1462) SHA1(e430b185c51b7b50fcf8ec1f56d46db21d4b1eb5) ) + ROM_LOAD( "5c.bin", 0x5000, 0x0800, CRC(df4139fe) SHA1(840d3f15a667679ed7ba031fc8d0b0efee5bc382) ) + ROM_LOAD( "5d.bin", 0x5800, 0x0800, CRC(d07a1fcb) SHA1(1cd4150eda53d164dacc0c6e9eb7bd30f646bd00) ) + + ROM_REGION( 0x4000, "gfx1", 0 ) + ROM_LOAD( "bottom-tms2532.bin", 0x0000, 0x0800, CRC(c26409b5) SHA1(7d6a309f26ad6cd8790f6a4b383a00c2a06bbe05) ) + ROM_IGNORE( 0x800 ) // Second half unused + ROM_LOAD( "top-tms2532.bin", 0x1000, 0x1000, CRC(a2790089) SHA1(7eb8634f26f6af52fb79bf90ec90b4e258c7c79f) ) + ROM_LOAD( "c3-bottom-tms2532.bin", 0x2000, 0x0800, CRC(4fdd460f) SHA1(b3d69676be9cd60b201a1c0573eaa3d7121a68b9) ) + ROM_IGNORE( 0x800 ) // Second half unused + ROM_LOAD( "c3-top-tms2532.bin", 0x3000, 0x1000, CRC(b63cfae4) SHA1(3e0cb3dbeec8ad790bc482176ca599721bac31ee) ) + + ROM_COPY( "gfx1", 0x3800, 0x2800, 0x0800 ) + ROM_COPY( "gfx1", 0x1800, 0x0800, 0x0800 ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "82s123.bin", 0x0000, 0x0020, CRC(9fe412ff) SHA1(eea54dbf60f3661f24da732c4a479d552734a592) ) + + ROM_REGION( 0x0020, "proms2", 0 ) // Extra PROM attached to a 74157 + ROM_LOAD( "82s123-74157.bin", 0x0000, 0x0020, CRC(66bb08a3) SHA1(f02700b651c3f840ad00844bb716d334f1f36637) ) +ROM_END ROM_START( mooncmw ) ROM_REGION( 0x8000, "maincpu", 0 ) @@ -16253,6 +16300,7 @@ GAME( 1979, galaxbsf, galaxian, galaxian, galaxian, galaxian_state, init_galaxian, ROT90, "bootleg", "Galaxian (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1979, galaxianbl, galaxian, galaxian, galaxianbl, galaxian_state, init_galaxian, ROT90, "bootleg", "Galaxian (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1979, galaxbsf2, galaxian, galaxian, galaxian, galaxian_state, init_galaxian, ROT90, "bootleg", "Galaxian (bootleg, set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1979, galaxiamv, galaxian, galaxian, galaxian, galaxian_state, init_galaxian, ROT90, "bootleg (Multivideo)", "Diviertate Galaxia (Multivideo, Spanish bootleg of Galaxian)", MACHINE_SUPPORTS_SAVE ) GAME( 1979, galaxianbl2, galaxian, galaxian, galaxianbl, galaxian_state, init_galaxian, ROT90, "bootleg", "Galaxian (bootleg, set 4)", MACHINE_SUPPORTS_SAVE ) GAME( 1979, galaxianbl3, galaxian, galaxian, zerotime, galaxian_state, init_galaxian, ROT90, "bootleg", "Galaxian (Spanish bootleg)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // unique color PROM that gives strange colors. Unfortunately PCB doesn't work so it cannot be verified GAME( 1980, galaxianem, galaxian, galaxian, galaxrf, galaxian_state, init_galaxian, ROT90, "bootleg (Electromar)", "Galaxian (Electromar Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) @@ -16441,10 +16489,12 @@ GAME( 1981, bigkonggx, ckong, bigkonggx, ckongg, galaxian_state, init_bigkonggx, ROT90, "bootleg", "Big Kong (bootleg of Crazy Kong on Galaxian hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) GAME( 1982, bagmanmc, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_bagmanmc, ROT90, "bootleg", "Bagman (bootleg on Moon Cresta hardware, set 1)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) GAME( 1984, bagmanm2, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_bagmanmc, ROT90, "bootleg (GIB)", "Bagman (bootleg on Moon Cresta hardware, set 2)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, bagmanm3, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_bagmanmc, ROT90, "bootleg", "Bagman (bootleg on Moon Cresta hardware, set 3)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) + // Other games on basic mooncrst hardware GAME( 1982, porter, dockman, porter, porter, pisces_state, init_pisces, ROT90, "bootleg", "Port Man (bootleg on Moon Cresta hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL ) -GAME( 1982, portera, dockman, porter, portera, pisces_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL ) +GAME( 1982, portera, dockman, porter, portera, pisces_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL ) // May be Portuguese, not Spanish GAME( 1982, skybase, 0, skybase, skybase, pisces_state, init_pisces, ROT90, "Omori Electric Co., Ltd.", "Sky Base", MACHINE_SUPPORTS_SAVE ) GAME( 198?, kong, 0, kong, kong, galaxian_state, init_kong, ROT90, "Taito do Brasil", "Kong (Donkey Kong conversion on Galaxian hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_WRONG_COLORS ) // rewrite of Donkey Kong (!) not a clone diff -Nru mame-0.263+dfsg.1/src/mame/gametron/gatron.cpp mame-0.264+dfsg.1/src/mame/gametron/gatron.cpp --- mame-0.263+dfsg.1/src/mame/gametron/gatron.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gametron/gatron.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -376,8 +376,6 @@ }; -// video - void gatron_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -412,8 +410,6 @@ } -// machine - /**************************** * Read/Write Handlers * ****************************/ diff -Nru mame-0.263+dfsg.1/src/mame/gametron/gotya.cpp mame-0.264+dfsg.1/src/mame/gametron/gotya.cpp --- mame-0.263+dfsg.1/src/mame/gametron/gotya.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gametron/gotya.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -131,8 +131,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -294,8 +292,6 @@ } -// audio - static const char *const sample_names[] = { // Address triggered at "*thehand", @@ -399,8 +395,6 @@ } -// machine - void gotya_state::prg_map(address_map &map) { map(0x0000, 0x3fff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/gametron/sbugger.cpp mame-0.264+dfsg.1/src/mame/gametron/sbugger.cpp --- mame-0.263+dfsg.1/src/mame/gametron/sbugger.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/gametron/sbugger.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -152,8 +152,6 @@ }; -// video - TILE_GET_INFO_MEMBER(sbugger_state::get_tile_info) { int const tileno = m_videoram[tile_index]; @@ -201,8 +199,6 @@ } -// machine - void sbugger_state::prg_map(address_map &map) { map(0x0000, 0x37ff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_cop400.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_cop400.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_cop400.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_cop400.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2827,7 +2827,7 @@ SYST( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** SYST( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight: The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, bshipg, bship, 0, bshipg, bshipg, bshipg_state, empty_init, "Milton Bradley", "Electronic Battleship (COP420 version, Rev. G)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +SYST( 1982, bshipg, bship, 0, bshipg, bshipg, bshipg_state, empty_init, "Milton Bradley", "Electronic Battleship (COP420 version, rev. G)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** SYST( 1979, qkracera, qkracer, 0, qkracera, qkracera, qkracera_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "COPS Pocket Assistant", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_hmcs40.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_hmcs40.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_hmcs40.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_hmcs40.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -5388,8 +5388,8 @@ SYST( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) SYST( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE ) SYST( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -SYST( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, rev. 29)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, rev. 28)", MACHINE_SUPPORTS_SAVE ) SYST( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, cmspacmn_state, empty_init, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) SYST( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_pic16.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_pic16.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_pic16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_pic16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2193,7 +2193,7 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, rev. 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Calfax / Caprice Electronics", "Pro-Action Electronic-Computerized Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_pps41.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_pps41.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_pps41.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_pps41.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -388,7 +388,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Swing / S2 V") PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CHANGED_MEMBER(DEVICE_SELF, ftri1_state, reset_button, 0) PORT_CODE(KEYCODE_F1) PORT_NAME("Game Reset") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, ftri1_state, reset_button, 0) PORT_NAME("Game Reset") INPUT_PORTS_END // config @@ -800,7 +800,7 @@ PORT_START("IN.3") // DIO3 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("PE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("PE") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CD") PORT_START("IN.4") @@ -1753,7 +1753,7 @@ PORT_START("IN.3") // DIO3 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("Pass") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_tms1k.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_tms1k.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_tms1k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_tms1k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -304,6 +304,7 @@ #include "h2hfootb.lh" #include "h2hhockey.lh" #include "horseran.lh" +#include "lilprof.lh" #include "litelrn.lh" #include "liveafb.lh" #include "lostreas.lh" @@ -356,7 +357,6 @@ #include "tmvolleyb.lh" #include "uboat.lh" #include "vclock3.lh" -#include "wizatron.lh" #include "xl25.lh" #include "zodiac.lh" @@ -1596,7 +1596,7 @@ PORT_START("IN.5") // R5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(u8"π") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME(u8"π") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME(u8"x²") PORT_START("IN.6") // R6 @@ -2226,7 +2226,7 @@ // inputs -/* The physical button layout and labels are like this: +/* physical button layout and labels are like this: [P] [A] [ 1 ] [ 2 ] [ 3 ] @@ -2236,45 +2236,38 @@ [.__.__.__.] OFF H P A - -Despite that this layout features a typical digital keypad and distances -the letter buttons from it, the 8-character encoding for date input uses -letters and digits in combination. This fact and the use of the P key are -why the digit buttons are mapped here as keyboard inputs rather than as a -keypad. - */ static INPUT_PORTS_START( zodiac ) PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("P") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("L") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("J") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_START("IN.5") // R8 PORT_CONFNAME( 0x03, 0x01, "Mode") @@ -7818,7 +7811,7 @@ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("Player Number") PORT_START("IN.1") // R1 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn") @@ -9817,7 +9810,7 @@ /******************************************************************************* Milton Bradley Dark Tower - * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label: + * TMS1400NLL MP7332-N1.U1(rev. B) or MP7332-N2LL(rev. C) (die label: TMS1400, MP7332, 28L 01D D100 R100) (assume same ROM between revisions) * SN75494N MOS-to-LED digit driver * motorized rotating reel + lightsensor, 1bit-sound @@ -10271,7 +10264,7 @@ PORT_START("IN.2") // O2 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Evasive Sub") // expert button PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire") @@ -10279,7 +10272,7 @@ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Sub Finder") // expert button PORT_START("IN.4") // O4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship") @@ -13658,11 +13651,7 @@ refreshable Braille cells. The TI-30 itself is slightly modified to wire the original LED display to a 25-pin D-Sub connector. - TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 - * TMS0980 MCU label TMC0982NL (die label: 0980B-82F) - - TI Programmer - * TMS0980 MCU label ZA0675NL, JP0983AT (die label: 0980B-83) + See further below for TI Business Analyst and TI Programmer. *******************************************************************************/ @@ -13764,64 +13753,59 @@ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) INPUT_PORTS_END -static INPUT_PORTS_START( tiprog ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") +// config - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") +void ti30_state::ti30(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 400000); // guessed + m_maincpu->read_k().set(FUNC(ti30_state::read_k)); + m_maincpu->write_o().set(FUNC(ti30_state::write_o)); + m_maincpu->write_r().set(FUNC(ti30_state::write_r)); + m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1fe, 0xff); + m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP + config.set_default_layout(layout_ti30); - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + // no sound! +} - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") +// roms - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") +ROM_START( ti30 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END + + + + +/******************************************************************************* + + TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 + * TMS0980 MCU label TMC0982NL (die label: 0980B-82F) + * 9-digit 7seg LED display + + It's on the same hardware as TI-30. + +*******************************************************************************/ + +// class/handlers: uses the ones in ti30_state + +// inputs static INPUT_PORTS_START( tibusan ) // PORT_NAME lists functions under [2nd] as secondaries. @@ -13883,42 +13867,8 @@ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) INPUT_PORTS_END -// config - -void ti30_state::ti30(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 400000); // guessed - m_maincpu->read_k().set(FUNC(ti30_state::read_k)); - m_maincpu->write_o().set(FUNC(ti30_state::write_o)); - m_maincpu->write_r().set(FUNC(ti30_state::write_r)); - m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1fe, 0xff); - m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP - config.set_default_layout(layout_ti30); - - // no sound! -} - // roms -ROM_START( ti30 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - ROM_START( tibusan ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) @@ -13933,6 +13883,85 @@ ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) ROM_END + + + + +/******************************************************************************* + + TI Programmer + * TMS0980 MCU label ZA0675NL, JP0983AT (die label: 0980B-83) + * 9-digit 7seg LED display + + Like TI Business Analyst, it's on the same hardware as TI-30. + +*******************************************************************************/ + +// class/handlers: uses the ones in ti30_state + +// inputs + +static INPUT_PORTS_START( tiprog ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +// roms + ROM_START( tiprog ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) @@ -14074,35 +14103,43 @@ /******************************************************************************* - Texas Instruments WIZ-A-TRON - * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label: 0970F-07B) + Texas Instruments Little Professor (1976 version, rev. A) + * TMS0970 MCU label TMS0975NL ZA0356, AP (die label: 0970D-75A) * 9-digit 7seg LED display(one custom digit) + Texas Instruments Little Professor (1976 version, rev. B) + * TMS0970 MCU label TMS0975NL ZA0356, BP (die label: 0970D-75B) + + Texas Instruments Little Professor (1976 version, rev. C) + * TMS0970 MCU label TMS0975NL ZA0356, CSP/GP0975CS (die label: 0970D-75C) + *******************************************************************************/ -class wizatron_state : public hh_tms1k_state +class lilprofo_state : public hh_tms1k_state { public: - wizatron_state(const machine_config &mconfig, device_type type, const char *tag) : + lilprofo_state(const machine_config &mconfig, device_type type, const char *tag) : hh_tms1k_state(mconfig, type, tag) { } - void wizatron(machine_config &config); + void lilprofo(machine_config &config); + void lilprofoc(machine_config &config); protected: - virtual void write_o(u16 data); - virtual void write_r(u32 data); - virtual u8 read_k(); + void write_o(u16 data); + void write_o7(u16 data); + void write_r(u32 data); + u8 read_k(); }; // handlers -void wizatron_state::write_r(u32 data) +void lilprofo_state::write_r(u32 data) { // R0-R8: select digit // 3rd digit only has A and G for =, though some newer hardware revisions - // (goes for both wizatron and lilprof) use a custom equals-sign digit here + // (goes for both lilprof and wizatron) use a custom equals-sign digit here // 6th digit is custom(not 7seg), for math symbols, like this: // \./ GAB @@ -14111,28 +14148,34 @@ m_display->matrix(data, m_o); } -void wizatron_state::write_o(u16 data) +void lilprofo_state::write_o(u16 data) { - // O1-O4: input mux + // O1-O5: input mux // O0-O6: digit segments A-G - // O7: N/C - m_inp_mux = data >> 1 & 0xf; + m_inp_mux = (data >> 1 & 0x1f); m_o = data & 0x7f; } -u8 wizatron_state::read_k() +void lilprofo_state::write_o7(u16 data) +{ + // level switch is on O7 + write_o(data); + m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); +} + +u8 lilprofo_state::read_k() { // K: multiplexed inputs - return read_inputs(4); + return read_inputs(5); } // inputs -static INPUT_PORTS_START( wizatron ) +static INPUT_PORTS_START( lilprofo ) PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_START("IN.1") // O2 @@ -14152,128 +14195,125 @@ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.4") // O5/O7 + PORT_CONFNAME( 0x0f, 0x01, "Level") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) INPUT_PORTS_END // config -void wizatron_state::wizatron(machine_config &config) +void lilprofo_state::lilprofo(machine_config &config) { // basic machine hardware TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->read_k().set(FUNC(wizatron_state::read_k)); - m_maincpu->write_o().set(FUNC(wizatron_state::write_o)); - m_maincpu->write_r().set(FUNC(wizatron_state::write_r)); + m_maincpu->read_k().set(FUNC(lilprofo_state::read_k)); + m_maincpu->write_o().set(FUNC(lilprofo_state::write_o)); + m_maincpu->write_r().set(FUNC(lilprofo_state::write_r)); // video hardware PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1ff^8, 0x7f); + m_display->set_segmask(0x1f7, 0x7f); m_display->set_segmask(8, 0x41); // equals sign - config.set_default_layout(layout_wizatron); + config.set_default_layout(layout_lilprof); // no sound! } +void lilprofo_state::lilprofoc(machine_config &config) +{ + lilprofo(config); + m_maincpu->write_o().set(FUNC(lilprofo_state::write_o7)); +} + // roms -ROM_START( wizatron ) +ROM_START( lilprofo ) ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) + ROM_LOAD( "tms0975nl_za0356_csp", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) ROM_REGION( 782, "maincpu:ipla", 0 ) ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) + ROM_LOAD( "tms0980_lilprofo_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) ROM_REGION( 157, "maincpu:spla", 0 ) ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) ROM_END +ROM_START( lilprofob ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0975nl_za0356_bp", 0x0000, 0x0400, CRC(00c8357f) SHA1(32ab47e979e117bda889ab1c72c1c239cfa0f386) ) + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprofo_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END +ROM_START( lilprofoa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0975nl_za0356_ap", 0x0000, 0x0400, CRC(ab77b595) SHA1(8ec5a00d9eb0780b9bb2937c4c023efb2470b287) ) + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprofo_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END -/******************************************************************************* - - Texas Instruments Little Professor (1976 version) - * TMS0970 MCU label TMS0975NL ZA0356, GP0975CS (die label: 0970D-75C) - * 9-digit 7seg LED display(one custom digit) - The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this - one is older). -*******************************************************************************/ -class lilprof_state : public wizatron_state -{ -public: - lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : - wizatron_state(mconfig, type, tag) - { } - void lilprof(machine_config &config); +/******************************************************************************* -private: - virtual void write_o(u16 data) override; - virtual u8 read_k() override; -}; + Texas Instruments WIZ-A-TRON + * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label: 0970F-07B) + * 9-digit 7seg LED display(one custom digit) -// handlers + The hardware is nearly identical to Little Professor (1976 version). -void lilprof_state::write_o(u16 data) -{ - // O1-O4,O7: input mux - // O0-O6: digit segments A-G - m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); - m_o = data; -} +*******************************************************************************/ -u8 lilprof_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} +// class/handlers: uses the ones in lilprofo_state // inputs -static INPUT_PORTS_START( lilprof ) - PORT_INCLUDE( wizatron ) +static INPUT_PORTS_START( wizatron ) + PORT_INCLUDE( lilprofo ) PORT_MODIFY("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_START("IN.4") // O7 - PORT_CONFNAME( 0x0f, 0x01, "Level") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) + PORT_MODIFY("IN.4") + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END -// config - -void lilprof_state::lilprof(machine_config &config) -{ - wizatron(config); - - // basic machine hardware - m_maincpu->read_k().set(FUNC(lilprof_state::read_k)); - m_maincpu->write_o().set(FUNC(lilprof_state::write_o)); -} - // roms -ROM_START( lilprof ) +ROM_START( wizatron ) ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) + ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) ROM_REGION( 782, "maincpu:ipla", 0 ) ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) + ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) ROM_REGION( 157, "maincpu:spla", 0 ) ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) ROM_END @@ -14293,14 +14333,14 @@ *******************************************************************************/ -class lilprofa_state : public hh_tms1k_state +class lilprof_state : public hh_tms1k_state { public: - lilprofa_state(const machine_config &mconfig, device_type type, const char *tag) : + lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : hh_tms1k_state(mconfig, type, tag) { } - void lilprofa(machine_config &config); + void lilprof(machine_config &config); private: void write_o(u16 data); @@ -14310,7 +14350,7 @@ // handlers -void lilprofa_state::write_r(u32 data) +void lilprof_state::write_r(u32 data) { // update leds state u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; @@ -14320,11 +14360,11 @@ // 3rd digit A/G(equals sign) is from O7 m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); - // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) + // 6th digit is a custom 7seg for math symbols (see lilprofo_state write_r) m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); } -void lilprofa_state::write_o(u16 data) +void lilprof_state::write_o(u16 data) { // O0-O3,O5(?): input mux // O0-O6: digit segments A-G @@ -14333,7 +14373,7 @@ m_o = data; } -u8 lilprofa_state::read_k() +u8 lilprof_state::read_k() { // K: multiplexed inputs return read_inputs(5); @@ -14341,7 +14381,7 @@ // inputs -static INPUT_PORTS_START( lilprofa ) +static INPUT_PORTS_START( lilprof ) PORT_START("IN.0") // O0 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") @@ -14376,25 +14416,25 @@ // config -void lilprofa_state::lilprofa(machine_config &config) +void lilprof_state::lilprof(machine_config &config) { // basic machine hardware TMS1990(config, m_maincpu, 250000); // approximation - m_maincpu->read_k().set(FUNC(lilprofa_state::read_k)); - m_maincpu->write_o().set(FUNC(lilprofa_state::write_o)); - m_maincpu->write_r().set(FUNC(lilprofa_state::write_r)); + m_maincpu->read_k().set(FUNC(lilprof_state::read_k)); + m_maincpu->write_o().set(FUNC(lilprof_state::write_o)); + m_maincpu->write_r().set(FUNC(lilprof_state::write_r)); // video hardware PWM_DISPLAY(config, m_display).set_size(9, 7); m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_wizatron); + config.set_default_layout(layout_lilprof); // no sound! } // roms -ROM_START( lilprofa ) +ROM_START( lilprof ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) @@ -14403,7 +14443,7 @@ ROM_REGION( 860, "maincpu:mpla", 0 ) ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprofa_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) + ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) ROM_REGION( 157, "maincpu:spla", 0 ) ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) ROM_END @@ -14579,10 +14619,10 @@ void dataman(machine_config &config); protected: - virtual void update_display(); - virtual void write_o(u16 data); - virtual void write_r(u32 data); - virtual u8 read_k(); + void update_display(); + void write_o(u16 data); + void write_r(u32 data); + u8 read_k(); }; // handlers @@ -14711,21 +14751,9 @@ { } void mathmarv(machine_config &config); - -private: - virtual void write_r(u32 data) override; }; -// handlers - -void mathmarv_state::write_r(u32 data) -{ - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // rest is same as dataman - dataman_state::write_r(data); -} +// handlers: uses the ones in dataman_state // inputs @@ -14750,7 +14778,7 @@ dataman(config); // basic machine hardware - m_maincpu->write_r().set(FUNC(mathmarv_state::write_r)); + m_maincpu->write_r().append(m_speaker, FUNC(speaker_sound_device::level_w)).bit(8); config.set_default_layout(layout_mathmarv); @@ -17337,10 +17365,10 @@ SYST( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons: Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** SYST( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -SYST( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, Rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) // *** -SYST( 1978, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, Rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** -SYST( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev. F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND ) // *** +SYST( 1978, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (TMS1000 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** +SYST( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (rev. F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** SYST( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** @@ -17382,9 +17410,11 @@ SYST( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1977, wizatron, 0, 0, wizatron, wizatron, wizatron_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1976, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1978, lilprofa, lilprof, 0, lilprofa, lilprofa, lilprofa_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1978, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1976, lilprofoa, lilprof, 0, lilprofo, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1976, lilprofob, lilprof, 0, lilprofo, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1976, lilprofo, lilprof, 0, lilprofoc, lilprofo, lilprofo_state, empty_init, "Texas Instruments", "Little Professor (1976 version, rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1977, wizatron, 0, 0, lilprofo, wizatron, lilprofo_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) SYST( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/handheld/hh_ucom4.cpp mame-0.264+dfsg.1/src/mame/handheld/hh_ucom4.cpp --- mame-0.263+dfsg.1/src/mame/handheld/hh_ucom4.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/hh_ucom4.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3346,8 +3346,8 @@ SYST( 1980, einspace, 0, 0, einspace, einspace, einspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) SYST( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE ) -SYST( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD rev. D)", MACHINE_SUPPORTS_SAVE ) +SYST( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD rev. B)", MACHINE_SUPPORTS_SAVE ) SYST( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE ) SYST( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/handheld/pensebem.cpp mame-0.264+dfsg.1/src/mame/handheld/pensebem.cpp --- mame-0.263+dfsg.1/src/mame/handheld/pensebem.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/handheld/pensebem.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -241,23 +241,23 @@ PORT_START("ROW1") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Adicao") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Subtracao") PORT_CODE(KEYCODE_W) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH_PAD) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("*") PORT_CODE(KEYCODE_ASTERISK) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Adição") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Subtração") PORT_CODE(KEYCODE_W) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"÷") PORT_CODE(KEYCODE_SLASH_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"×") PORT_CODE(KEYCODE_ASTERISK) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS_PAD) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("+") PORT_CODE(KEYCODE_PLUS_PAD) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_START("ROW2") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Multiplicacao") PORT_CODE(KEYCODE_E) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Aritmetica") PORT_CODE(KEYCODE_T) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Divisao") PORT_CODE(KEYCODE_R) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Adivinhe o Número") PORT_CODE(KEYCODE_P) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Número do Meio") PORT_CODE(KEYCODE_O) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Memória Tons") PORT_CODE(KEYCODE_I) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Siga-me") PORT_CODE(KEYCODE_U) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Operacao") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Multiplicação") PORT_CODE(KEYCODE_E) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Aritmética") PORT_CODE(KEYCODE_T) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Divisão") PORT_CODE(KEYCODE_R) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Adivinhe o Número") PORT_CODE(KEYCODE_P) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Número do Meio") PORT_CODE(KEYCODE_O) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Memória Tons") PORT_CODE(KEYCODE_I) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Siga-me") PORT_CODE(KEYCODE_U) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME(u8"Operação") PORT_CODE(KEYCODE_Y) PORT_START("ROW3") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) diff -Nru mame-0.263+dfsg.1/src/mame/heathkit/h17_fdc.cpp mame-0.264+dfsg.1/src/mame/heathkit/h17_fdc.cpp --- mame-0.263+dfsg.1/src/mame/heathkit/h17_fdc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/heathkit/h17_fdc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,295 @@ +// license:BSD-3-Clause +// copyright-holders:Mark Garlanger +/*************************************************************************** + + Heathkit H-17 Floppy controller + + This was an option for both the Heathkit H8 and H89 computer systems. + + TODO + - define hard-sectored disk format + - incoming floppy data should drive receive clock of the ami 2350. + +****************************************************************************/ + +#include "emu.h" + +#include "h17_fdc.h" + +// Register setup +#define LOG_REG (1U << 1) +// Control lines +#define LOG_LINES (1U << 2) +// Drive select +#define LOG_DRIVE (1U << 3) +// Function calls +#define LOG_FUNC (1U << 4) + +//#define VERBOSE (0xff) + +#include "logmacro.h" + +#define LOGREG(...) LOGMASKED(LOG_REG, __VA_ARGS__) +#define LOGLINES(...) LOGMASKED(LOG_LINES, __VA_ARGS__) +#define LOGDRIVE(...) LOGMASKED(LOG_DRIVE, __VA_ARGS__) +#define LOGFUNC(...) LOGMASKED(LOG_FUNC, __VA_ARGS__) + +#ifdef _MSC_VER +#define FUNCNAME __func__ +#else +#define FUNCNAME __PRETTY_FUNCTION__ +#endif + + +DEFINE_DEVICE_TYPE(HEATH_H17_FDC, heath_h17_fdc_device, "heath_h17_fdc", "Heath H-17 Hard-sectored Controller"); + + +heath_h17_fdc_device::heath_h17_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock): + device_t(mconfig, HEATH_H17_FDC, tag, owner, 0), + m_floppy_ram_wp(*this), + m_s2350(*this, "s2350"), + m_floppies(*this, "floppy%u", 0U), + m_tx_timer(*this, "tx_timer"), + m_floppy(nullptr) +{ +} + +void heath_h17_fdc_device::write(offs_t reg, u8 val) +{ + LOGFUNC("%s: reg: %d val: 0x%02x\n", FUNCNAME, reg, val); + + switch (reg) + { + case 0: // data port + m_s2350->transmitter_holding_reg_w(val); + break; + case 1: // fill character + m_s2350->transmit_fill_reg_w(val); + break; + case 2: // sync port + m_s2350->receiver_sync_reg_w(val); + break; + case 3: // control port + ctrl_w(val); + break; + } +} + +void heath_h17_fdc_device::set_floppy(floppy_image_device *floppy) +{ + if (m_floppy == floppy) + { + return; + } + + LOGDRIVE("%s: selecting new drive\n", FUNCNAME); + + m_floppy = floppy; + + // set any latched signals + { + m_floppy->ss_w(m_side); + } +} + +void heath_h17_fdc_device::side_select_w(int state) +{ + m_side = BIT(state, 0); + + if (m_floppy) + { + m_floppy->ss_w(m_side); + } +} + +void heath_h17_fdc_device::dir_w(int state) +{ + if (m_floppy) + { + LOGFUNC("%s: step dir: 0x%02x\n", FUNCNAME, state); + + m_floppy->dir_w(state); + } +} + +void heath_h17_fdc_device::step_w(int state) +{ + if (m_floppy) + { + LOGFUNC("%s: step dir: 0x%02x\n", FUNCNAME, state); + + m_floppy->stp_w(state); + } +} + +void heath_h17_fdc_device::set_motor(bool motor_on) +{ + if (m_motor_on == motor_on) + { + return; + } + + m_motor_on = motor_on; + + for (auto &elem : m_floppies) + { + floppy_image_device *floppy = elem->get_device(); + if (floppy) + { + LOGFUNC("%s: motor: %d\n", FUNCNAME, motor_on); + + floppy->mon_w(!motor_on); + } + } +} + +void heath_h17_fdc_device::ctrl_w(u8 val) +{ + m_write_gate = bool(BIT(val, CTRL_WRITE_GATE)); + + set_motor(bool(BIT(val, CTRL_MOTOR_ON))); + + if (BIT(val, CTRL_DRIVE_SELECT_0)) + { + LOGFUNC("%s: set drive 0\n", FUNCNAME); + + set_floppy(m_floppies[0]->get_device()); + } + else if (BIT(val, CTRL_DRIVE_SELECT_1)) + { + LOGFUNC("%s: set drive 1\n", FUNCNAME); + + set_floppy(m_floppies[1]->get_device()); + } + else if (BIT(val, CTRL_DRIVE_SELECT_2)) + { + LOGFUNC("%s: set drive 2\n", FUNCNAME); + + set_floppy(m_floppies[2]->get_device()); + } + else + { + LOGFUNC("%s: set drive none\n", FUNCNAME); + + set_floppy(nullptr); + } + + dir_w(!BIT(val, CTRL_DIRECTION)); + + step_w(!BIT(val, CTRL_STEP_COMMAND)); + + m_floppy_ram_wp(BIT(val, CTRL_WRITE_ENABLE_RAM)); +} + +u8 heath_h17_fdc_device::read(offs_t reg) +{ + // default return for the h89 + u8 val = 0xff; + + switch (reg) + { + case 0: // data port + val = m_s2350->receiver_output_reg_r(); + break; + case 1: // status port + val = m_s2350->status_word_r(); + break; + case 2: // sync port + val = m_s2350->receiver_sync_search(); + break; + case 3: // floppy status port + val = floppy_status_r(); + break; + } + + LOGREG("%s: reg: %d val: 0x%02x\n", FUNCNAME, reg, val); + + return val; +} + +u8 heath_h17_fdc_device::floppy_status_r() +{ + u8 val = 0; + + // statuses from the floppy drive + if (m_floppy) + { + // index/sector hole + val |= m_floppy->idx_r() ? 0x00 : 0x01; + + // track 0 + val |= m_floppy->trk00_r() ? 0x00 : 0x02; + + // disk is write-protected + val |= m_floppy->wpt_r() ? 0x00 : 0x04; + } + else + { + LOGREG("%s: no drive selected\n", FUNCNAME); + } + + // status from USRT + val |= m_sync_char_received ? 0x08 : 0x00; + + LOGFUNC("%s: val: 0x%02x\n", FUNCNAME, val); + + return val; +} + +void heath_h17_fdc_device::device_start() +{ + save_item(NAME(m_motor_on)); + save_item(NAME(m_write_gate)); + save_item(NAME(m_sync_char_received)); + save_item(NAME(m_step_direction)); + save_item(NAME(m_side)); +} + +void heath_h17_fdc_device::device_reset() +{ + LOGFUNC("%s\n", FUNCNAME); + + m_motor_on = false; + m_write_gate = false; + m_sync_char_received = false; + + m_tx_timer->adjust(attotime::from_hz(USRT_TX_CLOCK), 0, attotime::from_hz(USRT_TX_CLOCK)); +} + +static void h17_floppies(device_slot_interface &device) +{ + // H-17-1 + device.option_add("ssdd", FLOPPY_525_SSDD); + + // Future plans - test and verify higher capacity drives with LLC's BIOS-80 for CP/M and an HUG's enhanced HDOS driver + // - FLOPPY_525_SSQD + // - FLOPPY_525_DD + // - FLOPPY_525_QD (H-17-4) +} + +TIMER_DEVICE_CALLBACK_MEMBER(heath_h17_fdc_device::tx_timer_cb) +{ + m_s2350->tcp_w(); +} + +void heath_h17_fdc_device::device_add_mconfig(machine_config &config) +{ + S2350(config, m_s2350, 0); + m_s2350->sync_character_received_cb().set(FUNC(heath_h17_fdc_device::sync_character_received)); + + for (int i = 0; i < MAX_FLOPPY_DRIVES; i++) + { + // TODO -> add (and define) heath hard-sectored floppy formats. + FLOPPY_CONNECTOR(config, m_floppies[i], h17_floppies, "ssdd", floppy_image_device::default_fm_floppy_formats); + m_floppies[i]->enable_sound(true); + } + + TIMER(config, m_tx_timer).configure_generic(FUNC(heath_h17_fdc_device::tx_timer_cb)); +} + +void heath_h17_fdc_device::sync_character_received(int state) +{ + LOGFUNC("%s: state: %d\n", FUNCNAME, state); + + m_sync_char_received = bool(!BIT(state, 0)); +} diff -Nru mame-0.263+dfsg.1/src/mame/heathkit/h17_fdc.h mame-0.264+dfsg.1/src/mame/heathkit/h17_fdc.h --- mame-0.263+dfsg.1/src/mame/heathkit/h17_fdc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/heathkit/h17_fdc.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,90 @@ +// license:BSD-3-Clause +// copyright-holders:Mark Garlanger +/*************************************************************************** + + Heathkit H-17 Floppy Disk Controller + + + Model number: H-88-1 + + TODO + - Mame core must support hard-sectored disk images. + - used floppy clock bits to clock USRT received clock. + - Add support for a heath hard-sectored disk support (h17disk). + +****************************************************************************/ + +#ifndef MAME_HEATHKIT_H17_FDC_H +#define MAME_HEATHKIT_H17_FDC_H + +#pragma once + +#include "imagedev/floppy.h" +#include "machine/s2350.h" + + +class heath_h17_fdc_device : public device_t +{ +public: + heath_h17_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + + auto floppy_ram_wp_cb() { return m_floppy_ram_wp.bind(); } + + void write(offs_t reg, u8 val); + u8 read(offs_t reg); + + void side_select_w(int state); + +protected: + static constexpr u8 MAX_FLOPPY_DRIVES = 3; + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + void ctrl_w(u8 val); + u8 floppy_status_r(); + + void set_floppy(floppy_image_device *floppy); + void step_w(int state); + void dir_w(int state); + void set_motor(bool motor_on); + + void sync_character_received(int state); + + TIMER_DEVICE_CALLBACK_MEMBER(tx_timer_cb); + + devcb_write_line m_floppy_ram_wp; + + required_device m_s2350; + required_device_array m_floppies; + required_device m_tx_timer; + + bool m_motor_on; + bool m_write_gate; + bool m_sync_char_received; + u8 m_step_direction; + u8 m_side; + + floppy_image_device *m_floppy; + + /// write bit control port + static constexpr u8 CTRL_WRITE_GATE = 0; + static constexpr u8 CTRL_DRIVE_SELECT_0 = 1; + static constexpr u8 CTRL_DRIVE_SELECT_1 = 2; + static constexpr u8 CTRL_DRIVE_SELECT_2 = 3; + static constexpr u8 CTRL_MOTOR_ON = 4; // Controls all the drives + static constexpr u8 CTRL_DIRECTION = 5; // (0 = out) + static constexpr u8 CTRL_STEP_COMMAND = 6; // (Active high) + static constexpr u8 CTRL_WRITE_ENABLE_RAM = 7; // 0 - write protected + + // USRT clock + static constexpr XTAL USRT_BASE_CLOCK = XTAL(12'288'000) / 6 / 16; + static constexpr u32 USRT_TX_CLOCK = USRT_BASE_CLOCK.value(); +}; + + +DECLARE_DEVICE_TYPE(HEATH_H17_FDC, heath_h17_fdc_device) + + +#endif // MAME_HEATHKIT_H17_FDC_H diff -Nru mame-0.263+dfsg.1/src/mame/heathkit/h19.cpp mame-0.264+dfsg.1/src/mame/heathkit/h19.cpp --- mame-0.263+dfsg.1/src/mame/heathkit/h19.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/heathkit/h19.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,6 +14,9 @@ #include "tlb.h" #include "bus/rs232/rs232.h" +#include "h19.lh" + + namespace { class h19_state : public driver_device @@ -45,6 +48,8 @@ void h19_state::h19(machine_config &config) { + config.set_default_layout(layout_h19); + HEATH_TLB_CONNECTOR(config, m_tlbc, tlb_options, "heath"); m_tlbc->serial_data_callback().set("dte", FUNC(rs232_port_device::write_txd)); m_tlbc->dtr_callback().set("dte", FUNC(rs232_port_device::write_dtr)); diff -Nru mame-0.263+dfsg.1/src/mame/heathkit/h89.cpp mame-0.264+dfsg.1/src/mame/heathkit/h89.cpp --- mame-0.263+dfsg.1/src/mame/heathkit/h89.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/heathkit/h89.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -56,6 +56,9 @@ #include "softlist_dev.h" +#include "h89.lh" + + // Single Step #define LOG_SS (1U << 1) @@ -401,10 +404,10 @@ PORT_DIPUNUSED_DIPLOC(0x04, 0x00, "SW501:3") PORT_DIPUNUSED_DIPLOC(0x08, 0x00, "SW501:4") PORT_DIPUNUSED_DIPLOC(0x10, 0x00, "SW501:5") - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0xc0, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7,8") + PORT_DIPNAME( 0xc0, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7,8") PORT_DIPSETTING( 0x00, "9600" ) PORT_DIPSETTING( 0x40, "19200" ) PORT_DIPSETTING( 0x80, "38400" ) @@ -423,91 +426,91 @@ PORT_START("SW501") // Generic definition - PORT_DIPNAME( 0x01, 0x00, "Switch 0" ) PORT_DIPLOCATION("SW501:1") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x01, 0x00, "Switch 0" ) PORT_DIPLOCATION("SW501:1") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "Switch 1" ) PORT_DIPLOCATION("SW501:2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x02, 0x00, "Switch 1" ) PORT_DIPLOCATION("SW501:2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, "Switch 2" ) PORT_DIPLOCATION("SW501:3") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x04, 0x00, "Switch 2" ) PORT_DIPLOCATION("SW501:3") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "Switch 3" ) PORT_DIPLOCATION("SW501:4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x08, 0x00, "Switch 3" ) PORT_DIPLOCATION("SW501:4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, "Switch 4" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x10, 0x00, "Switch 4" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Switch 5" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x20, 0x20, "Switch 5" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, "Switch 6" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x40, 0x00, "Switch 6" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, "Switch 7" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) + PORT_DIPNAME( 0x80, 0x00, "Switch 7" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) // MTR-90 (444-84 or 444-142) - PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x00, "H-88-1 (Not yet implemented)" ) PORT_DIPSETTING( 0x01, "H/Z-47 (Not yet implemented)" ) PORT_DIPSETTING( 0x02, "Z-67 (Not yet implemented)" ) PORT_DIPSETTING( 0x03, "Undefined" ) - PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x00, "H-89-37" ) PORT_DIPSETTING( 0x04, "H/Z-47 (Not yet implemented)" ) PORT_DIPSETTING( 0x08, "Z-67 (Not yet implemented)" ) PORT_DIPSETTING( 0x0c, "Undefined" ) - PORT_DIPNAME( 0x10, 0x00, "Primary Boot from" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x10, 0x00, "Primary Boot from" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x00, "Disk I/O #2" ) PORT_DIPSETTING( 0x10, "Disk I/O #1" ) - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x40, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x00, "9600" ) PORT_DIPSETTING( 0x40, "19200" ) - PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) + PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x04) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x80, "Auto" ) // MTR-89 (444-62) - PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x00, "H-88-1" ) PORT_DIPSETTING( 0x01, "H/Z-47" ) PORT_DIPSETTING( 0x02, "Undefined" ) PORT_DIPSETTING( 0x03, "Undefined" ) - PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x00, "Unused" ) PORT_DIPSETTING( 0x04, "H/Z-47" ) PORT_DIPSETTING( 0x08, "Undefined" ) PORT_DIPSETTING( 0x0c, "Undefined" ) - PORT_DIPNAME( 0x10, 0x00, "Primary Boot from" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x10, 0x00, "Primary Boot from" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x00, "Disk I/O #2" ) PORT_DIPSETTING( 0x10, "Disk I/O #1" ) - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x40, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x00, "9600" ) PORT_DIPSETTING( 0x40, "19200" ) - PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) + PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x08) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x80, "Auto" ) // MMS 444-84B (and possibly 444-84A) - PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) + PORT_DIPNAME( 0x03, 0x00, "Disk I/O #2" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) PORT_DIPSETTING( 0x00, "H-88-1" ) PORT_DIPSETTING( 0x01, "H/Z-47 (Not yet implemented)" ) PORT_DIPSETTING( 0x02, "MMS 77320 SASI or Z-67 (Not yet implemented)" ) PORT_DIPSETTING( 0x03, "MMS 77422 Network Controller" ) - PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) + PORT_DIPNAME( 0x0c, 0x00, "Disk I/O #1" ) PORT_DIPLOCATION("SW501:3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) PORT_DIPSETTING( 0x00, "H-89-37" ) PORT_DIPSETTING( 0x04, "H/Z-47 (Not yet implemented)" ) PORT_DIPSETTING( 0x08, "MMS 77320 SASI or Z-67 (Not yet implemented)" ) PORT_DIPSETTING( 0x0c, "MMS 77422 Network Controller" ) - PORT_DIPNAME( 0x70, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:5,6,7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) + PORT_DIPNAME( 0x70, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:5,6,7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) PORT_DIPSETTING( 0x00, "MMS 77316 Dbl Den 5\"" ) PORT_DIPSETTING( 0x10, "MMS 77316 Dbl Den 8\"" ) PORT_DIPSETTING( 0x20, "Disk Device at 0x7C" ) @@ -516,12 +519,12 @@ PORT_DIPSETTING( 0x50, "reserved for future use" ) PORT_DIPSETTING( 0x60, "MMS Network (77422)" ) PORT_DIPSETTING( 0x70, "Use MMS I/O board Config Port" ) - PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) + PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x0c) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x80, "Auto" ) // Kres KMR-100 - PORT_DIPNAME( 0x0f, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2,3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) + PORT_DIPNAME( 0x0f, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2,3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) PORT_DIPSETTING( 0x00, "H-17 hard-sectored 5\" floppy units 0-2" ) PORT_DIPSETTING( 0x01, "H-37 soft-sectored 5\" floppy units 0-3" ) PORT_DIPSETTING( 0x02, "Corvus hard disk/Magnolia interface, partitions 0-8" ) @@ -538,22 +541,22 @@ PORT_DIPSETTING( 0x0d, "Reserved" ) PORT_DIPSETTING( 0x0e, "Reserved" ) PORT_DIPSETTING( 0x0f, "Magnolia 128K pseudo disk, banks 0-1" ) - PORT_DIPNAME( 0x10, 0x00, "Map ROM into RAM on boot" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) + PORT_DIPNAME( 0x10, 0x00, "Map ROM into RAM on boot" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPSETTING( 0x10, DEF_STR( No ) ) - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x00, "Have a LLL controller installed" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) + PORT_DIPNAME( 0x40, 0x00, "Have a LLL controller installed" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) + PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x10) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x80, "Auto" ) // Ultimeth MTRHEX-4k // (values based on testing and comparison with the Kres KMR-100 ROM which was also written by Ultimeth) - PORT_DIPNAME( 0x0f, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2,3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) + PORT_DIPNAME( 0x0f, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2,3,4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) PORT_DIPSETTING( 0x00, "H-17 hard-sectored 5\" floppy" ) PORT_DIPSETTING( 0x01, "H-37 soft-sectored 5\" floppy" ) PORT_DIPSETTING( 0x02, "? Corvus hard disk/Magnolia interface" ) @@ -570,35 +573,35 @@ PORT_DIPSETTING( 0x0d, "? Reserved" ) PORT_DIPSETTING( 0x0e, "? Reserved" ) PORT_DIPSETTING( 0x0f, "? Magnolia 128K pseudo disk" ) - PORT_DIPNAME( 0x10, 0x00, "? Map ROM into RAM on boot" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) + PORT_DIPNAME( 0x10, 0x00, "? Map ROM into RAM on boot" ) PORT_DIPLOCATION("SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) PORT_DIPSETTING( 0x00, "? Yes" ) PORT_DIPSETTING( 0x10, "? No" ) - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x00, "? Have a LLL controller installed" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) + PORT_DIPNAME( 0x40, 0x00, "? Have a LLL controller installed" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) PORT_DIPSETTING( 0x00, "? No" ) PORT_DIPSETTING( 0x40, "? Yes" ) - PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) + PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x14) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x80, "Auto" ) // Ultimeth MTRHEX-2k - PORT_DIPNAME( 0x03, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPNAME( 0x03, 0x00, "Default Boot Device" ) PORT_DIPLOCATION("SW501:1,2") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) PORT_DIPSETTING( 0x00, "H-17 hard-sectored 5\" floppy" ) PORT_DIPSETTING( 0x01, "H-47 8\" floppy at port 0x78/0170" ) PORT_DIPSETTING( 0x02, "H-47 8\" floppy at port 0x7c/0174" ) PORT_DIPSETTING( 0x03, "Magnolia 5\"/8\" double density floppy" ) - PORT_DIPUNUSED_DIPLOC(0x04, 0x00, "SW501:3") - PORT_DIPUNUSED_DIPLOC(0x08, 0x00, "SW501:4") - PORT_DIPUNUSED_DIPLOC(0x10, 0x00, "SW501:5") - PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPUNUSED_DIPLOC(0x04, 0x00, "SW501:3") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPUNUSED_DIPLOC(0x08, 0x00, "SW501:4") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPUNUSED_DIPLOC(0x10, 0x00, "SW501:5") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("SW501:6") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPNAME( 0x40, 0x00, "Boot mode" ) PORT_DIPLOCATION("SW501:7") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x40, "Auto" ) - PORT_DIPNAME( 0x80, 0x00, "Baud Rate" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) + PORT_DIPNAME( 0x80, 0x00, "Baud Rate" ) PORT_DIPLOCATION("SW501:8") PORT_CONDITION("CONFIG", 0x3c, EQUALS, 0x18) PORT_DIPSETTING( 0x00, "9600" ) PORT_DIPSETTING( 0x80, "19200" ) @@ -834,6 +837,8 @@ void h89_base_state::h89_base(machine_config &config) { + config.set_default_layout(layout_h89); + // basic machine hardware Z80(config, m_maincpu, H89_CLOCK); m_maincpu->set_m1_map(&h89_base_state::map_fetch); diff -Nru mame-0.263+dfsg.1/src/mame/heathkit/tlb.cpp mame-0.264+dfsg.1/src/mame/heathkit/tlb.cpp --- mame-0.263+dfsg.1/src/mame/heathkit/tlb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/heathkit/tlb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1074,7 +1074,7 @@ // MC 6845 uses a character clock, divide the DOT clock by 8. MC6845(config, m_crtc, BASE_DOT_CLOCK / 8); m_crtc->set_screen("screen"); - m_crtc->set_show_border_area(true); + m_crtc->set_show_border_area(false); m_crtc->set_char_width(8); m_crtc->set_update_row_callback(FUNC(heath_tlb_device::crtc_update_row)); // frame pulse diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/academy.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/academy.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/academy.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/academy.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -41,13 +41,13 @@ class academy_state : public driver_device { public: - academy_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_led_pwm(*this, "led_pwm") - , m_outlatch(*this, "outlatch") - , m_keys(*this, "KEY") + academy_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_led_pwm(*this, "led_pwm"), + m_outlatch(*this, "outlatch"), + m_keys(*this, "KEY") { } void academy(machine_config &config); @@ -114,7 +114,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TRAIN") PORT_CODE(KEYCODE_T) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/amsterdam.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/amsterdam.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/amsterdam.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/amsterdam.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -58,7 +58,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_keys; required_ioport m_reset; @@ -147,7 +147,7 @@ static INPUT_PORTS_START( amsterdam ) PORT_START("KEY.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/berlin.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/berlin.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/berlin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/berlin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -33,13 +33,13 @@ class berlin_state : public driver_device { public: - berlin_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG) - , m_board(*this, "board") - , m_display(*this, "display") - , m_keys(*this, "KEY") + berlin_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG), + m_board(*this, "board"), + m_display(*this, "display"), + m_keys(*this, "KEY") { } void berlin(machine_config &config); diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/brikett.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/brikett.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/brikett.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/brikett.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -131,7 +131,7 @@ optional_device m_board; required_device m_display; optional_device m_led_pwm; - required_device m_dac; + required_device m_dac; required_device m_speaker_off; optional_ioport_array<4+2> m_inputs; @@ -409,7 +409,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("INFO") PORT_MODIFY("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("POS") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("POS") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left / Black / 9") PORT_MODIFY("IN.3") diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/europa.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/europa.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/europa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/europa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -66,7 +66,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<3> m_inputs; u16 m_inp_mux = 0; @@ -144,7 +144,7 @@ static INPUT_PORTS_START( europa ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("PLAY") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("POS") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("POS") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MEM") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENT") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("White / Black") diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/glasgow.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/glasgow.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/glasgow.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/glasgow.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -68,7 +68,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_keys; u8 m_kp_mux = 0; @@ -150,7 +150,7 @@ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E / 5 / Rook") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right / White / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RIGHT) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H / 8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G / 7 / King") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/milano.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/milano.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/milano.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/milano.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,13 +34,13 @@ class milano_state : public driver_device { public: - milano_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_display(*this, "display") - , m_led_pwm(*this, "led_pwm") - , m_keys(*this, "KEY") + milano_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_led_pwm(*this, "led_pwm"), + m_keys(*this, "KEY") { } void milano(machine_config &config); @@ -147,7 +147,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Training / Pawn") PORT_CODE(KEYCODE_T) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Info / Knight") PORT_CODE(KEYCODE_I) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Memory / Bishop") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Position / Rook") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Position / Rook") PORT_CODE(KEYCODE_P) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Level / Queen") PORT_CODE(KEYCODE_L) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Enter / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/mm1.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/mm1.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/mm1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/mm1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,7 +82,7 @@ // devices/pointers required_device m_maincpu; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; bool m_reset = false; @@ -193,7 +193,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E / 5 / Rook") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("INFO") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right / White / 0") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("POS") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("POS") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H / 8") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LEV") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G / 7 / King") diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/mm2.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/mm2.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/mm2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/mm2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -267,7 +267,7 @@ static INPUT_PORTS_START( mm2 ) PORT_START("KEY.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) @@ -312,7 +312,7 @@ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("BEST") PORT_CODE(KEYCODE_S) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MON") PORT_CODE(KEYCODE_N) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/modena.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/modena.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/modena.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/modena.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -38,14 +38,14 @@ class modena_state : public driver_device { public: - modena_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_display(*this, "display") - , m_led_pwm(*this, "led_pwm") - , m_dac(*this, "dac") - , m_keys(*this, "KEY") + modena_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_led_pwm(*this, "led_pwm"), + m_dac(*this, "dac"), + m_keys(*this, "KEY") { } void modena(machine_config &config); @@ -58,7 +58,7 @@ required_device m_board; required_device m_display; required_device m_led_pwm; - required_device m_dac; + required_device m_dac; required_ioport m_keys; u8 m_board_mux = 0; @@ -154,7 +154,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Book / Pawn") PORT_CODE(KEYCODE_B) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Info / Knight") PORT_CODE(KEYCODE_I) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Memory / Bishop") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Position / Rook") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Position / Rook") PORT_CODE(KEYCODE_P) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Level / Queen") PORT_CODE(KEYCODE_L) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Enter / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,13 +39,13 @@ class mondial_state : public driver_device { public: - mondial_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_led_pwm(*this, "led_pwm") - , m_beeper(*this, "beeper") - , m_keys(*this, "KEY.%u", 0) + mondial_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_led_pwm(*this, "led_pwm"), + m_beeper(*this, "beeper"), + m_keys(*this, "KEY.%u", 0) { } void mondial(machine_config &config); @@ -148,7 +148,7 @@ PORT_START("KEY.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PLAY") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial2.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial2.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -31,13 +31,13 @@ class mondial2_state : public driver_device { public: - mondial2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_led_pwm(*this, "led_pwm") - , m_dac(*this, "dac") - , m_keys(*this, "KEY.%u", 0) + mondial2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_led_pwm(*this, "led_pwm"), + m_dac(*this, "dac"), + m_keys(*this, "KEY.%u", 0) { } void mondial2(machine_config &config); @@ -49,7 +49,7 @@ required_device m_maincpu; required_device m_board; required_device m_led_pwm; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_keys; u8 m_keypad_mux = 0; @@ -155,7 +155,7 @@ PORT_START("KEY.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PLAY") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial68k.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial68k.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/mondial68k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/mondial68k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,15 +39,15 @@ class mondial68k_state : public driver_device { public: - mondial68k_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_lcd_latch(*this, "lcd_latch") - , m_led_pwm(*this, "led_pwm") - , m_lcd(*this, "lcd") - , m_inputs(*this, "IN.%u", 0) - , m_digits(*this, "digit%u", 0U) + mondial68k_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_lcd_latch(*this, "lcd_latch"), + m_led_pwm(*this, "led_pwm"), + m_lcd(*this, "lcd"), + m_inputs(*this, "IN.%u", 0), + m_digits(*this, "digit%u", 0U) { } void mondial68k(machine_config &config); @@ -178,7 +178,7 @@ PORT_START("IN.3") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D / 4 / Bishop") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H / 8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine ENT/CL for NEW GAME PORT_START("CLICKABLE") // helper for clickable artwork diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/montec.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/montec.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/montec.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/montec.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -42,15 +42,15 @@ class montec_state : public driver_device { public: - montec_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_lcd_latch(*this, "lcd_latch") - , m_led_pwm(*this, "led_pwm") - , m_lcd(*this, "lcd%u", 0) - , m_keys(*this, "KEY.%u", 0) - , m_digits(*this, "digit%u", 0U) + montec_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_lcd_latch(*this, "lcd_latch"), + m_led_pwm(*this, "led_pwm"), + m_lcd(*this, "lcd%u", 0), + m_keys(*this, "KEY.%u", 0), + m_digits(*this, "digit%u", 0U) { } void montec(machine_config &config); @@ -151,7 +151,7 @@ static INPUT_PORTS_START( montec ) PORT_START("KEY.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("BOOK / 9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_B) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/polgar.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/polgar.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/polgar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/polgar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -33,10 +33,10 @@ class polgar_state : public driver_device { public: - polgar_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_keys(*this, "KEY") + polgar_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_keys(*this, "KEY") { } void polgar10(machine_config &config); @@ -92,7 +92,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TRN / Pawn") PORT_CODE(KEYCODE_T) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO / Knight") PORT_CODE(KEYCODE_I) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM / Bishop") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / Rook") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / Rook") PORT_CODE(KEYCODE_P) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV / Queen") PORT_CODE(KEYCODE_L) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/risc.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/risc.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/risc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/risc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -36,12 +36,12 @@ class risc_state : public driver_device { public: - risc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_chessm(*this, "chessm") - , m_rombank(*this, "rombank") - , m_keys(*this, "KEY") + risc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_chessm(*this, "chessm"), + m_rombank(*this, "rombank"), + m_keys(*this, "KEY") { } void mrisc(machine_config &config); @@ -128,7 +128,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TRN / Pawn") PORT_CODE(KEYCODE_T) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO / Knight") PORT_CODE(KEYCODE_I) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM / Bishop") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / Rook") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / Rook") PORT_CODE(KEYCODE_P) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV / Queen") PORT_CODE(KEYCODE_L) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT / King") PORT_CODE(KEYCODE_F) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT / New Game") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_F1) // combine for NEW GAME diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/roma2.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/roma2.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/roma2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/roma2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -63,7 +63,7 @@ required_device m_outlatch; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_inputs; optional_ioport m_reset; @@ -130,7 +130,7 @@ static INPUT_PORTS_START( montreal ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) @@ -186,7 +186,7 @@ HC259(config, m_outlatch); // Q0-Q3: input mux; Q4: strobe; Q6-Q7: DAC m_outlatch->q_out_cb<4>().set(m_display, FUNC(mephisto_display1_device::strobe_w)); - m_outlatch->parallel_out_cb().set(m_dac, FUNC(dac_byte_interface::write)).rshift(6).mask(3); + m_outlatch->parallel_out_cb().set(m_dac, FUNC(dac_2bit_ones_complement_device::write)).rshift(6).mask(3); MEPHISTO_SENSORS_BOARD(config, m_board); m_board->set_delay(attotime::from_msec(200)); diff -Nru mame-0.263+dfsg.1/src/mame/hegenerglaser/smondial.cpp mame-0.264+dfsg.1/src/mame/hegenerglaser/smondial.cpp --- mame-0.263+dfsg.1/src/mame/hegenerglaser/smondial.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/hegenerglaser/smondial.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -48,16 +48,16 @@ class smondialb_state : public driver_device { public: - smondialb_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_board(*this, "board") - , m_lcd_latch(*this, "lcd_latch") - , m_led_pwm(*this, "led_pwm") - , m_lcd(*this, "lcd%u", 0) - , m_dac(*this, "dac") - , m_keys(*this, "KEY.%u", 0) - , m_digits(*this, "digit%u", 0U) + smondialb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_lcd_latch(*this, "lcd_latch"), + m_led_pwm(*this, "led_pwm"), + m_lcd(*this, "lcd%u", 0), + m_dac(*this, "dac"), + m_keys(*this, "KEY.%u", 0), + m_digits(*this, "digit%u", 0U) { } // machine configs @@ -74,7 +74,7 @@ required_device m_lcd_latch; required_device m_led_pwm; required_device_array m_lcd; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_keys; output_finder<8> m_digits; @@ -102,6 +102,7 @@ save_item(NAME(m_board_mux)); } + // Super Mondial A class smondiala_state : public smondialb_state @@ -235,7 +236,7 @@ PORT_START("KEY.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Knight / 2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("King / 6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_O) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_P) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L) PORT_START("KEY.2") @@ -263,7 +264,7 @@ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_MODIFY("KEY.2") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P) PORT_MODIFY("KEY.3") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M) diff -Nru mame-0.263+dfsg.1/src/mame/homebrew/lft_phasor.cpp mame-0.264+dfsg.1/src/mame/homebrew/lft_phasor.cpp --- mame-0.263+dfsg.1/src/mame/homebrew/lft_phasor.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/homebrew/lft_phasor.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -86,8 +86,8 @@ void lft_phasor_state::port_b_w(uint8_t data) { - m_gpio_b = data; video_update(); + m_gpio_b = data; } //************************************************************************** diff -Nru mame-0.263+dfsg.1/src/mame/homebrew/pc532.cpp mame-0.264+dfsg.1/src/mame/homebrew/pc532.cpp --- mame-0.263+dfsg.1/src/mame/homebrew/pc532.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/homebrew/pc532.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,7 +10,6 @@ * - https://www.nic.funet.fi/pub/misc/pc532/ * * TODO: - * - ns32381 * - et532 * * WIP: @@ -47,7 +46,7 @@ pc532_state(machine_config const &mconfig, device_type type, char const *tag) : driver_device(mconfig, type, tag) , m_cpu(*this, "cpu") - //, m_fpu(*this, "fpu") + , m_fpu(*this, "fpu") , m_icu(*this, "icu") , m_rtc(*this, "rtc") , m_ncr5380(*this, "slot:7:ncr5380") @@ -61,7 +60,6 @@ { } - void init(); void pc532(machine_config &config); protected: @@ -71,7 +69,7 @@ template void cpu_map(address_map &map); required_device m_cpu; - //required_device m_fpu; + required_device m_fpu; required_device m_icu; required_device m_rtc; @@ -113,12 +111,6 @@ m_state; }; -void pc532_state::init() -{ - // HACK: disable unemulated FPU - m_eprom[0x7c00 >> 2] &= ~0x02; -} - void pc532_state::machine_start() { // install phantom rtc using memory taps @@ -312,8 +304,8 @@ // ODT required because system software uses explicit MOV instead of RETI instructions m_cpu->set_addrmap(ns32000::ST_ODT, &pc532_state::cpu_map); - //NS32381(config, m_fpu, 50_MHz_XTAL / 2); - //m_cpu->set_fpu(m_fpu); + NS32381(config, m_fpu, 50_MHz_XTAL / 2); + m_cpu->set_fpu(m_fpu); NS32202(config, m_icu, 3.6864_MHz_XTAL); m_icu->out_int().set_inputline(m_cpu, INPUT_LINE_IRQ0).invert(); @@ -327,7 +319,7 @@ NSCSI_CONNECTOR(config, "slot:1", scsi_devices, nullptr, false); NSCSI_CONNECTOR(config, "slot:2", scsi_devices, nullptr, false); NSCSI_CONNECTOR(config, "slot:3", scsi_devices, nullptr, false); - NSCSI_CONNECTOR(config, "slot:7").option_set("ncr5380", NCR5380).machine_config( + NSCSI_CONNECTOR(config, "slot:7").option_set("ncr5380", NCR5380).machine_config( // DP8490 [this](device_t *device) { ncr5380_device &ncr5380(downcast(*device)); @@ -412,5 +404,5 @@ } // anonymous namespace -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP(1989, pc532, 0, 0, pc532, 0, pc532_state, init, "George Scolaro", "pc532", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP(1989, pc532, 0, 0, pc532, 0, pc532_state, empty_init, "George Scolaro", "pc532", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW) diff -Nru mame-0.263+dfsg.1/src/mame/homebrew/uzebox.cpp mame-0.264+dfsg.1/src/mame/homebrew/uzebox.cpp --- mame-0.263+dfsg.1/src/mame/homebrew/uzebox.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/homebrew/uzebox.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -128,7 +128,7 @@ uint8_t uzebox_state::port_a_r() { - return m_port_a | 0xf0; + return m_port_a | 0xf0; } void uzebox_state::port_b_w(uint8_t data) diff -Nru mame-0.263+dfsg.1/src/mame/igs/goldstar.cpp mame-0.264+dfsg.1/src/mame/igs/goldstar.cpp --- mame-0.263+dfsg.1/src/mame/igs/goldstar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/igs/goldstar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16889,11 +16889,10 @@ /* Animal House (set 3). Strings "CHERRY 1994" on program ROM. Clone of Super Cherry Master. Hardware: -GoldStar Z8400B PS - -Two 32-pin DIP chips (AU1 and AU2) with their surface scratched out. -12.000 MHz xtal. -Sound: 95101 (AY8910 compatible). -4 banks of 8 DIP switches. - Video directly recorded from the PCB: https://youtu.be/3xV_LJJ46IM + Video directly recorded from the PCB: https://youtu.be/fAx1wuwCqWA */ ROM_START( animalhsb ) ROM_REGION( 0x10000, "maincpu", 0 ) @@ -16905,12 +16904,43 @@ ROM_REGION( 0x40000, "gfx2", 0 ) ROM_LOAD( "3_am27c020.u66", 0x00000, 0x40000, CRC(6e81b70d) SHA1(3e3c63ae7200f8f98cbaf999be4ae9d854b90a8e) ) + // Sockets AU1 and AU2 unpopulated + + ROM_REGION( 0x00200, "plds", 0 ) + ROM_LOAD( "galce16v8a.u18", 0x00000, 0x00117, CRC(12998a17) SHA1(080b04d5d756428a870c67aad57f4dace5447320) ) + ROM_LOAD( "palce16v8h.u8", 0x00000, 0x00117, CRC(c8f1c706) SHA1(d91ab228a6effda76b7112b141c7afc1f7d141b2) ) + ROM_LOAD( "palce16v8h.u7", 0x00000, 0x00117, CRC(b9d6b3a0) SHA1(0cf0f84f30a03ff3e0bb3f30bcb60cc519cac0f5) ) + ROM_LOAD( "palce16v8h.u44", 0x00000, 0x00117, CRC(fdbdb9de) SHA1(5bb6c960c3adcc6fc03cc457783c00b61d9fcadf) ) + ROM_LOAD( "palce20v8h.u45", 0x00000, 0x00157, CRC(a187d5a1) SHA1(344eb67fe9c3214b445c1118dcde36040920edd2) ) +ROM_END + +/* Animal House (set 4). Strings "CHERRY 1994" on program ROM. Clone of Super Cherry Master. + Hardware: + -GoldStar Z8400B PS + -12.000 MHz xtal. + -Sound: 95101 (AY8910 compatible). + -4 banks of 8 DIP switches. +*/ +ROM_START( animalhsc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2_27c256.u10n", 0x00000, 0x08000, CRC(2ab7d75d) SHA1(53cebed677e1b7f57e07cea53357d5a9516ea22a) ) // same as 'animalhsb' + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "1_27c010a.u65", 0x00000, 0x20000, CRC(98bd34b6) SHA1(e3ff6536eb421ed2e2f5d4354099078ba4ae5671) ) // same as 'animalhsb' and 'scmaster' + + ROM_REGION( 0x40000, "gfx2", 0 ) + ROM_LOAD( "3_am27c020.u66", 0x00000, 0x40000, CRC(6e81b70d) SHA1(3e3c63ae7200f8f98cbaf999be4ae9d854b90a8e) ) // same as 'animalhsb' + + ROM_REGION( 0x60000, "unknown", 0 ) + ROM_LOAD( "am27c020.au1", 0x00000, 0x40000, CRC(3dca81dd) SHA1(8f77bc93174ece682ac12f6d4a6148ea8ca53f4d) ) + ROM_LOAD( "am27c010.au2", 0x40000, 0x20000, CRC(4533b543) SHA1(eb9b83f35f1d3a51272faaf3a19539c412f94e38) ) + ROM_REGION( 0x00200, "plds", 0 ) - ROM_LOAD( "palce16v8h.u18", 0x00000, 0x00117, NO_DUMP ) - ROM_LOAD( "palce16v8h.u8", 0x00000, 0x00117, NO_DUMP ) - ROM_LOAD( "palce16v8h.u7", 0x00000, 0x00117, NO_DUMP ) - ROM_LOAD( "palce16v8h.u44", 0x00000, 0x00117, NO_DUMP ) - ROM_LOAD( "gal20v8.u44", 0x00000, 0x00157, NO_DUMP ) + ROM_LOAD( "palce16v8h.u18", 0x00000, 0x00117, CRC(a9f2150e) SHA1(2e33dff5a81880462633fc5de0b967960d7e277a) ) + ROM_LOAD( "palce16v8h.u8", 0x00000, 0x00117, CRC(f766c473) SHA1(9a8799ccc423c2e88ac73647da66aceeed183237) ) + ROM_LOAD( "palce16v8h.u7", 0x00000, 0x00117, CRC(a9f2150e) SHA1(2e33dff5a81880462633fc5de0b967960d7e277a) ) + ROM_LOAD( "gal16v8c.u44", 0x00000, 0x00117, CRC(93cf21df) SHA1(84e4b2084cb98b916c51950245b1684b12b1b215) ) + ROM_LOAD( "gal20v8as.u45", 0x00000, 0x00157, CRC(a768904a) SHA1(7cd0165e152b46aff1f441f6c55c70efd82559bc) ) ROM_END @@ -20566,8 +20596,8 @@ GAME( 1996, roypok96c, roypok96, amcoe2, roypok96a, cmaster_state, init_rp96sub, ROT0, "Amcoe", "Royal Poker '96 (set 4, C3 board)", MACHINE_NOT_WORKING ) -/* these all appear to be graphic hacks of 'New Fruit Bonus '96', they can run with the same program ROM - some sets are messy and appear to have mismatched graphic roms, they need to be sorted out properly +/* These all appear to be graphic hacks of 'New Fruit Bonus '96', they can run with the same program ROM + some sets are messy and appear to have mismatched graphic roms, they need to be sorted out properly. */ // YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS GAME( 1996, nfb96se, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "New Fruit Bonus '96 Special Edition (bootleg set 1, v97-3.3c Portuguese)", 0 ) @@ -20582,10 +20612,10 @@ GAME( 2003, nfma, nfm, nfm, nfm, cmaster_state, empty_init, ROT0, "Ming-Yang Electronic", "New Fruit Machine (Ming-Yang Electronic, vFB02-01A)", MACHINE_NOT_WORKING ) // vFB02-01A "Copyright By Ms. Liu Orchis 2003/03/06", needs correct PROM and USER1 regions decode -// super cherry master sets... +// Super Cherry Master sets... GAMEL(1994, scmaster, 0, unkch, unkch4, unkch_state, init_unkch4, ROT0, "bootleg", "Super Cherry Master (v1.0)", 0, layout_unkch ) - GAMEL(1994, animalhsb, scmaster, unkch, unkch4, unkch_state, init_unkch4, ROT0, "bootleg", "Animal House (set 3)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS, layout_unkch ) +GAMEL(1994, animalhsc, scmaster, unkch, unkch4, unkch_state, init_unkch4, ROT0, "bootleg", "Animal House (set 4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS, layout_unkch ) // these have 'cherry 1994' in the program roms, but also "Super Cherry / New Cherry Gold '99". Probably hacks of a 1994 version of Super Cherry Master. GAMEL(1999, unkch1, scmaster, unkch, unkch, unkch_state, init_unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", 0, layout_unkch ) diff -Nru mame-0.263+dfsg.1/src/mame/igs/igs017.cpp mame-0.264+dfsg.1/src/mame/igs/igs017.cpp --- mame-0.263+dfsg.1/src/mame/igs/igs017.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/igs/igs017.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,25 +11,26 @@ Other: IGS025 (8255), IGS022 (protection, MCU), IGS029 (protection) Sound: M6295(K668/AR17961) + [YM2413(U3567)] --------------------------------------------------------------------------------------------------------- -Year + Game PCB CPU Sound Custom Other --------------------------------------------------------------------------------------------------------- -96 Shuzi Leyuan (V127M) NO-0131-4 Z180 AR17961 U3567 IGS017 8255 Battery -97 Chaoji Da Man Guan II (V754C) NO-0147-6 68000 K668 IGS031 8255 Battery -97 Tian Jiang Shen Bing (V137C) NO-0157-2 Z180 AR17961 U3567 IGS017 IGS025 Battery -97 Man Guan Daheng (V123T1) NO-0252 68000 M6295 IGS031 IGS025 IGS???* Battery -98 Genius 6 (V110F) NO-0131-4 Z180 K668 U3567 IGS017 IGS003c Battery -98 Long Hu Zhengba 2 (set 1) NO-0206 68000 K668 IGS031 IGS025 IGS022* Battery -98 Shuang Long Qiang Zhu 2 VS (VS203J) NO-0207 68000 K668 IGS031 IGS025 IGS022 Battery -98 Man Guan Caishen (V103CS) NO-0192-1 68000 K668 IGS017 IGS025 IGS029 Battery -99 Tarzan (V107) NO-0228? Z180 U6295 IGS031 IGS025 IGS029 Battery -99 Tarzan (V109C) NO-0248-1 Z180 U6295 IGS031 IGS025 Battery -00? Super Tarzan (V100I) NO-0230-1 Z180 K668 IGS031 IGS025 Battery -00? Happy Skill (V611IT) NO-0281 Z180 K668 IGS031 IGS025 Battery -00? Champion Poker 2 (V100A) unreadable Z180 M6295 IGS031 IGS025 Battery -00? Super Poker (V100xD03) / Formosa NO-0187 Z180 K668 U3567 IGS017 IGS025 Battery --------------------------------------------------------------------------------------------------------- - not present in another set * +------------------------------------------------------------------------------------------------------------- +Year + Game PCB CPU Sound Custom Other +------------------------------------------------------------------------------------------------------------- +96 Shuzi Leyuan (V127M) NO-0131-4 Z180 AR17961 U3567 IGS017 8255 Battery +97 Chaoji Damanguan II (V754C) NO-0147-6 68000 K668 IGS031 8255 Battery +97 Tian Jiang Shen Bing (V137C) NO-0157-2 Z180 AR17961 U3567 IGS017 IGS025 Battery +97 Manguan Daheng (V123T1) NO-0252 68000 M6295 IGS031 IGS025 IGS???* Battery +98 Genius 6 (V110F) NO-0131-4 Z180 K668 U3567 IGS017 IGS003c Battery +98 Long Hu Zhengba 2 (set 1) NO-0206 68000 K668 IGS031 IGS025 IGS022* Battery +98 Shuang Long Qiang Zhu 2 VS (VS203J) NO-0207 68000 K668 IGS031 IGS025 IGS022 Battery +98 Manguan Caishen (V103CS) NO-0192-1 68000 K668 IGS017 IGS025 IGS029 Battery +99 Tarzan (V107) NO-0228? Z180 U6295 IGS031 IGS025 IGS029 Battery +99 Tarzan (V109C) NO-0248-1 Z180 U6295 IGS031 IGS025 Battery +00 Chaoji Damanguan 2 - Jiaqiang Ban (V100C) NO-0271 68000 K668 IGS031 IGS025 Battery +00? Super Tarzan (V100I) NO-0230-1 Z180 K668 IGS031 IGS025 Battery +00? Happy Skill (V611IT) NO-0281 Z180 K668 IGS031 IGS025 Battery +00? Champion Poker 2 (V100A) unreadable Z180 M6295 IGS031 IGS025 Battery +00? Super Poker (V100xD03) / Formosa NO-0187 Z180 K668 U3567 IGS017 IGS025 Battery +------------------------------------------------------------------------------------------------------------- + not present in another set * To Do: - Protection emulation in some games, instead of patching the roms. @@ -646,6 +647,7 @@ void mgdh(machine_config &config); void mgdha(machine_config &config); void sdmg2(machine_config &config); + void sdmg2p(machine_config &config); void slqz2(machine_config &config); // Init @@ -658,6 +660,7 @@ void init_mgdh(); void init_mgdha(); void init_sdmg2(); + void init_sdmg2p(); void init_slqz2(); void init_spkrform(); void init_starzan(); @@ -805,6 +808,8 @@ u8 sdmg2_keys_joy_r(); void sdmg2_keys_hopper_w(u8 data); + u8 sdmg2p_keys_r(); + void slqz2_sound_hopper_w(u8 data); u8 slqz2_scramble_data_r(); @@ -876,6 +881,8 @@ void mgdha_mux_map(address_map &map); void sdmg2_map(address_map &map); void sdmg2_mux_map(address_map &map); + void sdmg2p_map(address_map &map); + void sdmg2p_mux_map(address_map &map); void slqz2_map(address_map &map); void slqz2_mux_map(address_map &map); void spkrform_io(address_map &map); @@ -1491,6 +1498,34 @@ } } +// sdmg2p + +void igs017_state::init_sdmg2p() +{ + const int rom_size = memregion("maincpu")->bytes(); + u16 * const rom = (u16 *)memregion("maincpu")->base(); + + for (int i = 0; i < rom_size / 2; i++) + { + u16 x = rom[i]; + + // bit 0 xor layer + if (((i & 0x4320 / 2) == (0x0000 / 2)) || ((i & 0x4322 / 2) == (0x0020 / 2)) || ((i & 0x0122 / 2) == (0x0122 / 2)) || ((i & 0x0222 / 2) == (0x0222 / 2)) || ((i & 0x4322 / 2) == (0x4022 / 2))) + x ^= 0x0001; + + // bit 6 xor layer + if ((i & 0x4000 / 2) || (i & 0x0200 / 2) || ((i & 0x4b68 / 2) == (0x0048 / 2)) || ((i & 0x4b40 / 2) == (0x0840 / 2))) + x ^= 0x0040; + + // bit 13 xor layer + if (((i & 0x60000 / 2 ) == (0x00000 / 2)) || ((i & 0x60000 / 2 ) == (0x60000 / 2))) + x ^= 0x2000; + + rom[i] = x; + } + +// m_igs_string->dump("sdmg2p_string.key", 0x7f512, 0x?????, true); +} // mgdh, mgdha @@ -2569,6 +2604,43 @@ // igs_string_mux_map(map); // 0x05 r, 0x20 - 0x27 w, 0x40 r (actually unused except for the game id check?) } +// sdmg2p + +u8 igs017_state::sdmg2p_keys_r() +{ + u8 ret = 0xff; + if (!BIT(m_input_select, 2)) ret &= m_io_key[0]->read(); + if (!BIT(m_input_select, 3)) ret &= m_io_key[1]->read(); + if (!BIT(m_input_select, 4)) ret &= m_io_key[2]->read(); + if (!BIT(m_input_select, 5)) ret &= m_io_key[3]->read(); + if (!BIT(m_input_select, 6)) ret &= m_io_key[4]->read(); + return bitswap<8>(ret, 5, 4, 3, 2, 1, 0, 7, 6); +} + +void igs017_state::sdmg2p_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); + + map(0x100000, 0x103fff).ram(); + + map(0x38d000, 0x38d001).nopr().w(m_igs_mux, FUNC(igs_mux_device::address_w)).umask16(0x00ff); // clr.w dummy read + map(0x38d002, 0x38d003).rw(m_igs_mux, FUNC(igs_mux_device::data_r), FUNC(igs_mux_device::data_w)).umask16(0x00ff); + + map(0xb00000, 0xb0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); + + map(0xb10001, 0xb10001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); +} + +void igs017_state::sdmg2p_mux_map(address_map &map) // TODO: hopper motor w +{ + map.unmap_value_high(); + map(0x00, 0x00).r(FUNC(igs017_state::sdmg2p_keys_r)); + map(0x01, 0x01).portr("JOY"); + map(0x02, 0x02).portr("BUTTONS").w(FUNC(igs017_state::mgdh_keys_hopper_w)); + map(0x03, 0x03).portr("COINS").w(FUNC(igs017_state::mgdh_counter_w)); + + igs_string_mux_map(map); +} // tjsb @@ -3479,6 +3551,153 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +static INPUT_PORTS_START( sdmg2p ) + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) + PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" ) PORT_DIPLOCATION("SW1:3,4") + PORT_DIPSETTING( 0x0c, "10" ) + PORT_DIPSETTING( 0x08, "20" ) + PORT_DIPSETTING( 0x04, "50" ) + PORT_DIPSETTING( 0x00, "100" ) + PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" ) PORT_DIPLOCATION("SW1:5") + PORT_DIPSETTING( 0x10, "2000" ) + PORT_DIPSETTING( 0x00, "29999" ) + PORT_DIPNAME( 0x20, 0x20, "Money Type" ) PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x20, "Coins" ) + PORT_DIPSETTING( 0x00, "Notes" ) + PORT_DIPNAME( 0x40, 0x40, "Pay Out Type" ) PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x40, "Coins" ) + PORT_DIPSETTING( 0x00, "Notes" ) + PORT_DIPNAME( 0x80, 0x80, "Hidden Function" ) PORT_DIPLOCATION("SW1:8") // 隐分功能 (Yǐnfēn Gōngnéng) TODO: determine what this does + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, "Game Title" ) PORT_DIPLOCATION("SW2:1") // 機種名稱 (Jīzhǒng Míngchēng) + PORT_DIPSETTING( 0x01, "Maque Wangchao" ) + PORT_DIPSETTING( 0x00, "Chaoji Damanguan 2 - Jiaqiang Ban" ) // actually abbreviated in 超二加強 (Chāo èr jiāqiáng) + PORT_DIPNAME( 0x02, 0x02, "Double Up Limit" ) PORT_DIPLOCATION("SW2:2") + PORT_DIPSETTING( 0x02, "500" ) + PORT_DIPSETTING( 0x00, "1000" ) + PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x0c, "1" ) + PORT_DIPSETTING( 0x08, "2" ) + PORT_DIPSETTING( 0x04, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x10, 0x10, "Double Up" ) PORT_DIPLOCATION("SW2:5") + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, "Double-up/Continue" ) PORT_DIPLOCATION("SW2:6") // 比倍續玩 TODO: determine what this does + PORT_DIPSETTING( 0x20, "Double Up" ) // 比倍 + PORT_DIPSETTING( 0x00, "Continue Game" ) // 續玩 + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Controls ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x40, "Keyboard" ) + PORT_DIPSETTING( 0x00, DEF_STR( Joystick ) ) + PORT_DIPNAME( 0x80, 0x80, "Number Type" ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, "Number" ) + PORT_DIPSETTING( 0x00, "Tile" ) + + PORT_START("DSW3") + PORT_DIPUNKNOWN_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW3:1" ) + PORT_DIPUNKNOWN_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW3:2" ) + PORT_DIPUNKNOWN_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNKNOWN_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) + PORT_DIPUNKNOWN_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW3:5" ) + PORT_DIPUNKNOWN_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW3:6" ) + PORT_DIPUNKNOWN_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:7" ) + PORT_DIPUNKNOWN_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:8" ) + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + // Joystick mode only?: + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CONDITION("DSW2",0x40,EQUALS,0x00) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW2",0x40,EQUALS,0x40) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Pay Out") PORT_CODE(KEYCODE_O) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) + PORT_SERVICE_NO_TOGGLE( 0x20, IP_ACTIVE_LOW ) // also keep pressed while booting + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("JOY") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START("KEY0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("KEY1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("KEY2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("KEY3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("KEY4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_BIG ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("BUTTONS") + // Joystick mode only: + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CONDITION("DSW2",0x40,EQUALS,0x00) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW2",0x40,EQUALS,0x40) + // Keyboard mode only: + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_CONDITION("DSW2",0x40,EQUALS,0x40) PORT_NAME("Hide Gambling") // shown in test mode as "clear" (清除) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW2",0x40,EQUALS,0x00) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", hopper_device, line_r) // hopper switch, TODO: verify +INPUT_PORTS_END + static INPUT_PORTS_START( mgdh ) PORT_START("DSW1") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") @@ -4745,6 +4964,26 @@ // IGS_STRING(config, m_igs_string, 0); } +void igs017_state::sdmg2p(machine_config &config) +{ + base_machine_oki(config, 22_MHz_XTAL / 22); + + M68000(config, m_maincpu, 22_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::sdmg2p_map); + TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1); + + // i/o + m_igs_mux->set_addrmap(0, &igs017_state::sdmg2p_mux_map); + + m_ppi->in_pa_callback().set_ioport("DSW1"); + m_ppi->in_pb_callback().set_ioport("DSW2"); + m_ppi->in_pc_callback().set_ioport("DSW3"); // there are 3 DIP banks on PCB but only two are shown in test mode + + HOPPER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW); + + IGS_STRING(config, m_igs_string, 0); +} + /*************************************************************************** ROMs Loading @@ -5004,8 +5243,8 @@ /*************************************************************************** -Man Guan Caishen (V103CS) -满贯财神 (Mǎn Guàn Cáishén) +Manguan Caishen (V103CS) +满贯财神 (Mǎnguàn Cáishén) IGS, 1998 PCB Layout @@ -5065,8 +5304,8 @@ /*************************************************************************** -Chaoji Da Man Guan II (China, V754C) -超級大滿貫(Chāojí dà mǎn guàn) +Chaoji Damanguan II (China, V754C) +超級大滿貫 (Chāojí Dàmǎnguàn) IGS, 1997 PCB Layout @@ -5124,6 +5363,69 @@ /*************************************************************************** +Maque Wangchao / Chaoji Damanguan 2 - Jiaqiang Ban +麻雀王朝 / 超級大滿貫 2 -加強版 (Mahjong Dynasty / Super Grand Slam 2 - Enhanced Edition) + +IGS 2000 +Hardware info By Guru +--------------------- + +IGS PCB NO-0271 +|--------------------------------------| +|PC817x19 JAMMA | +| |-----| MA.DY_TEXT.U18| +| | IGS | | +| | 025 | | +| |-----| 22MHz | +| |-------| | +| | IGS031| IGS_M0906.U20| +|PC817x6 | | | +| 22V10 | | MA.DY_V100C.U21| +| SW1 |-------| | +| SW2 61256|------| | +| SW3 |68000 | 22V10 BATT| +| | | 6264 | +| 16V8 |------| | +|LM7805 K668 | +| SW4 | +|TDA1020 VOL MA.DY_SP.U14 | +|--------------------------------------| +Notes: + 68000 - Clock 11.0MHz [22/2] + K668 - ==OKI M6295. Clock 1.0MHz [22/22]. Pin 7 HIGH + 61256 - 32kB x8-bit SRAM + 6262 - 8kB x8-bit SRAM (battery-backed) + SW1-3 - 8-position DIP Switch + SW4 - High Score Reset / Back-up Battery RAM Re-initialize / PCB Reset + PC817 - Sharp PC817 Optocoupler + 16V8 - Atmel ATF16V8B PLD + 22V10 - Atmel ATF22V10B PLD + TDA1020 - Audio Power Amp + U18/U21 - 27C4002 EPROM + U14 - 27C040 EPROM + U20 - MX23C3210 mask ROM + +***************************************************************************/ + +ROM_START( sdmg2p ) + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP( "ma.dy_v100c.u21", 0x00000, 0x80000,CRC(c071270e) SHA1(8b55a80da30f4233c862bb5d8a79a76af634a296) ) + + ROM_REGION( 0x400000, "igs017_igs031:sprites", 0 ) + ROM_LOAD( "igs_m0906.u20", 0x000000, 0x400000, CRC(01ea0a60) SHA1(66f083084f6d9e8dc4d1d50f3c5bcf2b79025fc0) ) // FIXED BITS (xxxxxxxx0xxxxxxx) + + ROM_REGION( 0x80000, "igs017_igs031:tilemaps", 0 ) + ROM_LOAD( "ma.dy_text.u18", 0x000000, 0x080000, CRC(e46a3a52) SHA1(7b3f113170904dc474712a6a76162a8ee5dbd318) ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "ma.dy_sp.u14", 0x00000, 0x80000, CRC(b31c6349) SHA1(9e8e5b029e1eff47581f99ecf2da3f17bee01f32) ) // 1ST AND 2ND HALF IDENTICAL + + ROM_REGION( 0xec, "igs_string", 0 ) + ROM_LOAD( "sdmg2p_string.key", 0x00, 0xec, NO_DUMP ) +ROM_END + +/*************************************************************************** + Long Hu Zhengba 2 (set 1) 龙虎争霸 (Lóng Hǔ Zhēngbà) IGS, 1998 @@ -5270,8 +5572,8 @@ /*************************************************************************** -Man Guan Daheng (V123T1) -滿貫大亨 (Mǎn Guàn Dàhēng) +Manguan Daheng (V123T1) +滿貫大亨 (Mǎnguàn Dàhēng) (c) 1997 IGS PCB Layout @@ -5325,8 +5627,8 @@ /*************************************************************************** -Man Guan Daheng (V125T1) -滿貫大亨 (Mǎn Guàn Dàhēng) +Manguan Daheng (V125T1) +滿貫大亨 (Mǎnguàn Dàhēng) (c) 1997 IGS No hardware info, no sprites rom for this set. @@ -5351,7 +5653,8 @@ /*************************************************************************** -Taishan (Tarzan) Chuang Tian Guan (V109C) +Tarzan Chuang Tian Guan (V109C) +泰山闯天关 (Tàishān Chuǎng Tiān Guān) IGS 1999 PCB Layout @@ -5631,23 +5934,24 @@ } // anonymous namespace -GAME ( 1996, iqblocka, iqblock, iqblocka, iqblocka, igs017_state, init_iqblocka, ROT0, "IGS", "Shuzi Leyuan (China, V127M, gambling)", 0 ) // 數字樂園 -GAME ( 1997, iqblockf, iqblock, iqblockf, iqblockf, igs017_state, init_iqblocka, ROT0, "IGS", "IQ Block (V113FR, gambling)", 0 ) -GAME ( 1997, mgdh, 0, mgdh, mgdh, igs017_state, init_mgdh, ROT0, "IGS", "Man Guan Daheng (Taiwan, V125T1)", MACHINE_IMPERFECT_COLORS | MACHINE_UNEMULATED_PROTECTION) // 滿貫大亨, wrong colors in betting screen, game id check (patched out) -GAME ( 1997, mgdha, mgdh, mgdha, mgdh, igs017_state, init_mgdha, ROT0, "IGS", "Man Guan Daheng (Taiwan, V123T1)", 0 ) // 滿貫大亨 -GAME ( 1997, sdmg2, 0, sdmg2, sdmg2, igs017_state, init_sdmg2, ROT0, "IGS", "Chaoji Da Man Guan II (China, V754C)", 0 ) // 超級大滿貫II -GAME ( 1997, tjsb, 0, tjsb, tjsb, igs017_state, init_tjsb, ROT0, "IGS", "Tian Jiang Shen Bing (China, V137C)", MACHINE_UNEMULATED_PROTECTION ) // 天將神兵, fails the bonus round protection check (if enabled via DSW), see e.g. demo mode -GAME ( 1998, genius6, 0, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V110F)", 0 ) // shows chinese text in puzzle game -GAME ( 1997, genius6a, genius6, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V133F)", 0 ) // clone because it has older copyright year -GAME ( 1997, genius6b, genius6, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V132F)", 0 ) // " -GAME ( 1998, mgcs, 0, mgcs, mgcs, igs017_state, init_mgcs, ROT0, "IGS", "Man Guan Caishen (China, V103CS)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // 满贯财神, finish IGS029 protection -GAME ( 1998, lhzb2, 0, lhzb2, lhzb2, igs017_state, init_lhzb2, ROT0, "IGS", "Long Hu Zhengba 2 (China, set 1)", MACHINE_UNEMULATED_PROTECTION ) // 龙虎争霸2, finish IGS022 protection -GAME ( 1998, lhzb2a, lhzb2, lhzb2a, lhzb2a, igs017_state, init_lhzb2a, ROT0, "IGS", "Long Hu Zhengba 2 (China, VS221M)", 0 ) // 龙虎争霸2 -GAME ( 1998, slqz2, 0, slqz2, slqz2, igs017_state, init_slqz2, ROT0, "IGS", "Shuang Long Qiang Zhu 2 VS (China, VS203J)", MACHINE_UNEMULATED_PROTECTION ) // 双龙抢珠, finish IGS022 protection -GAME ( 1999, tarzanc, 0, tarzan, tarzan, igs017_state, init_tarzanc, ROT0, "IGS", "Tarzan Chuang Tian Guan (China, V109C, set 1)", 0 ) -GAME ( 1999, tarzan, tarzanc, tarzan, tarzan, igs017_state, init_tarzan, ROT0, "IGS", "Tarzan Chuang Tian Guan (China, V109C, set 2)", MACHINE_NOT_WORKING ) // missing sprites and sound rom, imperfect tiles decryption -GAME ( 1999, tarzana, tarzanc, tarzan, tarzan, igs017_state, init_tarzana, ROT0, "IGS", "Tarzan (V107)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // missing IGS029 protection, missing sprites and sound rom -GAMEL( 2000?, starzan, 0, starzan, starzan, igs017_state, init_starzan, ROT0, "IGS (G.F. Gioca license)", "Super Tarzan (Italy, V100I)", 0, layout_igsslot ) -GAMEL( 2000?, happyskl, 0, happyskl, happyskl, igs017_state, init_happyskl, ROT0, "IGS", "Happy Skill (Italy, V611IT)", 0, layout_igspoker ) -GAMEL( 2000?, cpoker2, 0, cpoker2, cpoker2, igs017_state, init_cpoker2, ROT0, "IGS", "Champion Poker 2 (V100A)", 0, layout_igspoker ) -GAME ( 2000?, spkrform, spk306us, spkrform, spkrform, igs017_state, init_spkrform, ROT0, "IGS", "Super Poker (V100xD03) / Formosa", MACHINE_UNEMULATED_PROTECTION ) // poker game enabling forced with a patch. Parent spk306us in driver spoker.cpp +GAME ( 1996, iqblocka, iqblock, iqblocka, iqblocka, igs017_state, init_iqblocka, ROT0, "IGS", "Shuzi Leyuan (China, V127M, gambling)", 0 ) // 數字樂園 +GAME ( 1997, iqblockf, iqblock, iqblockf, iqblockf, igs017_state, init_iqblocka, ROT0, "IGS", "IQ Block (V113FR, gambling)", 0 ) +GAME ( 1997, mgdh, 0, mgdh, mgdh, igs017_state, init_mgdh, ROT0, "IGS", "Manguan Daheng (Taiwan, V125T1)", MACHINE_IMPERFECT_COLORS | MACHINE_UNEMULATED_PROTECTION) // 滿貫大亨, wrong colors in betting screen, game id check (patched out) +GAME ( 1997, mgdha, mgdh, mgdha, mgdh, igs017_state, init_mgdha, ROT0, "IGS", "Manguan Daheng (Taiwan, V123T1)", 0 ) // 滿貫大亨 +GAME ( 1997, sdmg2, 0, sdmg2, sdmg2, igs017_state, init_sdmg2, ROT0, "IGS", "Chaoji Damanguan II (China, V754C)", 0 ) // 超級大滿貫II +GAME ( 1997, tjsb, 0, tjsb, tjsb, igs017_state, init_tjsb, ROT0, "IGS", "Tian Jiang Shen Bing (China, V137C)", MACHINE_UNEMULATED_PROTECTION ) // 天將神兵, fails the bonus round protection check (if enabled via DSW), see e.g. demo mode +GAME ( 1998, genius6, 0, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V110F)", 0 ) // shows Chinese text in puzzle game +GAME ( 1997, genius6a, genius6, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V133F)", 0 ) // clone because it has older copyright year +GAME ( 1997, genius6b, genius6, genius6, genius6, igs017_state, init_iqblocka, ROT0, "IGS", "Genius 6 (V132F)", 0 ) // " +GAME ( 1998, mgcs, 0, mgcs, mgcs, igs017_state, init_mgcs, ROT0, "IGS", "Manguan Caishen (China, V103CS)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // 满贯财神, finish IGS029 protection +GAME ( 1998, lhzb2, 0, lhzb2, lhzb2, igs017_state, init_lhzb2, ROT0, "IGS", "Long Hu Zhengba 2 (China, set 1)", MACHINE_UNEMULATED_PROTECTION ) // 龙虎争霸2, finish IGS022 protection +GAME ( 1998, lhzb2a, lhzb2, lhzb2a, lhzb2a, igs017_state, init_lhzb2a, ROT0, "IGS", "Long Hu Zhengba 2 (China, VS221M)", 0 ) // 龙虎争霸2 +GAME ( 1998, slqz2, 0, slqz2, slqz2, igs017_state, init_slqz2, ROT0, "IGS", "Shuang Long Qiang Zhu 2 VS (China, VS203J)", MACHINE_UNEMULATED_PROTECTION ) // 双龙抢珠, finish IGS022 protection +GAME ( 1999, tarzanc, 0, tarzan, tarzan, igs017_state, init_tarzanc, ROT0, "IGS", "Tarzan Chuang Tian Guan (China, V109C, set 1)", 0 ) // 泰山闯天关 +GAME ( 1999, tarzan, tarzanc, tarzan, tarzan, igs017_state, init_tarzan, ROT0, "IGS", "Tarzan Chuang Tian Guan (China, V109C, set 2)", MACHINE_NOT_WORKING ) // missing sprites and sound rom, imperfect tiles decryption +GAME ( 1999, tarzana, tarzanc, tarzan, tarzan, igs017_state, init_tarzana, ROT0, "IGS", "Tarzan (V107)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // missing IGS029 protection, missing sprites and sound rom +GAME ( 2000, sdmg2p, 0, sdmg2p, sdmg2p, igs017_state, init_sdmg2p, ROT0, "IGS", "Maque Wangchao / Chaoji Damanguan 2 - Jiaqiang Ban (China, V100C)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // 麻雀王朝 / 超級大滿貫 2 -加強版 protection kicks in after starting game, hopper isn't hooked up correctly +GAMEL( 2000?, starzan, 0, starzan, starzan, igs017_state, init_starzan, ROT0, "IGS (G.F. Gioca license)", "Super Tarzan (Italy, V100I)", 0, layout_igsslot ) +GAMEL( 2000?, happyskl, 0, happyskl, happyskl, igs017_state, init_happyskl, ROT0, "IGS", "Happy Skill (Italy, V611IT)", 0, layout_igspoker ) +GAMEL( 2000?, cpoker2, 0, cpoker2, cpoker2, igs017_state, init_cpoker2, ROT0, "IGS", "Champion Poker 2 (V100A)", 0, layout_igspoker ) +GAME ( 2000?, spkrform, spk306us, spkrform, spkrform, igs017_state, init_spkrform, ROT0, "IGS", "Super Poker (V100xD03) / Formosa", MACHINE_UNEMULATED_PROTECTION ) // poker game enabling forced with a patch. Parent spk306us in driver spoker.cpp diff -Nru mame-0.263+dfsg.1/src/mame/igs/iqblock.cpp mame-0.264+dfsg.1/src/mame/igs/iqblock.cpp --- mame-0.263+dfsg.1/src/mame/igs/iqblock.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/igs/iqblock.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -117,8 +117,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -205,8 +203,6 @@ } -// machine - void iqblock_state::iqblock_prot_w(uint8_t data) { m_rambase[0xe26] = data; diff -Nru mame-0.263+dfsg.1/src/mame/igs/pgm2.cpp mame-0.264+dfsg.1/src/mame/igs/pgm2.cpp --- mame-0.263+dfsg.1/src/mame/igs/pgm2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/igs/pgm2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -750,7 +750,7 @@ void pgm2_state::pgm2(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware IGS036(config, m_maincpu, 100000000); // Unknown clock / divider m_maincpu->set_addrmap(AS_PROGRAM, &pgm2_state::pgm2_rom_map); @@ -758,7 +758,7 @@ ARM_AIC(config, m_arm_aic, 0).irq_callback().set(FUNC(pgm2_state::irq)); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh(HZ_TO_ATTOSECONDS(59.08)); // 59.08Hz, 264 total lines @ 15.59KHz m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -1193,6 +1193,35 @@ KOF98UMH_VIDEO_SOUND_ROMS ROM_END +// Single board game (PCB-0779-00-JG) +ROM_START( bubucar ) + ROM_REGION( 0x04000, "maincpu", 0 ) + ROM_LOAD( "bu_bu_car-en_b5_internal_rom.u12", 0x00000000, 0x0004000, NO_DUMP ) + + ROM_REGION32_LE( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "bubu-car-s1c0en_ev29lv160ab.u23", 0x00000000, 0x0200000, CRC(4c5009ef) SHA1(5b0c96d7bd1243523eb3670b7545cc7455b2d668) ) + + ROM_REGION( 0x200000, "tiles", ROMREGION_ERASE00 ) + ROM_LOAD( "jg_text.u31", 0x00000000, 0x0200000, NO_DUMP ) // EN29LV160AB-70TCP + + ROM_REGION( 0x2000000, "bgtile", ROMREGION_ERASE00 ) + // BGL/BGH unpopulated (no background tilemap) + + ROM_REGION( 0x08000000, "sprites_mask", 0 ) + ROM_LOAD32_WORD( "jg_map_bml.u38", 0x00000000, 0x4000000, NO_DUMP ) // K8Q2815UQB + ROM_LOAD32_WORD( "jg_map_bmh.u37", 0x00000002, 0x4000000, NO_DUMP ) // K8Q2815UQB + + ROM_REGION( 0x20000000, "sprites_colour", 0 ) + ROM_LOAD32_WORD( "jg_cg_cgl.u19", 0x00000000, 0x4000000, NO_DUMP ) // K8Q2815UQB + ROM_LOAD32_WORD( "jg_cg_cgh.u20", 0x00000002, 0x4000000, NO_DUMP ) // K8Q2815UQB + + ROM_REGION( 0x08000000, "ymz774", ROMREGION_ERASEFF ) // YMZ774 + ROM_LOAD16_WORD_SWAP( "jg_wave.u18", 0x00000000, 0x4000000, NO_DUMP ) // K8Q2815UQB + + ROM_REGION( 0x10000, "sram", 0 ) + ROM_LOAD( "bubucar_en_sram", 0x00000000, 0x0010000, NO_DUMP ) +ROM_END + static void iga_u16_decode(u16 *rom, int len, int ixor) { int i; @@ -1249,10 +1278,10 @@ for (i = 0; i < len / 2; i++) { - rom[i] = bitswap<16>(rom[i], 15, 14, /* unused - 6bpp */ + rom[i] = bitswap<16>(rom[i], 15, 14, // unused - 6bpp 13, 12, 11, 5, 4, 3, - 7, 6, /* unused - 6bpp */ + 7, 6, // unused - 6bpp 10, 9, 8, 2, 1, 0 ); } @@ -1472,7 +1501,7 @@ -/* PGM2 */ +// PGM2 //华通电子/Huatong Electronics (distributor of orleg2, kov2nl in china) = 华通科技/Huatong Technology (distributor of kov3 in china), //Same company but they changed name. @@ -1480,7 +1509,7 @@ // Oriental Legend 2 - should be a V102 and V100 too //西游释厄传2/Xīyóu shì è chuán 2 (China; Simplified Chinese) //西遊釋厄傳2/Saiyū Shakuyakuden 2 (Japan; Traditional Chinese - Taiwan(undumped) too?) -GAME( 2007, orleg2, 0, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V104, Oversea)", MACHINE_SUPPORTS_SAVE ) /* Overseas sets of OL2 do not use the card reader */ +GAME( 2007, orleg2, 0, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V104, Oversea)", MACHINE_SUPPORTS_SAVE ) // Overseas sets of OL2 do not use the card reader GAME( 2007, orleg2_103, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V103, Oversea)", MACHINE_SUPPORTS_SAVE ) GAME( 2007, orleg2_101, orleg2, pgm2, pgm2, pgm2_state, init_orleg2, ROT0, "IGS", "Oriental Legend 2 (V101, Oversea)", MACHINE_SUPPORTS_SAVE ) @@ -1518,6 +1547,8 @@ // King of Fighters '98: Ultimate Match Hero GAME( 2009, kof98umh, 0, pgm2_lores, pgm2, pgm2_state, init_kof98umh, ROT0, "IGS / SNK Playmore / New Channel", "The King of Fighters '98: Ultimate Match HERO (China, V100, 09-08-23)", MACHINE_SUPPORTS_SAVE ) +GAME( 2009, bubucar, 0, pgm2, pgm2, pgm2_state, empty_init, ROT0, "IGS", "Bu Bu Car (English)", MACHINE_IS_SKELETON ) // Only the program ROM is dumped + // ジグソーワールドアリーナ/Jigsaw World Arena // お茶犬のパズル/Ochaken no Puzzle (V101JP exists but undumped, Puzzle game of Japanese お茶犬/Ochaken franchises) diff -Nru mame-0.263+dfsg.1/src/mame/igt/gkigt.cpp mame-0.264+dfsg.1/src/mame/igt/gkigt.cpp --- mame-0.263+dfsg.1/src/mame/igt/gkigt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/igt/gkigt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -890,6 +890,7 @@ ROM_START( gkkey ) ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD( "key00016,1-4002.bin", 0x00000, 0x80000, CRC(97f43f33) SHA1(1485a343f7865f3600ba9cd80eedc489ea75ae40) ) ROM_LOAD( "key00017,1-4002.bin", 0x00000, 0x80000, CRC(1579739f) SHA1(7b6257d17f74599a4ada3014d02a2e7c6686ab3f) ) /* non WAP keychip */ ROM_LOAD( "key00018,1-4002.bin", 0x00000, 0x80000, CRC(b35b8888) SHA1(60adc02d17ab0a163e9a6bfbac1f46eeb4a77243) ) /* WAP keychip */ ROM_LOAD( "key00021,1-4002.bin", 0x00000, 0x80000, CRC(4d1ef12f) SHA1(ab9eebe0ba84d8e27496864adbfe7d1639a6375e) ) /* MD3 WAP keychip & memory clear */ @@ -914,9 +915,8 @@ ROM_LOAD( "cvs00080,1-4002.bin", 0x00000, 0x80000, CRC(f58a3040) SHA1(906ed54aeafdf2cf58ee8425405498a8c64b52e1) ) ROM_LOAD( "ivc00097,1-4002.bin", 0x00000, 0x80000, CRC(f0a59fd1) SHA1(8e980e9eb80e6899fe3bbcd21ccbd39f9fdccaca) ) /* Vision Ram/E-Square Clear (Replaces IVC00070) */ - ROM_REGION( 0x80000, "miscbad", 0 ) - // these are also bad dumps, again they never contains the byte value 0x0d (uploaded in ASCII mode with carriage return stripped out?) - ROM_LOAD( "key00016,1-4002.bin", 0x00000, 0x07ff9a, BAD_DUMP CRC(80c0c2c4) SHA1(e8df4e516c058aeacf1492151c38b5e73f161c8c) ) // should be 0x80000 +// ROM_REGION( 0x80000, "miscbad", 0 ) +// these are also bad dumps, again they never contains the byte value 0x0d (uploaded in ASCII mode with carriage return stripped out?) ROM_REGION32_LE( 0x200000, "game", ROMREGION_ERASEFF ) ROM_REGION( 0x100000, "cg", ROMREGION_ERASEFF ) diff -Nru mame-0.263+dfsg.1/src/mame/irem/m72.cpp mame-0.264+dfsg.1/src/mame/irem/m72.cpp --- mame-0.263+dfsg.1/src/mame/irem/m72.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/irem/m72.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3724,7 +3724,7 @@ ROM_LOAD( "t51.31.ic13", 0xe0000, 0x20000, CRC(229bf7b1) SHA1(ae42c7efbb6278dd3fa56842361138391f2d49ca) ) ROM_REGION( 0x080000, "gfx2", 0 ) // mask ROMs - ROM_LOAD( "t53.a0,ic50", 0x00000, 0x20000, CRC(1a082494) SHA1(63a3a84a262833d2cafab41e35df8f10a5e317b1) ) // tiles #1 + ROM_LOAD( "t53.a0.ic50", 0x00000, 0x20000, CRC(1a082494) SHA1(63a3a84a262833d2cafab41e35df8f10a5e317b1) ) // tiles #1 ROM_LOAD( "t54.a1.ic49", 0x20000, 0x20000, CRC(076c16c5) SHA1(4be858806b916953d59aceee550e721eaf3996a6) ) ROM_LOAD( "t55.a2.ic51", 0x40000, 0x20000, CRC(25d877a5) SHA1(48c948bf714c432f534c098123c8f50d5561756f) ) ROM_LOAD( "t56.a3.ic52", 0x60000, 0x20000, CRC(5b1213f5) SHA1(87782aa0bd04d4378c4ba78b63028ae2709da2f1) ) @@ -4418,7 +4418,7 @@ ROM_LOAD( "cc_d-g30-.ic64", 0x60000, 0x20000, CRC(f64a3166) SHA1(1661db2a37c76e6b4552e48c04966dbbccab8926) ) // == cc-b-a3.ic23 + cc-b-b3.ic24 ROM_REGION( 0x20000, "samples", 0 ) // samples - ROM_LOAD( "cc_d-vo-.ic14", 0x00000, 0x20000, CRC(6247bade) SHA1(4bc9f86acd09908c74b1ab0e7817c4ff1cad6f0b) ) // == cc-c-v0.ic44 + ROM_LOAD( "cc_d-v0-.ic14", 0x00000, 0x20000, CRC(6247bade) SHA1(4bc9f86acd09908c74b1ab0e7817c4ff1cad6f0b) ) // == cc-c-v0.ic44 ROM_REGION( 0x0200, "proms", 0 ) // located on M84-B-B top board ROM_LOAD( "ken_b-4n-.ic23", 0x0000, 0x0100, CRC(b460c438) SHA1(00e20cf754b6fd5138ee4d2f6ec28dff9e292fe6) ) // TBP24S10N @@ -4455,7 +4455,7 @@ ROM_LOAD( "cc_d-g30-.ic64", 0x60000, 0x20000, CRC(f64a3166) SHA1(1661db2a37c76e6b4552e48c04966dbbccab8926) ) // == cc-b-a3.ic23 + cc-b-b3.ic24 ROM_REGION( 0x20000, "samples", 0 ) // samples - ROM_LOAD( "cc_d-vo-.ic14", 0x00000, 0x20000, CRC(6247bade) SHA1(4bc9f86acd09908c74b1ab0e7817c4ff1cad6f0b) ) // == cc-c-v0.ic44 + ROM_LOAD( "cc_d-v0-.ic14", 0x00000, 0x20000, CRC(6247bade) SHA1(4bc9f86acd09908c74b1ab0e7817c4ff1cad6f0b) ) // == cc-c-v0.ic44 ROM_REGION( 0x0200, "proms", 0 ) // located on M84-B-B top board ROM_LOAD( "ken_b-4n-.ic23", 0x0000, 0x0100, CRC(b460c438) SHA1(00e20cf754b6fd5138ee4d2f6ec28dff9e292fe6) ) // TBP24S10N diff -Nru mame-0.263+dfsg.1/src/mame/irem/shisen.cpp mame-0.264+dfsg.1/src/mame/irem/shisen.cpp --- mame-0.263+dfsg.1/src/mame/irem/shisen.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/irem/shisen.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -81,8 +81,6 @@ }; -// video - void shisen_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -151,8 +149,6 @@ } -// machine - void shisen_state::main_prg_map(address_map &map) { map(0x0000, 0x7fff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/irem/travrusa.cpp mame-0.264+dfsg.1/src/mame/irem/travrusa.cpp --- mame-0.263+dfsg.1/src/mame/irem/travrusa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/irem/travrusa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,8 +119,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -425,8 +423,6 @@ } -// machine - void travrusa_state::program_map(address_map &map) { map(0x0000, 0x7fff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/itech/capbowl.cpp mame-0.264+dfsg.1/src/mame/itech/capbowl.cpp --- mame-0.263+dfsg.1/src/mame/itech/capbowl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/itech/capbowl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -224,8 +224,6 @@ }; -// video - /************************************* * * TMS34061 I/O @@ -367,8 +365,6 @@ } -// machine - /************************************* * * NMI is to trigger the self test. diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/aeroboto.cpp mame-0.264+dfsg.1/src/mame/jaleco/aeroboto.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/aeroboto.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/aeroboto.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -134,8 +134,6 @@ }; -// video - // how the starfield ROM is interpreted: 0 = 256 x 256 x 1 linear bitmap, 1 = 8 x 8 x 1 x 1024 tilemap static constexpr uint8_t STARS_LAYOUT = 1; @@ -333,8 +331,6 @@ } -// machine - uint8_t aeroboto_state::_201_r() { /* if you keep a button pressed during boot, the game will expect this diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/bigstrkb.cpp mame-0.264+dfsg.1/src/mame/jaleco/bigstrkb.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/bigstrkb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/bigstrkb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -79,8 +79,6 @@ }; -// video - // Sprites void bigstrkb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -194,8 +192,6 @@ } -// machine - /* 68k interrupts diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/blueprnt.cpp mame-0.264+dfsg.1/src/mame/jaleco/blueprnt.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/blueprnt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/blueprnt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -125,8 +125,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -292,8 +290,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/citycon.cpp mame-0.264+dfsg.1/src/mame/jaleco/citycon.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/citycon.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/citycon.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -80,8 +80,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -216,8 +214,6 @@ } -// machine - uint8_t citycon_state::in_r() { return m_player[flip_screen()]->read(); diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/exerion.cpp mame-0.264+dfsg.1/src/mame/jaleco/exerion.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/exerion.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/exerion.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -218,8 +218,6 @@ }; -// video - static constexpr XTAL MASTER_CLOCK = XTAL(19'968'000); // verified on PCB static constexpr XTAL CPU_CLOCK = MASTER_CLOCK / 6; static constexpr XTAL AY8910_CLOCK = CPU_CLOCK / 2; @@ -623,8 +621,6 @@ } -// machine - /************************************* * * Interrupts & inputs diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/fcombat.cpp mame-0.264+dfsg.1/src/mame/jaleco/fcombat.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/fcombat.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/fcombat.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -118,8 +118,6 @@ }; -// video - // this is copied from Exerion, but it should be correct static constexpr XTAL MASTER_CLOCK = 20_MHz_XTAL; static constexpr XTAL CPU_CLOCK = MASTER_CLOCK / 6; @@ -357,8 +355,6 @@ } -// machine - INPUT_CHANGED_MEMBER(fcombat_state::coin_inserted) { // coin insertion causes an NMI diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/ginganin.cpp mame-0.264+dfsg.1/src/mame/jaleco/ginganin.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/ginganin.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/ginganin.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -146,8 +146,6 @@ }; -// video - /************************************************************************** Note: if MAME_DEBUG is defined, pressing Z with: @@ -415,8 +413,6 @@ } -// machine - void ginganin_state::main_map(address_map &map) { // PC=0x408 ROM area 10000-13fff is written at POST with: 0000 0000 0000 0001, diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/homerun.cpp mame-0.264+dfsg.1/src/mame/jaleco/homerun.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/homerun.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/homerun.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -191,8 +191,6 @@ }; -// video - /**************************************************************************/ int homerun_state::sprite0_r() @@ -340,8 +338,6 @@ } -// machine - /*************************************************************************** I/O / Memory diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/megasys1.cpp mame-0.264+dfsg.1/src/mame/jaleco/megasys1.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/megasys1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/megasys1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2923,8 +2923,8 @@ ROM_LOAD16_BYTE( "prg8.bin", 0x000000, 0x010000, CRC(a682b1ca) SHA1(66f5d5a73f5e8cba87eac09c55eee59117d94f7b) ) ROM_LOAD16_BYTE( "prg7.bin", 0x000001, 0x010000, CRC(83b9982d) SHA1(68e7d344ebfffe19822c4cf9f7b13cb51f23537a) ) - ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ - ROM_LOAD( "chimerab.mcu", 0x00000, 0x04000, NO_DUMP ) + ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code - using Cybattler program, label not confirmed */ + ROM_LOAD( "mo-91028.mcu", 0x00000, 0x04000, BAD_DUMP CRC(a72e04a7) SHA1(0bd96272e37b0e23793ca47b98a966540e2e2df9) ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "s1.bin", 0x000000, 0x080000, CRC(e4c2ac77) SHA1(db4bff3c02f22cc59a67b103fd176f4d88531f93) ) @@ -3046,7 +3046,7 @@ ROM_LOAD16_BYTE( "cb_07.rom", 0x000001, 0x010000, CRC(85d219d7) SHA1(a9628efc5eddefad739363ff0b2f37a2d095df86) ) ROM_REGION( 0x4000, "iomcu", 0 ) /* TMP91640 Internal Code */ - ROM_LOAD( "mo-91028.mcu", 0x00000, 0x04000, NO_DUMP ) + ROM_LOAD( "mo-91028.mcu", 0x00000, 0x04000, CRC(a72e04a7) SHA1(0bd96272e37b0e23793ca47b98a966540e2e2df9) ) ROM_REGION( 0x080000, "scroll0", 0 ) /* Scroll 0 */ ROM_LOAD( "cb_m01.rom", 0x000000, 0x080000, CRC(1109337f) SHA1(ab294d87c9b4eb54401da5ad6ea171e4c0a700b5) ) @@ -5179,11 +5179,6 @@ m_ip_select_values = chimeraba_seq; } -void megasys1_bc_iosim_state::init_cybattlr() // Type C -{ - m_ip_select_values = cybattler_seq; -} - // Type D void megasys1_typed_state::init_peekaboo() { @@ -5276,9 +5271,9 @@ GAME( 1991, 64streetj, 64street, system_C_iomcu, 64street, megasys1_bc_iomcu_state, empty_init, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, 64streetja, 64street, system_C_iomcu, 64street, megasys1_bc_iomcu_state, empty_init, ROT0, "Jaleco", "64th. Street - A Detective Story (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, bigstrik, 0, system_C_iomcu, bigstrik, megasys1_bc_iomcu_state, empty_init, ROT0, "Jaleco", "Big Striker", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, chimerab, 0, system_C_iosim, chimerab, megasys1_bc_iosim_state, init_cybattlr, ROT0, "Jaleco", "Chimera Beast (Japan, prototype, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, chimerab, 0, system_C_iomcu, chimerab, megasys1_bc_iomcu_state, empty_init, ROT0, "Jaleco", "Chimera Beast (Japan, prototype, set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, chimeraba, chimerab, system_C_iosim, chimerab, megasys1_bc_iosim_state, init_chimeraba,ROT0, "Jaleco", "Chimera Beast (Japan, prototype, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, cybattlr, 0, system_C_iosim, cybattlr, megasys1_bc_iosim_state, init_cybattlr, ROT90, "Jaleco", "Cybattler", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, cybattlr, 0, system_C_iomcu, cybattlr, megasys1_bc_iomcu_state, empty_init, ROT90, "Jaleco", "Cybattler", MACHINE_SUPPORTS_SAVE ) // Type D GAME( 1993, peekaboo, 0, system_D, peekaboo, megasys1_typed_state, init_peekaboo, ROT0, "Jaleco", "Peek-a-Boo! (Japan, ver. 1.1)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/megasys1.h mame-0.264+dfsg.1/src/mame/jaleco/megasys1.h --- mame-0.263+dfsg.1/src/mame/jaleco/megasys1.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/megasys1.h 2024-03-25 14:00:46.000000000 +0000 @@ -271,7 +271,6 @@ void init_avspirit(); void init_chimeraba(); - void init_cybattlr(); void init_hayaosi1(); void init_edf(); @@ -291,7 +290,6 @@ static constexpr u8 edf_seq[7] = { 0x20,0x21,0x22,0x23,0x24, 0xf0,0x06 }; static constexpr u8 hayaosi1_seq[7] = { 0x51,0x52,0x53,0x54,0x55, 0xfc,0x06 }; static constexpr u8 chimeraba_seq[7] = { 0x56,0x52,0x53,0x55,0x54, 0xfa,0x06 }; - static constexpr u8 cybattler_seq[7] = { 0x56,0x52,0x53,0x54,0x55, 0xf2,0x06 }; void megasys1B_iosim_map(address_map &map); void megasys1C_iosim_map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/momoko.cpp mame-0.264+dfsg.1/src/mame/jaleco/momoko.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/momoko.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/momoko.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -141,8 +141,6 @@ }; -// video - /******************************************************************************* Video consists of @@ -424,8 +422,6 @@ } -// machine - void momoko_state::bg_read_bank_w(u8 data) { m_bgbank->set_entry(data & 0x1f); diff -Nru mame-0.263+dfsg.1/src/mame/jaleco/skyfox.cpp mame-0.264+dfsg.1/src/mame/jaleco/skyfox.cpp --- mame-0.263+dfsg.1/src/mame/jaleco/skyfox.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/jaleco/skyfox.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -87,8 +87,6 @@ }; -// video - /*************************************************************************** @@ -318,8 +316,6 @@ } -// machine - /*************************************************************************** Main CPU diff -Nru mame-0.263+dfsg.1/src/mame/kaneko/djboy.cpp mame-0.264+dfsg.1/src/mame/kaneko/djboy.cpp --- mame-0.263+dfsg.1/src/mame/kaneko/djboy.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/kaneko/djboy.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -262,8 +262,6 @@ }; -// video - void djboy_state::scrollx_w(uint8_t data) { m_scrollx = data; @@ -337,8 +335,6 @@ } -// machine - // KANEKO BEAST state uint8_t djboy_state::beast_status_r() diff -Nru mame-0.263+dfsg.1/src/mame/kaneko/galpanic.cpp mame-0.264+dfsg.1/src/mame/kaneko/galpanic.cpp --- mame-0.263+dfsg.1/src/mame/kaneko/galpanic.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/kaneko/galpanic.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -133,8 +133,6 @@ }; -// video - void galpanic_state::video_start() { m_screen->register_screen_bitmap(m_bitmap); @@ -186,8 +184,6 @@ } -// machine - void galpanic_state::machine_start() { m_okibank->configure_entries(0, 16, memregion("oki")->base(), 0x10000); diff -Nru mame-0.263+dfsg.1/src/mame/kiwako/mrjong.cpp mame-0.264+dfsg.1/src/mame/kiwako/mrjong.cpp --- mame-0.263+dfsg.1/src/mame/kiwako/mrjong.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/kiwako/mrjong.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -99,8 +99,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs. @@ -228,8 +226,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/konami/ajax.cpp mame-0.264+dfsg.1/src/mame/konami/ajax.cpp --- mame-0.263+dfsg.1/src/mame/konami/ajax.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/ajax.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -120,8 +120,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -208,8 +206,6 @@ } -// machine - /* main_bankswitch_w: Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at H11: diff -Nru mame-0.263+dfsg.1/src/mame/konami/aliens.cpp mame-0.264+dfsg.1/src/mame/konami/aliens.cpp --- mame-0.263+dfsg.1/src/mame/konami/aliens.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/aliens.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,8 +77,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -144,8 +142,6 @@ } -// machine - void aliens_state::coin_counter_w(uint8_t data) { // bits 0-1 = coin counters diff -Nru mame-0.263+dfsg.1/src/mame/konami/battlnts.cpp mame-0.264+dfsg.1/src/mame/konami/battlnts.cpp --- mame-0.263+dfsg.1/src/mame/konami/battlnts.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/battlnts.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -73,8 +73,6 @@ }; -// video - /*************************************************************************** Callback for the K007342 @@ -122,8 +120,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/konami/bladestl.cpp mame-0.264+dfsg.1/src/mame/konami/bladestl.cpp --- mame-0.263+dfsg.1/src/mame/konami/bladestl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/bladestl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,6 @@ }; -// video - void bladestl_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -179,8 +177,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(bladestl_state::scanline) { int const scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/konami/blockhl.cpp mame-0.264+dfsg.1/src/mame/konami/blockhl.cpp --- mame-0.263+dfsg.1/src/mame/konami/blockhl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/blockhl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Nicola Salmoria +// copyright-holders: Nicola Salmoria + /******************************************************************************* Block Hole (GX973) (c) 1989 Konami @@ -18,16 +19,16 @@ *******************************************************************************/ #include "emu.h" + +#include "k051960.h" +#include "k052109.h" #include "konamipt.h" #include "cpu/m6809/konami.h" #include "cpu/z80/z80.h" -#include "machine/bankdev.h" #include "machine/gen_latch.h" #include "machine/watchdog.h" #include "sound/ymopm.h" -#include "k052109.h" -#include "k051960.h" #include "emupal.h" #include "speaker.h" @@ -45,13 +46,26 @@ blockhl_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_bank5800(*this, "bank5800"), m_audiocpu(*this, "audiocpu"), m_k052109(*this, "k052109"), m_k051960(*this, "k051960"), - m_rombank(*this, "rombank") + m_rombank(*this, "rombank"), + m_view5800(*this, "view5800") { } + void blockhl(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_audiocpu; + required_device m_k052109; + required_device m_k051960; + required_memory_bank m_rombank; + memory_view m_view5800; + K052109_CB_MEMBER(tile_callback); K051960_CB_MEMBER(sprite_callback); uint32_t screen_update_blockhl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -62,20 +76,8 @@ void banking_callback(uint8_t data); - void blockhl(machine_config &config); void audio_map(address_map &map); - void bank5800_map(address_map &map); void main_map(address_map &map); -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device m_bank5800; - required_device m_audiocpu; - required_device m_k052109; - required_device m_k051960; - required_memory_bank m_rombank; }; @@ -95,17 +97,13 @@ map(0x1f97, 0x1f97).portr("DSW1"); map(0x1f98, 0x1f98).portr("DSW2"); map(0x4000, 0x57ff).ram(); - map(0x5800, 0x5fff).m(m_bank5800, FUNC(address_map_bank_device::amap8)); + map(0x5800, 0x5fff).view(m_view5800); + m_view5800[0](0x5800, 0x5fff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); + m_view5800[1](0x5800, 0x5fff).ram(); map(0x6000, 0x7fff).bankr("rombank"); map(0x8000, 0xffff).rom().region("maincpu", 0x8000); } -void blockhl_state::bank5800_map(address_map &map) -{ - map(0x0000, 0x07ff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); - map(0x0800, 0x0fff).ram(); -} - void blockhl_state::audio_map(address_map &map) { map(0x0000, 0x7fff).rom(); @@ -120,7 +118,7 @@ // VIDEO EMULATION //************************************************************************** -K052109_CB_MEMBER( blockhl_state::tile_callback ) +K052109_CB_MEMBER(blockhl_state::tile_callback) { static const int layer_colorbase[] = { 0 / 16, 256 / 16, 512 / 16 }; @@ -128,7 +126,7 @@ *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5); } -K051960_CB_MEMBER( blockhl_state::sprite_callback ) +K051960_CB_MEMBER(blockhl_state::sprite_callback) { enum { sprite_colorbase = 768 / 16 }; @@ -194,6 +192,8 @@ { // the first 0x8000 are banked, the remaining 0x8000 are directly accessible m_rombank->configure_entries(0, 4, memregion("maincpu")->base(), 0x2000); + + m_view5800.select(0); } void blockhl_state::banking_callback(uint8_t data) @@ -208,7 +208,7 @@ machine().bookkeeping().coin_counter_w(1, data & 0x10); // bit 5 = select palette RAM or work RAM at 5800-5fff - m_bank5800->set_bank(BIT(data, 5)); + m_view5800.select(BIT(data, 5)); // bit 6 = enable char ROM reading through the video RAM m_k052109->set_rmrd_line(BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); @@ -284,12 +284,10 @@ void blockhl_state::blockhl(machine_config &config) { // basic machine hardware - KONAMI(config, m_maincpu, XTAL(24'000'000)/2); // Konami 052526 + KONAMI(config, m_maincpu, XTAL(24'000'000) / 2); // Konami 052526 m_maincpu->set_addrmap(AS_PROGRAM, &blockhl_state::main_map); m_maincpu->line().set(FUNC(blockhl_state::banking_callback)); - ADDRESS_MAP_BANK(config, "bank5800").set_map(&blockhl_state::bank5800_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800); - Z80(config, m_audiocpu, XTAL(3'579'545)); m_audiocpu->set_addrmap(AS_PROGRAM, &blockhl_state::audio_map); @@ -297,9 +295,9 @@ // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(24'000'000)/3, 528, 112, 400, 256, 16, 240); + screen.set_raw(XTAL(24'000'000) / 3, 528, 112, 400, 256, 16, 240); // 6MHz dotclock is more realistic, however needs drawing updates. replace when ready -// screen.set_raw(XTAL(24'000'000)/4, 396, hbend, hbstart, 256, 16, 240); +// screen.set_raw(XTAL(24'000'000) / 4, 396, hbend, hbstart, 256, 16, 240); screen.set_screen_update(FUNC(blockhl_state::screen_update_blockhl)); screen.set_palette("palette"); @@ -330,10 +328,10 @@ //************************************************************************** ROM_START( blockhl ) - ROM_REGION( 0x10000, "maincpu", 0 ) // code + banked roms + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "973l02.e21", 0x00000, 0x10000, CRC(e14f849a) SHA1(d44cf178cc98998b72ed32c6e20b6ebdf1f97579) ) - ROM_REGION( 0x08000, "audiocpu", 0 ) // 32k for the sound CPU + ROM_REGION( 0x08000, "audiocpu", 0 ) ROM_LOAD( "973d01.g6", 0x00000, 0x08000, CRC(eeee9d92) SHA1(6c6c324b1f6f4fba0aa12e0d1fc5dbab133ef669) ) ROM_REGION( 0x20000, "k052109", 0 ) // tiles @@ -348,15 +346,15 @@ ROM_LOAD32_BYTE( "973f04.k7", 0x00002, 0x08000, CRC(69ca41bd) SHA1(9b0b1c888efd2f2d5525f14778e18fb4a7353eb6) ) ROM_LOAD32_BYTE( "973f03.k4", 0x00003, 0x08000, CRC(21e98472) SHA1(8c697d369a1f57be0825c33b4e9107ce1b02a130) ) - ROM_REGION( 0x0100, "priority", 0 ) // priority encoder (not used) + ROM_REGION( 0x0100, "priority", 0 ) // not used ROM_LOAD( "973a11.h10", 0x0000, 0x0100, CRC(46d28fe9) SHA1(9d0811a928c8907785ef483bfbee5445506b3ec8) ) ROM_END ROM_START( quarth ) - ROM_REGION( 0x10000, "maincpu", 0 ) // code + banked roms + ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "973j02.e21", 0x00000, 0x10000, CRC(27a90118) SHA1(51309385b93db29b9277d14252166c4ea1746303) ) - ROM_REGION( 0x08000, "audiocpu", 0 ) // 32k for the sound CPU + ROM_REGION( 0x08000, "audiocpu", 0 ) ROM_LOAD( "973d01.g6", 0x00000, 0x08000, CRC(eeee9d92) SHA1(6c6c324b1f6f4fba0aa12e0d1fc5dbab133ef669) ) ROM_REGION( 0x20000, "k052109", 0 ) // tiles @@ -371,7 +369,7 @@ ROM_LOAD32_BYTE( "973e04.k7", 0x00002, 0x08000, CRC(d70f4a2c) SHA1(25f835a17bacf2b8debb2eb8a3cff90cab3f402a) ) ROM_LOAD32_BYTE( "973e03.k4", 0x00003, 0x08000, CRC(2c5a4b4b) SHA1(e2991dd78b9cd96cf93ebd6de0d4e060d346ab9c) ) - ROM_REGION( 0x0100, "priority", 0 ) // priority encoder (not used) + ROM_REGION( 0x0100, "priority", 0 ) // not used ROM_LOAD( "973a11.h10", 0x0000, 0x0100, CRC(46d28fe9) SHA1(9d0811a928c8907785ef483bfbee5445506b3ec8) ) ROM_END diff -Nru mame-0.263+dfsg.1/src/mame/konami/bottom9.cpp mame-0.264+dfsg.1/src/mame/konami/bottom9.cpp --- mame-0.263+dfsg.1/src/mame/konami/bottom9.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/bottom9.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,8 +98,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -173,8 +171,6 @@ } -// machine - uint8_t bottom9_state::k052109_051960_r(offs_t offset) { if (m_k052109->get_rmrd_line() == CLEAR_LINE) diff -Nru mame-0.263+dfsg.1/src/mame/konami/circusc.cpp mame-0.264+dfsg.1/src/mame/konami/circusc.cpp --- mame-0.263+dfsg.1/src/mame/konami/circusc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/circusc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -142,8 +142,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -334,8 +332,6 @@ } -// machine - void circusc_state::machine_start() { save_item(NAME(m_sn_latch)); diff -Nru mame-0.263+dfsg.1/src/mame/konami/contra.cpp mame-0.264+dfsg.1/src/mame/konami/contra.cpp --- mame-0.263+dfsg.1/src/mame/konami/contra.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/contra.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -219,8 +219,6 @@ }; -// video - /*************************************************************************** ** ** Contra has palette RAM, but it also has four lookup table PROMs @@ -429,8 +427,6 @@ } -// machine - INTERRUPT_GEN_MEMBER(contra_state::interrupt) { if (m_k007121[0]->ctrlram_r(7) & 0x02) diff -Nru mame-0.263+dfsg.1/src/mame/konami/ddribble.cpp mame-0.264+dfsg.1/src/mame/konami/ddribble.cpp --- mame-0.263+dfsg.1/src/mame/konami/ddribble.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/ddribble.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -101,8 +101,6 @@ }; -// video - void ddribble_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -316,8 +314,6 @@ } -// machine - void ddribble_state::vblank_irq(int state) { if (state && m_int_enable[0]) diff -Nru mame-0.263+dfsg.1/src/mame/konami/divebomb.cpp mame-0.264+dfsg.1/src/mame/konami/divebomb.cpp --- mame-0.263+dfsg.1/src/mame/konami/divebomb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/divebomb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -194,8 +194,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -369,8 +367,6 @@ } -// machine - /************************************* * * Main CPU diff -Nru mame-0.263+dfsg.1/src/mame/konami/fastlane.cpp mame-0.264+dfsg.1/src/mame/konami/fastlane.cpp --- mame-0.263+dfsg.1/src/mame/konami/fastlane.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/fastlane.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,8 +85,6 @@ }; -// video - void fastlane_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -198,8 +196,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(fastlane_state::scanline) { int scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/konami/finalizr.cpp mame-0.264+dfsg.1/src/mame/konami/finalizr.cpp --- mame-0.263+dfsg.1/src/mame/konami/finalizr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/finalizr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,8 +98,6 @@ }; -// video - /*************************************************************************** @@ -317,8 +315,6 @@ return 0; } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(finalizr_state::scanline) { int const scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/konami/flkatck.cpp mame-0.264+dfsg.1/src/mame/konami/flkatck.cpp --- mame-0.263+dfsg.1/src/mame/konami/flkatck.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/flkatck.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,8 +98,6 @@ }; -// video - /*************************************************************************** Callbacks for the K007121 diff -Nru mame-0.263+dfsg.1/src/mame/konami/gberet.cpp mame-0.264+dfsg.1/src/mame/konami/gberet.cpp --- mame-0.263+dfsg.1/src/mame/konami/gberet.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/gberet.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -322,8 +322,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -525,8 +523,6 @@ } -// machine - /************************************* * * Interrupt generators diff -Nru mame-0.263+dfsg.1/src/mame/konami/gyruss.cpp mame-0.264+dfsg.1/src/mame/konami/gyruss.cpp --- mame-0.263+dfsg.1/src/mame/konami/gyruss.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/gyruss.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -164,8 +164,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -321,8 +319,6 @@ } -// machine - /* The timer clock which feeds the upper 4 bits of */ /* AY-3-8910 port A is based on the same clock */ /* feeding the sound CPU Z80. It is a divide by */ diff -Nru mame-0.263+dfsg.1/src/mame/konami/hcastle.cpp mame-0.264+dfsg.1/src/mame/konami/hcastle.cpp --- mame-0.263+dfsg.1/src/mame/konami/hcastle.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/hcastle.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -94,8 +94,6 @@ }; -// video - void hcastle_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -283,8 +281,6 @@ } -// machine - void hcastle_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data & 0x1f); diff -Nru mame-0.263+dfsg.1/src/mame/konami/hexion.cpp mame-0.264+dfsg.1/src/mame/konami/hexion.cpp --- mame-0.263+dfsg.1/src/mame/konami/hexion.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/hexion.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -183,8 +183,6 @@ }; -// video - /*************************************************************************** @@ -351,8 +349,6 @@ return 0; } -// machine - void hexion_state::coincntr_w(uint8_t data) { diff -Nru mame-0.263+dfsg.1/src/mame/konami/hyperspt.cpp mame-0.264+dfsg.1/src/mame/konami/hyperspt.cpp --- mame-0.263+dfsg.1/src/mame/konami/hyperspt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/hyperspt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -154,8 +154,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -327,8 +325,6 @@ } -// machine - void base_state::machine_start() { save_item(NAME(m_irq_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/konami/ironhors.cpp mame-0.264+dfsg.1/src/mame/konami/ironhors.cpp --- mame-0.263+dfsg.1/src/mame/konami/ironhors.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/ironhors.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -150,8 +150,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -483,8 +481,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/konami/jackal.cpp mame-0.264+dfsg.1/src/mame/konami/jackal.cpp --- mame-0.263+dfsg.1/src/mame/konami/jackal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/jackal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -161,8 +161,6 @@ }; -// video - void jackal_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -335,8 +333,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/konami/jailbrek.cpp mame-0.264+dfsg.1/src/mame/konami/jailbrek.cpp --- mame-0.263+dfsg.1/src/mame/konami/jailbrek.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/jailbrek.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -166,8 +166,6 @@ }; -// video - void jailbrek_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -279,8 +277,6 @@ } -// machine - void jailbrek_state::ctrl_w(uint8_t data) { m_nmi_enable = data & 0x01; diff -Nru mame-0.263+dfsg.1/src/mame/konami/ksys573.cpp mame-0.264+dfsg.1/src/mame/konami/ksys573.cpp --- mame-0.263+dfsg.1/src/mame/konami/ksys573.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/ksys573.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -112,8 +112,8 @@ P Handle Champ 1997.12 GQ710 JA (no CD) P Hyper Bishi Bashi Champ 1998.07 GC876 EA (no CD) P Hyper Bishi Bashi Champ - 2 Player 1999.08 GC908 JA 908 A02 -P Jikkyou Powerful Pro Yakyuu EX 1998.04 GX802 JA 802 JA B02 -P Jikkyou Powerful Pro Yakyuu EX 98 1998.08 +P Jikkyou Pawafuru Puro Yakyu EX 1998.04 GX802 JA 802 JA B02 +P Jikkyou Pawafuru Puro Yakyu EX 98 1998.08 AA Kick & Kick 2001 GNA36 EA (no CD) P Konami 80's Arcade Gallery 1998.11 GC826 JA 826 JA A01 P Konami 80's AC Special 1998 GC826 UA 826 UA A01 @@ -6341,8 +6341,8 @@ GAME( 1998, darkhleg, sys573, konami573x, konami573, ksys573_state, empty_init, ROT0, "Konami", "Dark Horse Legend (GX706 VER. JAA)", MACHINE_IMPERFECT_SOUND ) GAME( 1998, fbaitbc, sys573, fbaitbc, fbaitbc, ksys573_state, empty_init, ROT0, "Konami", "Fisherman's Bait - A Bass Challenge (GE765 VER. UAB)", MACHINE_IMPERFECT_SOUND ) GAME( 1998, bassangl, fbaitbc, fbaitbc, fbaitbc, ksys573_state, empty_init, ROT0, "Konami", "Bass Angler (GE765 VER. JAA)", MACHINE_IMPERFECT_SOUND ) -GAME( 1998, powyakex, sys573, konami573x, konami573, ksys573_state, empty_init, ROT0, "Konami", "Jikkyou Powerful Pro Yakyuu EX (GX802 VER. JAB)", MACHINE_IMPERFECT_SOUND ) -GAME( 1998, jppyex98, sys573, konami573x, konami573, ksys573_state, empty_init, ROT0, "Konami", "Jikkyou Powerful Pro Yakyuu EX '98 (GC811 VER. JAA)", MACHINE_IMPERFECT_SOUND ) +GAME( 1998, powyakex, sys573, konami573x, konami573, ksys573_state, empty_init, ROT0, "Konami", "Jikkyou Pawafuru Puro Yakyu EX (GX802 VER. JAB)", MACHINE_IMPERFECT_SOUND ) +GAME( 1998, jppyex98, sys573, konami573x, konami573, ksys573_state, empty_init, ROT0, "Konami", "Jikkyou Pawafuru Puro Yakyu EX '98 (GC811 VER. JAA)", MACHINE_IMPERFECT_SOUND ) GAME( 1998, konam80s, sys573, konami573x, konami573, ksys573_state, empty_init, ROT90, "Konami", "Konami 80's AC Special (GC826 VER. EAA)", MACHINE_IMPERFECT_SOUND ) GAME( 1998, konam80u, konam80s, konami573x, konami573, ksys573_state, empty_init, ROT90, "Konami", "Konami 80's AC Special (GC826 VER. UAA)", MACHINE_IMPERFECT_SOUND ) GAME( 1998, konam80j, konam80s, konami573x, konami573, ksys573_state, empty_init, ROT90, "Konami", "Konami 80's Gallery (GC826 VER. JAA)", MACHINE_IMPERFECT_SOUND ) diff -Nru mame-0.263+dfsg.1/src/mame/konami/labyrunr.cpp mame-0.264+dfsg.1/src/mame/konami/labyrunr.cpp --- mame-0.263+dfsg.1/src/mame/konami/labyrunr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/labyrunr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,8 +77,6 @@ }; -// video - void labyrunr_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -301,8 +299,6 @@ } -// machine - void labyrunr_state::vblank_irq(int state) { if (state && (m_k007121->ctrlram_r(7) & 0x02)) diff -Nru mame-0.263+dfsg.1/src/mame/konami/mainevt.cpp mame-0.264+dfsg.1/src/mame/konami/mainevt.cpp --- mame-0.263+dfsg.1/src/mame/konami/mainevt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/mainevt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -158,8 +158,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -248,8 +246,6 @@ } -// machine - void devstors_state::nmienable_w(uint8_t data) { m_nmi_enable = data; diff -Nru mame-0.263+dfsg.1/src/mame/konami/megazone.cpp mame-0.264+dfsg.1/src/mame/konami/megazone.cpp --- mame-0.263+dfsg.1/src/mame/konami/megazone.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/megazone.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -272,8 +272,6 @@ }; -// video - /*************************************************************************** Based on driver from MAME 0.55 Changes by Martin M. (pfloyd@gmx.net) 14.10.2001: @@ -470,8 +468,6 @@ } -// machine - uint8_t megazone_state::port_a_r() { // main xtal 14.318MHz, divided by 8 to get the AY-3-8910 clock, further divided by 1024 to get this timer diff -Nru mame-0.263+dfsg.1/src/mame/konami/mikie.cpp mame-0.264+dfsg.1/src/mame/konami/mikie.cpp --- mame-0.263+dfsg.1/src/mame/konami/mikie.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/mikie.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -262,8 +260,6 @@ return 0; } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/konami/pandoras.cpp mame-0.264+dfsg.1/src/mame/konami/pandoras.cpp --- mame-0.263+dfsg.1/src/mame/konami/pandoras.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/pandoras.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,8 +119,6 @@ }; -// video - /*********************************************************************** Convert the color PROMs into a more useable format. @@ -281,8 +279,6 @@ } -// machine - void pandoras_state::vblank_irq(int state) { if (state && m_irq_enable_a) diff -Nru mame-0.263+dfsg.1/src/mame/konami/parodius.cpp mame-0.264+dfsg.1/src/mame/konami/parodius.cpp --- mame-0.263+dfsg.1/src/mame/konami/parodius.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/parodius.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -87,8 +87,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -161,8 +159,6 @@ } -// machine - void parodius_state::videobank_w(uint8_t data) { if (data & 0xf8) diff -Nru mame-0.263+dfsg.1/src/mame/konami/pingpong.cpp mame-0.264+dfsg.1/src/mame/konami/pingpong.cpp --- mame-0.263+dfsg.1/src/mame/konami/pingpong.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/pingpong.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -99,8 +99,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -232,8 +230,6 @@ } -// machine - void cashquiz_state::machine_start() { diff -Nru mame-0.263+dfsg.1/src/mame/konami/pooyan.cpp mame-0.264+dfsg.1/src/mame/konami/pooyan.cpp --- mame-0.263+dfsg.1/src/mame/konami/pooyan.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/pooyan.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,8 +83,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -258,8 +256,6 @@ } -// machine - /************************************* * * Interrupts diff -Nru mame-0.263+dfsg.1/src/mame/konami/rockrage.cpp mame-0.264+dfsg.1/src/mame/konami/rockrage.cpp --- mame-0.263+dfsg.1/src/mame/konami/rockrage.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/rockrage.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -121,8 +121,6 @@ }; -// video - void rockrage_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -201,8 +199,6 @@ } -// machine - void rockrage_state::vblank_irq(int state) { if (state && m_k007342->is_int_enabled()) diff -Nru mame-0.263+dfsg.1/src/mame/konami/rocnrope.cpp mame-0.264+dfsg.1/src/mame/konami/rocnrope.cpp --- mame-0.263+dfsg.1/src/mame/konami/rocnrope.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/rocnrope.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -80,8 +80,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -200,8 +198,6 @@ } -// machine - void rocnrope_state::machine_start() { m_irq_mask = 0; diff -Nru mame-0.263+dfsg.1/src/mame/konami/rollerg.cpp mame-0.264+dfsg.1/src/mame/konami/rollerg.cpp --- mame-0.263+dfsg.1/src/mame/konami/rollerg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/rollerg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,8 +89,6 @@ }; -// video - /*************************************************************************** Callbacks for the K053245 @@ -142,8 +140,6 @@ } -// machine - void rollerg_state::ext_enable_w(uint8_t data) { LOGUNKWRITE("%04x: write %02x to 0010\n", m_maincpu->pc(), data); diff -Nru mame-0.263+dfsg.1/src/mame/konami/sbasketb.cpp mame-0.264+dfsg.1/src/mame/konami/sbasketb.cpp --- mame-0.263+dfsg.1/src/mame/konami/sbasketb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/sbasketb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -133,8 +133,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -293,8 +291,6 @@ } -// machine - void sbasketb_state::sh_irqtrigger_w(uint8_t data) { m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80 diff -Nru mame-0.263+dfsg.1/src/mame/konami/scotrsht.cpp mame-0.264+dfsg.1/src/mame/konami/scotrsht.cpp --- mame-0.263+dfsg.1/src/mame/konami/scotrsht.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/scotrsht.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,6 @@ }; -// video - // Similar to Iron Horse void scotrsht_state::palette(palette_device &palette) const { @@ -244,8 +242,6 @@ } -// machine - void scotrsht_state::ctrl_w(uint8_t data) { m_irq_enable = data & 0x02; diff -Nru mame-0.263+dfsg.1/src/mame/konami/shaolins.cpp mame-0.264+dfsg.1/src/mame/konami/shaolins.cpp --- mame-0.263+dfsg.1/src/mame/konami/shaolins.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/shaolins.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -166,8 +166,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -329,8 +327,6 @@ } -// machine - TIMER_DEVICE_CALLBACK_MEMBER(shaolins_state::interrupt) { int const scanline = param; diff -Nru mame-0.263+dfsg.1/src/mame/konami/surpratk.cpp mame-0.264+dfsg.1/src/mame/konami/surpratk.cpp --- mame-0.263+dfsg.1/src/mame/konami/surpratk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/surpratk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -78,8 +78,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -153,8 +151,6 @@ } -// machine - void surpratk_state::videobank_w(uint8_t data) { if (data & 0xf8) diff -Nru mame-0.263+dfsg.1/src/mame/konami/timeplt.cpp mame-0.264+dfsg.1/src/mame/konami/timeplt.cpp --- mame-0.263+dfsg.1/src/mame/konami/timeplt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/timeplt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -173,8 +173,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -388,8 +386,6 @@ } -// machine - /************************************* * * Interrupts diff -Nru mame-0.263+dfsg.1/src/mame/konami/tp84.cpp mame-0.264+dfsg.1/src/mame/konami/tp84.cpp --- mame-0.263+dfsg.1/src/mame/konami/tp84.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/tp84.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -164,8 +164,6 @@ }; -// video - /* -The colortable is divided in 2 part: -The characters colors @@ -350,8 +348,6 @@ } -// machine - void tp84_state::machine_start() { save_item(NAME(m_irq_enable)); diff -Nru mame-0.263+dfsg.1/src/mame/konami/ultraman.cpp mame-0.264+dfsg.1/src/mame/konami/ultraman.cpp --- mame-0.263+dfsg.1/src/mame/konami/ultraman.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/ultraman.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -86,8 +86,6 @@ }; -// video - /*************************************************************************** Callbacks for the K051960 @@ -193,8 +191,6 @@ } -// machine - void ultraman_state::sound_nmi_enable_w(uint8_t data) { m_soundnmi->in_w<1>(BIT(data, 0)); diff -Nru mame-0.263+dfsg.1/src/mame/konami/vendetta.cpp mame-0.264+dfsg.1/src/mame/konami/vendetta.cpp --- mame-0.263+dfsg.1/src/mame/konami/vendetta.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/vendetta.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -190,8 +190,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -269,8 +267,6 @@ } -// machine - /*************************************************************************** EEPROM diff -Nru mame-0.263+dfsg.1/src/mame/konami/xmen.cpp mame-0.264+dfsg.1/src/mame/konami/xmen.cpp --- mame-0.263+dfsg.1/src/mame/konami/xmen.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/xmen.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -161,8 +161,6 @@ }; -// video - /*************************************************************************** Callbacks for the K052109 @@ -338,8 +336,6 @@ } -// machine - /*************************************************************************** EEPROM diff -Nru mame-0.263+dfsg.1/src/mame/konami/yiear.cpp mame-0.264+dfsg.1/src/mame/konami/yiear.cpp --- mame-0.263+dfsg.1/src/mame/konami/yiear.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/yiear.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -178,8 +178,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -310,8 +308,6 @@ } -// machine - uint8_t yiear_state::speech_r() { if (m_vlm->bsy()) diff -Nru mame-0.263+dfsg.1/src/mame/konami/zs01.cpp mame-0.264+dfsg.1/src/mame/konami/zs01.cpp --- mame-0.263+dfsg.1/src/mame/konami/zs01.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/konami/zs01.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -15,6 +15,8 @@ #include "zs01.h" #include +#include + #define VERBOSE_LEVEL ( 0 ) @@ -694,22 +696,32 @@ bool zs01_device::nvram_read( util::read_stream &file ) { + std::error_condition err; std::size_t actual; - bool result = !file.read( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.read( m_command_key, sizeof( m_command_key ), actual ) && actual == sizeof( m_command_key ); - result = result && !file.read( m_data_key, sizeof( m_data_key ), actual ) && actual == sizeof( m_data_key ); - result = result && !file.read( m_configuration_registers, sizeof( m_configuration_registers ), actual ) && actual == sizeof( m_configuration_registers ); - result = result && !file.read( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); - return result; + std::tie( err, actual ) = read( file, m_response_to_reset, sizeof( m_response_to_reset ) ); + if( err || ( sizeof( m_response_to_reset ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_command_key, sizeof( m_command_key ) ); + if( err || ( sizeof( m_command_key ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_data_key, sizeof( m_data_key ) ); + if( err || ( sizeof( m_data_key ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_configuration_registers, sizeof( m_configuration_registers ) ); + if( err || ( sizeof( m_configuration_registers ) != actual ) ) + return false; + std::tie( err, actual ) = read( file, m_data, sizeof( m_data ) ); + if( err || ( sizeof( m_data ) != actual ) ) + return false; + return true; } bool zs01_device::nvram_write( util::write_stream &file ) { - std::size_t actual; - bool result = !file.write( m_response_to_reset, sizeof( m_response_to_reset ), actual ) && actual == sizeof( m_response_to_reset ); - result = result && !file.write( m_command_key, sizeof( m_command_key ), actual ) && actual == sizeof( m_command_key ); - result = result && !file.write( m_data_key, sizeof( m_data_key ), actual ) && actual == sizeof( m_data_key ); - result = result && !file.write( m_configuration_registers, sizeof( m_configuration_registers ), actual ) && actual == sizeof( m_configuration_registers ); - result = result && !file.write( m_data, sizeof( m_data ), actual ) && actual == sizeof( m_data ); + bool result = !write( file, m_response_to_reset, sizeof( m_response_to_reset ) ).first; + result = result && !write( file, m_command_key, sizeof( m_command_key ) ).first; + result = result && !write( file, m_data_key, sizeof( m_data_key ) ).first; + result = result && !write( file, m_configuration_registers, sizeof( m_configuration_registers ) ).first; + result = result && !write( file, m_data, sizeof( m_data ) ).first; return result; } diff -Nru mame-0.263+dfsg.1/src/mame/korg/microkorg.cpp mame-0.264+dfsg.1/src/mame/korg/microkorg.cpp --- mame-0.263+dfsg.1/src/mame/korg/microkorg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/korg/microkorg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,7 +9,7 @@ ****************************************************************************/ #include "emu.h" -#include "cpu/h8/h8s2320.h" +#include "cpu/h8/h8s2329.h" #include "machine/intelfsh.h" diff -Nru mame-0.263+dfsg.1/src/mame/layout/cking_master.lay mame-0.264+dfsg.1/src/mame/layout/cking_master.lay --- mame-0.263+dfsg.1/src/mame/layout/cking_master.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/cking_master.lay 2024-03-25 14:00:46.000000000 +0000 @@ -12,11 +12,11 @@ - + - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/cking_triomphe.lay mame-0.264+dfsg.1/src/mame/layout/cking_triomphe.lay --- mame-0.263+dfsg.1/src/mame/layout/cking_triomphe.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/cking_triomphe.lay 2024-03-25 14:00:46.000000000 +0000 @@ -12,7 +12,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/cxg_scptchess.lay mame-0.264+dfsg.1/src/mame/layout/cxg_scptchess.lay --- mame-0.263+dfsg.1/src/mame/layout/cxg_scptchess.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/cxg_scptchess.lay 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/cxg_scptchessa.lay mame-0.264+dfsg.1/src/mame/layout/cxg_scptchessa.lay --- mame-0.263+dfsg.1/src/mame/layout/cxg_scptchessa.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/cxg_scptchessa.lay 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/cxg_senterprisec.lay mame-0.264+dfsg.1/src/mame/layout/cxg_senterprisec.lay --- mame-0.263+dfsg.1/src/mame/layout/cxg_senterprisec.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/cxg_senterprisec.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/excal_ivant.lay mame-0.264+dfsg.1/src/mame/layout/excal_ivant.lay --- mame-0.263+dfsg.1/src/mame/layout/excal_ivant.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/excal_ivant.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/excal_mirage.lay mame-0.264+dfsg.1/src/mame/layout/excal_mirage.lay --- mame-0.263+dfsg.1/src/mame/layout/excal_mirage.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/excal_mirage.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/fidel_cphantom.lay mame-0.264+dfsg.1/src/mame/layout/fidel_cphantom.lay --- mame-0.263+dfsg.1/src/mame/layout/fidel_cphantom.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/fidel_cphantom.lay 2024-03-25 14:00:46.000000000 +0000 @@ -7,13 +7,11 @@ - - - - + + + - @@ -24,8 +22,8 @@ - - + + @@ -51,44 +49,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100,8 +95,13 @@ - - + + + + + + + @@ -143,7 +143,12 @@ - + + + + + + @@ -219,63 +224,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + + + + + + + + + + + @@ -291,10 +310,10 @@ - - - - + + + + @@ -305,10 +324,10 @@ - - - - + + + + @@ -319,37 +338,37 @@ - - - + + + - - + + - + - + - + - + - - - + + + @@ -397,7 +416,7 @@ - + @@ -429,79 +448,97 @@ + + + + + + + + + + + + + + + + + + + - - - + + - + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + @@ -514,8 +551,8 @@ - - + + @@ -531,7 +568,7 @@ - + @@ -551,36 +588,33 @@ - + + + + - - - - - - - + - - + + - - + + - - + + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/fidel_phantom.lay mame-0.264+dfsg.1/src/mame/layout/fidel_phantom.lay --- mame-0.263+dfsg.1/src/mame/layout/fidel_phantom.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/fidel_phantom.lay 2024-03-25 14:00:46.000000000 +0000 @@ -7,13 +7,11 @@ - - - + + - @@ -25,7 +23,7 @@ - + @@ -51,44 +49,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -100,8 +95,13 @@ - - + + + + + + + @@ -143,7 +143,12 @@ - + + + + + + @@ -219,63 +224,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + @@ -291,10 +310,10 @@ - - - - + + + + @@ -305,10 +324,10 @@ - - - - + + + + @@ -319,37 +338,37 @@ - - - + + + - - + + - + - + - + - + - - - + + + @@ -397,7 +416,7 @@ - + @@ -429,79 +448,100 @@ + + + + + + + + + + + + + + + + + + + + + + - - + - + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + @@ -512,10 +552,10 @@ - - - - + + + + @@ -531,7 +571,7 @@ - + @@ -551,33 +591,30 @@ - + + + + - - - - - - - + - - + + - - + + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/h19.lay mame-0.264+dfsg.1/src/mame/layout/h19.lay --- mame-0.263+dfsg.1/src/mame/layout/h19.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/h19.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + ]]> + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/h89.lay mame-0.264+dfsg.1/src/mame/layout/h89.lay --- mame-0.263+dfsg.1/src/mame/layout/h89.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/h89.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + ]]> + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/lilprof.lay mame-0.264+dfsg.1/src/mame/layout/lilprof.lay --- mame-0.263+dfsg.1/src/mame/layout/lilprof.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/lilprof.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mastmind.lay mame-0.264+dfsg.1/src/mame/layout/mastmind.lay --- mame-0.263+dfsg.1/src/mame/layout/mastmind.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mastmind.lay 2024-03-25 14:00:46.000000000 +0000 @@ -9,22 +9,20 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + ]]> @@ -43,7 +41,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_bup.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_bup.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_bup.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_bup.lay 2024-03-25 14:00:46.000000000 +0000 @@ -33,7 +33,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_milano.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_milano.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_milano.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_milano.lay 2024-03-25 14:00:46.000000000 +0000 @@ -32,11 +32,11 @@ - + - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_mm2.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_mm2.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_mm2.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_mm2.lay 2024-03-25 14:00:46.000000000 +0000 @@ -33,7 +33,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_mm5.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_mm5.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_mm5.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_mm5.lay 2024-03-25 14:00:46.000000000 +0000 @@ -35,7 +35,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_modena.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_modena.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_modena.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_modena.lay 2024-03-25 14:00:46.000000000 +0000 @@ -31,11 +31,11 @@ - + - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_mondial.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_mondial.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_mondial.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_mondial.lay 2024-03-25 14:00:46.000000000 +0000 @@ -13,7 +13,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_mondial2.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_mondial2.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_mondial2.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_mondial2.lay 2024-03-25 14:00:46.000000000 +0000 @@ -13,7 +13,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_polgar.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_polgar.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_polgar.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_polgar.lay 2024-03-25 14:00:46.000000000 +0000 @@ -34,7 +34,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/mephisto_risc.lay mame-0.264+dfsg.1/src/mame/layout/mephisto_risc.lay --- mame-0.263+dfsg.1/src/mame/layout/mephisto_risc.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/mephisto_risc.lay 2024-03-25 14:00:46.000000000 +0000 @@ -34,7 +34,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_accord.lay mame-0.264+dfsg.1/src/mame/layout/novag_accord.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_accord.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_accord.lay 2024-03-25 14:00:46.000000000 +0000 @@ -13,11 +13,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_cexpert.lay mame-0.264+dfsg.1/src/mame/layout/novag_cexpert.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_cexpert.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_cexpert.lay 2024-03-25 14:00:46.000000000 +0000 @@ -15,7 +15,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_cforte.lay mame-0.264+dfsg.1/src/mame/layout/novag_cforte.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_cforte.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_cforte.lay 2024-03-25 14:00:46.000000000 +0000 @@ -28,11 +28,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_const.lay mame-0.264+dfsg.1/src/mame/layout/novag_const.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_const.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_const.lay 2024-03-25 14:00:46.000000000 +0000 @@ -14,11 +14,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_constjr.lay mame-0.264+dfsg.1/src/mame/layout/novag_constjr.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_constjr.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_constjr.lay 2024-03-25 14:00:46.000000000 +0000 @@ -14,11 +14,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_constq.lay mame-0.264+dfsg.1/src/mame/layout/novag_constq.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_constq.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_constq.lay 2024-03-25 14:00:46.000000000 +0000 @@ -12,11 +12,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_mentor16.lay mame-0.264+dfsg.1/src/mame/layout/novag_mentor16.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_mentor16.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_mentor16.lay 2024-03-25 14:00:46.000000000 +0000 @@ -13,11 +13,11 @@ - + - - + + @@ -377,9 +377,9 @@ - + - + @@ -413,40 +413,33 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - - - @@ -484,14 +477,14 @@ - - - - - - - - + + + + + + + + @@ -504,14 +497,41 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_micro.lay mame-0.264+dfsg.1/src/mame/layout/novag_micro.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_micro.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_micro.lay 2024-03-25 14:00:46.000000000 +0000 @@ -15,11 +15,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_micro2.lay mame-0.264+dfsg.1/src/mame/layout/novag_micro2.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_micro2.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_micro2.lay 2024-03-25 14:00:46.000000000 +0000 @@ -15,11 +15,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_primo.lay mame-0.264+dfsg.1/src/mame/layout/novag_primo.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_primo.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_primo.lay 2024-03-25 14:00:46.000000000 +0000 @@ -15,7 +15,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_scorpio68k.lay mame-0.264+dfsg.1/src/mame/layout/novag_scorpio68k.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_scorpio68k.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_scorpio68k.lay 2024-03-25 14:00:46.000000000 +0000 @@ -7,19 +7,14 @@ - + + - - - - - - - + @@ -40,64 +35,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -358,144 +295,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - - + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_sdiamond.lay mame-0.264+dfsg.1/src/mame/layout/novag_sdiamond.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_sdiamond.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_sdiamond.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_sforte.lay mame-0.264+dfsg.1/src/mame/layout/novag_sforte.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_sforte.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_sforte.lay 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_snova.lay mame-0.264+dfsg.1/src/mame/layout/novag_snova.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_snova.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_snova.lay 2024-03-25 14:00:46.000000000 +0000 @@ -12,7 +12,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_ssensor4.lay mame-0.264+dfsg.1/src/mame/layout/novag_ssensor4.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_ssensor4.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_ssensor4.lay 2024-03-25 14:00:46.000000000 +0000 @@ -19,11 +19,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_supercon.lay mame-0.264+dfsg.1/src/mame/layout/novag_supercon.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_supercon.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_supercon.lay 2024-03-25 14:00:46.000000000 +0000 @@ -16,11 +16,11 @@ - + - - + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/novag_supremo.lay mame-0.264+dfsg.1/src/mame/layout/novag_supremo.lay --- mame-0.263+dfsg.1/src/mame/layout/novag_supremo.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/novag_supremo.lay 2024-03-25 14:00:46.000000000 +0000 @@ -15,7 +15,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/saitek_chessac.lay mame-0.264+dfsg.1/src/mame/layout/saitek_chessac.lay --- mame-0.263+dfsg.1/src/mame/layout/saitek_chessac.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/saitek_chessac.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/layout/saitek_gk2000.lay mame-0.264+dfsg.1/src/mame/layout/saitek_gk2000.lay --- mame-0.263+dfsg.1/src/mame/layout/saitek_gk2000.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/saitek_gk2000.lay 2024-03-25 14:00:46.000000000 +0000 @@ -14,7 +14,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/smastmind.lay mame-0.264+dfsg.1/src/mame/layout/smastmind.lay --- mame-0.263+dfsg.1/src/mame/layout/smastmind.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/smastmind.lay 2024-03-25 14:00:46.000000000 +0000 @@ -9,27 +9,25 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + ]]> @@ -49,7 +47,7 @@ - + diff -Nru mame-0.263+dfsg.1/src/mame/layout/wizatron.lay mame-0.264+dfsg.1/src/mame/layout/wizatron.lay --- mame-0.263+dfsg.1/src/mame/layout/wizatron.lay 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/wizatron.lay 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru mame-0.263+dfsg.1/src/mame/layout/yeno_416xl.lay mame-0.264+dfsg.1/src/mame/layout/yeno_416xl.lay --- mame-0.263+dfsg.1/src/mame/layout/yeno_416xl.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/layout/yeno_416xl.lay 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.263+dfsg.1/src/mame/liberty/freedom200.cpp mame-0.264+dfsg.1/src/mame/liberty/freedom200.cpp --- mame-0.263+dfsg.1/src/mame/liberty/freedom200.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/liberty/freedom200.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,6 +34,7 @@ - I/O write to 0xc0 Notes: + - Use Set-Up for status line setup, Shift+Set-Up for fullscreen setup - On first boot you will get an "error 8" - this is because RAM is uninitialized. @@ -242,6 +243,13 @@ rgb_t fg = BIT(attrcode, 4) ? pen[1] : pen[2]; rgb_t bg = pen[0]; + // reverse video? + if (BIT(m_video_ctrl, 1)) + { + using std::swap; + swap(fg, bg); + } + // draw 8 pixels of the character if (dw) { @@ -298,10 +306,6 @@ void freedom200_state::machine_reset() { m_dw_active = false; - - // allow data to be send to keyboard - m_usart[2]->write_dsr(1); - m_usart[2]->write_cts(0); } @@ -362,7 +366,7 @@ I8251(config, m_usart[2], 0); // unknown clock m_usart[2]->rxrdy_handler().set("irq", FUNC(input_merger_device::in_w<4>)); - m_usart[2]->txd_handler().set("kbd", FUNC(freedom220_kbd_device::rx_w)); + m_usart[2]->txd_handler().set("kbd", FUNC(freedom220_kbd_device::rxd_w)); rs232_port_device &mainport(RS232_PORT(config, "mainport", default_rs232_devices, nullptr)); mainport.rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd)); @@ -373,7 +377,8 @@ auxport.cts_handler().set(m_usart[1], FUNC(i8251_device::write_cts)); freedom220_kbd_device &kbd(FREEDOM220_KBD(config, "kbd")); - kbd.tx_handler().set(m_usart[2], FUNC(i8251_device::write_rxd)); + kbd.txd_cb().set(m_usart[2], FUNC(i8251_device::write_rxd)); + kbd.cts_cb().set(m_usart[2], FUNC(i8251_device::write_cts)); } @@ -416,5 +421,5 @@ //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, free200, 0, 0, freedom200, 0, freedom200_state, empty_init, "Liberty Electronics", "Freedom 200", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -COMP( 1984, free220, 0, 0, freedom200, 0, freedom200_state, empty_init, "Liberty Electronics", "Freedom 220", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +COMP( 1983, free200, 0, 0, freedom200, 0, freedom200_state, empty_init, "Liberty Electronics", "Freedom 200", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +COMP( 1984, free220, 0, 0, freedom200, 0, freedom200_state, empty_init, "Liberty Electronics", "Freedom 220", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/liberty/freedom220_kbd.cpp mame-0.264+dfsg.1/src/mame/liberty/freedom220_kbd.cpp --- mame-0.263+dfsg.1/src/mame/liberty/freedom220_kbd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/liberty/freedom220_kbd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,48 +7,49 @@ Hardware: - SCN8050 (8039) - 2716 labeled "121" - - XTAL labeled "300-107 KSS3M", measured at 4.6 MHz + - XTAL labeled "300-107 KSS3M", measured at 4.6 MHz (4.608 MHz XTAL) + - Exar 22-908-03A - UA555TC - Speaker TOOD: - "Funct" key - - Speaker + - Speaker frequency Notes: - Also used by the Freedom 200? - Data transfer with 1200 baud, 8n1 + - Key Tronic A65-02730-051 PCB-251 C ***************************************************************************/ #include "emu.h" #include "freedom220_kbd.h" + #include "speaker.h" //************************************************************************** -// DEVICE DEFINITIONS +// TYPE DEFINITIONS //************************************************************************** DEFINE_DEVICE_TYPE(FREEDOM220_KBD, freedom220_kbd_device, "freedom220_kbd", "Liberty Freedom 220 keyboard") -//------------------------------------------------- -// address maps -//------------------------------------------------- - -void freedom220_kbd_device::mem_map(address_map &map) +freedom220_kbd_device::freedom220_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, FREEDOM220_KBD, tag, owner, clock), + m_mcu(*this, "mcu"), + m_buzzer(*this, "buzzer"), + m_keys(*this, "keys_%x", 0U), + m_txd_cb(*this), + m_cts_cb(*this), + m_key_row(0x0f) { - map(0x000, 0x7ff).rom().region("mcu", 0); } -void freedom220_kbd_device::io_map(address_map &map) -{ - map(0x00, 0xff).rw(FUNC(freedom220_kbd_device::select_r), FUNC(freedom220_kbd_device::speaker_w)); -} -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** ROM_START( firmware ) ROM_REGION(0x800, "mcu", 0) @@ -57,16 +58,32 @@ const tiny_rom_entry *freedom220_kbd_device::device_rom_region() const { - return ROM_NAME(firmware); + return ROM_NAME( firmware ); } -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void freedom220_kbd_device::mem_map(address_map &map) +{ + map(0x000, 0x7ff).rom().region("mcu", 0); +} + +void freedom220_kbd_device::io_map(address_map &map) +{ + map(0x00, 0xff).rw(FUNC(freedom220_kbd_device::key_row_r), FUNC(freedom220_kbd_device::speaker_w)); +} + + +//************************************************************************** +// MACHINE DEFINITIONS +//************************************************************************** void freedom220_kbd_device::device_add_mconfig(machine_config &config) { - I8039(config, m_mcu, 4600000); + I8039(config, m_mcu, 4.608_MHz_XTAL); m_mcu->set_addrmap(AS_PROGRAM, &freedom220_kbd_device::mem_map); m_mcu->set_addrmap(AS_IO, &freedom220_kbd_device::io_map); m_mcu->p1_in_cb().set(FUNC(freedom220_kbd_device::p1_r)); @@ -74,13 +91,14 @@ SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 1.00); + BEEP(config, m_buzzer, 786); // unknown frequency + m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.5); } -//------------------------------------------------- -// input_ports - device-specific input ports -//------------------------------------------------- + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** static INPUT_PORTS_START( keyboard ) PORT_START("keys_0") @@ -91,7 +109,7 @@ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PAUSE) PORT_CHAR(UCHAR_MAMEKEY(PAUSE)) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Ins Here") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Prog") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Prog") PORT_START("keys_1") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) @@ -100,18 +118,18 @@ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) // "Funct" key? PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Find") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_NAME("Set Up") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Find") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_NAME("Set Up") PORT_START("keys_2") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 00 PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(u8"\u2190") - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(u8"\u2190") // ← + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) // 00 PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_NAME("Comp Char") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(u8"\u2193") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(u8"\u2193") // ↓ + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // 00 PORT_START("keys_3") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) @@ -159,8 +177,8 @@ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME(". .") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_NAME(", ,") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_START("keys_8") @@ -170,7 +188,7 @@ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Shift") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Shift") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_START("keys_9") @@ -179,31 +197,31 @@ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2190 Pan") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2190 Pan") // ← + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) - PORT_START("keys_10") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Slct") - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Scrl \u2193") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2191 Scrl") + PORT_START("keys_a") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Slct") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Scrl \u2193") // ↓ + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2191 Scrl") // ↑ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('<') PORT_CHAR('>') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2192 Pan") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Remov") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Auto Pan") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2192 Pan") // → + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Remov") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Auto Pan") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - PORT_START("keys_11") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) // 00 code - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_NAME("Break") - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(u8"\u2192") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(u8"\u2191") + PORT_START("keys_b") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 00 + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) // 00 + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) // 00 + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CANCEL) PORT_CHAR(UCHAR_MAMEKEY(CANCEL)) PORT_NAME("Break") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(u8"\u2192") // → + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(u8"\u2191") // ↑ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) PORT_NAME("Prev Scrn") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_NAME("Next Scrn") - PORT_START("keys_12") + PORT_START("keys_c") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) @@ -213,20 +231,20 @@ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) - PORT_START("keys_13") + PORT_START("keys_d") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA_PAD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) PORT_NAME("Print") PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad .") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad .") PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) - PORT_START("keys_14") + PORT_START("keys_e") PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_START("keys_15") + PORT_START("keys_f") PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END @@ -237,58 +255,44 @@ //************************************************************************** -// LIVE DEVICE +// MACHINE EMULATION //************************************************************************** -freedom220_kbd_device::freedom220_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, FREEDOM220_KBD, tag, owner, clock), - m_mcu(*this, "mcu"), - m_speaker(*this, "speaker"), - m_keys(*this, "keys_%u", 0U), - m_tx_handler(*this) -{ -} - void freedom220_kbd_device::device_start() { // register for save states - save_item(NAME(m_select)); + save_item(NAME(m_key_row)); } void freedom220_kbd_device::device_reset() { + // signal we are connected to the host + m_cts_cb(0); } - -//************************************************************************** -// IMPLEMENTATION -//************************************************************************** - -void freedom220_kbd_device::rx_w(int state) +void freedom220_kbd_device::rxd_w(int state) { m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE); } -uint8_t freedom220_kbd_device::select_r(offs_t offset) +uint8_t freedom220_kbd_device::key_row_r(offs_t offset) { - m_select = offset & 0x0f; + m_key_row = offset & 0x0f; return 0; } void freedom220_kbd_device::speaker_w(offs_t offset, uint8_t data) { - // TODO + m_buzzer->set_state(BIT(data, 0)); } uint8_t freedom220_kbd_device::p1_r() { - return m_keys[m_select]->read(); + return m_keys[m_key_row]->read(); } void freedom220_kbd_device::p2_w(uint8_t data) { - if (0) - logerror("p2_w: %d %d %d %d\n", BIT(data, 7), BIT(data, 6), BIT(data, 5), BIT(data, 4)); - - m_tx_handler(BIT(data, 7)); + // TODO: bit 4 does something too + m_txd_cb(BIT(data, 7)); } diff -Nru mame-0.263+dfsg.1/src/mame/liberty/freedom220_kbd.h mame-0.264+dfsg.1/src/mame/liberty/freedom220_kbd.h --- mame-0.263+dfsg.1/src/mame/liberty/freedom220_kbd.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/liberty/freedom220_kbd.h 2024-03-25 14:00:46.000000000 +0000 @@ -2,7 +2,7 @@ // copyright-holders: Dirk Best /*************************************************************************** - Liberty Freedom 220 keyboard + Liberty Freedom 220 Keyboard ***************************************************************************/ @@ -12,15 +12,13 @@ #pragma once #include "cpu/mcs48/mcs48.h" -#include "sound/spkrdev.h" +#include "sound/beep.h" //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -// ======================> freedom220_kbd_device - class freedom220_kbd_device : public device_t { public: @@ -28,9 +26,11 @@ freedom220_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); // callbacks - auto tx_handler() { return m_tx_handler.bind(); } + auto txd_cb() { return m_txd_cb.bind(); } + auto cts_cb() { return m_cts_cb.bind(); } - void rx_w(int state); + // from host + void rxd_w(int state); protected: // device_t overrides @@ -41,24 +41,25 @@ virtual void device_reset() override; private: + required_device m_mcu; + required_device m_buzzer; + required_ioport_array<16> m_keys; + + devcb_write_line m_txd_cb; + devcb_write_line m_cts_cb; + + uint8_t m_key_row; + void mem_map(address_map &map); void io_map(address_map &map); - uint8_t select_r(offs_t offset); + uint8_t key_row_r(offs_t offset); void speaker_w(offs_t offset, uint8_t data); uint8_t p1_r(); void p2_w(uint8_t data); - - required_device m_mcu; - required_device m_speaker; - required_ioport_array<16> m_keys; - - devcb_write_line m_tx_handler; - - uint8_t m_select; }; -// device type definition +// device type declaration DECLARE_DEVICE_TYPE(FREEDOM220_KBD, freedom220_kbd_device) #endif // MAME_LIBERTY_FREEDOM220_KBD_H diff -Nru mame-0.263+dfsg.1/src/mame/mame.lst mame-0.264+dfsg.1/src/mame/mame.lst --- mame-0.263+dfsg.1/src/mame/mame.lst 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mame.lst 2024-03-25 14:00:46.000000000 +0000 @@ -405,6 +405,15 @@ @source:adc/superslave.cpp superslv // +@source:adds/4000_260.cpp // (c) 1995 ADDS / SunRiver Data Systems / Boundless Technologies +4000_260 + +@source:adds/adds2020.cpp +adds2020 // + +@source:adds/vp60.cpp +vp60 // + @source:adp/adp.cpp fashiong // (c) 1997 fashiong2 // (c) 1997 @@ -439,7 +448,8 @@ mpc3000 @source:alba/albazg.cpp -yumefuda // (c) 198? Alba +hana6pt2 // (c) 1991 Alba +yumefuda // (c) 1991 Alba @source:alba/rmhaihai.cpp rmhaihai // (c) 1985 Alba @@ -887,6 +897,7 @@ maclc2 // 1991 Apple Macintosh LC II macclas2 // 1991 Apple Macintosh Classic II maccclas // 1993 Apple Macintosh Color Classic +mactv // 1994 Apple Macintosh TV @source:apple/maclc3.cpp maclc3 // 1993 Apple Macintosh LC III @@ -2154,6 +2165,76 @@ @source:atlus/bowltry.cpp bowltry // (c) 200? Atlus +@source:atlus/cave.cpp +agallet // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalleth // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletj // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletk // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agallett // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletu // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalleta // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletah // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletaj // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletak // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletat // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +agalletau // (c) 1996 Banpresto / Gazelle (country is in EEPROM) +crusherm // (c) 1999 Takumi +ddonpach // (c) 1997 Atlus/Cave +ddonpacha // hack +ddonpachj // (c) 1997 Atlus/Cave +dfeveron // (c) 1998 Cave + Nihon System license +donpachi // (c) 1995 Atlus/Cave +donpachihk // (c) 1995 Atlus/Cave +donpachij // (c) 1995 Atlus/Cave +donpachijs // (c) 1995 Atlus/Cave +donpachikr // (c) 1995 Atlus/Cave +esprade // (c) 1998 Atlus/Cave +espradej // (c) 1998 Atlus/Cave (Japan) +espradejo // (c) 1998 Atlus/Cave (Japan) +feversos // (c) 1998 Cave + Nihon System license +gaia // (c) 1999 Noise Factory +guwange // (c) 1999 Atlus/Cave +guwanges // (c) 1999 Atlus/Cave +hotdogst // (c) 1996 Marble +korokoro // (c) 1999 Takumi +mazinger // (c) 1994 Banpresto (country is in EEPROM) +mazingerj // (c) 1994 Banpresto (country is in EEPROM) +metmqstr // (c) 1995 Banpresto / Pandorabox +nmaster // (c) 1995 Banpresto / Pandorabox +paccarn // (c) 1996 Namco +paceight // (c) 1996 Namco +pacslot // (c) 1996 Namco +plegends // (c) 1994 Atlus +plegendsj // (c) 1994 Atlus +ppsatan // (c) 1996 +pwrinst2 // (c) 1994 Atlus +pwrinst2a // (c) 1994 Atlus +pwrinst2j // (c) 1994 Atlus +sailormn // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +sailormnh // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +sailormnj // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +sailormnk // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +sailormnn // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormnnh // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormnnj // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormnnk // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormnnt // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormnnu // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) +sailormno // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnoh // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnoj // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnok // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnot // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnou // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) +sailormnt // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +sailormnu // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) +tekkenbs // (c) 1998 Namco +tekkencw // (c) 1997 Namco +theroes // (c) 2001 Primetek Investments +tjumpman // (c) 1999 Namco +uopoko // (c) 1998 Cave + Jaleco license +uopokoj // (c) 1998 Cave + Jaleco license + @source:atlus/ohmygod.cpp naname // (c) 1994 Atlus (Japan) ohmygod // (c) 1993 Atlus (Japan) @@ -14923,6 +15004,7 @@ shendeng // (c) 1998 BMC @source:bmc/koftball.cpp +jxzh // (c) 1996 BMC koftball // (c) 1995 BMC @source:bmc/popobear.cpp @@ -15886,7 +15968,8 @@ tvcapcom // @source:capcom/vulgus.cpp -mach9 // bootleg (ITISA) +1942iti // bootleg (Itisa) +mach9 // bootleg (Itisa) vulgus // 5/1984 (c) 1984 vulgusa // 5/1984 (c) 1984 vulgusj // 5/1984 (c) 1984 @@ -15899,6 +15982,7 @@ @source:casio/cfx9850.cpp cfx9850 // Casio CFX-9850 +cfx9850gb // Casio CFX-9850GB Plus @source:casio/ctk2000.cpp ctk2100 // @@ -15941,6 +16025,9 @@ pb1000 // Casio PB-1000 pb2000c // Casio PB-2000C +@source:casio/pickytlk.cpp +pickytlk // Casio Picky Talk + @source:casio/pv1000.cpp pv1000 // Casio PV-1000 @@ -15959,6 +16046,43 @@ @source:casio/sx1000.cpp sx1010 // Casio SX1010 +@source:cave/cavepc.cpp +deathsm2 // + +@source:cave/cv1k.cpp +ddpdfk // (c) 2008 Cave (AMI license) - 2008/06/23 MASTER VER 1.5 +ddpdfk10 // (c) 2008 Cave (AMI license) - 2008/05/16 MASTER VER +deathsml // (c) 2007 Cave (AMI license) - 2007/10/09 MASTER VER +dfkbl // (c) 2010 Cave (AMI license) - 2010/1/18 BLACK LABEL +dsmbl // (c) 2008 Cave (AMI license) - 2008/10/06 MEGABLACK LABEL VER +espgal2 // (c) 2005 Cave (AMI license) - 2005/11/14.MASTER VER. +espgal2a // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER +espgal2b // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER +futari10 // (c) 2006 Cave (AMI license) - 2006/10/23 MASTER VER. +futari15 // (c) 2006 Cave (AMI license) - 2006/12/8.MASTER VER. 1.54. +futari15a // (c) 2006 Cave (AMI license) - 2006/12/8 MASTER VER 1.54 +futaribl // (c) 2007 Cave (AMI license) - 2009/11/27 INTERNATIONAL BL - Another Ver +futariblj // (c) 2007 Cave (AMI license) - 2007/12/11 BLACK LABEL VER +ibara // (c) 2005 Cave (AMI license) - 2005/03/22 MASTER VER.. '06. 3. 7 ver. +ibarao // (c) 2005 Cave (AMI license) - 2005/03/22 MASTER VER.. +ibarablk // (c) 2005 Cave (AMI license) - 2006/02/06. MASTER VER. +ibarablka // (c) 2005 Cave (AMI license) - 2006/02/06 MASTER VER. +mmmbanc // (c) 2007 Cave (AMI license) - 2007/06/05 MASTER VER. +mmpork // (c) 2007 Cave (AMI license) - 2007/ 4/17 MASTER VER. +mushisam // (c) 2004 Cave (AMI license) - 2004/10/12.MASTER VER. +mushisama // (c) 2004 Cave (AMI license) - 2004/10/12 MASTER VER. +mushisamb // (c) 2004 Cave (AMI license) - 2004/10/12 MASTER VER +mushitam // (c) 2005 Cave (AMI license) - 2005/09/09.MASTER VER +mushitama // (c) 2005 Cave (AMI license) - 2005/09/09 MASTER VER +pinkswts // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER.... +pinkswtsa // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER... +pinkswtsb // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER. +pinkswtsx // (c) 2006 Cave (AMI license) - 2006/xx/xx MASTER VER. +pinkswtssc // bootleg + +@source:cave/fstgfish.cpp +fstgfish // (c) 2008 Cave + @source:cce/mc1000.cpp mc1000 // @@ -16013,6 +16137,12 @@ @source:chess/conic_cchess3.cpp cncchess3 +@source:chess/excal_ivant.cpp +ivant + +@source:chess/excal_mirage.cpp +emirage + @source:chess/regence.cpp regence @@ -16022,12 +16152,6 @@ tascr30b tascr30g -@source:chess/yeno_301xl.cpp -y301xl - -@source:chess/yeno_532xl.cpp -y532xl - @source:chromatics/cgc7900.cpp cgc7900 // @@ -16188,6 +16312,9 @@ bg_max // bg_maxa // ccorsario // (c) 2002 Cirsa / Unidesa +ccorsarioa // (c) 2002 Cirsa / Unidesa +charles // (c) 2002? Cirsa / Unidesa / Europea +gladiador // (c) 2008 Cirsa / Unidesa mltpoints // (c) 2006 Cirsa / Unidesa neptunp2 // (c) 2003 Cirsa / Unidesa perlacrb // (c) 2008 Cirsa / Unidesa @@ -16446,6 +16573,7 @@ @source:cxg/senterprise.cpp senterp +senterpc @source:cxg/sphinx40.cpp sphinx40 @@ -18340,6 +18468,7 @@ atlantisb // bootleg azurian // (c) 1982 Rait Electronics Ltd bagmanm2 // (c) 1984 Valadon Automation / GIB +bagmanm3 // bootleg bagmanmc // bootleg batman2 // bootleg bigkonggx // bootleg @@ -18396,6 +18525,7 @@ galaxbsf // hack galaxbsf2 // bootleg galaxcirsa // bootleg (Cirsa) +galaxiamv // bootleg (Multivideo) galaxian // (c) Namco galaxiana // (c) Namco galaxianbl // bootleg @@ -19119,7 +19249,9 @@ h2hhockey // Coleco horseran // Mattel lilprof // Texas Instruments -lilprofa // Texas Instruments +lilprofo // Texas Instruments +lilprofoa // Texas Instruments +lilprofob // Texas Instruments litelrn // Concept 2000 liveafb // Kenner lostreas // Parker Bros @@ -19736,6 +19868,7 @@ animalhs // (c) 1991 Suns Co Ltd. animalhsa // (c) 1991 Suns Co Ltd. animalhsb // bootleg +animalhsc // bootleg animalw // bootleg aplan // bootleg (WeaShing) bingowng // (c) 1993 Wing Co. Ltd @@ -19964,6 +20097,7 @@ mgdh // (c) 1997 mgdha // (c) 1997 sdmg2 // (c) 1997 +sdmg2p // (c) 2000 slqz2 // (c) 1998 spkrform // (c) 2000? starzan // (c) 2000? @@ -20197,6 +20331,7 @@ thegladpcba // @source:igs/pgm2.cpp +bubucar // (c) 2009 ddpdojt // (c) 2010 kov2nl // (c) 2008 kov2nl_301 // @@ -28397,7 +28532,7 @@ @source:misc/anes.cpp sanma // 2001, ANES -tonpuu // 200?, ANES +tonpuu // 1997, ANES @source:misc/arachnid.cpp arac6k27 // (c) 1987/88/89/90 Arachnid Inc. @@ -28590,9 +28725,11 @@ @source:misc/astrcorp.cpp astoneag // (c) 2005 Astro Corp. +cptshark // (c) 2006 Astro Corp. dinodino // (c) 2005 Astro Corp. gostopac // (c) 2004 Astro Corp. hacher // (c) 2005 bootleg (Gametron) +hapfarm // (c) 2008 Astro Corp. luckycoin // (c) 2002 Astro Corp. magibomb // (c) 2001? Astro Corp. magibomba // (c) 2002 Astro Corp. @@ -28612,9 +28749,13 @@ skilldrp // (c) 2002 Astro Corp. skilldrpa // (c) 2002 Astro Corp. speeddrp // (c) 2003 Astro Corp. +speedmst // (c) 2004 D2 Enterprises +speedmsta // (c) 2003 D2 Enterprises +speedmstb // (c) 2004 D2 Enterprises westvent // (c) 2007? Astro Corp. winbingo // (c) 2006 Astro Corp. winbingoa // (c) 2006 Astro Corp. +wwitch // (c) 2005 Astro Corp. zoo // (c) 2004 Astro Corp. @source:misc/astropc.cpp @@ -28785,6 +28926,7 @@ comg187 // (c) 1983 Cal Omega Inc. comg204 // (c) 1984 Cal Omega Inc. comg208 // (c) 1984 Cal Omega Inc. +comg214 // (c) 1984 Cal Omega Inc. comg227 // (c) 1984 Cal Omega Inc. comg230 // (c) 1984 Cal Omega Inc. comg236 // (c) 1984 Cal Omega Inc. @@ -28810,86 +28952,18 @@ cardline // (c) 199? Veltmeijer @source:misc/carrera.cpp +alantin // bootleg (Robert / Avraam) bsebman // (c) 19?? BS Electronics +bsebmanbl // bootleg (Ballas / Avraam) +bsebmanbl2 // bootleg (J.T.) carrera // (c) 19?? BS Electronics +drkseal // bootleg (Vegas) +ncarrera // bootleg (J.T.) @source:misc/castle.cpp castfpt // Fortune Pot castrev // Revolution -@source:misc/cave.cpp -agallet // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalleth // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletj // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletk // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agallett // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletu // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalleta // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletah // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletaj // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletak // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletat // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -agalletau // (c) 1996 Banpresto / Gazelle (country is in EEPROM) -crusherm // (c) 1999 Takumi -ddonpach // (c) 1997 Atlus/Cave -ddonpacha // hack -ddonpachj // (c) 1997 Atlus/Cave -dfeveron // (c) 1998 Cave + Nihon System license -donpachi // (c) 1995 Atlus/Cave -donpachihk // (c) 1995 Atlus/Cave -donpachij // (c) 1995 Atlus/Cave -donpachijs // (c) 1995 Atlus/Cave -donpachikr // (c) 1995 Atlus/Cave -esprade // (c) 1998 Atlus/Cave -espradej // (c) 1998 Atlus/Cave (Japan) -espradejo // (c) 1998 Atlus/Cave (Japan) -feversos // (c) 1998 Cave + Nihon System license -gaia // (c) 1999 Noise Factory -guwange // (c) 1999 Atlus/Cave -guwanges // (c) 1999 Atlus/Cave -hotdogst // (c) 1996 Marble -korokoro // (c) 1999 Takumi -mazinger // (c) 1994 Banpresto (country is in EEPROM) -mazingerj // (c) 1994 Banpresto (country is in EEPROM) -metmqstr // (c) 1995 Banpresto / Pandorabox -nmaster // (c) 1995 Banpresto / Pandorabox -paccarn // (c) 1996 Namco -paceight // (c) 1996 Namco -pacslot // (c) 1996 Namco -plegends // (c) 1994 Atlus -plegendsj // (c) 1994 Atlus -ppsatan // (c) 1996 -pwrinst2 // (c) 1994 Atlus -pwrinst2a // (c) 1994 Atlus -pwrinst2j // (c) 1994 Atlus -sailormn // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -sailormnh // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -sailormnj // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -sailormnk // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -sailormnn // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormnnh // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormnnj // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormnnk // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormnnt // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormnnu // (c) 1995 Banpresto (Ver. 95/03/22, country is in EEPROM) -sailormno // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnoh // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnoj // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnok // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnot // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnou // (c) 1995 Banpresto (Ver. 95/03/21, country is in EEPROM) -sailormnt // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -sailormnu // (c) 1995 Banpresto (Ver. 95/03/22B, country is in EEPROM) -tekkenbs // (c) 1998 Namco -tekkencw // (c) 1997 Namco -theroes // (c) 2001 Primetek Investments -tjumpman // (c) 1999 Namco -uopoko // (c) 1998 Cave + Jaleco license -uopokoj // (c) 1998 Cave + Jaleco license - -@source:misc/cavepc.cpp -deathsm2 // - @source:misc/cb2001.cpp cb2001 // (c) 2001 Dyna Electronics scherrym // (c) 2001? Dyna Electronics @@ -29024,37 +29098,6 @@ tsarevna // tsarevnaa // -@source:misc/cv1k.cpp -ddpdfk // (c) 2008 Cave (AMI license) - 2008/06/23 MASTER VER 1.5 -ddpdfk10 // (c) 2008 Cave (AMI license) - 2008/05/16 MASTER VER -deathsml // (c) 2007 Cave (AMI license) - 2007/10/09 MASTER VER -dfkbl // (c) 2010 Cave (AMI license) - 2010/1/18 BLACK LABEL -dsmbl // (c) 2008 Cave (AMI license) - 2008/10/06 MEGABLACK LABEL VER -espgal2 // (c) 2005 Cave (AMI license) - 2005/11/14.MASTER VER. -espgal2a // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER -espgal2b // (c) 2005 Cave (AMI license) - 2005/11/14 MASTER VER -futari10 // (c) 2006 Cave (AMI license) - 2006/10/23 MASTER VER. -futari15 // (c) 2006 Cave (AMI license) - 2006/12/8.MASTER VER. 1.54. -futari15a // (c) 2006 Cave (AMI license) - 2006/12/8 MASTER VER 1.54 -futaribl // (c) 2007 Cave (AMI license) - 2009/11/27 INTERNATIONAL BL - Another Ver -futariblj // (c) 2007 Cave (AMI license) - 2007/12/11 BLACK LABEL VER -ibara // (c) 2005 Cave (AMI license) - 2005/03/22 MASTER VER.. '06. 3. 7 ver. -ibarao // (c) 2005 Cave (AMI license) - 2005/03/22 MASTER VER.. -ibarablk // (c) 2005 Cave (AMI license) - 2006/02/06. MASTER VER. -ibarablka // (c) 2005 Cave (AMI license) - 2006/02/06 MASTER VER. -mmmbanc // (c) 2007 Cave (AMI license) - 2007/06/05 MASTER VER. -mmpork // (c) 2007 Cave (AMI license) - 2007/ 4/17 MASTER VER. -mushisam // (c) 2004 Cave (AMI license) - 2004/10/12.MASTER VER. -mushisama // (c) 2004 Cave (AMI license) - 2004/10/12 MASTER VER. -mushisamb // (c) 2004 Cave (AMI license) - 2004/10/12 MASTER VER -mushitam // (c) 2005 Cave (AMI license) - 2005/09/09.MASTER VER -mushitama // (c) 2005 Cave (AMI license) - 2005/09/09 MASTER VER -pinkswts // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER.... -pinkswtsa // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER... -pinkswtsb // (c) 2006 Cave (AMI license) - 2006/04/06 MASTER VER. -pinkswtsx // (c) 2006 Cave (AMI license) - 2006/xx/xx MASTER VER. -pinkswtssc // bootleg - @source:misc/cwheel.cpp cwheel // (c) 19?? Gamebar @@ -29084,6 +29127,7 @@ @source:misc/dfruit.cpp dfruit // +dfruita // gemcrush @source:misc/dgpix.cpp @@ -29098,6 +29142,7 @@ xfilesk // (c) 1999 dgPIX Entertainment Inc (censored for the Korean market) @source:misc/diamondking.cpp +caribe // (c) 2001 SegaSA / Sonic diamondking // (c) 1997 SegaSA / Sonic diamondkinp // (c) 1997 SegaSA / Sonic goldenchip // (c) 19?? SegaSA / Sonic @@ -30123,6 +30168,8 @@ rbmk // (c) 1998 GMS rbspm // (c) 1998 GMS sc2in1 // (c) 2001 GMS +ssanguoj // (c) 1998 GMS +sscs // (c) 1999 GMS super555 // (c) 1999 GMS @source:misc/goldngam.cpp @@ -30478,6 +30525,9 @@ jackpot jackpota +@source:misc/jaminator.cpp +jaminator // 1990 Noise Toys Inc. + @source:misc/jankenmn.cpp jankenmn // (c) 1985 Sunwise @@ -32054,6 +32104,9 @@ wyvernwga // (c) 2001 Semicom / Game Vision yorijori // (c) +@source:misc/vampire.cpp +vampire + @source:misc/vcombat.cpp shadfgtr // (c) 1993 DUTECH Inc. vcombat // (c) 1993 VR8 Inc. @@ -32109,6 +32162,7 @@ hottop // (c) 2003 WMS - Hot Toppings (English) hottopa // (c) 2001 WMS - Hot Toppings (Russian?) inwinner // (c) 1998 WMS - Instant Winner (Russian) +inwinners // (c) 1998 WMS - Instant Winner (Spanish) jptparty // (c) 1998 WMS - Jackpot Party (Russian) leprgld // (c) 2001 WMS - Leprechaun's Gold (Russian) leprglds // (c) 2001 WMS - Leprechaun's Gold (Spanish) @@ -32232,8 +32286,9 @@ @source:mr/dribling.cpp dribling // (c) 1983 Model Racing driblinga // (c) 1983 Model Racing -driblingbr // bootleg +driblingam // bootleg (Automave) driblingo // (c) 1983 Olympia +driblingvm // bootleg (Videomac) @source:mr/sshot.cpp gunchamps // (c) 1980 Model Racing (sshot.cpp) @@ -34228,6 +34283,7 @@ @source:nintendo/nes_clone.cpp afbm7800 +croaky dancexpt digezlg dnce2000 @@ -34868,6 +34924,7 @@ @source:novag/primo.cpp nprimo nsnova +nsnovaa supremo @source:novag/robotadv.cpp @@ -34877,6 +34934,9 @@ savant // savant2 // +@source:novag/sdiamond.cpp +sdiamond + @source:novag/sexpert.cpp sexperta // sexperta1 // @@ -35156,6 +35216,7 @@ mspacmanbg2 // bootleg mspacmanbgc // bootleg mspacmanbgd // bootleg +mspacmanbgf // bootleg mspacmanbhe // bootleg mspacmanbi // bootleg mspacmanblt // bootleg @@ -35170,6 +35231,7 @@ mspacpls // hack mspackpls // hack mspactwin // (c) 1992 SUSILU +mspactwina // (c) 1992 SUSILU newpuc2 // hack newpuc2b // hack newpuckx // hack @@ -35481,6 +35543,7 @@ sy012 // SY-012 16/25 386MB VER: 5.2 motherboard (386) sy019hi // Soyo SY-019H and SY-019I motherboards (386) sybaby386 // SOYO Baby AT 386 +t4000 // Tandy 4000 tam25p2 // AUVA TAM/25-P2 motherboard (386) tam3340ma0 // TAM/33/40-MA0 (CM318R00,M31-R00) um82c481af // motherboards using the UMC UM82C481AF chipset (386) @@ -35816,6 +35879,9 @@ @source:pc/poisk1.cpp poisk1 // +@source:pc/przone.cpp +przonegd + @source:pc/ps2.cpp i8530286 // IBM PS/2 Model 30-286 i8530h31 // IBM PS/2 8530-H31 (Model 30/286) @@ -37006,6 +37072,7 @@ taxi_lg1 // taxi_lu1 // taxi_p5 // +tsptr_l1 // tsptr_l3 // whirl_l2 // whirl_l3 // @@ -38349,11 +38416,12 @@ rc759 // 1984 RC759 @source:rm/rm380z.cpp -rm380z // -rm380z34d // -rm380z34e // -rm480z // -rm480za // +rm380z // 1978 RM380z with COS 4.0 firmware +rm380zhrg // 1978 RM380z with COS 4.0 and HRG +rm380z34d // 1978 RM380z with COS 3.4 firmware and casette +rm380z34e // 1978 RM380z with COS 3.4 firmware and casette +rm480z // 1981 RM480z +rm480za // 1981 RM480z @source:rm/rmnimbus.cpp nimbus // RM Nimbus 186 @@ -38432,6 +38500,9 @@ d50o // d550 // +@source:roland/roland_d70.cpp +d70 // 1990 Roland D-70 Super LA Synthesizer + @source:roland/roland_jd800.cpp jd800 // @@ -38483,6 +38554,9 @@ @source:roland/roland_sc55.cpp sc55 // 1991 Sound Canvas SC-55 +@source:roland/roland_sc55mk2.cpp +sc55mk2 // 1994 Sound Canvas SC-55mkii + @source:roland/roland_sc88.cpp sc88vl // @@ -38521,6 +38595,13 @@ @source:sage/sage2.cpp sage2 +@source:saitek/chessac.cpp +chessac + +@source:saitek/chesstrv.cpp +chesstrv +chesstrvi + @source:saitek/companion.cpp compan @@ -38529,10 +38610,6 @@ enterp expchess -@source:saitek/chesstrv.cpp -chesstrv -chesstrvi - @source:saitek/corona.cpp corona coronaa @@ -40152,6 +40229,7 @@ pdriftl // rchase // 1991.09 Rail Chase (World) rchasej // 1991.09 Rail Chase (Japan) +rchasejb // 1991.09 Rail Chase (Japan) strkfgtr // 1991.06 Strike Fighter (World) strkfgtrj // 1991.06 Strike Fighter (Japan) @@ -40311,6 +40389,9 @@ znpwfv // 1997.12 Zen Nippon Pro Wrestling featuring Virtua znpwfvt // 1997.12 Zen Nippon Pro Wrestling featuring Virtua +@source:sega/stvdev.cpp +stvdev // + @source:sega/suprloco.cpp suprloco // (c) 1982 Sega suprlocoo // (c) 1982 Sega @@ -40330,6 +40411,7 @@ dakkochn // 836-6483 (S2) flicky // (c) 1984 (S1) flickya // (c) 1984 (S1) +flickyb // (c) 1984 (S1) flickyo // (c) 1984 (S1) flickys1 // (c) 1984 (S1) flickys2 // (c) 1984 (S1) @@ -41433,9 +41515,6 @@ @source:skeleton/adacp150.cpp adacp150p // -@source:skeleton/adds2020.cpp -adds2020 // - @source:skeleton/aid80f.cpp aid80f // @@ -41718,6 +41797,7 @@ marimba // poembase poemgolf +poemspoo poemzet poemzet2 @@ -41948,12 +42028,19 @@ @source:skeleton/ptcsol.cpp sol20 // +@source:skeleton/pullttrigger.cpp +pullttrig // (c) 2003 Digital Silkroad / Covielsa + @source:skeleton/pv9234.cpp pv9234 // @source:skeleton/pwp14.cpp pwp14 // Smith Corona PWP System 14 +@source:skeleton/qmquasar.cpp +qmquasar // +technox // + @source:skeleton/qmsirius.cpp qmrave // qmsirius // @@ -42023,6 +42110,9 @@ @source:skeleton/squale.cpp squale // +@source:skeleton/sterz80.cpp +tongzi + @source:skeleton/swyft.cpp swyft // @@ -42086,6 +42176,9 @@ @source:skeleton/ti630.cpp ti630 // +@source:skeleton/ticz80.cpp +baoqingt + @source:skeleton/tk635.cpp tk635 // (c) 199? Termtek @@ -42126,9 +42219,6 @@ @source:skeleton/vp415.cpp vp415 // (c) 1983 Philips -@source:skeleton/vp60.cpp -vp60 // - @source:skeleton/vsmilepro.cpp vsmilpro @@ -42564,6 +42654,7 @@ dinofmly // (c) 1994 Subsino dinofmlya // (c) 1995 Subsino (Tangasoft license or hack?) mtrainnv // (c) 1996 Subsino +ndongmul // (c) 1998 Hyoja Game newhunter // (c) 1992 Karam newhunterb // bootleg newhunterc // bootleg @@ -42817,6 +42908,7 @@ @source:taito/2mindril.cpp 2mindril // (c) 1993 Taito +2mindrila // (c) 1993 Taito @source:taito/40love.cpp 40love // A30 (c) 1984 Taito @@ -43033,6 +43125,9 @@ halleyscja // A62 (c) 1986 Taito Corporation (Japan) halleyscjp // A62 (c) 1985 Taito Corporation (Japan, prototype) +@source:taito/haplucky.cpp +haplucky // A58 + @source:taito/heromem.cpp heromem // E34 (c) 1997 Taito @@ -44771,6 +44866,7 @@ airblsjs buzztime carlecfg +pvmil8 pvmilfin pvwwcas rad_sinv @@ -44780,6 +44876,7 @@ sudoku2p @source:tvgames/elan_eu3a14.cpp +batvgc rad_gtg rad_rsg rad_rsgp @@ -44790,6 +44887,8 @@ rad_hnt3p rad_bask rad_baskp +spidtt +tsbuzz @source:tvgames/generalplus_gpl16250_mobigo.cpp mobigo @@ -44818,13 +44917,14 @@ beambox @source:tvgames/generalplus_gpl16250_rom.cpp +beijuehh +gormiti +imgame +myac220 smartfp // Smart Fit Park +smartfpf smartfps -gormiti tkmag220 // -myac220 -imgame -beijuehh @source:tvgames/generalplus_gpl16250_romram.cpp paccon @@ -44920,9 +45020,11 @@ decathln decathlna doraglob // (c) 2007 VTech +doraglobf doraglobg doraphon // (c) 2006 VTech doraphonf +doyousud dreamlss fordrace gssytts @@ -44935,6 +45037,7 @@ jjstrip jouet knd +lexiart lxairjet lxspidaj mattelcs // @@ -45153,6 +45256,8 @@ epo_eppk // epo_esdx // epo_guru // +epo_tenn // +epo_tfp2 // evio // gcslottv // gungunad // @@ -45315,6 +45420,7 @@ idsoccert // 8461A (c) 1985 jjack // ???? (c) 1984 kickridr // ???? (c) 1984 +runrun // bootleg spiero // ???? (c) 1987 @source:universal/getaway.cpp @@ -45634,12 +45740,18 @@ @source:visual/v102.cpp v102 // +@source:visual/v50.cpp +visual50 // (c) 1983 Visual Technology + @source:visual/v550.cpp v550 // @source:visual/v1050.cpp v1050 // +@source:visual/xds.cpp +xds19p // (c) 1990 Visual Technology + @source:votrax/votrhv.cpp hc110 // 1978 Votrax/Phonic Mirror HandiVoice HC-110 hc120 // 1978 Votrax/Phonic Mirror HandiVoice HC-120 @@ -46029,6 +46141,7 @@ bigboard // mk82 // mk83 // +mojmikro // x168 // x820 // x820ii // @@ -46132,6 +46245,9 @@ @source:yamaha/ympsr540.cpp psr540 // 1999 PSR-540 +@source:yamaha/ympsr2000.cpp +psr2000 + @source:yamaha/ymqy70.cpp qy70 // 1997 QY-70 @@ -46150,6 +46266,15 @@ @source:yamaha/ymvl70.cpp vl70 // 1996 VL70-m +@source:yeno/301xl.cpp +y301xl + +@source:yeno/416xl.cpp +y416xl + +@source:yeno/532xl.cpp +y532xl + @source:yunsung/nmg5.cpp 7ordi // (c) 2002 Yun Sung garogun // (c) 2000 Yun Sung diff -Nru mame-0.263+dfsg.1/src/mame/mc/mc68000.cpp mame-0.264+dfsg.1/src/mame/mc/mc68000.cpp --- mame-0.263+dfsg.1/src/mame/mc/mc68000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mc/mc68000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -553,8 +553,13 @@ ROM_START( mc68000 ) ROM_REGION16_BE(0x8000, "eprom0", 0) - ROM_LOAD16_BYTE("mc68000_system_1.41_upper.bin", 0x00000, 0x4000, CRC(e57f246f) SHA1(89e59e307ced22f243c4f6619dc07948e714fe71)) - ROM_LOAD16_BYTE("mc68000_system_1.41_lower.bin", 0x00001, 0x4000, CRC(9183494d) SHA1(3be47d956d03e4f89c7ff17e027cd2fe8334d64a)) + ROM_DEFAULT_BIOS("v143") + ROM_SYSTEM_BIOS(0, "v141", "V1.41") + ROMX_LOAD("mc68000_system_1.41_upper.bin", 0x00000, 0x4000, CRC(e57f246f) SHA1(89e59e307ced22f243c4f6619dc07948e714fe71), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("mc68000_system_1.41_lower.bin", 0x00001, 0x4000, CRC(9183494d) SHA1(3be47d956d03e4f89c7ff17e027cd2fe8334d64a), ROM_SKIP(1) | ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v143", "V1.43") + ROMX_LOAD("mc68000_system_1.43_upper.bin", 0x00000, 0x4000, CRC(5d73ae54) SHA1(38a594de605d63ba13ee963b004d3175a98e669a), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("mc68000_system_1.43_lower.bin", 0x00001, 0x4000, CRC(296434e5) SHA1(74416aebf3ccfa9b57d8d778b3689971f354d87c), ROM_SKIP(1) | ROM_BIOS(1)) ROM_REGION16_BE(0x8000, "eprom1", 0) ROM_LOAD16_BYTE("mc68000_cpm_2.0_upper.bin", 0x00000, 0x4000, CRC(9dbe197a) SHA1(a26dcbbf567cdccf026ce5cebb248e52b5a8b24a)) diff -Nru mame-0.263+dfsg.1/src/mame/meadows/lazercmd.cpp mame-0.264+dfsg.1/src/mame/meadows/lazercmd.cpp --- mame-0.263+dfsg.1/src/mame/meadows/lazercmd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/meadows/lazercmd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -323,8 +323,6 @@ }; -// video - /* scale a marker's vertical position the following table shows how the marker's vertical position worked in hardware @@ -395,8 +393,6 @@ } -// machine - /************************************************************* * Interrupt for the CPU * Fake something toggling the sense input line of the S2650 diff -Nru mame-0.263+dfsg.1/src/mame/meadows/meadows.cpp mame-0.264+dfsg.1/src/mame/meadows/meadows.cpp --- mame-0.263+dfsg.1/src/mame/meadows/meadows.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/meadows/meadows.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -227,8 +227,6 @@ }; -// audio - static constexpr uint32_t BASE_CTR1 = (5'000'000 / 256); static constexpr uint32_t BASE_CTR2 = (5'000'000 / 32); @@ -307,8 +305,6 @@ } -// video - // some constants to make life easier static constexpr int8_t SPR_ADJUST_X = -18; static constexpr int8_t SPR_ADJUST_Y = -14; @@ -409,8 +405,6 @@ return 0; } -// machine - void meadows_state::machine_start() { m_main_sense_state = 0; diff -Nru mame-0.263+dfsg.1/src/mame/meadows/meadwttl.cpp mame-0.264+dfsg.1/src/mame/meadows/meadwttl.cpp --- mame-0.263+dfsg.1/src/mame/meadows/meadwttl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/meadows/meadwttl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,7 +168,7 @@ } // anonymous namespace -GAME( 1976, bombaway, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Bombs Away [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, ckidzo, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Ckidzo [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, cgunship, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Cobra Gunship [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, mead4in1, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Meadows 4 in 1 [TTL]", MACHINE_IS_SKELETON ) +GAME( 1976, bombaway, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Bombs Away", MACHINE_IS_SKELETON ) +GAME( 1976, ckidzo, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Ckidzo", MACHINE_IS_SKELETON ) +GAME( 1976, cgunship, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Cobra Gunship", MACHINE_IS_SKELETON ) +GAME( 1976, mead4in1, 0, meadows, 0, meadwttl_state, empty_init, ROT0, "Meadows", "Meadows 4 in 1", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/metro/metro.cpp mame-0.264+dfsg.1/src/mame/metro/metro.cpp --- mame-0.263+dfsg.1/src/mame/metro/metro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/metro/metro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1065,7 +1065,7 @@ } -void metro_state::puzzlet_portb_w(u16 data) +void metro_state::puzzlet_portb_w(u8 data) { // popmessage("PORTB %02x", data); } diff -Nru mame-0.263+dfsg.1/src/mame/metro/metro.h mame-0.264+dfsg.1/src/mame/metro/metro.h --- mame-0.263+dfsg.1/src/mame/metro/metro.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/metro/metro.h 2024-03-25 14:00:46.000000000 +0000 @@ -116,7 +116,7 @@ u16 gakusai_input_r(); void blzntrnd_sh_bankswitch_w(u8 data); void puzzlet_irq_enable_w(u8 data); - void puzzlet_portb_w(u16 data); + void puzzlet_portb_w(u8 data); void k053936_w(offs_t offset, u16 data, u16 mem_mask = ~0); void gakusai_oki_bank_hi_w(u8 data); void gakusai_oki_bank_lo_w(u8 data); diff -Nru mame-0.263+dfsg.1/src/mame/mg1/mg1.cpp mame-0.264+dfsg.1/src/mame/mg1/mg1.cpp --- mame-0.263+dfsg.1/src/mame/mg1/mg1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mg1/mg1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -8,41 +8,42 @@ * - http://www.cpu-ns32k.net/Whitechapel.html * * TODO: - * - hard disk controller * - mouse */ +/* + * WIP + * - boots 42nix from hard disk image, but can't operate GUI without mouse + */ #include "emu.h" -// cpus and memory +#include "kbd.h" + +#include "bus/rs232/rs232.h" #include "cpu/ns32000/ns32000.h" #include "cpu/m6800/m6801.h" -#include "machine/ram.h" -#include "machine/nvram.h" - -// various hardware -#include "machine/ns32081.h" -#include "machine/ns32082.h" -#include "machine/ns32202.h" #include "machine/am79c90.h" #include "machine/am9516.h" +#include "machine/clock.h" #include "machine/i8251.h" +#include "machine/input_merger.h" +#include "machine/mm58174.h" +#include "machine/ns32081.h" +#include "machine/ns32082.h" +#include "machine/ns32202.h" +#include "machine/nvram.h" #include "machine/pit8253.h" +#include "machine/ram.h" +#include "machine/upd7261.h" #include "machine/wd_fdc.h" -//#include "machine/upd7261.h" -#include "machine/mm58174.h" -#include "machine/clock.h" +#include "sound/spkrdev.h" +#include "video/mc6845.h" -// buses and connectors -#include "bus/rs232/rs232.h" #include "imagedev/floppy.h" #include "formats/applix_dsk.h" -// video #include "screen.h" -#include "video/mc6845.h" - -#include "kbd.h" +#include "speaker.h" #include "mg1.lh" @@ -72,12 +73,15 @@ , m_fdc(*this, "fdc") , m_fdd(*this, "fdc:0:35dd") , m_net(*this, "net") - //, m_hdc(*this, "hdc") + , m_hdc(*this, "hdc") , m_ctc(*this, "ctc") , m_crtc(*this, "crtc") , m_screen(*this, "screen") , m_vmram(*this, "vmram") , m_kbd(*this, "kbd") + , m_buzzer(*this, "buzzer") + , m_buzzen(*this, "buzzer_enable") + , m_mouse_buttons(*this, "mouse_buttons") , m_led_err(*this, "led_err") , m_led_fdd(*this, "led_fdd") { @@ -99,8 +103,6 @@ private: MC6845_UPDATE_ROW(update_row); - static void floppy_formats(format_registration &fr); - // devices required_device m_cpu; required_device m_fpu; @@ -122,7 +124,7 @@ required_device m_fdd; required_device m_net; - //required_device m_hdc; + required_device m_hdc; required_device m_ctc; required_device m_crtc; @@ -131,6 +133,11 @@ required_device m_kbd; + required_device m_buzzer; + required_device m_buzzen; + + required_ioport m_mouse_buttons; + output_finder<> m_led_err; output_finder<> m_led_fdd; @@ -208,18 +215,18 @@ map(0x309200, 0x3093ff).mirror(0xcf6000).rw(m_net, FUNC(am7990_device::regs_r), FUNC(am7990_device::regs_w)); map(0x309400, 0x3095ff).mirror(0xcf6000).umask16(0x00ff).rw(m_rtc, FUNC(mm58174_device::read), FUNC(mm58174_device::write)); - //map(0x309600, 0x309603).mirror(0xcf6000).m(m_hdc, FUNC(upd7261_device::map)).umask16(0x00ff); + map(0x309600, 0x309603).mirror(0xcf6000).m(m_hdc, FUNC(upd7261_device::map)).umask16(0x00ff); map(0x309800, 0x309807).mirror(0xcf6000).umask16(0x00ff).rw(m_fdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); map(0x309a00, 0x309bff).mirror(0xcf6000).umask16(0x00ff).lw8( [this](u8 data) { - m_fdd->ss_w(!BIT(data, 0)); + m_fdd->ss_w(BIT(data, 0)); m_fdc->dden_w(BIT(data, 1)); m_led_fdd = !BIT(data, 2); m_led_err = BIT(data, 3); - //m_hdc->head_w(BIT(data, 4) ? 0x08 : 0x00); + m_hdc->head_w(BIT(data, 4) ? 0x08 : 0x00); }, "fdc_reg_w"); //map(0x309c00, 0x309dff).mirror(0xcf6000); // dma interrupt acknowledge @@ -243,13 +250,13 @@ }, "iop_sem_w"); // i/o area - //map(0x2000, 0x201f).mirror(0x1e00).lw8([this](u8 data) { logerror("mouse x counter 0x%02x\n", data); }, "mouse_x"); // mouse x counter + map(0x2000, 0x201f).mirror(0x1e00).lw8([this](u8 data) { m_buzzen->in_w<1>(BIT(data, 0)); }, "mouse_x"); // mouse x counter/buzzer enable map(0x2020, 0x2020).mirror(0x1e00).lw8([this](offs_t offset, u8 data) { logerror("host reset %x,0x%02x\n", offset, data); }, "host_reset").select(0x0100); //map(0x2040, 0x205f).mirror(0x1e00).lw8([this](u8 data) { logerror("cursor 0x%02x\n", data); }, "cursor"); // cursor pixel offset & cursor number map(0x2060, 0x207f).mirror(0x1e00).lw8([this](u8 data) { m_icu->ir_w<10>(0); }, "iopint"); map(0x2080, 0x2080).mirror(0x1e00).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); map(0x2081, 0x2081).mirror(0x1e00).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - //map(0x20a0, 0x20bf).mirror(0x1e00).lw8([this](u8 data) { logerror("mouse buttons 0x%02x\n", data); }, "mouse_b"); // mouse buttons + map(0x20a0, 0x20bf).mirror(0x1e00).lr8([this]() { return m_mouse_buttons->read(); }, "mouse_b"); // mouse buttons //map(0x20c0, 0x20df).mirror(0x1e00).lw8([this](u8 data) { logerror("mouse y counter 0x%02x\n", data); }, "mouse_y"); // mouse y counter map(0x20e0, 0x20ff).mirror(0x1e00).rw(m_iop_ctc, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); @@ -266,6 +273,10 @@ } static INPUT_PORTS_START(mg1) + PORT_START("mouse_buttons") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Middle Button") PORT_CODE(MOUSECODE_BUTTON3) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Mouse Right Button") PORT_CODE(MOUSECODE_BUTTON2) INPUT_PORTS_END MC6845_UPDATE_ROW(mg1_state::update_row) @@ -296,6 +307,14 @@ } } +static void floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + + // TODO: unrelated to applix, but same logical format + fr.add(FLOPPY_APPLIX_FORMAT); +} + void mg1_state::mg1(machine_config &config) { NS32016(config, m_cpu, 16_MHz_XTAL / 2); @@ -320,7 +339,7 @@ * 5 busint3 level lo * 6 level lo * 7 busint4 level lo - * 8 level hi + * 8 fdcintr level hi * 9 busint5 edge lo * 10 iopint edge lo * 11 edge hi @@ -346,20 +365,21 @@ NVRAM(config, m_iop_sram); // 1xD4016C-3 2048x8 SRAM PIT8253(config, m_iop_ctc); - // channel 0 buzzer - // out0 -> speaker - // clk0 <- iope (1MHz) - // gate0 <- pullup? + m_iop_ctc->set_clk<0>(8_MHz_XTAL / 8); + m_iop_ctc->out_handler<0>().set(m_buzzen, FUNC(input_merger_all_high_device::in_w<0>)); + + INPUT_MERGER_ALL_HIGH(config, m_buzzen); + m_buzzen->output_handler().set(m_buzzer, FUNC(speaker_sound_device::level_w)); + // channel 1 & 2 cursor position - // crt-vbas -> clk1, clk2 - // hsync -> gate2 - // out2 -> ? - // out1 -> ? - // vsync -> gate1 + m_iop_ctc->set_clk<1>(60_MHz_XTAL / 64); + m_iop_ctc->set_clk<2>(60_MHz_XTAL / 64); + // out2 -> cout2 (triggered every line) + // out1 -> cout1 (goes low when cursor required on this line) - AM9516(config, m_dma[0], 10_MHz_XTAL / 2); // graphics (not used) + AM9516(config, m_dma[0], 8_MHz_XTAL / 2); // graphics (not used) - AM9516(config, m_dma[1], 10_MHz_XTAL / 2); // general, ch1 hard disk, ch2 -> J3 or floppy + AM9516(config, m_dma[1], 8_MHz_XTAL / 2); // general, ch1 hard disk, ch2 -> J3 or floppy m_dma[1]->out_int().set(m_icu, FUNC(ns32202_device::ir_w<4>)); m_dma[1]->set_addrmap(am9516_device::SYSTEM_MEM, &mg1_state::dma_map); @@ -384,6 +404,8 @@ m_crtc->set_show_border_area(false); m_crtc->set_hpixels_per_column(64); m_crtc->set_update_row_callback(FUNC(mg1_state::update_row)); + m_crtc->out_vsync_callback().set(m_iop_ctc, FUNC(pit8253_device::write_gate1)); + m_crtc->out_hsync_callback().set(m_iop_ctc, FUNC(pit8253_device::write_gate2)); // black & white crt, 56Hz refresh, 46.877kHz line, line sync 1.066uS, frame sync 341.32uS // crtc sees it as 16 col x 50 rows, with 64x16 character cells @@ -396,20 +418,18 @@ m_net->dma_in().set([this](offs_t offset) { return m_cpu->space(0).read_word(offset); }); m_net->dma_out().set([this](offs_t offset, u16 data, u16 mem_mask) { m_cpu->space(0).write_word(offset, data, mem_mask); }); - // hard disk controller not emulated -#if 0 UPD7261(config, m_hdc, 10_MHz_XTAL); m_hdc->out_dreq().set(m_dma[1], FUNC(am9516_device::dreq_w<0>)).invert(); m_hdc->out_int().set(m_icu, FUNC(ns32202_device::ir_w<3>)); HARDDISK(config, "hdc:0"); HARDDISK(config, "hdc:1"); -#endif WD1770(config, m_fdc, 8_MHz_XTAL); m_fdc->intrq_wr_callback().set(m_icu, FUNC(ns32202_device::ir_w<8>)); - //m_fdc->drq_wr_callback().set(m_dma, FUNC(dmac_0448_device::drq<1>)); + m_fdc->drq_wr_callback().set(m_dma[1], FUNC(am9516_device::dreq_w<1>)).invert(); + // format is 80 tracks, 5 sectors/track, 1024 bytes/sector FLOPPY_CONNECTOR(config, "fdc:0", "35dd", FLOPPY_35_DD, true, floppy_formats).enable_sound(true); PIT8253(config, m_ctc); @@ -427,11 +447,15 @@ /* * Documentation indicates the serial clock for the IOP should be driven by the keyboard, however the available * keyboard firmware does not produce a compatible clock output. A hand-drawn sketch indicates the system front - * panel allows the serial clock to be generated by a 2.4676MHz crystal and a 4060 divider. The default strapping + * panel allows the serial clock to be generated by a 2.4576MHz crystal and a 4060 divider. The default strapping * selects a 256 divisor, giving a 9600Hz clock which after the 8x divider in the IOP gives a 1200 baud data rate. */ clock_device &kbd_clk(CLOCK(config, "kbd_clock", 2.4576_MHz_XTAL / 256)); - kbd_clk.signal_handler().set([this](int state) { if (state) m_iop->m6801_clock_serial(); }); + kbd_clk.signal_handler().set([this](int state) { if (state) m_iop->clock_serial(); }); + + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_buzzer); + m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.50); //SOFTWARE_LIST(config, "flop_list").set_original("mg1_flop"); //SOFTWARE_LIST(config, "hdd_list").set_original("mg1_hdd"); @@ -439,17 +463,13 @@ config.set_default_layout(layout_mg1); } -void mg1_state::floppy_formats(format_registration &fr) -{ - fr.add_mfm_containers(); - fr.add(FLOPPY_APPLIX_FORMAT); -} - ROM_START(mg1) ROM_REGION16_LE(0x4000, "prom", 0) ROM_SYSTEM_BIOS(0, "260", "v2.60") ROMX_LOAD("sys_260_even.u291", 0x0000, 0x2000, CRC(24b45b73) SHA1(04d86587b104aa122ac395aa39eb92a1f4d68def), ROM_BIOS(0) | ROM_SKIP(1)) ROMX_LOAD("sys_260_odd.u292", 0x0001, 0x2000, CRC(a46ebbf8) SHA1(a2ab9fa3a9576d63d8d49730bfcd58a0f508b30f), ROM_BIOS(0) | ROM_SKIP(1)) + + // floppy support seems to work better with this firmware version ROM_SYSTEM_BIOS(1, "251", "v2.51") ROMX_LOAD("even_2.51__sys__13.1_u291.u291", 0x0000, 0x2000, CRC(677cab3c) SHA1(d0197b45ddb1ddd8cd125727312b06dcae0f984a), ROM_BIOS(1) | ROM_SKIP(1)) ROMX_LOAD("odd_2.51__sys__13.1_u292.u292", 0x0001, 0x2000, CRC(b0134a98) SHA1(a81bd4987030b09799bad0c3bc758ea8aed8cd2f), ROM_BIOS(1) | ROM_SKIP(1)) diff -Nru mame-0.263+dfsg.1/src/mame/microterm/mt440.cpp mame-0.264+dfsg.1/src/mame/microterm/mt440.cpp --- mame-0.263+dfsg.1/src/mame/microterm/mt440.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/microterm/mt440.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -48,6 +48,8 @@ #include "emu.h" #include "cpu/z80/z80.h" +#include "emupal.h" + namespace { @@ -102,6 +104,27 @@ //************************************************************************** +// VIDEO EMULATION +//************************************************************************** + +static const gfx_layout char_layout = +{ + 8, 10, + 128, + 1, + { 0 }, + { STEP8(0, 1) }, + { 0*0x80*8, 1*0x80*8, 2*0x80*8, 3*0x80*8, 4*0x80*8, 5*0x80*8, 6*0x80*8, 7*0x80*8, 8*0x80*8, 9*0x80*8 }, + 8 +}; + +static GFXDECODE_START(chars) + GFXDECODE_ENTRY("cg", 0x000, char_layout, 0, 1) + GFXDECODE_ENTRY("cg", 0x800, char_layout, 0, 1) +GFXDECODE_END + + +//************************************************************************** // MACHINE EMULATION //************************************************************************** @@ -123,6 +146,10 @@ Z80(config, m_maincpu, 4_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &mt440_state::mem_map); m_maincpu->set_addrmap(AS_IO, &mt440_state::io_map); + + PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT); + + GFXDECODE(config, "gfxdecode", "palette", chars); } @@ -137,6 +164,7 @@ ROM_LOAD("1965_mp_r40.u9", 0xa000, 0x1000, CRC(e39d145c) SHA1(79c4a8dd62398b6f2f6e7e8004ec42b2511016de)) ROM_REGION(0x1000, "cg", 0) + // bad? gfxdecode shows missing pixels ROM_LOAD("mt425_cg_rev21.u37", 0x0000, 0x1000, CRC(3ba34cf4) SHA1(dddddf69d736f04a17aae2019f47257484e88377)) ROM_REGION(0x800, "attr", 0) diff -Nru mame-0.263+dfsg.1/src/mame/midway/midwayic.cpp mame-0.264+dfsg.1/src/mame/midway/midwayic.cpp --- mame-0.263+dfsg.1/src/mame/midway/midwayic.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/midway/midwayic.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -640,14 +640,14 @@ bool midway_serial_pic2_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_nvram, sizeof(m_nvram), actual) && actual == sizeof(m_nvram); + auto const [err, actual] = util::read(file, m_nvram, sizeof(m_nvram)); + return !err && (actual == sizeof(m_nvram)); } bool midway_serial_pic2_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_nvram, sizeof(m_nvram), actual) && actual == sizeof(m_nvram); + auto const [err, actual] = util::write(file, m_nvram, sizeof(m_nvram)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/misc/4enraya.cpp mame-0.264+dfsg.1/src/mame/misc/4enraya.cpp --- mame-0.263+dfsg.1/src/mame/misc/4enraya.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/4enraya.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -255,8 +255,6 @@ }; -// video - void _4enraya_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[(offset & 0x3ff) * 2] = data; @@ -282,8 +280,6 @@ } -// machine - /*********************************** * Custom Handlers * ***********************************/ diff -Nru mame-0.263+dfsg.1/src/mame/misc/anes.cpp mame-0.264+dfsg.1/src/mame/misc/anes.cpp --- mame-0.263+dfsg.1/src/mame/misc/anes.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/anes.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -797,5 +797,5 @@ } // anonymous namespace -GAME( 2001, sanma, 0, anes, sanma, anes_state, empty_init, ROT0, "ANES", "Sanma - San-nin Uchi Mahjong [BET] (Japan, version 2.60)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // flyer says 2000, manual says 2001 version 2.60 -GAME( 200?, tonpuu, 0, anes, tonpuu, anes_state, empty_init, ROT0, "ANES", "Ton Puu Mahjong Version 2.0 RX [BET] (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 2001, sanma, 0, anes, sanma, anes_state, empty_init, ROT0, "ANES", "Sanma - San-nin Uchi Mahjong (Japan, version 2.60)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // flyer says 2000, manual says 2001 version 2.60 +GAME( 1997, tonpuu, 0, anes, tonpuu, anes_state, empty_init, ROT0, "ANES", "Ton Puu Mahjong Version 2.0 RX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/astrcorp.cpp mame-0.264+dfsg.1/src/mame/misc/astrcorp.cpp --- mame-0.263+dfsg.1/src/mame/misc/astrcorp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/astrcorp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -23,17 +23,23 @@ 02 Skill Drop GA None JX-1689F1028N ASTRO V02 pLSI1016-60LJ 02? Keno 21 ? ASTRO V102? ASTRO V05 ASTRO F02? not dumped 03 Speed Drop None JX-1689HP ASTRO V05 pLSI1016-60LJ +03 Speed Master (V1.0) M02 AST-V102PX scratched scratched Encrypted 04 Zoo M1.1 ASTRO V102PX-005? ASTRO V06 ASTRO F02 2005-02-18 Encrypted 04 Magic Bomb (NB6.1) J (CS350P001 + CS350P033) ASTRO V102PX-014? ASTRO V07 ?, Encrypted, select CGA / VGA via jumper 04 Go & Stop K2 (CS350P011) no markings ASTRO V05 ASTRO F01 2007-06-03 Encrypted 04 Magic Bomb (AA.72C) M1.1 ASTRO V102PX-014? ASTRO V05 ASTRO F02 2005-02-18 Encrypted +04 Speed Master (V1.0) M02 AST-V102PX scratched scratched Encrypted +04 Speed Master (V1.0) CS350P003 scratched scratched scratched Encrypted 05 Monkey Land (AA.13B) M1 ASTRO V102PX-005? ASTRO V06 ASTRO F02 2004-05-18 Encrypted 05 Monkey Land (AA.21A) M1.1 ASTRO V102PX-005? ASTRO V06 ASTRO F02 2004-12-04 Encrypted 05 Dino Dino T-3802A ASTRO V102PX-010? ASTRO V05 ASTRO F02 2003-03-12 Encrypted 05 Stone Age L1 ASTRO V102PX-012? ASTRO V05(x2) ASTRO F02 2004-09-04 Encrypted 05? Hacher (hack) M1.2 ? ? ASTRO F02 2005-02-18 Encrypted +05 Wicked Witch O (CS350P032) ASTRO V102PX-016? ASTRO V06 ASTRO F02 2005-09-17 Encrypted +06 Captain Shark M1.2 ASTRO V102PX-006? ASTRO V06 ASTRO F02 2005-05-29 Encrypted 06 Win Win Bingo M1.2 ASTRO V102PX-006? ASTRO V06 ASTRO F02 2005-09-17 Encrypted 07? Western Venture O (CS350P032) ASTRO V102? ASTRO V07 ASTRO F01 2007-06-03 Encrypted +07 Happy Farm _P_ROHS ASTRO V102PX-008? ASTRO V07 ASTRO ROHS BA21C00009 M835KK01 Encrypted ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - astoneag, magibomb, winbingo, etc.: to initialize EEPROM (and self test in some games), keep keyout (W) pressed during boot. @@ -61,7 +67,11 @@ - astoneag, dinodino, magibombd, magibombg: exiting from test menu goes haywire (requires a soft-reset with F3). - magibombg: needs RE of the CPU code and correct EEPROM. - gostopac: stops with 'S4' message during boot. Needs RE of the CPU code and emulation of its peculiarities. -- monkeyl,a: Needs RE of the CPU code, inputs and layout. After reset it initializes. +- monkeyl,a: need RE of the CPU code, inputs and layout. After reset it initializes. +- speedmst,a,b: need RE of the CPU code, correct EEPROM. Won't boot right now. +- cptshark: needs verifying of inputs and layout +- wwitch: needs correct GFX ROMs loading / decode, RE of the CPU code, inputs, outputs. Currently starts but then freezes. +- hapfarm: doesn't work, possibly wrong interrupts. Code base differs significantly, needs studying. *************************************************************************************************************/ @@ -288,21 +298,30 @@ void hacher(machine_config &config); void dinodino(machine_config &config); void gostop(machine_config &config); + void hapfarm(machine_config &config); void magibombd(machine_config &config); void magibombg(machine_config &config); void monkeyl(machine_config &config); + void speedmst(machine_config &config); void winbingo(machine_config &config); + void wwitch(machine_config &config); void zoo(machine_config &config); + void init_cptshark(); void init_dinodino(); void init_gostop(); void init_hacher(); + void init_hapfarm(); void init_magibombd(); void init_magibombg(); void init_monkeyl(); void init_monkeyla(); + void init_speedmst(); + void init_speedmsta(); + void init_speedmstb(); void init_winbingo(); void init_winbingoa(); + void init_wwitch(); void init_zoo(); virtual void eeprom_w(u8 data) override; @@ -336,18 +355,22 @@ void dinodino_map(address_map &map); void gostop_map(address_map &map); void hacher_map(address_map &map); + void hapfarm_map(address_map &map); void magibombd_map(address_map &map); void magibombg_map(address_map &map); void monkeyl_map(address_map &map); + void speedmst_map(address_map &map); void winbingo_map(address_map &map); + void wwitch_map(address_map &map); void zoo_map(address_map &map); - static const decryption_info dinodino_table; static const decryption_info gostop_table; - static const decryption_info magibombd_table; - static const decryption_info monkeyl_table; - static const decryption_info winbingo_table; - static const decryption_info zoo_table; + static const decryption_info v102_px005_table; + static const decryption_info v102_px006_table; + static const decryption_info v102_px008_table; + static const decryption_info v102_px010_table; + static const decryption_info v102_px014_table; + static const decryption_info v102_px016_table; }; // Adds RAMDAC and 16x32 sprites @@ -369,7 +392,7 @@ void astoneag_map(address_map &map); void ramdac_map(address_map &map); - static const decryption_info astoneag_table; + static const decryption_info v102_px012_table; void interleave_sprites_16x32(); }; @@ -934,6 +957,57 @@ map(0xe80001, 0xe80001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); } +void zoo_state::speedmst_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom().mirror(0x800000); // POST checks for ROM checksum at mirror + map(0x850000, 0x850001).nopr().w(FUNC(zoo_state::screen_enable_w)).umask16(0x00ff); + map(0x860000, 0x863fff).ram().share("nvram"); // battery + map(0x880000, 0x880fff).ram().share("spriteram"); + map(0x882000, 0x882001).nopr().w(FUNC(zoo_state::draw_sprites_w)); + map(0x884000, 0x884001).portr("INPUTS"); + map(0x886000, 0x8861ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0x888001, 0x888001).w(FUNC(zoo_state::eeprom_w)); + map(0x88a000, 0x88a001).w(FUNC(zoo_state::magibomb_outputs_w)); + map(0x890000, 0x890001).portr("EEPROM_IN"); + map(0x8a0000, 0x8a0001).portr("CPUCODE_IN"); + //map(0x8c0001, 0x8c0001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + //map(0x??0001, 0x??0001).w(FUNC(zoo_state::oki_bank_w)) +} + +void zoo_state::wwitch_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom().mirror(0x800000); // POST checks for ROM checksum at mirror + map(0xa00001, 0xa00001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0xa80000, 0xa80fff).ram().share("spriteram"); + map(0xa82000, 0xa82001).nopr().w(FUNC(zoo_state::draw_sprites_w)); + map(0xa84000, 0xa84001).portr("INPUTS"); + map(0xa88001, 0xa88001).w(FUNC(zoo_state::eeprom_w)); + map(0xa8a000, 0xa8a001).w(FUNC(zoo_state::magibomb_outputs_w)); + map(0xa8e000, 0xa8e001).portr("EEPROM_IN"); + map(0xb00000, 0xb00000).w(FUNC(zoo_state::oki_bank_w)); + map(0xb80000, 0xb83fff).ram().share("nvram"); // battery + map(0xc00000, 0xc00001).portr("CPUCODE_IN"); + map(0xd00000, 0xd001ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); +// map(0x??0001, 0x??0001).w(FUNC(zoo_state::screen_enable_w)); // unknown location +} + +void zoo_state::hapfarm_map(address_map &map) // TODO: verify everything +{ + map(0x000000, 0x03ffff).rom().mirror(0x800000); // POST checks for ROM checksum at mirror + map(0x480000, 0x483fff).ram().share("nvram"); // battery + map(0xb00000, 0xb00001).portr("CPUCODE_IN"); + map(0xb80000, 0xb80fff).ram().share("spriteram"); + map(0xb82000, 0xb82001).nopr().w(FUNC(zoo_state::draw_sprites_w)); + map(0xb84000, 0xb84001).portr("INPUTS"); + map(0xb88001, 0xb88001).w(FUNC(zoo_state::eeprom_w)); + map(0xb8a000, 0xb8a001).w(FUNC(zoo_state::magibomb_outputs_w)); + map(0xb8e000, 0xb8e001).portr("EEPROM_IN"); + map(0xd00000, 0xd001ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0xd80000, 0xd80000).w(FUNC(zoo_state::oki_bank_w)); + map(0xe00001, 0xe00001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); +// map(0x??0001, 0x??0001).w(FUNC(zoo_state::screen_enable_w)); // unknown location +} + void astoneag_state::astoneag_map(address_map &map) { map(0x000000, 0x03ffff).rom().mirror(0x800000); // POST checks for ROM checksum at mirror @@ -1369,6 +1443,24 @@ m_maincpu->set_addrmap(AS_PROGRAM, &zoo_state::monkeyl_map); } +void zoo_state::speedmst(machine_config &config) +{ + gostop(config); + m_maincpu->set_addrmap(AS_PROGRAM, &zoo_state::speedmst_map); +} + +void zoo_state::wwitch(machine_config &config) +{ + winbingo(config); + m_maincpu->set_addrmap(AS_PROGRAM, &zoo_state::wwitch_map); +} + +void zoo_state::hapfarm(machine_config &config) +{ + winbingo(config); + m_maincpu->set_addrmap(AS_PROGRAM, &zoo_state::hapfarm_map); +} + void astoneag_state::ramdac_map(address_map &map) { map(0x000, 0x2ff).rw(m_ramdac, FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb666_w)); @@ -2298,7 +2390,7 @@ ROM_LOAD16_BYTE( "1_m.l._aa.21.a.u25", 0x00001, 0x20000, CRC(0612f893) SHA1(6300d9defc75b1b09fad31f719c841c728fe3ff6) ) // F29C51001T ROM_REGION( 0x1000000, "sprites", 0 ) - ROM_LOAD( "mx29f1610mc.u26", 0x000000, 0x200000, CRC(dfa57e8f) SHA1(b24849825324695117ceea2d85412f06df96efcf) ) // the "U26" marking is present twice (should have been U31?) + ROM_LOAD( "mx29f1610mc.u26", 0x000000, 0x200000, CRC(1ec8b75d) SHA1(53f501126c81bdc8ccd8c44ed9f82078156c48ff) ) // the "U26" marking is present twice (should have been U31?) ROM_LOAD( "mx29f1610mc.u30", 0x200000, 0x200000, CRC(9d26fa05) SHA1(571f5515411e504bf7661b8b5d358dc6c55e6fbe) ) ROM_RELOAD( 0x400000, 0x200000 ) ROM_RELOAD( 0x600000, 0x200000 ) @@ -2323,7 +2415,7 @@ ROM_LOAD16_BYTE( "1_m.l._aa.13.b.u25", 0x00001, 0x20000, CRC(d261b6ed) SHA1(347feb51b67cd0e0faeff98fa023b3f4a8cb9c32) ) // F29C51001T ROM_REGION( 0x1000000, "sprites", 0 ) - ROM_LOAD( "mx29f1610mc.u26", 0x000000, 0x200000, CRC(dfa57e8f) SHA1(b24849825324695117ceea2d85412f06df96efcf) ) // the "U26" marking is present twice (should have been U31?) + ROM_LOAD( "mx29f1610mc.u26", 0x000000, 0x200000, CRC(1ec8b75d) SHA1(53f501126c81bdc8ccd8c44ed9f82078156c48ff) ) // the "U26" marking is present twice (should have been U31?) ROM_LOAD( "mx29f1610mc.u30", 0x200000, 0x200000, CRC(9d26fa05) SHA1(571f5515411e504bf7661b8b5d358dc6c55e6fbe) ) ROM_RELOAD( 0x400000, 0x200000 ) ROM_RELOAD( 0x600000, 0x200000 ) @@ -2342,6 +2434,178 @@ ROM_LOAD( "monkeyl_cpucode.key", 0x00, 0x02, NO_DUMP ) ROM_END +/*************************************************************************** + +Speed Master +D2 Enterprises + +***************************************************************************/ + +ROM_START( speedmst ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "1_s.m._d2.01.c.u23", 0x00000, 0x10000, CRC(f98cdc5f) SHA1(59088d649ec47c94469de3d409d75ab29ebdd4ec) ) // 27C512 + ROM_LOAD16_BYTE( "2_s.m._d2.01.c.u22", 0x00001, 0x10000, CRC(f5017c91) SHA1(fa5e4888ff819dbaa5f10f089c6de2f32b8888ac) ) // 27C512 + ROM_FILL( 0x20000, 0x20000, 0xff ) + + ROM_REGION( 0x1000000, "sprites", 0 ) + ROM_LOAD( "mx29f1610ml.u31", 0x000000, 0x200000, BAD_DUMP CRC(70b33a01) SHA1(d8330c5ff0a47127d00bad313963becf6bc92280) ) // chip wouldn't read, taken from other sets + ROM_RELOAD( 0x200000, 0x200000 ) + ROM_RELOAD( 0x400000, 0x200000 ) + ROM_RELOAD( 0x600000, 0x200000 ) + ROM_RELOAD( 0x800000, 0x200000 ) + ROM_RELOAD( 0xa00000, 0x200000 ) + ROM_RELOAD( 0xc00000, 0x200000 ) + ROM_RELOAD( 0xe00000, 0x200000 ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_speed_master.u44", 0x00000, 0x80000, CRC(5eacf25c) SHA1(affbf8176b6cbc406a281793c0a9c79e7175942d) ) // 27C4000 + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u9", 0x0000, 0x0080, CRC(5e03d141) SHA1(d475bd0509fb977d38f012c4eb1e9cb88c3d130a) ) + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "speedmst_cpucode.key", 0x00, 0x02, NO_DUMP ) +ROM_END + +ROM_START( speedmsta ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "speed_master_1.u23", 0x00000, 0x10000, CRC(c99200af) SHA1(0573ebc4bd866850aa6c16a0b9db7d7229865dbf) ) // 27C512 + ROM_LOAD16_BYTE( "speed_master_2.u22", 0x00001, 0x10000, CRC(041ff0de) SHA1(63b129605d1c330836fdd5fa8a654f5d20170f0d) ) // 27C512 + ROM_FILL( 0x20000, 0x20000, 0xff ) + + ROM_REGION( 0x1000000, "sprites", 0 ) + ROM_LOAD( "mx29f1610ml.u31", 0x000000, 0x200000, CRC(70b33a01) SHA1(d8330c5ff0a47127d00bad313963becf6bc92280) ) + ROM_RELOAD( 0x200000, 0x200000 ) + ROM_RELOAD( 0x400000, 0x200000 ) + ROM_RELOAD( 0x600000, 0x200000 ) + ROM_RELOAD( 0x800000, 0x200000 ) + ROM_RELOAD( 0xa00000, 0x200000 ) + ROM_RELOAD( 0xc00000, 0x200000 ) + ROM_RELOAD( 0xe00000, 0x200000 ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_speed_master.u44", 0x00000, 0x80000, CRC(d2c7025f) SHA1(3337216811c8b81ce72cfdd1ed9eecd4b0622dc7) ) // SLDH, 27C4001 + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u9", 0x0000, 0x0080, BAD_DUMP CRC(5e03d141) SHA1(d475bd0509fb977d38f012c4eb1e9cb88c3d130a) ) // dumped for the D2.01.C set + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "speedmsta_cpucode.key", 0x00, 0x02, NO_DUMP ) +ROM_END + +ROM_START( speedmstb ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "1_speed_master_d1.6.u23", 0x00000, 0x10000, CRC(beb8bcb8) SHA1(a06f4cb151ae6e80a4d5335a774be06d2c1feb2b) ) // 27C512 + ROM_LOAD16_BYTE( "2_speed_master_d1.6.u22", 0x00001, 0x10000, CRC(2a0912fd) SHA1(e83bb6f131ea0d6dd5dc8e71e21a76b1f1ba1f09) ) // 27C512 + ROM_FILL( 0x20000, 0x20000, 0xff ) + + ROM_REGION( 0x1000000, "sprites", 0 ) + ROM_LOAD( "mx29f1610ml.u31", 0x000000, 0x200000, CRC(70b33a01) SHA1(d8330c5ff0a47127d00bad313963becf6bc92280) ) + ROM_RELOAD( 0x200000, 0x200000 ) + ROM_RELOAD( 0x400000, 0x200000 ) + ROM_RELOAD( 0x600000, 0x200000 ) + ROM_RELOAD( 0x800000, 0x200000 ) + ROM_RELOAD( 0xa00000, 0x200000 ) + ROM_RELOAD( 0xc00000, 0x200000 ) + ROM_RELOAD( 0xe00000, 0x200000 ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_speed_master.u44", 0x00000, 0x80000, CRC(d2c7025f) SHA1(3337216811c8b81ce72cfdd1ed9eecd4b0622dc7) ) // 27C040 + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u9", 0x0000, 0x0080, BAD_DUMP CRC(5e03d141) SHA1(d475bd0509fb977d38f012c4eb1e9cb88c3d130a) ) // dumped for the D2.01.C set + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "speedmstb_cpucode.key", 0x00, 0x02, NO_DUMP ) +ROM_END + +/*************************************************************************** + +Captain Shark +Astro Corp. / American Alpha + +***************************************************************************/ + +ROM_START( cptshark ) // clearly based on Win Win Bingo, still has strings for it + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "1_c.s._cs.01.6.u31", 0x00000, 0x20000, CRC(87eb4151) SHA1(600154bde858a185d18db9a2a2cb58284622e905) ) // F29C51001T + ROM_LOAD16_BYTE( "2_c.s._cs.01.6.u25", 0x00001, 0x20000, CRC(ed59d9b5) SHA1(30ac8a988e8b80463b1e67614a784c75582bcf16) ) // F29C51001T + + ROM_REGION( 0x1000000, "sprites", 0 ) + ROM_LOAD( "mx29f1610mc.u26", 0x000000, 0x200000, CRC(ed034ac1) SHA1(7f26d81e65cb4519018ee01f247b91cd711cba4f) ) + ROM_LOAD( "mx29f1610mc.u30", 0x200000, 0x200000, CRC(b21423a2) SHA1(106eea71a0f7ed58342b180f976093d8da477608) ) + ROM_RELOAD( 0x400000, 0x200000 ) + ROM_RELOAD( 0x600000, 0x200000 ) + ROM_RELOAD( 0x800000, 0x200000 ) + ROM_RELOAD( 0xa00000, 0x200000 ) + ROM_RELOAD( 0xc00000, 0x200000 ) + ROM_RELOAD( 0xe00000, 0x200000 ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_captain_shark.u35", 0x00000, 0x80000, CRC(e48ed57d) SHA1(11995b90e70e010b292ba9db2da0af4ebf795c1a) ) // 27C040, same as winbingoa + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u13", 0x00, 0x80, CRC(d2f41598) SHA1(3876553e5cfc5b8c8383e1dc828a0f393bb15e22) ) // TODO: factory default + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "cptshark_cpucode.key", 0x00, 0x02, CRC(c38c8e25) SHA1(7e866fc75f4ddbbd6efbbd359f2b378c798e2cec) ) +ROM_END + +/*************************************************************************** + +Wicked Witch +Astro Corp. + +***************************************************************************/ + +ROM_START( wwitch ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "1_wicked_w_aa.01.a.u26", 0x00000, 0x20000, CRC(6c654105) SHA1(b07e807864d7d0ccb80111369f8dc205fe45aea4) ) // F29C51001T + ROM_LOAD16_BYTE( "2_wicked_w_aa.01.a.u25", 0x00001, 0x20000, CRC(66206bb4) SHA1(80513d7dc7cd664238f01a6c1b3e40e7696e2211) ) // F29C51001T + + ROM_REGION( 0x600000, "sprites", 0 ) + ROM_LOAD( "mx29f1610mc.bin", 0x000000, 0x200000, CRC(8dad2fc0) SHA1(88c4bda8e247839029a8c9a84d3bd598892b1775) ) // no U location on the PCB, silkscreened 'ROM # 7' on PCB under the chip + ROM_LOAD( "mx29f1610mc.u30", 0x200000, 0x200000, CRC(d4e7b00d) SHA1(2689d19fcdd828d0d47265362f6625377a90c1e4) ) // silkscreened 'ROM # 4' on PCB under the chip + ROM_LOAD( "mx29f1610mc.u51", 0x400000, 0x200000, CRC(05bc898d) SHA1(c88c14e4858943b2ea719abe0cc9ac0738d682dd) ) // silkscreened 'ROM # 3' on PCB under the chip + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_wicked_w_aa.01.a.bin", 0x00000, 0x80000, CRC(298014f3) SHA1(98da24e84ec69c48e8754f8406e11e68fb352e28) ) + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u13", 0x00, 0x80, CRC(663f14cd) SHA1(8a675a4e270d86d3a350e7ddbeb3f9d958798bd1) ) + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "wwitch_cpucode.key", 0x00, 0x02, NO_DUMP ) +ROM_END + +/*************************************************************************** + +Happy Farm +Astro Corp. + +***************************************************************************/ + +ROM_START( hapfarm ) // also has Hot Runner N3.00 string, so probably derived from that code base + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "1_happy_farm_us.01.02.b.u26", 0x00000, 0x20000, CRC(c60bbc39) SHA1(fcf23c9c75bc221a310b87de58dea75f018065c2) ) // EV29001TSC-70R read as F29C51001T + ROM_LOAD16_BYTE( "2_happy_farm_us.01.02.b.u25", 0x00001, 0x20000, CRC(186a3e0f) SHA1(8e2474beb9264dbadc154cdfdc7b911cc1a3a601) ) // EV29001TSC-70R read as F29C51001T + + ROM_REGION( 0x600000, "sprites", 0 ) + ROM_LOAD( "mx29f1610mc.bin", 0x000000, 0x200000, CRC(fea5629e) SHA1(cbee315f7264dc6f3dd2a973cf948854138827e3) ) // no U location on the PCB, silkscreened 'ROM # 7' on PCB under the chip + ROM_LOAD( "mx29f1610mc.u30", 0x200000, 0x200000, CRC(97af8968) SHA1(344834f7fae193e9f505d451cb6fc7240e5e84b9) ) // silkscreened 'ROM # 4' on PCB under the chip + ROM_LOAD( "mx29f1610mc.u51", 0x400000, 0x200000, CRC(42faf0e8) SHA1(de596978c9a57d7667b78755ea111972857b6313) ) // silkscreened 'ROM # 3' on PCB under the chip + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "5_happy_farm.bin", 0x00000, 0x40000, CRC(859a6086) SHA1(2821ae6f86df8a3bbff0f348cf6a36c1c3fec68a) ) // 0xxxxxxxxxxxxxxxxxx = 0xFF + ROM_CONTINUE( 0x00000, 0x40000 ) + + ROM_REGION16_LE( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u13", 0x00, 0x80, CRC(c11f2b48) SHA1(174681a01b30b036e948a90313add8e7de9aef55) ) + + ROM_REGION16_LE( 0x02, "astro_cpucode", 0 ) + ROM_LOAD( "hapfarm_cpucode.key", 0x00, 0x02, NO_DUMP ) +ROM_END + void astrocorp_state::init_showhand() { #if 0 @@ -2451,7 +2715,7 @@ } } -const zoo_state::decryption_info zoo_state::magibombd_table = { +const zoo_state::decryption_info zoo_state::v102_px014_table = { { { { 8, 11, 9 }, @@ -2485,7 +2749,7 @@ void zoo_state::init_magibombd() { - decrypt_rom(magibombd_table); + decrypt_rom(v102_px014_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2501,7 +2765,7 @@ void zoo_state::init_magibombg() { - decrypt_rom(magibombd_table); + decrypt_rom(v102_px014_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2515,7 +2779,7 @@ #endif } -const zoo_state::decryption_info zoo_state::winbingo_table = { +const zoo_state::decryption_info zoo_state::v102_px006_table = { { { { 8, 11, 9 }, @@ -2549,7 +2813,7 @@ void zoo_state::init_winbingo() { - decrypt_rom(winbingo_table); + decrypt_rom(v102_px006_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2563,7 +2827,7 @@ void zoo_state::init_winbingoa() { - decrypt_rom(winbingo_table); + decrypt_rom(v102_px006_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2577,7 +2841,7 @@ void zoo_state::init_hacher() { - decrypt_rom(winbingo_table); + decrypt_rom(v102_px006_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2589,7 +2853,21 @@ #endif } -const zoo_state::decryption_info zoo_state::zoo_table = { +void zoo_state::init_cptshark() +{ + decrypt_rom(v102_px006_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0400; + + rom[0x08a2a/2] = 0x4e71; // Mirror ROM word checksum (it expects 0) +#endif +} + +const zoo_state::decryption_info zoo_state::v102_px005_table = { { { { 8, 9, 10 }, @@ -2623,7 +2901,7 @@ void zoo_state::init_zoo() { - decrypt_rom(zoo_table); + decrypt_rom(v102_px005_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2638,7 +2916,7 @@ #endif } -const zoo_state::decryption_info zoo_state::dinodino_table = { +const zoo_state::decryption_info zoo_state::v102_px010_table = { { { { 8, 11, 9 }, @@ -2672,7 +2950,7 @@ void zoo_state::init_dinodino() { - decrypt_rom(dinodino_table); + decrypt_rom(v102_px010_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2730,10 +3008,84 @@ #endif } -const zoo_state::decryption_info zoo_state::monkeyl_table = { +void zoo_state::init_monkeyl() +{ + decrypt_rom(v102_px005_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0470; + + rom[0x00400/2] = 0x4e75; // overlay!? + + rom[0x01352/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) +#endif +} + +void zoo_state::init_monkeyla() +{ + decrypt_rom(v102_px005_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0470; + + rom[0x00400/2] = 0x4e75; // overlay!? + + rom[0x01334/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) +#endif +} + +void zoo_state::init_speedmst() +{ + decrypt_rom(v102_px005_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0400; + + rom[0x08736/2] = 0x4e71; // Mirror ROM word checksum (it expects 0) +#endif +} + +void zoo_state::init_speedmsta() +{ + decrypt_rom(v102_px005_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0400; + + rom[0x086fc/2] = 0x4e71; // Mirror ROM word checksum (it expects 0) +#endif +} + +void zoo_state::init_speedmstb() +{ + decrypt_rom(v102_px005_table); +#if 1 + // TODO: There's more stuff happening for addresses < 0x400... + // override reset vector for now + u16 * const rom = (u16 *)memregion("maincpu")->base(); + rom[0x00004/2] = 0x0000; + rom[0x00006/2] = 0x0400; + + rom[0x0871a/2] = 0x4e71; // Mirror ROM word checksum (it expects 0) +#endif +} + +const zoo_state::decryption_info zoo_state::v102_px016_table = { { { - { 8, 9, 10 }, + { 11, 10, 9 }, { { { 7, 5, 4, 6, 0, 3, 2, 1 }, 0x00 }, { { 1, 4, 6, 0, 2, 5, 3, 7 }, 0xd0 }, @@ -2746,7 +3098,7 @@ } }, { - { 12, 9, 11 }, + { 12, 10, 8 }, { { { 6, 5, 4, 3, 2, 1, 0, 7 }, 0x90 }, { { 2, 4, 0, 7, 5, 6, 3, 1 }, 0x32 }, @@ -2759,42 +3111,72 @@ } } }, - { 12, 10, 8, 11, 9, 7, 5, 3, 6, 2, 4 } + { 12, 9, 11, 8, 10, 7, 2, 4, 6, 5, 3 } }; -void zoo_state::init_monkeyl() +void zoo_state::init_wwitch() { - decrypt_rom(monkeyl_table); + decrypt_rom(v102_px016_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now u16 * const rom = (u16 *)memregion("maincpu")->base(); rom[0x00004/2] = 0x0000; - rom[0x00006/2] = 0x0470; + rom[0x00006/2] = 0x0446; rom[0x00400/2] = 0x4e75; // overlay!? - rom[0x01352/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) + rom[0x01220/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) #endif } -void zoo_state::init_monkeyla() +const zoo_state::decryption_info zoo_state::v102_px008_table = { + { + { + { 11, 10, 9 }, + { + { { 7, 5, 4, 6, 0, 3, 2, 1 }, 0x00 }, + { { 1, 4, 6, 0, 2, 5, 3, 7 }, 0xd0 }, + { { 1, 7, 4, 3, 6, 5, 0, 2 }, 0x88 }, + { { 6, 5, 2, 3, 7, 1, 0, 4 }, 0xd1 }, + { { 6, 1, 7, 2, 4, 0, 3, 5 }, 0x64 }, + { { 1, 7, 2, 6, 5, 4, 3, 0 }, 0x83 }, + { { 6, 7, 4, 2, 5, 0, 1, 3 }, 0x81 }, + { { 7, 5, 1, 0, 2, 4, 6, 3 }, 0xea }, + } + }, + { + { 12, 10, 8 }, + { + { { 6, 5, 4, 3, 2, 1, 0, 7 }, 0x90 }, + { { 2, 4, 0, 7, 5, 6, 3, 1 }, 0x32 }, + { { 7, 1, 0, 6, 5, 2, 3, 4 }, 0xa9 }, + { { 2, 0, 3, 5, 1, 4, 6, 7 }, 0xa2 }, + { { 3, 0, 6, 5, 2, 1, 4, 7 }, 0x02 }, + { { 0, 1, 6, 4, 5, 2, 7, 3 }, 0x30 }, + { { 3, 5, 2, 7, 6, 1, 4, 0 }, 0x0a }, + { { 0, 6, 4, 2, 7, 3, 1, 5 }, 0x81 }, + } + } + }, + { 12, 9, 11, 8, 10, 7, 2, 6, 3, 5, 4 } +}; + +void zoo_state::init_hapfarm() { - decrypt_rom(monkeyl_table); + decrypt_rom(v102_px008_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now u16 * const rom = (u16 *)memregion("maincpu")->base(); rom[0x00004/2] = 0x0000; - rom[0x00006/2] = 0x0470; - - rom[0x00400/2] = 0x4e75; // overlay!? + rom[0x00006/2] = 0x0400; - rom[0x01334/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) + rom[0x32126/2] = 0x4e75; // Mirror ROM word checksum (it expects 0) #endif } -const astoneag_state::decryption_info astoneag_state::astoneag_table = { +const astoneag_state::decryption_info astoneag_state::v102_px012_table = { { { { 11, 10, 9 }, @@ -2828,7 +3210,7 @@ void astoneag_state::init_astoneag() { - decrypt_rom(astoneag_table); + decrypt_rom(v102_px012_table); #if 1 // TODO: There's more stuff happening for addresses < 0x400... // override reset vector for now @@ -2856,7 +3238,7 @@ rom[i] = tmp[(i & ~0xff) | (bitswap<8>(i, 7,6,5, 3,2,1, 4, 0) ^ 2)]; } -} // Anonymous namespace +} // anonymous namespace // YEAR NAME PARENT MACHINE INPUTS STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT GAMEL( 2000, showhand, 0, showhand, showhand, astrocorp_state, init_showhand, ROT0, "Astro Corp.", "Show Hand (Italy)", MACHINE_SUPPORTS_SAVE, layout_showhand ) @@ -2886,7 +3268,13 @@ GAMEL( 2005, magibombd, magibomb, magibombd, magibombd, zoo_state, init_magibombd, ROT0, "Astro Corp.", "Magic Bomb (Ver. AA.72.D, 14/11/05)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_magibombb ) // 15/11/05 09:31 GAMEL( 2005, magibombj, magibomb, magibombd, magibombd, zoo_state, init_magibombd, ROT0, "Astro Corp.", "Magic Bomb (Ver. AA.72.C, 25/05/05)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_magibombb ) // 25/05/05 11:26 GAMEL( 2004, magibombg, magibomb, magibombg, magibombg, zoo_state, init_magibombg, ROT0, "Astro Corp.", "Magic Bomb (Ver. NB6.1, 26/04/04)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_magibomb ) // 26/04/04. Undumped sprite ROM +GAMEL( 2004, speedmst, 0, speedmst, magibombg, zoo_state, init_speedmst, ROT0, "D2 Enterprises", "Speed Master (Ver. V1.0, Apr 29 2004)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_magibomb ) // Apr 29 2004 16:29:35 +GAMEL( 2003, speedmsta, speedmst, speedmst, magibombg, zoo_state, init_speedmsta, ROT0, "D2 Enterprises", "Speed Master (Ver. V1.0, May 23 2003)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_magibomb ) // May 23 2003 16:38:02 +GAMEL( 2003, speedmstb, speedmst, speedmst, magibombg, zoo_state, init_speedmstb, ROT0, "D2 Enterprises", "Speed Master (Ver. V1.0, Apr 28 2004)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_magibomb ) // Apr 28 2004 17:21:26 +GAMEL( 2006, cptshark, 0, winbingo, winbingo, zoo_state, init_cptshark, ROT0, "Astro Corp. / American Alpha", "Captain Shark (Ver. CS.01.6, Apr 21 2006)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_winbingo ) // 13:50:11 Apr 21 2006 GAMEL( 2006, winbingo, 0, winbingo, winbingo, zoo_state, init_winbingo, ROT0, "Astro Corp.", "Win Win Bingo (Ver. GM.03.3, Feb 23 2006)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION, layout_winbingo ) // 15:47:48 Feb 23 2006 GAMEL( 2006, winbingoa, winbingo, winbingo, winbingo, zoo_state, init_winbingoa, ROT0, "Astro Corp.", "Win Win Bingo (Ver. GM.05.1, May 11 2006)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_winbingo ) // 11:02:07 May 11 2006. Undumped sprite ROMs GAMEL( 2005, hacher, winbingo, hacher, winbingo, zoo_state, init_hacher, ROT0, "bootleg (Gametron)", "Hacher (hack of Win Win Bingo EN.01.6)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS, layout_winbingo ) // 14:25:46 Mar 10 2005. One bad sprite ROM GAME ( 2007?, westvent, 0, skilldrp, skilldrp, astrocorp_state, empty_init, ROT0, "Astro Corp.", "Western Venture (Ver. AA.02.D)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // One bad program ROM +GAME ( 2005, wwitch, 0, wwitch, magibombd, zoo_state, init_wwitch, ROT0, "Astro Corp.", "Wicked Witch (Ver. AA.01.A)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // 29/12/05 09:29 +GAME ( 2008, hapfarm, 0, hapfarm, magibombd, zoo_state, init_hapfarm, ROT0, "Astro Corp.", "Happy Farm (Ver. US.01.02.B)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // 2008/10/16 diff -Nru mame-0.263+dfsg.1/src/mame/misc/astropc.cpp mame-0.264+dfsg.1/src/mame/misc/astropc.cpp --- mame-0.263+dfsg.1/src/mame/misc/astropc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/astropc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -19,6 +19,9 @@ the game's executable. See the "ProtectCode" function, which writes the decrypted "PutJtx" function into the program in memory. +TODO: +- (with basic VGA core hooked up) hangs at Astro logo, attempts to write in the $cxxxx range (UMA?) + Known games Title Dumped Notes @@ -44,8 +47,17 @@ #include "emu.h" -#include "cpu/i386/i386.h" +#include "bus/isa/isa_cards.h" +#include "cpu/i386/i386.h" +#include "machine/8042kbdc.h" +#include "machine/mc146818.h" +#include "machine/mediagx_cs5530_bridge.h" +#include "machine/mediagx_cs5530_ide.h" +#include "machine/mediagx_cs5530_video.h" +#include "machine/mediagx_host.h" +#include "machine/pci.h" +#include "machine/zfmicro_usb.h" namespace { @@ -53,8 +65,10 @@ { public: astropc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_rtc(*this, "rtc") + , m_kbdc(*this, "kbdc") { } void astropc(machine_config &config); @@ -62,20 +76,19 @@ void init_astropc(); private: - void astropc_io(address_map &map); - void astropc_map(address_map &map); + void main_map(address_map &map); + void main_io(address_map &map); - // devices required_device m_maincpu; + required_device m_rtc; + required_device m_kbdc; }; -void astropc_state::astropc_map(address_map &map) +void astropc_state::main_map(address_map &map) { - map(0x000c0000, 0x000fffff).rom().region("bios", 0); - map(0xfffc0000, 0xffffffff).rom().region("bios", 0); } -void astropc_state::astropc_io(address_map &map) +void astropc_state::main_io(address_map &map) { } @@ -84,13 +97,58 @@ INPUT_PORTS_END - void astropc_state::astropc(machine_config &config) { - /* basic machine hardware */ - I486(config, m_maincpu, 40000000 ); // ?? - m_maincpu->set_addrmap(AS_PROGRAM, &astropc_state::astropc_map); - m_maincpu->set_addrmap(AS_IO, &astropc_state::astropc_io); + MEDIAGX(config, m_maincpu, 233'000'000); // Cyrix MediaGX GXm-266GP + m_maincpu->set_addrmap(AS_PROGRAM, &astropc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &astropc_state::main_io); + m_maincpu->set_irq_acknowledge_callback("pci:12.0:pic8259_master", FUNC(pic8259_device::inta_cb)); + + // TODO: copied from misc/matrix.cpp, verify if this has a working super I/O + DS1287(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->set_binary(true); + m_rtc->set_epoch(1980); + m_rtc->irq().set("pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq8n_w)); + + KBDC8042(config, m_kbdc, 0); + // TODO: PS/2 mouse + m_kbdc->set_keyboard_type(kbdc8042_device::KBDC8042_STANDARD); + m_kbdc->system_reset_callback().set_inputline(":maincpu", INPUT_LINE_RESET); + m_kbdc->gate_a20_callback().set_inputline(":maincpu", INPUT_LINE_A20); + m_kbdc->input_buffer_full_callback().set(":pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq1_w)); + m_kbdc->set_keyboard_tag("at_keyboard"); + + at_keyboard_device &at_keyb(AT_KEYB(config, "at_keyboard", pc_keyboard_device::KEYBOARD_TYPE::AT, 1)); + at_keyb.keypress().set(m_kbdc, FUNC(kbdc8042_device::keyboard_w)); + + PCI_ROOT(config, "pci", 0); + MEDIAGX_HOST(config, "pci:00.0", 0, "maincpu", 128*1024*1024); + // TODO: again copied from misc/matrix.cpp, verify usage here + PCI_BRIDGE(config, "pci:01.0", 0, 0x10780000, 0); + + // "pci:12.0" or "pci:10.0" depending on pin H26 (readable in bridge thru PCI index $44) + mediagx_cs5530_bridge_device &isa(MEDIAGX_CS5530_BRIDGE(config, "pci:12.0", 0, "maincpu", "pci:12.2")); + isa.set_kbdc_tag("kbdc"); + isa.boot_state_hook().set([](u8 data) { /* printf("%02x\n", data); */ }); + //isa.smi().set_inputline("maincpu", INPUT_LINE_SMI); + isa.rtcale().set([this](u8 data) { m_rtc->address_w(data); }); + isa.rtccs_read().set([this]() { return m_rtc->data_r(); }); + isa.rtccs_write().set([this](u8 data) { m_rtc->data_w(data); }); + + // "pci:12.1" SMI & ACPI + + mediagx_cs5530_ide_device &ide(MEDIAGX_CS5530_IDE(config, "pci:12.2", 0, "maincpu")); + ide.irq_pri().set("pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq14_w)); + ide.irq_sec().set("pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq15_w)); + + // "pci:12.3" XpressAUDIO + MEDIAGX_CS5530_VIDEO(config, "pci:12.4", 0); + + ZFMICRO_USB(config, "pci:13.0", 0); + + // 2 PCI slots, 2 ISA slots + ISA16_SLOT(config, "isa1", 0, "pci:12.0:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa2", 0, "pci:12.0:isabus", pc_isa16_cards, nullptr, false); } @@ -98,7 +156,7 @@ // Название игры : BLACK BEARD GAMES // Тип игры : Многолинейный видео-слот // Разработчик : ASTRO CORP. - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -115,7 +173,7 @@ ROM_START( blackbda ) - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -132,7 +190,7 @@ // Название игры : BLACK BEARD GAMES // Тип игры : Многолинейный видео-слот // Разработчик : ASTRO CORP. - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -152,7 +210,7 @@ // VERMAJOR = 15 // VERMINOR = B // RELEASE = 1 - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -172,7 +230,7 @@ // VERMAJOR = 16 // VERMINOR = B // RELEASE = 1 - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -187,7 +245,7 @@ // GAME NAME : HAWAII GAMES // GAME TYPE : MULTI-LINER // DEVELOPER : ASTRO CORP. - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -202,7 +260,7 @@ // GAME NAME : OLYMPIAN GAMES // GAME TYPE : MULTI-LINER // DEVELOPER : ASTRO CORP. - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -217,7 +275,7 @@ // GAME NAME : RA'S SCEPTER GAMES // GAME TYPE : MULTI-LINER // DEVELOPER : ASTRO CORP. - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ // wasn't in this set! + ROM_REGION32_LE(0x40000, "pci:12.0", 0) /* motherboard bios */ // wasn't in this set! ROM_LOAD( "bios.002", 0x0000, 0x040000, CRC(45333544) SHA1(bcc03b4f77b2e447192a1e5ed9f4cc09d0289714) ) ROM_REGION(0x20000, "rom", 0) @@ -236,15 +294,15 @@ } // anonymous namespace -GAME( 2005, blackbd, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 1)", MACHINE_IS_SKELETON ) -GAME( 2005?, blackbda, blackbd, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 2)", MACHINE_IS_SKELETON ) -GAME( 2005, blackbdb, blackbd, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 3)", MACHINE_IS_SKELETON ) +GAME( 2005, blackbd, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2005?, blackbda, blackbd, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2005, blackbdb, blackbd, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Black Beard (Russia, set 3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2005, dslayrr, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Dragon Slayer (Russia, v15.B, 2005/08/10)", MACHINE_IS_SKELETON ) -GAME( 2006, dslayrra, dslayrr, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Dragon Slayer (Russia, v16.B, 2005/11/10)", MACHINE_IS_SKELETON ) +GAME( 2005, dslayrr, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Dragon Slayer (Russia, v15.B, 2005/08/10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2006, dslayrra, dslayrr, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Dragon Slayer (Russia, v16.B, 2005/11/10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2004, hawaii, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Hawaii (Russia)", MACHINE_IS_SKELETON ) +GAME( 2004, hawaii, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Hawaii (Russia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2005, oligam, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Olympian Games (Russia)", MACHINE_IS_SKELETON ) +GAME( 2005, oligam, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Olympian Games (Russia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2005, rasce, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Ra's Scepter (Russia)", MACHINE_IS_SKELETON ) +GAME( 2005, rasce, 0, astropc, astropc, astropc_state, init_astropc, ROT0, "Astro", "Ra's Scepter (Russia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/bailey.cpp mame-0.264+dfsg.1/src/mame/misc/bailey.cpp --- mame-0.263+dfsg.1/src/mame/misc/bailey.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/bailey.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -159,5 +159,5 @@ } // anonymous namespace -GAME( 1976, fun4, 0, bailey, 0, bailey_state, empty_init, ROT0, "Bailey International", "Fun Four (set 1) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, fun4a, fun4, bailey, 0, bailey_state, empty_init, ROT0, "Bailey International", "Fun Four (set 2) [TTL]", MACHINE_IS_SKELETON ) +GAME( 1976, fun4, 0, bailey, 0, bailey_state, empty_init, ROT0, "Bailey International", "Fun Four (set 1)", MACHINE_IS_SKELETON ) +GAME( 1976, fun4a, fun4, bailey, 0, bailey_state, empty_init, ROT0, "Bailey International", "Fun Four (set 2)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/calomega.cpp mame-0.264+dfsg.1/src/mame/misc/calomega.cpp --- mame-0.263+dfsg.1/src/mame/misc/calomega.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/calomega.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -195,7 +195,7 @@ 20.9 | Gaming Poker-Europe | ? | | PKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No 21.1 | AWP Poker | ? | | POKCG | 6300010 | POKCLR | 6600020 | Gaming | No | | No 21.2 | Video Slot | ? | | SL1CG | 6300180 | SLC1 | 6600120 | Gaming | No | | No - 21.4 | Wild Double-Up Poker | ? | | WLDCG | 6300100 | WLDCLR | 6600010 | Amusement | No | | No + 21.4 | Wild Double-Up Poker | 905 | MAY/84 | WLDCG | 6300100 | WLDCLR | 6600010 | Amusement | Yes | IC | Yes 21.5 | Double/Double Poker | ? | | JKRTWO | 6300100 | WLDCLR | 6600010 | Amusement | No | | No * 21.6 | Wild Double-Up? | 905 | JUN/84 | WLDCG | 6300100 | WLDCLR | 6600010 | Amusement | No | | No * 21.7 | Poker? | 905 | MAY/84 | GPKCG? | 6300010 | POKCLR | 6600020 | Amusement | No | | No @@ -4897,7 +4897,7 @@ ROM_LOAD( "pkcga.u68", 0x1000, 0x0800, CRC(6e3e9b1d) SHA1(14eb8d14ce16719a6ad7d13db01e47c8f05955f0) ) ROM_REGION( 0x100, "proms", 0 ) - ROM_LOAD( "pokclr.u28", 0x0000, 0x0100, CRC(a8191ef7) SHA1(d6f777980179ab091e2713ee815d46bf9c0ac486) ) + ROM_LOAD( "clrprom_7.9.u28", 0x0000, 0x0100,CRC(a26a8fae) SHA1(d570fe9443a0912bd34b81ac4c3e4c5f8901f523) ) ROM_END ROM_START( comg080 ) // Cal Omega v8.0 (Arcade Black Jack) @@ -5426,6 +5426,30 @@ ROM_LOAD( "mltclr.u28", 0x0000, 0x0100, CRC(ab8960a6) SHA1(2414b445739860a0c3e533f2992291ff8a471d76) ) ROM_END +ROM_START( comg214 ) // Cal Omega v21.4 (Wild Double-Up Poker) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_FILL( 0x3000, 0x1000, 0xff ) // empty socket + ROM_FILL( 0x4000, 0x1000, 0xff ) // empty socket + ROM_LOAD( "21.43.bin", 0x5000, 0x1000, CRC(9ea9f6c5) SHA1(659dd68922de7142de9050e7d6495bdabbf15abb) ) + + // bad programmed eprom. It has the same contents of 21.43.bin + // the original one should have checksum16 = AD9F (as quoted in some notes) + ROM_LOAD( "21.44.bin", 0x6000, 0x1000, BAD_DUMP CRC(9ea9f6c5) SHA1(659dd68922de7142de9050e7d6495bdabbf15abb)) + + ROM_LOAD( "21.45.bin", 0x7000, 0x1000, CRC(199b77f8) SHA1(3c669469edfd83458441659866040ed57d4c1b88) ) + + ROM_REGION( 0x0800, "gfx1", 0 ) + ROM_LOAD( "cg0.bin", 0x0000, 0x0800, CRC(987b3e4d) SHA1(ae4b5dc0e4d1195bbf18b375c1a4dbf880f5f38c) ) + + ROM_REGION( 0x1800, "gfx2", 0 ) + ROM_LOAD( "cg2c.bin", 0x0000, 0x0800, CRC(5b96f5e0) SHA1(4733349798eb059998a4814331f57e7f09e02490) ) + ROM_LOAD( "cg2b.bin", 0x0800, 0x0800, CRC(d77dda31) SHA1(e11b476cf0b609a8a40981b81b4d83b3c86678dc) ) + ROM_LOAD( "cg2a.bin", 0x1000, 0x0800, CRC(def60756) SHA1(fe71424fc638761d9ff65391261a030a2889ad5e) ) + + ROM_REGION( 0x100, "proms", 0 ) + ROM_LOAD( "wldclr.u28", 0x0000, 0x0100, CRC(a26a8fae) SHA1(d570fe9443a0912bd34b81ac4c3e4c5f8901f523) ) +ROM_END + ROM_START( comg227 ) // Cal Omega v22.7 (Amusement Poker (Double Double)) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_FILL( 0x3000, 0x1000, 0xff ) // empty socket @@ -6144,6 +6168,7 @@ GAME( 1983, comg187, 0, sys905, stand905, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 18.7 (Amusement Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump GAME( 1984, comg204, 0, sys905, comg204, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 20.4 (Super Blackjack)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, comg208, 0, sys905, comg208 , calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 20.8 (Winner's Choice)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, comg214, 0, sys905, stand905, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 21.4 (Wild Double-Up Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // incomplete dump GAME( 1984, comg227, 0, sys905, stand905, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 22.7 (Amusement Poker, d/d)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump GAME( 1984, comg230, 0, sys905, stand905, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 23.0 (FC Bingo (4-card))", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump GAME( 1984, comg236, 0, sys905, hotline, calomega_state, empty_init, ROT0, "Cal Omega Inc.", "Cal Omega - Game 23.6 (Hotline)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/carrera.cpp mame-0.264+dfsg.1/src/mame/misc/carrera.cpp --- mame-0.263+dfsg.1/src/mame/misc/carrera.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/carrera.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:David Haywood +// copyright-holders: David Haywood + /* This is a simple 'Pairs' game called @@ -40,15 +41,19 @@ TODO: - Are colors 100% correct? Needs a reference to be sure. -- There are reel gfxs on the roms (near the end), left-over or there's a way to enable it? +- There are reel GFXs on the ROMs (near the end), left-over or there's a way to enable it? Update: if you trigger a normal irq 0 instead of a NMI the game will change into a proper 8 liner game without inputs. Investigate on it... + Update 2: alantin, bsebmanbl, bsebmanbl2, drkseal start directly with the 8 liner game +- ncarrera has an undumped AT90S8515 MCU (8 bit AVR RISC core) */ #include "emu.h" + #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "video/mc6845.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -56,9 +61,6 @@ namespace { -#define MASTER_CLOCK XTAL(22'118'400) - - class carrera_state : public driver_device { public: @@ -88,7 +90,7 @@ void carrera_state::prg_map(address_map &map) { - map(0x0000, 0x4fff).rom(); + map(0x0000, 0x7fff).rom(); map(0xe000, 0xe7ff).ram(); map(0xe800, 0xe800).w("crtc", FUNC(mc6845_device::address_w)); map(0xe801, 0xe801).w("crtc", FUNC(mc6845_device::register_w)); @@ -109,13 +111,13 @@ } static INPUT_PORTS_START( carrera ) - PORT_START("IN0") /* Port 0 */ + PORT_START("IN0") // Port 0 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) - /* unused / unknown inputs, not dips */ + // unused / unknown inputs, not dips PORT_DIPNAME( 0x20, 0x20, "0" ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -124,10 +126,10 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("IN1") /* Port 1 */ + PORT_START("IN1") // Port 1 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - /* unused / unknown inputs, not dips */ + // unused / unknown inputs, not dips PORT_DIPNAME( 0x04, 0x04, "1" ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -147,8 +149,8 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - /* I suspect the 4 below are the 4xDSWs */ - PORT_START("IN2") /* Port 2 */ + // I suspect the 4 below are the 4xDSWs + PORT_START("IN2") // Port 2 PORT_DIPNAME( 0x01, 0x01, "2" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -174,7 +176,7 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("IN3") /* Port 3 */ + PORT_START("IN3") // Port 3 PORT_DIPNAME( 0x01, 0x01, "3" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -200,7 +202,7 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("IN4") /* Port 4 */ + PORT_START("IN4") // Port 4 PORT_DIPNAME( 0x01, 0x01, "4" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -226,7 +228,7 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("IN5") /* Port 5 */ + PORT_START("IN5") // Port 5 PORT_DIPNAME( 0x01, 0x01, "5" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -265,7 +267,7 @@ }; static GFXDECODE_START( gfx_carrera ) - GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 1 ) + GFXDECODE_ENTRY( "tiles", 0, tiles8x8_layout, 0, 1 ) GFXDECODE_END uint32_t carrera_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -276,9 +278,9 @@ { for (int x = 0; x < 64; x++) { - int tile = m_tileram[count&0x7ff] | m_tileram[(count&0x7ff)+0x800]<<8; + int tile = m_tileram[count & 0x7ff] | m_tileram[(count & 0x7ff) + 0x800] << 8; - m_gfxdecode->gfx(0)->opaque(bitmap,cliprect,tile,0,0,0,x*8,y*8); + m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, tile, 0, 0, 0, x * 8, y * 8); count++; } } @@ -316,12 +318,14 @@ void carrera_state::carrera(machine_config &config) { - /* basic machine hardware */ + constexpr XTAL MASTER_CLOCK = 22.1184_MHz_XTAL; + + // basic machine hardware Z80(config, m_maincpu, MASTER_CLOCK / 6); m_maincpu->set_addrmap(AS_PROGRAM, &carrera_state::prg_map); m_maincpu->set_addrmap(AS_IO, &carrera_state::io_map); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -338,11 +342,11 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_carrera); PALETTE(config, m_palette, FUNC(carrera_state::palette), 32); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - ay8910_device &aysnd(AY8910(config, "aysnd", MASTER_CLOCK/12)); - /* these are set as input, but I have no idea which input port it uses is for the AY */ + ay8910_device &aysnd(AY8910(config, "aysnd", MASTER_CLOCK / 12)); + // these are set as input, but I have no idea which input port it uses is for the AY aysnd.port_a_read_callback().set(FUNC(carrera_state::unknown_r)); aysnd.port_b_read_callback().set(FUNC(carrera_state::unknown_r)); aysnd.add_route(ALL_OUTPUTS, "mono", 1.00); @@ -353,7 +357,7 @@ ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(2385b9c8) SHA1(12d4397779e074096fbb23b114985f104366b79c) ) - ROM_REGION( 0x50000, "gfx1", 0 ) + ROM_REGION( 0x50000, "tiles", 0 ) ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(a16e914e) SHA1(09f2271f193a7bffd62ef6e428ecbf9aa1154860) ) ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(147036a5) SHA1(34b4818fe61c5b13220b0a2001987b68b655b2cb) ) ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(920eee0e) SHA1(85e6d5292b751c57c64d17858bd00292356599e3) ) @@ -368,7 +372,7 @@ ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "ic22", 0x00000, 0x10000, CRC(294a205f) SHA1(b088617354b6a37520060f19f77d841ad8ee1538) ) - ROM_REGION( 0x50000, "gfx1", 0 ) + ROM_REGION( 0x50000, "tiles", 0 ) ROM_LOAD( "ic1", 0x00000, 0x10000, CRC(bf4868e1) SHA1(ca91343dbdb9f43d9b981b9b3f958edb17bf188d) ) ROM_LOAD( "ic2", 0x10000, 0x10000, CRC(26e1c17e) SHA1(ea0669e87207104eeaa3eae6a6708dbdf94e3c3c) ) ROM_LOAD( "ic3", 0x20000, 0x10000, CRC(8401248d) SHA1(f8c8ed93d76709ead0b262ab3039df6febe3c005) ) @@ -379,8 +383,93 @@ ROM_LOAD( "am27s19.ic39", 0x00, 0x20, CRC(af16359f) SHA1(1ff5c9d7807e52be09c0ded56fb68a47e41b3fcf) ) ROM_END +ROM_START( bsebmanbl ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(7b896b33) SHA1(841d5c7853e18109b74cad44c9f0d91398add146) ) // SLDH + + ROM_REGION( 0x50000, "tiles", 0 ) // still has BS GFX + ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(a16e914e) SHA1(09f2271f193a7bffd62ef6e428ecbf9aa1154860) ) + ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(147036a5) SHA1(34b4818fe61c5b13220b0a2001987b68b655b2cb) ) + ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(920eee0e) SHA1(85e6d5292b751c57c64d17858bd00292356599e3) ) + ROM_LOAD( "27512.ic4", 0x30000, 0x10000, CRC(97433f36) SHA1(39f3c6b76ad540693682832aba6e4fc400ca3753) ) + ROM_LOAD( "27512.ic5", 0x40000, 0x10000, CRC(ffa75920) SHA1(aa5619f5aabcdfa250bb24bcad101a8c512a1776) ) + + ROM_REGION( 0x20, "proms", 0 ) + ROM_LOAD( "82s123.ic39", 0x00, 0x20, CRC(af16359f) SHA1(1ff5c9d7807e52be09c0ded56fb68a47e41b3fcf) ) +ROM_END + +ROM_START( bsebmanbl2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) // has Carrera, Avraam and Ballas strings + ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(ca2c8962) SHA1(140a217bb0365ec55116ba483208bdf1d820a7af) ) + + ROM_REGION( 0x50000, "tiles", 0 ) // hacked J.T. GFX instead of BS + ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(65ad616a) SHA1(e87d6d187ec5c99628d767a9720dd9d634e39c2d) ) + ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(64004dcb) SHA1(f9af56035f00d3d914c8e83e941762cb6153fc16) ) + ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(c6e0a838) SHA1(e30d0f28845f331839afc44fb7358be72d2a88cb) ) + ROM_LOAD( "27512.ic4", 0x30000, 0x10000, CRC(eccd4da0) SHA1(8171ed1e9a492b804c86b5cd98cc8de91b01608c) ) + ROM_LOAD( "27512.ic5", 0x40000, 0x10000, CRC(f3014271) SHA1(97eeea6f2cde8f115d3285398b0083f0d1c95578) ) + + ROM_REGION( 0x20, "proms", 0 ) + ROM_LOAD( "82s123.ic39", 0x00, 0x20, CRC(af16359f) SHA1(1ff5c9d7807e52be09c0ded56fb68a47e41b3fcf) ) +ROM_END + +ROM_START( alantin ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "alpro.ic22", 0x00000, 0x10000, CRC(1eb97b31) SHA1(7097cf344734a2b553356f9b9fd6453e584a6e3f) ) // 27512 + + ROM_REGION( 0x50000, "tiles", 0 ) // still has BS GFX + ROM_LOAD( "alantin1.ic1", 0x00000, 0x10000, CRC(feb49cfd) SHA1(696683375c832b4cd6db9eef0edf4919b90c97ef) ) + ROM_LOAD( "alantin2.ic2", 0x10000, 0x10000, CRC(e79da4b9) SHA1(a80c5f6431fc755645a0c8cd0cb290669f0cbada) ) + ROM_LOAD( "alantin3.ic3", 0x20000, 0x10000, CRC(73d7c748) SHA1(bf688b8f506859ed3c514915676b13cecfec0a81) ) + ROM_LOAD( "alantin4.ic4", 0x30000, 0x10000, CRC(6a061afd) SHA1(f6d736bd284e97ab915adb249c371617daa02a36) ) + ROM_LOAD( "alantin5.ic5", 0x40000, 0x10000, CRC(35d8fb1b) SHA1(5d7ff8089e16ebb792543eeb9cc682f9f5eba6fe) ) + + ROM_REGION( 0x20, "proms", 0 ) + ROM_LOAD( "82s123.ic39", 0x00, 0x20, CRC(5b0e598f) SHA1(99a8e80229d684f2083634ae2d96bf1d4f13677c) ) +ROM_END + +ROM_START( drkseal ) + ROM_REGION( 0x10000, "maincpu", 0 ) // still shows Alantin and Avraam strings + ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(8a1732e5) SHA1(191de15d0ccf439991e3c0c258cbfeb79ef19002) ) // 1xxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x50000, "tiles", 0 ) // shows Vegas copyright + ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(fd3b6bbc) SHA1(b1fe09772a5d9a07077038244517fc7169266893) ) + ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(d3a048e3) SHA1(687d58b84ca5985f51755b09c8a8b2ef68d16399) ) + ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(50b8f9ee) SHA1(4f31e36eb54fde40e409f0ac18bf87126174be33) ) + ROM_LOAD( "27512.ic4", 0x30000, 0x10000, CRC(15292338) SHA1(95352969d3003eb3451334d569ead730cec9bcec) ) + ROM_LOAD( "27512.ic5", 0x40000, 0x10000, CRC(99fb8640) SHA1(053fdd600e5a120ea8988f3d55d1d444e8b29abe) ) + + ROM_REGION( 0x20, "proms", 0 ) + ROM_LOAD( "82s123.ic39", 0x00, 0x20, CRC(03aadf73) SHA1(e5baf8c5e7276eb207357e4cbb694c75e8caab6a) ) +ROM_END + +// this set uses a newer 'TYPE C-2000' board with a 'Rania Original 2000 Type 8515' riser board (the Z80 and MC6845 have been moved here along with a AT90S8515 MCU) +ROM_START( ncarrera ) + ROM_REGION( 0x10000, "maincpu", 0 ) // has 2001, Mpampis and Avraam strings + ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(3ec2dbca) SHA1(896fbccaf844c1fa5861b176c09e4a3707b3524f) ) // 1xxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0x2200, "mcu", 0 ) + ROM_LOAD( "internal_eeprom", 0x0000, 0x0200, NO_DUMP ) + ROM_LOAD( "internal_flash", 0x0200, 0x2000, NO_DUMP ) + + ROM_REGION( 0x50000, "tiles", 0 ) // has both New Carrera and New Bomberman GFX + ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(dbec54c7) SHA1(ca7e54c198ca8abeffba1b323a514678384c35f9) ) + ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(8e8c2b6d) SHA1(001121e0b91d8e0efdc3f5f99c43e1751b4be758) ) + ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(ac66cda8) SHA1(65fae21de9f9727c5d8198ff57b27d703a7518fc) ) + ROM_LOAD( "27512.ic4", 0x30000, 0x10000, CRC(c337a9b8) SHA1(0c4f86e1c7c94c492b09e3571e213308e9fa7c47) ) + ROM_LOAD( "27512.ic5", 0x40000, 0x10000, CRC(d8494f96) SHA1(11bc5d73f030361de8e6d6434ccbeac02c61a9eb) ) + + ROM_REGION( 0x20, "proms", 0 ) + ROM_LOAD( "am27s19.ic39", 0x00, 0x20, CRC(af16359f) SHA1(1ff5c9d7807e52be09c0ded56fb68a47e41b3fcf) ) +ROM_END + } // anonymous namespace -GAME( 19??, carrera, 0, carrera, carrera, carrera_state, empty_init, ROT0, "BS Electronics", "Carrera (Version 6.7)", MACHINE_SUPPORTS_SAVE ) -GAME( 19??, bsebman, carrera, carrera, carrera, carrera_state, empty_init, ROT0, "BS Electronics", "Bomberman (Version 6.6)", MACHINE_SUPPORTS_SAVE ) +GAME( 19??, carrera, 0, carrera, carrera, carrera_state, empty_init, ROT0, "BS Electronics", "Carrera (Version 6.7)", MACHINE_SUPPORTS_SAVE ) +GAME( 19??, bsebman, carrera, carrera, carrera, carrera_state, empty_init, ROT0, "BS Electronics", "Bomberman (Version 6.6)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, bsebmanbl, carrera, carrera, carrera, carrera_state, empty_init, ROT0, "bootleg (Ballas / Avraam)", "Bomberman (Version 6.6, Avraam bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs verifying of inputs +GAME( 1999, bsebmanbl2, carrera, carrera, carrera, carrera_state, empty_init, ROT0, "bootleg (J.T.)", "Bomberman (Version 6.6, J.T. bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs verifying of inputs +GAME( 1999, alantin, 0, carrera, carrera, carrera_state, empty_init, ROT0, "bootleg (Robert / Avraam)", "Alantin - Aladdin's Magic Lamp", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs verifying of inputs +GAME( 1999, drkseal, 0, carrera, carrera, carrera_state, empty_init, ROT0, "bootleg (Vegas)", "Dark Seal (8-liner)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs verifying of inputs +GAME( 2001, ncarrera, 0, carrera, carrera, carrera_state, empty_init, ROT0, "bootleg (J.T.)", "New Carrera - Version 2000", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // needs MCU dump diff -Nru mame-0.263+dfsg.1/src/mame/misc/cave.cpp mame-0.264+dfsg.1/src/mame/misc/cave.cpp --- mame-0.263+dfsg.1/src/mame/misc/cave.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/cave.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,5536 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia -/*************************************************************************** - - -= Cave Hardware =- - - driver by Luca Elia (l.elia@tin.it) - - -Main CPU : MC68000 - -Sound CPU : Z80 [Optional] - -Sound Chips : YMZ280B or - OKIM6295 x (1|2) + YM2203 / YM2151 [Optional] - -Other : 93C46 EEPROM - - ------------------------------------------------------------------------------------------ -Year + Game License PCB Tilemaps Sprites Other ------------------------------------------------------------------------------------------ -94 Mazinger Z Banpresto BP943A 038 9335EX706 013 9341E7009 Z80 -94 Power Instinct 2 Atlus AT047G2-B 038 9429WX709 013 9341E7009 Z80 NMK 112 -95 Gogetsuji Legends Atlus AT047G2-B 038 9429WX709 013 9341E7009 Z80 NMK 112 -95 Metamoqester Banpresto BP947A 038 9437WX711 013 9346E7002 Z80 -95 Sailor Moon Banpresto BP945A 038 9437WX711 013 9346E7002 Z80 -95 Donpachi Atlus AT-C01DP-2 038 9429WX727 013 9347E7003 NMK 112 -96 Air Gallet Banpresto BP962A 038 9437WX711 013 9346E7002 Z80 -96 Hotdog Storm Marble ASCT9501 038 9341EX702 013 Z80 -96 Pac-Slot Namco N-44 EM 038 9444WX010 013 9345E7006 -96 Poka Poka Satan Kato's PPS-MAIN 038 9444WX010 013 9607EX013 -97 Tekken Card World Namco EMG4 038 9701WX001 013 9651EX001 -97 Dodonpachi Atlus AT-C03 D2 038 9341E7010 013 9338EX701 -98 Dangun Feveron Nihon System CV01 038 9808WX003 013 9807EX004 -98 ESP Ra.De. Atlus ATC04 038 9841WX002 013 9838EX002 -98 Tekken Battle Scratch Namco EMG4 038 9748WX001 013 -98 Uo Poko Jaleco CV02 038 9749WX001 013 9749EX004 -99 Guwange Atlus ATC05 038 9919WX004 013 -99 Gaia Crusaders Noise Factory ? 038 9838WX003 013 9918EX008 -99 Koro Koro Quest Takumi TUG-01B 038 9838WX004 013 9838EX004 -99 Crusher Makochan Takumi TUG-01B 038 9838WX004 013 9838EX004 -99 Tobikose! Jumpman Namco EMG4 038 9919WX007 013 9934WX002 -01 Thunder Heroes Primetek ? 038 9838WX003 013 9918EX008 ------------------------------------------------------------------------------------------ - -To Do: - -- Sprite lag in some games (e.g. metmqstr). The sprites chip probably - generates interrupts (unknown_irq) - -- Max sprite number is possibly less than 1024 - (ex: Boss explosion scene at most of cave shmups on real hardware) - -- Tilemap scrolling issue in ppsatan right screen when flipped left - screen at some scenes - -- Most of videoreg functions aren't implemented - -- Measure video timings - -Stephh's notes (based on the games M68000 code and some tests) : - -1) 'gaia' - - - Difficulty Dip Switch also affects "Bonus Life" Dip Switch - - -2) 'theroes' - - - This is a English/Chinese version, but from the manual, there might exist a English/Japanese one - - Difficulty Dip Switch also affects "Bonus Life" Dip Switch - - There are less degrees of difficulty in this version - - DSW2 bit 5 effect remains unknown : - * it is checked at address 0x008d16 at the beginning of each sub-level - * it is checked at address 0x00c382 when you quickly push the joystick left or right twice - Any info is welcome ! - -Versions known to exist but not dumped: - Dodonpachi Campaign Version - Reportedly only 3 ever made, one was given out as a prize to a high score contest winner. The other two - PCBs were shown running (and could be played) at a Cave fan show known as Cave Festival 2006. There are - videos of the game being played floating around the internet and on YouTube. AKA DDP-CV or DDP BLUE ROM - -NOTE: Easter egg in Fereron SOS / Dangun Feveron: - Insert a coin and with the joystick move: Down, Up, Right, Left, Up, Down, Left, Right - If you did the above right, you'll hear a MEOW sound. Start the game and your ship is now a cat! - -***************************************************************************/ - -#include "emu.h" -#include "cave.h" - -#include "cpu/m68000/m68000.h" -#include "cpu/z80/z80.h" -#include "machine/nmk112.h" -#include "machine/nvram.h" -#include "machine/watchdog.h" -#include "sound/ymopm.h" -#include "sound/ymopn.h" -#include "sound/ymz280b.h" - -#include "speaker.h" - -#include - -#include "ppsatan.lh" - - -/*************************************************************************** - - - Interrupt Handling Routines - - -***************************************************************************/ - - -/* Update the IRQ state based on all possible causes */ -void cave_state::update_irq_state() -{ - if (m_vblank_irq || m_sound_irq || m_unknown_irq) - m_maincpu->set_input_line(m_irq_level, ASSERT_LINE); - else - m_maincpu->set_input_line(m_irq_level, CLEAR_LINE); -} - -TIMER_CALLBACK_MEMBER(cave_state::vblank_end) -{ - if (m_kludge == 3) /* mazinger metmqstr */ - { - m_unknown_irq = 1; - update_irq_state(); - } - m_agallet_vblank_irq = 0; -} - -TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start) -{ - m_vblank_irq = 1; - update_irq_state(); - get_sprite_info(0); - m_agallet_vblank_irq = 1; - m_vblank_end_timer->adjust(attotime::from_usec(2000)); // 2000us : vblank time -} -TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start_left) -{ - get_sprite_info(1); -} -TIMER_DEVICE_CALLBACK_MEMBER(cave_state::vblank_start_right) -{ - get_sprite_info(2); -} - -/* Called once/frame to generate the VBLANK interrupt */ -INTERRUPT_GEN_MEMBER(cave_state::interrupt) -{ - // 17376us : frame time - m_int_timer->adjust(attotime::from_usec(17376 - m_time_vblank_irq)); -} -INTERRUPT_GEN_MEMBER(ppsatan_state::interrupt_ppsatan) -{ - m_int_timer->adjust (attotime::from_usec(17376 - m_time_vblank_irq)); - m_int_timer_left->adjust (attotime::from_usec(17376 - m_time_vblank_irq)); - m_int_timer_right->adjust(attotime::from_usec(17376 - m_time_vblank_irq)); -} - -/* Called by the YMZ280B to set the IRQ state */ -void cave_state::sound_irq_gen(int state) -{ - m_sound_irq = (state != 0); - update_irq_state(); -} - - -/* Level 1 irq routines: - - Game |first read | bit==0->routine + | - |offset: | read this offset | - - ddonpach 4,0 0 -> vblank + 4 1 -> rte 2 -> like 0 read sound - dfeveron 0 0 -> vblank + 4 1 -> + 6 - read sound - uopoko 0 0 -> vblank + 4 1 -> + 6 - read sound - esprade 0 0 -> vblank + 4 1 -> rte 2 must be 0 read sound - guwange 0 0 -> vblank + 6,4 1 -> + 6,4 2 must be 0 read sound - mazinger 0 0 -> vblank + 4 rest -> scroll + 6 -*/ - - -/* Reads the cause of the interrupt and clears the state */ - -u16 cave_state::irq_cause_r(offs_t offset) -{ - u16 result = 0x0003; - - if (m_vblank_irq) - result ^= 0x01; - if (m_unknown_irq) - result ^= 0x02; - - if (!machine().side_effects_disabled()) - { - if (offset == 4/2) - m_vblank_irq = 0; - if (offset == 6/2) - m_unknown_irq = 0; - - update_irq_state(); - } - -/* - sailormn and agallet wait for bit 2 of $b80001 to go 1 -> 0. - It must happen once per frame as agallet uses this to show - the copyright notice screen for ~8.5s -*/ - if (offset == 0) - { - result &= ~4; - result |= (m_agallet_vblank_irq ? 0 : 4); - } - - return result; -} - -template -void cave_state::videoregs_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_videoregs[Chip][offset]); - offset <<= 1; - // offset 0x04 and 0x06 is offset related? - // offset 0x0a is position mode toggle in bit 13-12 (separated for X and Y?), other bits used but unknown - // offset 0x68 or 0x78 is commonly watchdog or DMA command? - // offset 0x6c or 0x7c is encryption key or CRTC or something else? - // offset 0x6e is commonly communication when sound CPU exists - // other registers unknown - if (offset != 0x00 && - offset != 0x02 && - offset != 0x04 && - offset != 0x06 && - offset != 0x08 && - offset != 0x0a && - offset != 0x68 && - offset != 0x6e && - offset != 0x78) - logerror("%s: Unknown videoregs #%02X written %04X = %04X & %04X\n", - machine().describe_context(), Chip, offset, data, mem_mask); -} - - -/*************************************************************************** - - - Sound Handling Routines - - -***************************************************************************/ - -/* We need a FIFO buffer for sailormn, where the inter-CPUs - communication is *really* tight */ - -u8 cave_z80_state::soundflags_r() -{ - // bit 2 is low: can read command (lo) - // bit 3 is low: can read command (hi) -// return (m_sound_flag[0] ? 0 : 4) | -// (m_sound_flag[1] ? 0 : 8) ; -return 0; -} - -u16 cave_z80_state::soundflags_ack_r() -{ - // bit 0 is low: can write command - // bit 1 is low: can read answer -// return ((m_sound_flag[0] | m_sound_flag[1]) ? 1 : 0) | -// (m_soundbuf_empty ? 0 : 2) ; - - return m_soundbuf_empty ? 2 : 0; -} - -/* Main CPU: write a 16 bit sound latch and generate a NMI on the sound CPU */ -void cave_z80_state::sound_cmd_w(u16 data) -{ -// m_sound_flag[0] = 1; -// m_sound_flag[1] = 1; - m_soundlatch->write(data); - m_maincpu->spin_until_time(attotime::from_usec(50)); // Allow the other cpu to reply -} - -/* Sound CPU: read the low 8 bits of the 16 bit sound latch */ -u8 cave_z80_state::soundlatch_lo_r() -{ -// m_sound_flag[0] = 0; - return m_soundlatch->read() & 0xff; -} - -/* Sound CPU: read the high 8 bits of the 16 bit sound latch */ -u8 cave_z80_state::soundlatch_hi_r() -{ -// m_sound_flag[1] = 0; - return m_soundlatch->read() >> 8; -} - -/* Main CPU: read the latch written by the sound CPU (acknowledge) */ -u16 cave_z80_state::soundlatch_ack_r() -{ - if (!m_soundbuf_empty) - { - const u8 data = m_soundbuf_data[m_soundbuf_rptr]; - if (!machine().side_effects_disabled()) - { - m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; - m_soundbuf_empty = m_soundbuf_rptr == m_soundbuf_wptr; - } - return data; - } - else - { - logerror("%s: Sound Buffer 2 Underflow Error\n", machine().describe_context()); - return 0xff; - } -} - - -/* Sound CPU: write latch for the main CPU (acknowledge) */ -void cave_z80_state::soundlatch_ack_w(u8 data) -{ - if (m_soundbuf_empty || (m_soundbuf_wptr != m_soundbuf_rptr)) - { - m_soundbuf_data[m_soundbuf_wptr] = data; - m_soundbuf_wptr = (m_soundbuf_wptr + 1) & 0x1f; - m_soundbuf_empty = false; - } - else - logerror("%s: Sound Buffer 2 Overflow Error\n", machine().describe_context()); -} - - -/*************************************************************************** - - - EEPROM - - -***************************************************************************/ - -void cave_state::eeprom_w(u8 data) -{ - if (data & ~0xfe) - logerror("%s: Unknown EEPROM bit written %04X\n", machine().describe_context(), data); - - machine().bookkeeping().coin_lockout_w(1, BIT(~data, 7)); - machine().bookkeeping().coin_lockout_w(0, BIT(~data, 6)); - machine().bookkeeping().coin_counter_w(1, BIT( data, 5)); - machine().bookkeeping().coin_counter_w(0, BIT( data, 4)); - - // latch the bit - m_eeprom->di_write(BIT(data, 3)); - - // reset line asserted: reset. - m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); -} - -void cave_z80_state::sailormn_eeprom_w(u8 data) -{ - sailormn_tilebank_w(BIT(data, 0)); - eeprom_w(data & ~0x01); -} - -void cave_z80_state::hotdogst_eeprom_w(u8 data) -{ - // latch the bit - m_eeprom->di_write(BIT(data, 3)); - - // reset line asserted: reset. - m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); -} - -void ppsatan_state::ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (data & ~0x000f) - logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); - - if (ACCESSING_BITS_0_7) // odd address - { - // bit 11? - - // latch the bit - m_eeprom->di_write((data & 0x0400) >> 10); - - // reset line asserted: reset. - m_eeprom->cs_write((data & 0x0100) ? CLEAR_LINE : ASSERT_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write((data & 0x0200) ? ASSERT_LINE : CLEAR_LINE); - } -} - - -void cave_state::guwange_eeprom_w(u8 data) -{ - if (data & ~0xef) - logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); - - machine().bookkeeping().coin_lockout_w(1, BIT(~data, 3)); - machine().bookkeeping().coin_lockout_w(0, BIT(~data, 2)); - machine().bookkeeping().coin_counter_w(1, BIT( data, 1)); - machine().bookkeeping().coin_counter_w(0, BIT( data, 0)); - - // latch the bit - m_eeprom->di_write(BIT(data, 7)); - - // reset line asserted: reset. - m_eeprom->cs_write(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write(BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); -} - -/* - No eeprom or lockouts */ -void cave_state::gaia_coin_w(u8 data) -{ - machine().bookkeeping().coin_counter_w(1, BIT(data, 1)); - machine().bookkeeping().coin_counter_w(0, BIT(data, 0)); -} - -/* - No coin lockouts - - Writing 0xcf shouldn't send a 1 bit to the EEPROM */ -void cave_z80_state::metmqstr_eeprom_w(u8 data) -{ - machine().bookkeeping().coin_counter_w(1, BIT(data, 5)); - machine().bookkeeping().coin_counter_w(0, BIT(data, 4)); - - if (BIT(~data, 0)) - { - // latch the bit - m_eeprom->di_write(BIT(data, 3)); - - // reset line asserted: reset. - m_eeprom->cs_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE); - } -} - -/*************************************************************************** - - - Memory Maps - Main CPU - - -***************************************************************************/ - -/* Lines starting with an empty comment in the following MemoryReadAddress - arrays are there for debug (e.g. the game does not read from those ranges - AFAIK) */ - -/*************************************************************************** - Dangun Feveron -***************************************************************************/ - -void cave_state::dfeveron_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x708000, 0x708fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x710000, 0x710bff).readonly(); // ? - map(0x710c00, 0x710fff).ram(); // ? - map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00001).portr("IN0"); // Inputs - map(0xb00002, 0xb00003).portr("IN1"); // Inputs + EEPROM - map(0xc00000, 0xc00000).w(FUNC(cave_state::eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Dodonpachi -***************************************************************************/ - -void cave_state::ddonpach_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x700000, 0x703fff).mirror(0x00c000).m(m_tilemap[2], FUNC(tilemap038_device::vram_8x8_map)); // Layer 2 - map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xd00000, 0xd00001).portr("IN0"); // Inputs - map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM - map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Donpachi -***************************************************************************/ - -u16 cave_state::donpachi_videoregs_r(offs_t offset) -{ - switch (offset) - { - case 0: - case 1: - case 2: - case 3: return irq_cause_r(offset); - - default: return 0x0000; - } -} - -void cave_state::donpachi_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x200000, 0x207fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x403fff).mirror(0x004000).m(m_tilemap[2], FUNC(tilemap038_device::vram_8x8_map)); // Layer 2 - map(0x500000, 0x50ffff).ram().share(m_spriteram[0]); // Sprites - map(0x600000, 0x600005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x800000, 0x800005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0x900000, 0x90007f).rw(FUNC(cave_state::donpachi_videoregs_r), FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0xa08000, 0xa08fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xb00000, 0xb00003).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // M6295 #0 - map(0xb00010, 0xb00013).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // M6295 #1 - map(0xb00020, 0xb0002f).w("nmk112", FUNC(nmk112_device::okibank_w)).umask16(0x00ff); // Samples bank - map(0xc00000, 0xc00001).portr("IN0"); // Inputs - map(0xc00002, 0xc00003).portr("IN1"); // Inputs + EEPROM - map(0xd00000, 0xd00000).w(FUNC(cave_state::eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Esprade -***************************************************************************/ - -void cave_state::esprade_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xd00000, 0xd00001).portr("IN0"); // Inputs - map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM - map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Gaia Crusaders -***************************************************************************/ - -void cave_state::gaia_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprite - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x508000, 0x50ffff).ram(); // More Layer 0, Tested but not used? - map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x608000, 0x60ffff).ram(); // More Layer 1, Tested but not used? - map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x708000, 0x70ffff).ram(); // More Layer 2, Tested but not used? - map(0x800000, 0x80007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x800000, 0x800007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xd00010, 0xd00011).portr("IN0"); // Inputs - map(0xd00011, 0xd00011).w(FUNC(cave_state::gaia_coin_w)); // Coin counter only - map(0xd00012, 0xd00013).portr("IN1"); // Inputs - map(0xd00014, 0xd00015).portr("DSW"); // Dips - map(0xd00014, 0xd00015).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? -} - - -/*************************************************************************** - Guwange -***************************************************************************/ - -void cave_state::guwange_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x200000, 0x20ffff).ram(); // RAM - map(0x300000, 0x30007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x600000, 0x607fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x700000, 0x707fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x800000, 0x800003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x900000, 0x900005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa00000, 0xa00005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control -/**/map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xd00010, 0xd00011).portr("IN0"); // Inputs - map(0xd00011, 0xd00011).w(FUNC(cave_state::guwange_eeprom_w)); // EEPROM - map(0xd00012, 0xd00013).portr("IN1"); // Inputs + EEPROM -// map(0xd00012, 0xd00013).nopw(); // ? -// map(0xd00014, 0xd00015).nopw(); // ? $800068 in dfeveron ? probably Watchdog -} - - -/*************************************************************************** - Hotdog Storm -***************************************************************************/ - -void cave_z80_state::hotdogst_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x300000, 0x30ffff).ram(); // RAM - map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x880000, 0x887fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x980000, 0x987fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0xa80000, 0xa8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0xa80000, 0xa80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause -// map(0xa8006e, 0xa8006f).r(FUNC(cave_z80_state::soundlatch_ack_r)); // From Sound CPU - map(0xa8006e, 0xa8006f).w(FUNC(cave_z80_state::sound_cmd_w)); // To Sound CPU - map(0xb00000, 0xb00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xb80000, 0xb80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xc00000, 0xc00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xc80000, 0xc80001).portr("IN0"); // Inputs - map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM - map(0xd00000, 0xd00000).w(FUNC(cave_z80_state::hotdogst_eeprom_w)); // EEPROM - map(0xd00002, 0xd00003).nopw(); // ??? - map(0xf00000, 0xf0ffff).ram().share(m_spriteram[0]); // Sprites -} - - -/*************************************************************************** - Koro Koro Quest -***************************************************************************/ - -void cave_state::show_leds() -{ -#ifdef MAME_DEBUG -// popmessage("led %04X eep %02X", m_leds[0], (m_leds[1] >> 8) & ~0x70); -#endif -} - -void cave_state::korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_leds[0]); - - m_led_outputs[0] = BIT(data, 15); - m_led_outputs[1] = BIT(data, 14); - m_led_outputs[2] = BIT(data, 12); // square button - m_led_outputs[3] = BIT(data, 11); // round button -// machine().bookkeeping().coin_lockout_w(1, ~data & 0x0200); // coin lockouts? -// machine().bookkeeping().coin_lockout_w(0, ~data & 0x0100); - -// machine().bookkeeping().coin_counter_w(2, data & 0x0080); -// machine().bookkeeping().coin_counter_w(1, data & 0x0020); - machine().bookkeeping().coin_counter_w(0, data & 0x0010); - - m_led_outputs[5] = BIT(data, 3); - m_led_outputs[6] = BIT(data, 2); - m_led_outputs[7] = BIT(data, 1); - m_led_outputs[8] = BIT(data, 0); - - show_leds(); -} - - -void cave_state::korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (data & ~0x7000) - { - logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); - COMBINE_DATA(&m_leds[1]); - show_leds(); - } - - if (ACCESSING_BITS_8_15) // even address - { - m_hopper = data & 0x0100; // ??? - - // latch the bit - m_eeprom->di_write((data & 0x4000) >> 14); - - // reset line asserted: reset. - m_eeprom->cs_write((data & 0x1000) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write((data & 0x2000) ? ASSERT_LINE : CLEAR_LINE); - } -} - -int cave_state::korokoro_hopper_r() -{ - return m_hopper ? 1 : 0; -} - - -void cave_state::korokoro_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x107fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_writeonly_map)); // Layer 0 - map(0x140000, 0x140005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x180000, 0x187fff).writeonly().share(m_spriteram[0]); // Sprites - map(0x1c0000, 0x1c007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x1c0000, 0x1c0007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette -// map(0x240000, 0x240003).r("ymz", FUNC(ymz280b_device::read)).umask16(0x00ff); // YMZ280 - map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? - map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM - map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds - map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM - map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) - map(0x300000, 0x30ffff).ram(); // RAM -} - -void cave_state::crusherm_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x107fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_writeonly_map)); // Layer 0 - map(0x140000, 0x140005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x180000, 0x187fff).writeonly().share(m_spriteram[0]); // Sprites - map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? - map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM - map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds - map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM - map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) - map(0x300000, 0x30007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x340000, 0x34ffff).ram(); // RAM -} - -/*************************************************************************** - Mazinger Z -***************************************************************************/ - -void cave_z80_state::mazinger_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x30007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x300000, 0x300007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause - map(0x300068, 0x300069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x30006e, 0x30006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From Sound CPU - map(0x400000, 0x403fff).mirror(0x004000).m(m_tilemap[1], FUNC(tilemap038_device::vram_8x8_map)); // Layer 1 - map(0x500000, 0x503fff).mirror(0x004000).m(m_tilemap[0], FUNC(tilemap038_device::vram_8x8_map)); // Layer 0 - map(0x600000, 0x600005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x800000, 0x800001).portr("IN0"); // Inputs - map(0x800002, 0x800003).portr("IN1"); // Inputs + EEPROM - map(0x900000, 0x900000).w(FUNC(cave_z80_state::eeprom_w)); // EEPROM - map(0xc08000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0xd00000, 0xd7ffff).rom().region("user1", 0); // extra data ROM -} - - -/*************************************************************************** - Metamoqester -***************************************************************************/ - -void cave_z80_state::metmqstr_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x17ffff).rom(); // ROM - map(0x200000, 0x27ffff).rom(); // ROM - map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x600000, 0x600001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog? - map(0x880000, 0x887fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x888000, 0x88ffff).ram(); // - map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x908000, 0x90ffff).ram(); // - map(0x980000, 0x987fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x988000, 0x98ffff).ram(); // - map(0xa80000, 0xa8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0xa80000, 0xa80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause - map(0xa80068, 0xa80069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? - map(0xa8006c, 0xa8006d).r(FUNC(cave_z80_state::soundflags_ack_r))/*.nopw()*/; // Communication - map(0xa8006e, 0xa8006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From Sound CPU - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xb80000, 0xb80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xc00000, 0xc00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xc80000, 0xc80001).portr("IN0"); // Inputs - map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM - map(0xd00000, 0xd00000).w(FUNC(cave_z80_state::metmqstr_eeprom_w)); // EEPROM - map(0xf00000, 0xf0ffff).ram().share(m_spriteram[0]); // Sprites - // 0xf00000-0xf07fff Sprite RAM - // 0xf08000-0xf0ffff Work RAM -} - - -/*************************************************************************** - Poka Poka Satan -***************************************************************************/ - -void ppsatan_state::ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_ppsatan_io_mux); -} - -template -u16 ppsatan_state::ppsatan_touch_r() -{ - u8 ret_x = 0, ret_y = 0; - - u16 x = m_touch_x[Player]->read(); - u16 y = m_touch_y[Player]->read(); - - if (x & 0x8000) // touching - { - x &= 0x7fff; - - // x - int slot_x = floor( ((320.0f - 1 - x) - 12) / 20 ); - - if (slot_x < 0) - slot_x = 0; - else if (slot_x > 14) - slot_x = 14; - - if ( (m_ppsatan_io_mux & (1 << slot_x)) || ((m_ppsatan_io_mux << 13) & (1 << slot_x)) ) - ret_x |= 1 << (slot_x % 8); - - // y - int slot_y = floor( ((224.0f - 1 - y) - 14) / 18 ); - - if (slot_y < 0) - slot_y = 0; - else if (slot_y > 10) - slot_y = 10; - - if ( ((m_ppsatan_io_mux >> 2) & (1 << slot_y)) || ((m_ppsatan_io_mux << 6) & (1 << slot_y)) ) - ret_y |= 1 << (slot_y % 6); - -// if (!Player) popmessage("TOUCH %03x %03x -> %f -> %d", x, y, ((320.0f - 1 - x) - 12) / 20, slot_x); - } - - return ret_x | (ret_y << 8); -} - -void ppsatan_state::ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - machine().bookkeeping().coin_counter_w(0, data & 0x0001); - - m_led_outputs[0] = BIT(data, 4); - m_led_outputs[1] = BIT(data, 5); - m_led_outputs[2] = BIT(data, 6); - m_led_outputs[3] = BIT(data, 7); - } - if (ACCESSING_BITS_8_15) - { - m_led_outputs[4] = BIT(data, 8); - m_led_outputs[5] = BIT(data, 9); - m_led_outputs[6] = BIT(data, 10); // not tested in service mode - m_led_outputs[7] = BIT(data, 11); // not tested in service mode - - m_oki[0]->set_rom_bank((data & 0x8000) >> 15); - } - -// popmessage("OUT %04x", data); -} - -void ppsatan_state::ppsatan_map(address_map &map) -{ - map(0x000000, 0x03ffff).rom(); // ROM - map(0x040000, 0x04ffff).ram(); // RAM - - // Left Screen (Player 2) - map(0x080000, 0x080005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control - map(0x100000, 0x107fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer -// map(0x180000, 0x1803ff).ram() // Palette (Tilemaps) -// map(0x187800, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette (Sprites) - map(0x180000, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette - map(0x1c0000, 0x1c7fff).ram().share(m_spriteram[1]); // Sprites - map(0x200000, 0x200001).portr("SYSTEM"); // DSW + (unused) EEPROM - map(0x200000, 0x200001).w(FUNC(ppsatan_state::ppsatan_out_w)); // Outputs + OKI banking - map(0x200002, 0x200003).rw(FUNC(ppsatan_state::ppsatan_touch_r<1>), FUNC(ppsatan_state::ppsatan_eeprom_w)); // Touch Screen + (unused) EEPROM - map(0x200004, 0x200005).rw(FUNC(ppsatan_state::ppsatan_touch_r<0>), FUNC(ppsatan_state::ppsatan_io_mux_w)); // Touch Screen - map(0x200006, 0x200007).nopw(); // Lev. 2 IRQ Ack? - map(0x2c0000, 0x2c007f).w(FUNC(ppsatan_state::videoregs_w<1>)).share(m_videoregs[1]); // Video Regs - map(0x2c0000, 0x2c0007).r(FUNC(ppsatan_state::irq_cause_r)); // IRQ Cause - map(0x2c0068, 0x2c0069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - - map(0x300001, 0x300001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - - // Right Screen (Player 1) - map(0x480000, 0x480005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control - map(0x500000, 0x507fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer -// map(0x580000, 0x5803ff).ram() // Palette (Tilemaps) -// map(0x587800, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette (Sprites) - map(0x580000, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette - map(0x5c0000, 0x5c7fff).ram().share(m_spriteram[2]); // Sprites - map(0x6c0000, 0x6c007f).w(FUNC(ppsatan_state::videoregs_w<2>)).share(m_videoregs[2]); // Video Regs - - // Top Screen - map(0x880000, 0x880005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer Control - map(0x900000, 0x907fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer -// map(0x980000, 0x9803ff).ram(); // Palette (Tilemaps) -// map(0x987800, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette (Sprites) - map(0x980000, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x9c0000, 0x9c7fff).ram().share(m_spriteram[0]); // Sprites - map(0xac0000, 0xac007f).w(FUNC(ppsatan_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs -} - - -/*************************************************************************** - Power Instinct 2 -***************************************************************************/ - -u16 cave_z80_state::pwrinst2_eeprom_r() -{ - return ~8 + ((m_eeprom->do_read() & 1) ? 8 : 0); -} - -template -void cave_z80_state::pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (offset == 4 / 2) - { - switch (data & 0x000f) - { - case 1: data = (data & ~0x000f) | 0; break; - case 2: data = (data & ~0x000f) | 1; break; - case 4: data = (data & ~0x000f) | 2; break; - default: - case 8: data = (data & ~0x000f) | 3; break; - } - } - m_tilemap[Chip]->vregs_w(offset, data, mem_mask); -} - -void cave_z80_state::pwrinst2_map(address_map &map) -{ - map(0x000000, 0x1fffff).rom(); // ROM - map(0x400000, 0x40ffff).ram(); // RAM - map(0x500000, 0x500001).portr("IN0"); // Inputs - map(0x500002, 0x500003).portr("IN1"); // - map(0x600000, 0x6fffff).rom().region("user1", 0); // extra data ROM space - map(0x700000, 0x700000).w(FUNC(cave_z80_state::eeprom_w)); // EEPROM - map(0x800000, 0x807fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x880000, 0x887fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x900000, 0x907fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x980000, 0x983fff).mirror(0x004000).m(m_tilemap[3], FUNC(tilemap038_device::vram_8x8_map)); // Layer 3 - map(0xa00000, 0xa0ffff).ram().share(m_spriteram[0]); // Sprites - map(0xa10000, 0xa1ffff).ram(); // Sprites? - map(0xa80000, 0xa8007f).rw(FUNC(cave_z80_state::donpachi_videoregs_r), FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0xb00000, 0xb00005).r(m_tilemap[2], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<2>)); // Layer 2 Control - map(0xb80000, 0xb80005).r(m_tilemap[0], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<0>)); // Layer 0 Control - map(0xc00000, 0xc00005).r(m_tilemap[1], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<1>)); // Layer 1 Control - map(0xc80000, 0xc80005).r(m_tilemap[3], FUNC(tilemap038_device::vregs_r)).w(FUNC(cave_z80_state::pwrinst2_vctrl_w<3>)); // Layer 3 Control - map(0xd80000, 0xd80001).r(FUNC(cave_z80_state::soundlatch_ack_r)); // ? From Sound CPU - map(0xe00000, 0xe00001).w(FUNC(cave_z80_state::sound_cmd_w)); // To Sound CPU - map(0xe80000, 0xe80001).r(FUNC(cave_z80_state::pwrinst2_eeprom_r)); // EEPROM - map(0xf00000, 0xf04fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette -} - - -/*************************************************************************** - Sailor Moon -***************************************************************************/ - -u16 cave_z80_state::sailormn_input0_r() -{ -// watchdog_reset16_r(0, 0); // written too rarely for mame. - return m_io_in0->read(); -} - -void cave_z80_state::sailormn_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x110000, 0x110001).ram(); // (agallet) - map(0x200000, 0x3fffff).rom(); // ROM - map(0x400000, 0x407fff).ram(); // (agallet) - map(0x408000, 0x40bfff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x40c000, 0x40ffff).ram(); // (agallet) - map(0x410000, 0x410001).ram(); // (agallet) - map(0x500000, 0x50ffff).ram().share(m_spriteram[0]); // Sprites - map(0x510000, 0x510001).ram(); // (agallet) - map(0x600000, 0x600001).r(FUNC(cave_z80_state::sailormn_input0_r)); // Inputs + Watchdog! - map(0x600002, 0x600003).portr("IN1"); // Inputs + EEPROM - map(0x700000, 0x700000).w(FUNC(cave_z80_state::sailormn_eeprom_w)); // EEPROM - map(0x800000, 0x807fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x880000, 0x887fff).m(m_tilemap[1], FUNC(tilemap038_device::vram_map)); // Layer 1 - map(0x900000, 0x907fff).m(m_tilemap[2], FUNC(tilemap038_device::vram_map)); // Layer 2 - map(0x908000, 0x908001).ram(); // (agallet) - map(0xa00000, 0xa00005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0xa80000, 0xa80005).rw(m_tilemap[1], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 1 Control - map(0xb00000, 0xb00005).rw(m_tilemap[2], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 2 Control - map(0xb80000, 0xb8007f).w(FUNC(cave_z80_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0xb80000, 0xb80007).r(FUNC(cave_z80_state::irq_cause_r)); // IRQ Cause (bit 2 tested!) - map(0xb8006c, 0xb8006d).r(FUNC(cave_z80_state::soundflags_ack_r)); // Communication - map(0xb8006e, 0xb8006f).rw(FUNC(cave_z80_state::soundlatch_ack_r), FUNC(cave_z80_state::sound_cmd_w)); // From/To Sound CPU -} - - -/*************************************************************************** - Tekken Card World -***************************************************************************/ - -void cave_state::tekkencw_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x400002, 0x400003).portr("IN1"); // Inputs - map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Tekken Battle Scratch -***************************************************************************/ - -void cave_state::tekkenbs_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x600002, 0x600003).portr("IN1"); // Inputs - map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Tobikose! Jumpman -***************************************************************************/ - -void cave_state::tjumpman_eeprom_w(u8 data) -{ - if (data & ~0x38) - logerror("%s: Unknown EEPROM bit written %04X\n",machine().describe_context(),data); - - // latch the bit - m_eeprom->di_write(BIT(data, 5)); - - // reset line asserted: reset. - m_eeprom->cs_write(BIT(data, 3) ? ASSERT_LINE : CLEAR_LINE); - - // clock line asserted: write latch or select next bit to read - m_eeprom->clk_write(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE); -} - -void cave_state::tjumpman_leds_w(u8 data) -{ - m_led_outputs[0] = BIT(data, 0); // suru - m_led_outputs[1] = BIT(data, 1); // shinai - m_led_outputs[2] = BIT(data, 2); // payout - m_led_outputs[3] = BIT(data, 3); // go - m_led_outputs[4] = BIT(data, 4); // 1 bet - m_led_outputs[5] = BIT(data, 5); // medal - m_hopper = BIT(data, 6); // hopper - m_led_outputs[6] = BIT(data, 7); // 3 bet - -// popmessage("led %04X", data); -} - -int cave_state::tjumpman_hopper_r() -{ - return (m_hopper && !(m_screen[0]->frame_number() % 10)) ? 0 : 1; -} - -void cave_state::tjumpman_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x304000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_16x16_writeonly_map)); // Layer 0 - 16x16 tiles mapped here - map(0x400000, 0x400005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x500000, 0x50ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x600002, 0x600003).portr("IN1"); // Inputs - map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Pac-Slot -***************************************************************************/ - -void cave_state::pacslot_leds_w(u8 data) -{ - m_led_outputs[0] = data & 0x0001; // pac-man - m_led_outputs[1] = data & 0x0002; // ms. pac-man - m_led_outputs[2] = data & 0x0004; // payout - m_led_outputs[3] = data & 0x0008; // start - m_led_outputs[4] = data & 0x0010; // bet - m_led_outputs[5] = data & 0x0020; // medal - m_hopper = data & 0x0040; // hopper - -// popmessage("led %04X", data); -} - -void cave_state::pacslot_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x40007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x400000, 0x400007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x400068, 0x400069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x500000, 0x500005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x700000, 0x700001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x700002, 0x700003).portr("IN1"); // Inputs - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Pac-Eight -***************************************************************************/ - -//TODO: leds need verifying - -void cave_state::paceight_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x500000, 0x500001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x500002, 0x500003).portr("IN1"); // Inputs - map(0x600000, 0x600005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - - -/*************************************************************************** - Pac-Carnival -***************************************************************************/ - -//TODO: leds need verifying - -int cave_state::paccarn_bet4_r() -{ - return (m_io_bet->read() & 0x5) ? 1 : 0; -} - -int cave_state::paccarn_bet8_r() -{ - return (m_io_bet->read() & 0x6) ? 1 : 0; -} - -void cave_state::paccarn_map(address_map &map) -{ - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share(m_spriteram[0]); // Sprites - map(0x300000, 0x307fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x400002, 0x400003).portr("IN1"); // Inputs - map(0x500000, 0x50ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x600000, 0x600005).w(m_tilemap[0], FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x700000, 0x70007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM -} - -/*************************************************************************** - Uo Poko -***************************************************************************/ - -void cave_state::uopoko_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x300000, 0x300003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x400000, 0x40ffff).ram().share(m_spriteram[0]); // Sprites - map(0x500000, 0x507fff).m(m_tilemap[0], FUNC(tilemap038_device::vram_map)); // Layer 0 - map(0x600000, 0x60007f).w(FUNC(cave_state::videoregs_w<0>)).share(m_videoregs[0]); // Video Regs - map(0x600000, 0x600007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700000, 0x700005).rw(m_tilemap[0], FUNC(tilemap038_device::vregs_r), FUNC(tilemap038_device::vregs_w)); // Layer 0 Control - map(0x800000, 0x80ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette - map(0x900000, 0x900001).portr("IN0"); // Inputs - map(0x900002, 0x900003).portr("IN1"); // Inputs + EEPROM - map(0xa00000, 0xa00000).w(FUNC(cave_state::eeprom_w)); // EEPROM -} - - - -/*************************************************************************** - - - Memory Maps - Sound CPU (Optional) - - -***************************************************************************/ - -template -void cave_z80_state::z80_rombank_w(u8 data) -{ - if (data & ~Mask) - logerror("%s: Z80 Bank %02X\n", machine().describe_context(), data); - - m_z80bank->set_entry(data & Mask); -} - -template -void cave_z80_state::oki1_bank_w(u8 data) -{ - int bank1 = (data >> 0) & Mask; - int bank2 = (data >> 4) & Mask; - m_okibank_lo[0]->set_entry(bank1); - m_okibank_hi[0]->set_entry(bank2); -} - -template -void cave_z80_state::oki2_bank_w(u8 data) -{ - int bank1 = (data >> 0) & Mask; - int bank2 = (data >> 4) & Mask; - m_okibank_lo[1]->set_entry(bank1); - m_okibank_hi[1]->set_entry(bank2); -} - - -void cave_z80_state::oki_map(address_map &map) -{ - map(0x00000, 0x1ffff).bankr(m_okibank_lo[0]); - map(0x20000, 0x3ffff).bankr(m_okibank_hi[0]); -} - -void cave_z80_state::oki2_map(address_map &map) -{ - map(0x00000, 0x1ffff).bankr(m_okibank_lo[1]); - map(0x20000, 0x3ffff).bankr(m_okibank_hi[1]); -} - - -/*************************************************************************** - Hotdog Storm -***************************************************************************/ - -void cave_z80_state::hotdogst_sound_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); // ROM - map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) - map(0xe000, 0xffff).ram(); // RAM -} - -void cave_z80_state::hotdogst_sound_portmap(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x0f>)); // ROM bank - map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU - map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" - map(0x50, 0x51).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // YM2203 - map(0x60, 0x60).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0x3>)); // Samples bank -} - - -/*************************************************************************** - Mazinger Z -***************************************************************************/ - -void cave_z80_state::mazinger_sound_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); // ROM - map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) - map(0xc000, 0xc7ff).ram(); // RAM - map(0xf800, 0xffff).ram(); // RAM -} - -void cave_z80_state::mazinger_sound_portmap(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x07>)); // ROM bank - map(0x10, 0x10).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU - map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU - map(0x50, 0x51).w("ymsnd", FUNC(ym2203_device::write)); // YM2203 - map(0x52, 0x53).r("ymsnd", FUNC(ym2203_device::read)); // YM2203 - map(0x70, 0x70).w("oki1", FUNC(okim6295_device::write)); // M6295 - map(0x74, 0x74).w(FUNC(cave_z80_state::oki1_bank_w<0x3>)); // Samples bank -} - - -/*************************************************************************** - Metamoqester -***************************************************************************/ - -void cave_z80_state::metmqstr_sound_portmap(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x0f>)); // Rom Bank - map(0x20, 0x20).r(FUNC(cave_z80_state::soundflags_r)); // Communication - map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU - map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" - map(0x50, 0x51).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 - map(0x60, 0x60).w("oki1", FUNC(okim6295_device::write)); // M6295 #0 - map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0x7>)); // Samples Bank #0 - map(0x80, 0x80).w("oki2", FUNC(okim6295_device::write)); // M6295 #1 - map(0x90, 0x90).w(FUNC(cave_z80_state::oki2_bank_w<0x7>)); // Samples Bank #1 -} - - -/*************************************************************************** - Power Instinct 2 -***************************************************************************/ - -void cave_z80_state::pwrinst2_sound_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); // ROM - map(0x8000, 0xbfff).bankr(m_z80bank); // ROM (Banked) - map(0xe000, 0xffff).ram(); // RAM -} - -void cave_z80_state::pwrinst2_sound_portmap(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #0 - map(0x08, 0x08).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #1 - map(0x10, 0x17).w("nmk112", FUNC(nmk112_device::okibank_w)); // Samples bank - map(0x40, 0x41).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // YM2203 - map(0x50, 0x50).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU -// map(0x51, 0x51).nopw(); // ?? volume - map(0x60, 0x60).r(FUNC(cave_z80_state::soundlatch_hi_r)); // From Main CPU - map(0x70, 0x70).r(FUNC(cave_z80_state::soundlatch_lo_r)); // "" - map(0x80, 0x80).w(FUNC(cave_z80_state::z80_rombank_w<0x07>)); // ROM bank -} - - -/*************************************************************************** - Sailor Moon -***************************************************************************/ - -void cave_z80_state::sailormn_sound_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); // ROM - map(0x4000, 0x7fff).bankr(m_z80bank); // ROM (Banked) - map(0xc000, 0xdfff).mirror(0x2000).ram(); // RAM (8KB, mirrored) -} - -void cave_z80_state::sailormn_sound_portmap(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x00).w(FUNC(cave_z80_state::z80_rombank_w<0x1f>)); // Rom Bank - map(0x10, 0x10).w(FUNC(cave_z80_state::soundlatch_ack_w)); // To Main CPU - map(0x20, 0x20).r(FUNC(cave_z80_state::soundflags_r)); // Communication - map(0x30, 0x30).r(FUNC(cave_z80_state::soundlatch_lo_r)); // From Main CPU - map(0x40, 0x40).r(FUNC(cave_z80_state::soundlatch_hi_r)); // "" - map(0x50, 0x51).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 - map(0x60, 0x60).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #0 - map(0x70, 0x70).w(FUNC(cave_z80_state::oki1_bank_w<0xf>)); // Samples Bank #0 - map(0x80, 0x80).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 #1 - map(0xc0, 0xc0).w(FUNC(cave_z80_state::oki2_bank_w<0xf>)); // Samples Bank #1 -} - - - -/*************************************************************************** - - - Input Ports - - -***************************************************************************/ - -/* - dfeveron config menu: - 101624.w -> 8,a6 preferences - 101626.w -> c,a6 (1:coin<<4|credit) <<8 | (2:coin<<4|credit) -*/ - -/* Most games use this */ -static INPUT_PORTS_START( cave ) - PORT_START("IN0") // Player 1 - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) - PORT_SERVICE_NO_TOGGLE( 0x0200, IP_ACTIVE_LOW ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sw? exit service mode - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // sw? enter & exit service mode - PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("IN1") // Player 2 - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0xf400, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - -/* Gaia Crusaders, no EEPROM. Has DIPS */ -static INPUT_PORTS_START( gaia ) - PORT_INCLUDE( cave ) - - PORT_MODIFY("IN0") // Player 1 + 2 - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) - - PORT_MODIFY("IN1") // Coins - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) - PORT_SERVICE_NO_TOGGLE( 0x0004, IP_ACTIVE_LOW ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x0fc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("DSW") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0002, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x0000, DEF_STR( English ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Japanese ) ) - PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:4,5,6") - PORT_DIPSETTING( 0x0008, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x0000, "2 Coins/1 Credit (1 to continue)" ) - PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x0018, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( On ) ) - - PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x0100, "1" ) - PORT_DIPSETTING( 0x0000, "2" ) - PORT_DIPSETTING( 0x0300, "3" ) - PORT_DIPSETTING( 0x0200, "4" ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0400, "150k/300k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xc000) - PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xa000) - PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0xe000) - PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x6000) - PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x8000) - PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x2000) - PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x4000) - PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xe000, EQUALS, 0x0000) - PORT_DIPNAME( 0x1800, 0x1800, "Damage" ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x1800, "+0" ) - PORT_DIPSETTING( 0x1000, "+1" ) - PORT_DIPSETTING( 0x0800, "+2" ) - PORT_DIPSETTING( 0x0000, "+3" ) - PORT_DIPNAME( 0xe000, 0xe000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7,8") - PORT_DIPSETTING( 0xc000, DEF_STR( Very_Easy ) ) - PORT_DIPSETTING( 0xa000, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0xe000, DEF_STR( Medium ) ) - PORT_DIPSETTING( 0x6000, DEF_STR( Medium_Hard ) ) - PORT_DIPSETTING( 0x8000, "Hard 1" ) - PORT_DIPSETTING( 0x2000, "Hard 2" ) - PORT_DIPSETTING( 0x4000, DEF_STR( Very_Hard ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) -INPUT_PORTS_END - -static INPUT_PORTS_START( theroes ) - PORT_INCLUDE( gaia ) - - PORT_MODIFY("DSW") - PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x0000, DEF_STR( English ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Chinese ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0400, "150k/300k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x8000) - PORT_DIPSETTING( 0x0400, "150k/350k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0xc000) - PORT_DIPSETTING( 0x0400, "150k/400k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x4000) - PORT_DIPSETTING( 0x0400, "200k/500k" ) PORT_CONDITION("DSW", 0xc000, EQUALS, 0x0000) - PORT_DIPUNKNOWN_DIPLOC( 0x2000, 0x2000, "SW2:6" ) - PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,8") - PORT_DIPSETTING( 0x8000, DEF_STR( Very_Easy ) ) - PORT_DIPSETTING( 0xc000, DEF_STR( Medium ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Medium_Hard ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) -INPUT_PORTS_END - - -/* Normal layout but with 4 buttons */ -static INPUT_PORTS_START( metmqstr ) - PORT_INCLUDE( cave ) - - PORT_MODIFY("IN0") // Player 1 - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) - - PORT_MODIFY("IN1") // Player 2 - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) -INPUT_PORTS_END - -/* Different layout */ -static INPUT_PORTS_START( guwange ) - PORT_START("IN0") // Player 1 & 2 - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - - PORT_START("IN1") // Coins - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(6) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(6) - PORT_SERVICE_NO_TOGGLE( 0x0004, IP_ACTIVE_LOW ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0xff70, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( korokoro ) - PORT_START("IN0") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // bit 0x0010 of leds (coin) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // bit 0x0020 of leds (does coin sound) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(10) // bit 0x0080 of leds - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON1 ) // round button (choose) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) // square button (select in service mode / medal out in game) - PORT_BIT( 0x0fe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE2 ) // service medal out? - PORT_SERVICE( 0x2000, IP_ACTIVE_LOW ) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, korokoro_hopper_r) // motor / hopper status ??? - - PORT_START("IN1") - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0xefff, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( tekkencw ) - PORT_START("IN0") - PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( Yes ) ) PORT_CODE(KEYCODE_Y) // suru ("do") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) - - PORT_START("IN1") - PORT_CONFNAME( 0x08, 0x08, "Self Test" ) - PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME( DEF_STR( No ) ) PORT_CODE(KEYCODE_N) // shinai ("not") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Action" ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) - PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( tekkenbs ) - PORT_START("IN0") - PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) - - PORT_START("IN1") - PORT_CONFNAME( 0x08, 0x08, "Self Test" ) - PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Start" ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) - PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( tjumpman ) - PORT_START("IN0") - PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW ) - PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( Yes ) ) PORT_CODE(KEYCODE_Y) // suru ("do") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "1 Bet" ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) - - PORT_START("IN1") - PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_CONFNAME( 0x08, 0x08, "Self Test" ) - PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( DEF_STR( No ) ) PORT_CODE(KEYCODE_N) // shinai ("not") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME( "Go" ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "3 Bet" ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( pacslot ) - PORT_START("IN0") - PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) // must stay on during service mode - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Pac-Man" ) PORT_CODE(KEYCODE_Y) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet" ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) - - PORT_START("IN1") - PORT_CONFNAME( 0x08, 0x08, "Self Test" ) - PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Ms. Pac-Man" ) PORT_CODE(KEYCODE_N) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) - PORT_BIT( 0x87, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - -static INPUT_PORTS_START( paceight ) - PORT_INCLUDE( pacslot ) - - PORT_MODIFY("IN0") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Left" ) PORT_CODE(KEYCODE_Y) - - PORT_MODIFY("IN1") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME( "Right" ) PORT_CODE(KEYCODE_N) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Max Bet" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( paccarn ) - PORT_START("IN0") - PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) // credits (impulse needed to coin up reliably) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, paccarn_bet4_r) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Bet 2" ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, tjumpman_hopper_r) - - PORT_START("IN1") - PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_CONFNAME( 0x08, 0x08, "Self Test" ) - PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cave_state, paccarn_bet8_r) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Bet 3" ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) // medal (impulse needed to coin up reliably) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - - // holding together Bet 4 and Bet 8 activates Bet 12 in IO Test Mode - PORT_START("BET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME( "Bet 4" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME( "Bet 8" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME( "Bet 12" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( ppsatan ) - PORT_START("SYSTEM") // $200000 - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE2 ) // advance in service mode - PORT_BIT( 0x0072, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - - PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2") - PORT_DIPSETTING( 0x0300, "1 Coin/1 1P-Game (2 Coins/1 2P-Game)" ) - PORT_DIPSETTING( 0x0100, "2 Coins/1 1P-Game (3 Coins/1 2P-Game)" ) - PORT_DIPSETTING( 0x0200, "2 Coins/1 1P-Game (4 Coins/1 2P-Game)" ) - PORT_DIPSETTING( 0x0000, "2 Coins/1 1P-Game (4 Coins/1 2P-Game) (duplicate)" ) - PORT_DIPUNKNOWN(0x0400, 0x0400) PORT_DIPLOCATION("SW1:3") - PORT_DIPUNKNOWN(0x0800, 0x0800) PORT_DIPLOCATION("SW1:4") - PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6") - PORT_DIPSETTING( 0x1000, DEF_STR( Easy ) ) // 15 hits - PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) ) // 20 hits - PORT_DIPSETTING( 0x0000, DEF_STR( Hard ) ) // 25 hits - PORT_DIPSETTING( 0x2000, "Hard (duplicate)" ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7") // Jingle after "warning" screen (every 3 demo loops) - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( On ) ) - PORT_SERVICE(0x8000, IP_ACTIVE_LOW) PORT_DIPLOCATION("SW1:8") - - PORT_START("TOUCH1_X") - PORT_BIT( 0x7fff, 0x20, IPT_LIGHTGUN_X ) PORT_PLAYER(1) PORT_MINMAX(0x000, 0x140-1) PORT_CROSSHAIR(X, 284.0/320.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_START("TOUCH1_Y") - PORT_BIT( 0xffff, 0x18, IPT_LIGHTGUN_Y ) PORT_PLAYER(1) PORT_MINMAX(0x000, 0xe0-1) PORT_CROSSHAIR(Y, 188.0/224.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) - - PORT_START("TOUCH2_X") - PORT_BIT( 0x7fff, 0x20, IPT_LIGHTGUN_X ) PORT_PLAYER(2) PORT_MINMAX(0x000, 0x140-1) PORT_CROSSHAIR(X, 284.0/320.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_START("TOUCH2_Y") - PORT_BIT( 0xffff, 0x18, IPT_LIGHTGUN_Y ) PORT_PLAYER(2) PORT_MINMAX(0x000, 0xe0-1) PORT_CROSSHAIR(Y, 188.0/224.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(8) -INPUT_PORTS_END - - -/*************************************************************************** - - - Graphics Layouts - - -***************************************************************************/ - -// 6bpp tiles are accessible only 0x400 colors - -// 8x8x6 tiles (in a 8x8x8 layout) -static const gfx_layout layout_8x8x6 = -{ - 8,8, - RGN_FRAC(1,1), - 6, - {STEP2(8,1),STEP4(0,1)}, - {0*4,1*4,4*4,5*4,8*4,9*4,12*4,13*4}, - {STEP8(0,8*8)}, - 8*8*8 -}; - -// 8x8x6 tiles (4 bits in one rom, 2 bits in the other, -// unpacked in 2 pages of 4 bits) -static const gfx_layout layout_8x8x6_2 = -{ - 8,8, - RGN_FRAC(1,2), - 6, - {RGN_FRAC(1,2)+2,RGN_FRAC(1,2)+3, STEP4(0,1)}, - {STEP8(0,4)}, - {STEP8(0,4*8)}, - 8*8*4 -}; - -// 8x8x8 tiles -static const gfx_layout layout_8x8x8 = -{ - 8,8, - RGN_FRAC(1,1), - 8, - {STEP4(8,1),STEP4(0,1)}, - {0*4,1*4,4*4,5*4,8*4,9*4,12*4,13*4}, - {STEP8(0,8*8)}, - 8*8*8 -}; - -// 16~x16~x4 Zooming Sprites - decode each 16 pixel lines -static const gfx_layout layout_sprites = -{ - 16,1, - RGN_FRAC(1,1), - 4, - {STEP4(0,1)}, - {1*4,0*4,3*4,2*4,5*4,4*4,7*4,6*4,9*4,8*4,11*4,10*4,13*4,12*4,15*4,14*4}, - {0}, - 16*4 -}; - -// 16~x16~x4 Non-zooming Sprites - decode each 16 pixel lines -static const gfx_layout layout_sprites_msb = -{ - 16,1, - RGN_FRAC(1,1), - 4, - {STEP4(0,1)}, - {STEP16(0,4)}, - {0}, - 16*4 -}; - -// esprade, guwange uses 8bpp sprites instead 4bpp -static const gfx_layout layout_sprites_8bpp = -{ - 16,1, - RGN_FRAC(1,1), - 8, - {STEP4(0,1), STEP4(4*4,1)}, - {STEP4(4*4*2*0+3*4,-4),STEP4(4*4*2*1+3*4,-4),STEP4(4*4*2*2+3*4,-4),STEP4(4*4*2*3+3*4,-4)}, - {0}, - 16*8 -}; - -static GFXDECODE_START( gfx_common_spr ) - GFXDECODE_ENTRY( "sprites0", 0, layout_sprites, 0x0000, 0x40 ) -GFXDECODE_END - -/*************************************************************************** - Dangun Feveron -***************************************************************************/ - -static GFXDECODE_START( gfx_dfeveron ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [1] Layer 1 -GFXDECODE_END - -/*************************************************************************** - Dodonpachi -***************************************************************************/ - -// different gfx layout -static GFXDECODE_START( gfx_ddonpach_spr ) - GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_msb, 0x0000, 0x40 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_ddonpach ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x4000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x4000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x8, 0x4000, 0x40 ) // [2] Layer 2 -GFXDECODE_END - -/*************************************************************************** - Donpachi -***************************************************************************/ - -static GFXDECODE_START( gfx_donpachi ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [2] Layer 2 -GFXDECODE_END - -/*************************************************************************** - Esprade -***************************************************************************/ - -static GFXDECODE_START( gfx_esprade_spr ) - GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_8bpp, 0x0000, 0x40 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_esprade ) - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x8, 0x4000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x8, 0x4000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x8, 0x4000, 0x40 ) // [2] Layer 2 -GFXDECODE_END - -/*************************************************************************** - Hotdog Storm -***************************************************************************/ - -static GFXDECODE_START( gfx_hotdogst ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [2] Layer 2 -GFXDECODE_END - -/*************************************************************************** - Koro Koro Quest -***************************************************************************/ - -// different sprite base palette -static GFXDECODE_START( gfx_korokoro_spr ) - GFXDECODE_ENTRY( "sprites0", 0, layout_sprites, 0x3c00, 0x40 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_korokoro ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 -GFXDECODE_END - -/*************************************************************************** - Mazinger Z -***************************************************************************/ - -static GFXDECODE_START( gfx_mazinger ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x6, 0x0400, 0x10 ) // [1] Layer 1 -GFXDECODE_END - -/*************************************************************************** - Poka Poka Satan -***************************************************************************/ - -static GFXDECODE_START( gfx_ppsatan_0 ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [0] Layer 0 -GFXDECODE_END - -static GFXDECODE_START( gfx_ppsatan_spr_1 ) - GFXDECODE_ENTRY( "sprites1", 0, layout_sprites, 0x3c00, 0x40 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_ppsatan_1 ) - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [1] Layer 1 -GFXDECODE_END - -static GFXDECODE_START( gfx_ppsatan_spr_2 ) - GFXDECODE_ENTRY( "sprites2", 0, layout_sprites, 0x3c00, 0x40 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_ppsatan_2 ) - GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x0000, 0x40 ) // [2] Layer 2 -GFXDECODE_END - -/*************************************************************************** - Power Instinct 2 -***************************************************************************/ - -// expanded sprite color space -static GFXDECODE_START( gfx_pwrinst2_spr ) - GFXDECODE_ENTRY( "sprites0", 0, layout_sprites_msb, 0x0000, 0x80 ) -GFXDECODE_END - -static GFXDECODE_START( gfx_pwrinst2 ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0800, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x1000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, gfx_8x8x4_packed_msb, 0x1800, 0x40 ) // [2] Layer 2 - GFXDECODE_ENTRY( "layer3", 0, gfx_8x8x4_packed_msb, 0x2000, 0x40 ) // [3] Layer 3 -GFXDECODE_END - - -/*************************************************************************** - Sailor Moon -***************************************************************************/ - -static GFXDECODE_START( gfx_sailormn ) - GFXDECODE_ENTRY( "layer0", 0, gfx_8x8x4_packed_msb, 0x0400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, gfx_8x8x4_packed_msb, 0x0800, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x6_2, 0x0c00, 0x10 ) // [2] Layer 2 -GFXDECODE_END - - -/*************************************************************************** - Uo Poko -***************************************************************************/ - -static GFXDECODE_START( gfx_uopoko ) - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x8, 0x4000, 0x40 ) // [0] Layer 0 -GFXDECODE_END - - -/*************************************************************************** - - - Machine Drivers - - -***************************************************************************/ - -void cave_state::machine_start() -{ - m_led_outputs.resolve(); - m_vblank_end_timer = timer_alloc(FUNC(cave_state::vblank_end), this); - - save_item(NAME(m_vblank_irq)); - save_item(NAME(m_sound_irq)); - save_item(NAME(m_unknown_irq)); - save_item(NAME(m_agallet_vblank_irq)); -} - -void cave_z80_state::machine_start() -{ - cave_state::machine_start(); - - save_item(NAME(m_soundbuf_wptr)); - save_item(NAME(m_soundbuf_rptr)); - save_item(NAME(m_soundbuf_data)); - save_item(NAME(m_soundbuf_empty)); -} - -void ppsatan_state::machine_start() -{ - cave_state::machine_start(); - - m_ppsatan_io_mux = 0; - save_item(NAME(m_ppsatan_io_mux)); -} - -void cave_state::machine_reset() -{ - m_vblank_irq = 0; - m_sound_irq = 0; - m_unknown_irq = 0; - m_agallet_vblank_irq = 0; -} - -void cave_z80_state::machine_reset() -{ - cave_state::machine_reset(); - - std::fill(std::begin(m_soundbuf_data), std::end(m_soundbuf_data), 0); - m_soundbuf_wptr = 0; - m_soundbuf_rptr = 0; - m_soundbuf_empty = true; -} - -void cave_state::add_base_config(machine_config &config, int layer) -{ - M68000(config, m_maincpu, 16_MHz_XTAL); - m_maincpu->set_vblank_int("screen.0", FUNC(cave_state::interrupt)); - - TIMER(config, m_int_timer).configure_generic(FUNC(cave_state::vblank_start)); - - SCREEN(config, m_screen[0], SCREEN_TYPE_RASTER); - m_screen[0]->set_refresh_hz(15625/271.5); - m_screen[0]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen[0]->set_size(320, 240); - m_screen[0]->set_visarea(0, 320-1, 0, 240-1); - m_screen[0]->set_screen_update(FUNC(cave_state::screen_update)); - - PALETTE(config, m_palette[0], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x8000); - - GFXDECODE(config, m_spr_gfxdecode[0], m_palette[0], gfx_common_spr); - - for (int i = 0; i < layer; i++) - { - TMAP038(config, m_tilemap[i]); - m_tilemap[i]->set_gfxdecode_tag(m_gfxdecode[0]); - m_tilemap[i]->set_gfx(i); - } -} - -void cave_state::add_ymz(machine_config &config) -{ - // TODO: all PCB versions using mono, on a YMZ chip as well? Sounds very unlikely, verify on all flavours. - SPEAKER(config, "mono").front_center(); - - ymz280b_device &ymz(YMZ280B(config, "ymz", 16.9344_MHz_XTAL)); - ymz.irq_handler().set(FUNC(cave_state::sound_irq_gen)); - ymz.add_route(ALL_OUTPUTS, "mono", 1.0); -} - -/*************************************************************************** - Dangun Feveron -***************************************************************************/ - -void cave_state::dfeveron(machine_config &config) -{ - add_base_config(config, 2); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::dfeveron_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_dfeveron); - m_palette[0]->set_entries(0x1000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) - - /* sound hardware */ - add_ymz(config); -} - - -/*************************************************************************** - Dodonpachi -***************************************************************************/ - -void cave_state::ddonpach(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::ddonpach_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_spr_gfxdecode[0]->set_info(gfx_ddonpach_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ddonpach); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - add_ymz(config); -} - - -/*************************************************************************** - Donpachi -***************************************************************************/ - -void cave_state::donpachi(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::donpachi_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_spr_gfxdecode[0]->set_info(gfx_ddonpach_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); - m_palette[0]->set_entries(0x1000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - OKIM6295(config, m_oki[0], 4.224_MHz_XTAL/4, okim6295_device::PIN7_HIGH); // pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.60); - - OKIM6295(config, m_oki[1], 4.224_MHz_XTAL/2, okim6295_device::PIN7_HIGH); // pin 7 not verified - m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); - - nmk112_device &nmk112(NMK112(config, "nmk112", 0)); - nmk112.set_rom0_tag("oki1"); - nmk112.set_rom1_tag("oki2"); - nmk112.set_page_mask(1 << 0); // chip #0 (music) is not paged -} - - -/*************************************************************************** - Esprade -***************************************************************************/ - -void cave_state::esprade(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::esprade_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_spr_gfxdecode[0]->set_info(gfx_esprade_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - add_ymz(config); -} - - -/*************************************************************************** - Gaia Crusaders -***************************************************************************/ - -void cave_state::gaia(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::gaia_map); - - WATCHDOG_TIMER(config, "watchdog"); - - /* video hardware */ - m_screen[0]->set_visarea(0, 320-1, 0, 224-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - add_ymz(config); - - // Unlike other games also using ymz, gaia (and theroes) has 16MHz clock for it - subdevice("ymz")->set_clock(16_MHz_XTAL); -} - - -/*************************************************************************** - Guwange -***************************************************************************/ - -void cave_state::guwange(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::guwange_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_spr_gfxdecode[0]->set_info(gfx_esprade_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - add_ymz(config); -} - -/*************************************************************************** - Hotdog Storm -***************************************************************************/ - -void cave_z80_state::hotdogst(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_clock(32_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_map); - - Z80(config, m_audiocpu, 32_MHz_XTAL/8); - m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_sound_map); - m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::hotdogst_sound_portmap); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_size(384, 240); - m_screen[0]->set_visarea(0, 384-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_hotdogst); - m_palette[0]->set_entries(0x1000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_16(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - ym2203_device &ymsnd(YM2203(config, "ymsnd", 32_MHz_XTAL/8)); - ymsnd.irq_handler().set_inputline("audiocpu", 0); - ymsnd.add_route(0, "mono", 0.20); - ymsnd.add_route(1, "mono", 0.20); - ymsnd.add_route(2, "mono", 0.20); - ymsnd.add_route(3, "mono", 0.80); - - OKIM6295(config, m_oki[0], 32_MHz_XTAL/16, okim6295_device::PIN7_HIGH); // pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); - m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); -} - - -/*************************************************************************** - Koro Koro Quest -***************************************************************************/ - -void cave_state::korokoro(machine_config &config) -{ - add_base_config(config, 1); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::korokoro_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_visarea(0, 320-1-2, 0, 240-1-1); - - m_spr_gfxdecode[0]->set_info(gfx_korokoro_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_korokoro); - m_palette[0]->set_entries(0x8000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_4bpp) - - /* sound hardware */ - add_ymz(config); -} - -void cave_state::crusherm(machine_config &config) -{ - korokoro(config); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::crusherm_map); -} - - -/*************************************************************************** - Mazinger Z -***************************************************************************/ - -void cave_z80_state::mazinger(machine_config &config) -{ - add_base_config(config, 2); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::mazinger_map); - - Z80(config, m_audiocpu, 4_MHz_XTAL); // Bidirectional communication - m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::mazinger_sound_map); - m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::mazinger_sound_portmap); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_size(384, 240); - m_screen[0]->set_visarea(0, 384-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_mazinger); - m_palette[0]->set_entries(0x8000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_16(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - ym2203_device &ymsnd(YM2203(config, "ymsnd", 4_MHz_XTAL)); - ymsnd.irq_handler().set_inputline("audiocpu", 0); - ymsnd.add_route(0, "mono", 0.20); - ymsnd.add_route(1, "mono", 0.20); - ymsnd.add_route(2, "mono", 0.20); - ymsnd.add_route(3, "mono", 0.60); - - OKIM6295(config, m_oki[0], 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 2.0); - m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); -} - - -/*************************************************************************** - Metamoqester -***************************************************************************/ - -void cave_z80_state::metmqstr(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_clock(32_MHz_XTAL / 2); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::metmqstr_map); - - Z80(config, m_audiocpu, 32_MHz_XTAL / 4); - m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::hotdogst_sound_map); - m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::metmqstr_sound_portmap); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_size(0x200, 240); - m_screen[0]->set_visarea(0x7d, 0x7d + 0x180-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); - m_palette[0]->set_entries(0x1000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_16(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4)); - ymsnd.irq_handler().set_inputline(m_audiocpu, 0); - ymsnd.add_route(ALL_OUTPUTS, "mono", 0.6); - - OKIM6295(config, m_oki[0], 32_MHz_XTAL / 16, okim6295_device::PIN7_HIGH); - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5); - m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); - - OKIM6295(config, m_oki[1], 32_MHz_XTAL / 16, okim6295_device::PIN7_HIGH); - m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.5); - m_oki[1]->set_addrmap(0, &cave_z80_state::oki2_map); -} - - -/*************************************************************************** - Pac-Slot -***************************************************************************/ - -void cave_state::pacslot(machine_config &config) -{ - add_base_config(config, 1); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - /* basic machine hardware */ - m_maincpu->set_clock(28_MHz_XTAL / 2); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::pacslot_map); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); - - /* video hardware */ - m_screen[0]->set_size(0x200, 240); - m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); - - // oki2 chip is present but its rom socket is unpopulated - OKIM6295(config, m_oki[1], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); -} - -void cave_state::paceight(machine_config &config) -{ - pacslot(config); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::paceight_map); -} - -void cave_state::paccarn(machine_config &config) -{ - pacslot(config); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::paccarn_map); -} - -/*************************************************************************** - Poka Poka Satan -***************************************************************************/ - -TIMER_DEVICE_CALLBACK_MEMBER( cave_state::timer_lev2_cb ) -{ - m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE); // ppsatan: read touch screens -} - -void ppsatan_state::ppsatan(machine_config &config) -{ - add_base_config(config, 1); - - /* basic machine hardware */ - m_maincpu->set_vblank_int("screen.0", FUNC(ppsatan_state::interrupt_ppsatan)); - m_maincpu->set_addrmap(AS_PROGRAM, &ppsatan_state::ppsatan_map); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(1)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom); - - TIMER(config, "timer_lev2").configure_periodic(FUNC(ppsatan_state::timer_lev2_cb), attotime::from_hz(60)); - - /* video hardware */ - m_screen[0]->set_visarea(0, 320-1, 0, 224-1); - m_screen[0]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_top)); - subdevice("int_timer")->configure_generic(FUNC(ppsatan_state::vblank_start)); - - SCREEN(config, m_screen[1], SCREEN_TYPE_RASTER); - m_screen[1]->set_refresh_hz(15625/271.5); - m_screen[1]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen[1]->set_size(320, 240); - m_screen[1]->set_visarea(0, 320-1, 0, 224-1); - m_screen[1]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_left)); - TIMER(config, "int_timer_left").configure_generic(FUNC(ppsatan_state::vblank_start_left)); - - SCREEN(config, m_screen[2], SCREEN_TYPE_RASTER); - m_screen[2]->set_refresh_hz(15625/271.5); - m_screen[2]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen[2]->set_size(320, 240); - m_screen[2]->set_visarea(0, 320-1, 0, 224-1); - m_screen[2]->set_screen_update(FUNC(ppsatan_state::screen_update_ppsatan_right)); - TIMER(config, "int_timer_right").configure_generic(FUNC(ppsatan_state::vblank_start_right)); - - m_spr_gfxdecode[0]->set_info(gfx_korokoro_spr); - GFXDECODE(config, m_spr_gfxdecode[1], m_palette[1], gfx_ppsatan_spr_1); - GFXDECODE(config, m_spr_gfxdecode[2], m_palette[2], gfx_ppsatan_spr_2); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ppsatan_0); - GFXDECODE(config, m_gfxdecode[1], m_palette[1], gfx_ppsatan_1); - GFXDECODE(config, m_gfxdecode[2], m_palette[2], gfx_ppsatan_2); - - m_tilemap[0]->set_xoffs(2, 0); - - TMAP038(config, m_tilemap[1]); - m_tilemap[1]->set_gfxdecode_tag(m_gfxdecode[1]); - m_tilemap[1]->set_gfx(0); - m_tilemap[1]->set_xoffs(1, 0); - - TMAP038(config, m_tilemap[2]); - m_tilemap[2]->set_gfxdecode_tag(m_gfxdecode[2]); - m_tilemap[2]->set_gfx(0); - m_tilemap[2]->set_xoffs(0, -57); - - m_palette[0]->set_entries(0x9000/2); - PALETTE(config, m_palette[1], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); - PALETTE(config, m_palette[2], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); - - config.set_default_layout(layout_ppsatan); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - OKIM6295(config, m_oki[0], 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 2.0); -} - - -/*************************************************************************** - Power Instinct 2 -***************************************************************************/ - -/* X1 = 12 MHz, X2 = 28 MHz, X3 = 16 MHz. OKI: / 165 mode A ; / 132 mode B */ - -void cave_z80_state::pwrinst2(machine_config &config) -{ - add_base_config(config, 4); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::pwrinst2_map); - - Z80(config, m_audiocpu, 16_MHz_XTAL / 2); /* 8 MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::pwrinst2_sound_map); - m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::pwrinst2_sound_portmap); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_size(0x200, 240); - m_screen[0]->set_visarea(0x70, 0x70 + 0x140-1, 0, 240-1); - - m_spr_gfxdecode[0]->set_info(gfx_pwrinst2_spr); - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_pwrinst2); - m_palette[0]->set_entries(0x5000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_16(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - ym2203_device &ym2203(YM2203(config, "ymsnd", 16_MHz_XTAL / 4)); - ym2203.irq_handler().set_inputline("audiocpu", 0); - ym2203.add_route(0, "mono", 0.40); - ym2203.add_route(1, "mono", 0.40); - ym2203.add_route(2, "mono", 0.40); - ym2203.add_route(3, "mono", 0.80); - - OKIM6295(config, m_oki[0], 3_MHz_XTAL, okim6295_device::PIN7_LOW); - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.80); - - OKIM6295(config, m_oki[1], 3_MHz_XTAL, okim6295_device::PIN7_LOW); - m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.00); - - nmk112_device &nmk112(NMK112(config, "nmk112", 0)); - nmk112.set_rom0_tag("oki1"); - nmk112.set_rom1_tag("oki2"); -} - - -/*************************************************************************** - Sailor Moon / Air Gallet -***************************************************************************/ - -TIMER_DEVICE_CALLBACK_MEMBER( cave_z80_state::sailormn_startup ) -{ - m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); -} - -MACHINE_RESET_MEMBER(cave_z80_state,sailormn) -{ - cave_z80_state::machine_reset(); - m_startup->adjust(attotime::from_usec(1000), 0, attotime::zero); -} - -void cave_z80_state::sailormn(machine_config &config) -{ - add_base_config(config, 3); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_z80_state::sailormn_map); - - // could be a wachdog, but if it is then our watchdog address is incorrect as there are periods where the game doesn't write it. - TIMER(config, m_startup).configure_generic(FUNC(cave_z80_state::sailormn_startup)); - - Z80(config, m_audiocpu, 8_MHz_XTAL); // Bidirectional Communication - m_audiocpu->set_addrmap(AS_PROGRAM, &cave_z80_state::sailormn_sound_map); - m_audiocpu->set_addrmap(AS_IO, &cave_z80_state::sailormn_sound_portmap); - -// config.set_maximum_quantum(attotime::from_hz(600)); - - MCFG_MACHINE_RESET_OVERRIDE(cave_z80_state,sailormn) - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - m_screen[0]->set_size(320+1, 240); - m_screen[0]->set_visarea(0+1, 320+1-1, 0, 240-1); - - /* Layer 2 (8x8) needs to be handled differently */ - m_tilemap[2]->set_tile_callback(FUNC(cave_z80_state::sailormn_get_banked_code)); /* Layer 2 has 1 banked ROM */ - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_sailormn); // 4 bit sprites, 6 bit tiles - m_palette[0]->set_entries(0x4000/2); - - MCFG_VIDEO_START_OVERRIDE(cave_z80_state,spr_4bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_16(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4)); - ymsnd.irq_handler().set_inputline(m_audiocpu, 0); - ymsnd.add_route(ALL_OUTPUTS, "mono", 0.30); - - OKIM6295(config, m_oki[0], 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); - m_oki[0]->set_addrmap(0, &cave_z80_state::oki_map); - - OKIM6295(config, m_oki[1], 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0); - m_oki[1]->set_addrmap(0, &cave_z80_state::oki2_map); - - -} - - -/*************************************************************************** - Tekken Card World -***************************************************************************/ - -void cave_state::tekkencw(machine_config &config) -{ - add_base_config(config, 1); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - /* basic machine hardware */ - m_maincpu->set_clock(28_MHz_XTAL / 2); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tekkencw_map); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); - - /* video hardware */ - m_screen[0]->set_size(0x200, 240); - m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); - - // oki2 chip spot and rom socket are both unpopulated -} - -void cave_state::tekkenbs(machine_config &config) -{ - tekkencw(config); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tekkenbs_map); -} - - -/*************************************************************************** - Tobikose! Jumpman -***************************************************************************/ - -void cave_state::tjumpman(machine_config &config) -{ - add_base_config(config, 1); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - /* basic machine hardware */ - m_maincpu->set_clock(28_MHz_XTAL / 2); - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::tjumpman_map); - - WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */ - - EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); - - /* video hardware */ - m_screen[0]->set_size(0x200, 240); - m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - OKIM6295(config, m_oki[0], 28_MHz_XTAL / 28, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0); - - // oki2 chip spot and rom socket are both unpopulated -} - - -/*************************************************************************** - Uo Poko -***************************************************************************/ - -void cave_state::uopoko(machine_config &config) -{ - add_base_config(config, 1); - - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::uopoko_map); - - EEPROM_93C46_16BIT(config, m_eeprom); - - /* video hardware */ - GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - - MCFG_VIDEO_START_OVERRIDE(cave_state,spr_8bpp) - - /* sound hardware */ - add_ymz(config); -} - - -/*************************************************************************** - - - ROMs Loading - - -***************************************************************************/ - -void cave_state::unpack_sprites(int chip) -{ - gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); - m_sprite_gfx_mask[chip] = 1; - const u32 needed = gfx->elements() * gfx->height() * gfx->width(); - while (m_sprite_gfx_mask[chip] < needed) - { - m_sprite_gfx_mask[chip] <<= 1; - } - m_sprite_gfx[chip] = make_unique_clear(m_sprite_gfx_mask[chip]); - - u8 *dst = m_sprite_gfx[chip].get(); - for (int e = 0; e < gfx->elements(); e++) - { - const u8 *data = gfx->get_data(e); - for (int y = 0; y < gfx->height(); y++) - { - const u8 *datatmp = data; - for (int x = 0; x < gfx->width(); x++) - { - *dst++ = *datatmp++; - } - data += gfx->rowbytes(); - } - } - m_sprite_gfx_mask[chip]--; -} - - -/*************************************************************************** - - Air Gallet - -Banpresto -Runs on identical board to Sailor Moon (several sockets unpopulated) - -PCB: BP945A (overstamped with BP962A) -CPU: TMP68HC000P16 (68000, 64 pin DIP) -SND: Z84C0008PEC (Z80, 40 pin DIP), OKI M6295 x 2, YM2151, YM3012 -OSC: 28.000MHz, 16.000MHz -RAM: 62256 x 8, NEC 424260 x 2, 6264 x 5 - -Other Chips: -SGS Thomson ST93C46CB1 (EEPROM) -PALS (same as Sailor Moon, not dumped): - 18CV8 label SMBG - 18CV8 label SMZ80 - 18CV8 label SMCPU - GAL16V8 (located near BP962A.U47) - -GFX: 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 013 9346E7002 (240 pin PQFP) - -On PCB near JAMMA connector is a small push button to access test mode. - -ROMS: -BP962A.U9 27C040 Sound Program -BP962A.U45 27C240 Main Program -BP962A.U47 23C16000 Sound -BP962A.U48 23C16000 Sound -BP962A.U53 23C16000 GFX -BP962A.U54 23C16000 GFX -BP962A.U57 23C16000 GFX -BP962A.U65 23C16000 GFX -BP962A.U76 23C16000 GFX -BP962A.U77 23C16000 GFX - -***************************************************************************/ - -#define ROMS_AGALLET_COMMON \ - ROM_REGION( 0x80000, "audiocpu", 0 ) \ - ROM_LOAD( "bp962a.u9", 0x00000, 0x80000, CRC(06caddbe) SHA1(6a3cc50558ba19a31b21b7f3ec6c6e2846244ff1) ) \ - \ - ROM_REGION( 0x400000, "sprites0", 0 ) \ - ROM_LOAD( "bp962a.u76", 0x000000, 0x200000, CRC(858da439) SHA1(33a3d2a3ec3fa3364b00e1e43b405e5030a5b2a3) ) \ - ROM_LOAD( "bp962a.u77", 0x200000, 0x200000, CRC(ea2ba35e) SHA1(72487f21d44fe7be9a98068ce7f57a43c132945f) ) \ - \ - ROM_REGION( 0x100000, "layer0", 0 ) \ - ROM_LOAD( "bp962a.u53", 0x000000, 0x100000, CRC(fcd9a107) SHA1(169b94db8389e7d47d4d77f36907a62c30fea727) ) \ - ROM_CONTINUE( 0x000000, 0x100000 ) \ - \ - ROM_REGION( 0x200000, "layer1", 0 ) \ - ROM_LOAD( "bp962a.u54", 0x000000, 0x200000, CRC(0cfa3409) SHA1(17107e26762ef7e3b902fb29a6d7bc534a4d09aa) ) \ - \ - ROM_REGION( (1*0x200000)*2, "layer2", 0 ) \ - \ - ROM_LOAD( "bp962a.u57", 0x000000, 0x200000, CRC(6d608957) SHA1(15f6e8346f5f95eb229505b1b4666dabeb810ee8) ) \ - \ - ROM_LOAD( "bp962a.u65", 0x200000, 0x100000, CRC(135fcf9a) SHA1(2e8c89c2627bbdef160d96724d07883fb2fa1a57) ) \ - ROM_CONTINUE( 0x200000, 0x100000 ) \ - \ - ROM_REGION( 0x200000, "oki1", 0 ) \ - ROM_LOAD( "bp962a.u48", 0x000000, 0x200000, CRC(ae00a1ce) SHA1(5e8c74df0ac77efb3080406870856f958be14f79) ) \ - \ - ROM_REGION( 0x200000, "oki2", 0 ) \ - ROM_LOAD( "bp962a.u47", 0x000000, 0x200000, CRC(6d4e9737) SHA1(81c7ecdfc2d38d0b35e26745866f6672f566f936) ) - - -// these roms were dumped from a board set to Taiwanese region. -#define ROMS_AGALLET \ - ROM_REGION( 0x400000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "bp962a.u45", 0x000000, 0x080000, CRC(24815046) SHA1(f5eeae60b923ae850b335e7898a2760407631d8b) ) \ - ROMS_AGALLET_COMMON - -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( agallet ) - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_europe.nv", 0x0000, 0x0080, CRC(ec38bf65) SHA1(cb8d9eacc0cf55a0c6b187e6673e3354554314b5) ) -ROM_END - -ROM_START( agalletu ) - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_usa.nv", 0x0000, 0x0080, CRC(72e65056) SHA1(abf1a86df01064d9d5d8c418e8367817319ec335) ) -ROM_END - -ROM_START( agalletj ) - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_japan.nv", 0x0000, 0x0080, CRC(0753f547) SHA1(aabb987470406b8729894108bc4d050f7200917d) ) -ROM_END - -ROM_START( agalletk ) - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_korea.nv", 0x0000, 0x0080, CRC(7f41c253) SHA1(50793d4da0ad6eb590941d26a729a1cf4b3c25c2) ) -ROM_END - -ROM_START( agallett ) // the dumped board was this region - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_taiwan.nv", 0x0000, 0x0080, CRC(0af46742) SHA1(37b704c4c573b2aabd6f016e9e8dd458f95148f7) ) -ROM_END - -ROM_START( agalleth ) - ROMS_AGALLET - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_hongkong.nv", 0x0000, 0x0080, CRC(998d1a74) SHA1(13e7e27a18417949d49e97d521781fc0feeef792) ) -ROM_END - -// these roms were dumped from a board set to the Japanese region. -#define ROMS_AGALLETA \ - ROM_REGION( 0x400000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "u45", 0x000000, 0x080000, CRC(2cab18b0) SHA1(5e779b74d8520cb482697b5efba4746854e7c9fe) ) \ - ROMS_AGALLET_COMMON - -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( agalleta ) - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_europe.nv", 0x0000, 0x0080, CRC(ec38bf65) SHA1(cb8d9eacc0cf55a0c6b187e6673e3354554314b5) ) -ROM_END - -ROM_START( agalletau ) - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_usa.nv", 0x0000, 0x0080, CRC(72e65056) SHA1(abf1a86df01064d9d5d8c418e8367817319ec335) ) -ROM_END - -ROM_START( agalletaj ) // the dumped board was this region - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_japan.nv", 0x0000, 0x0080, CRC(0753f547) SHA1(aabb987470406b8729894108bc4d050f7200917d) ) -ROM_END - -ROM_START( agalletak ) - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_korea.nv", 0x0000, 0x0080, CRC(7f41c253) SHA1(50793d4da0ad6eb590941d26a729a1cf4b3c25c2) ) -ROM_END - -ROM_START( agalletat ) - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_taiwan.nv", 0x0000, 0x0080, CRC(0af46742) SHA1(37b704c4c573b2aabd6f016e9e8dd458f95148f7) ) -ROM_END - -ROM_START( agalletah ) - ROMS_AGALLETA - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "agallet_hongkong.nv", 0x0000, 0x0080, CRC(998d1a74) SHA1(13e7e27a18417949d49e97d521781fc0feeef792) ) -ROM_END - -/*************************************************************************** - - Fever SOS (International) / Dangun Feveron (Japan) - -Board: CV01 -OSC: 28.0, 16.0, 16.9 MHz - -***************************************************************************/ - -ROM_START( dfeveron ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "cv01-u34.bin", 0x000000, 0x080000, CRC(be87f19d) SHA1(595239245df3835cdf5a99a6c62480465558d8d3) ) - ROM_LOAD16_BYTE( "cv01-u33.bin", 0x000001, 0x080000, CRC(e53a7db3) SHA1(ddced29f78dc3cc89038757b6577ba2ba0d8b041) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "cv01-u25.bin", 0x000000, 0x400000, CRC(a6f6a95d) SHA1(e1eb45cb5d0e6163edfd9d830633b913fb53c6ca) ) - ROM_LOAD( "cv01-u26.bin", 0x400000, 0x400000, CRC(32edb62a) SHA1(3def74e1316b80cc25a8c3ac162cd7bcb8cc807c) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "cv01-u50.bin", 0x000000, 0x200000, CRC(7a344417) SHA1(828bd8f95d2fcc34407e17629ccafc904a4ea12d) ) - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "cv01-u49.bin", 0x000000, 0x200000, CRC(d21cdda7) SHA1(cace4650de580c3c4a037f1f5c32bfc1846b383c) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "cv01-u19.bin", 0x000000, 0x400000, CRC(5f5514da) SHA1(53f27364aee544572a82649c9ff29bacc642b732) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-dfeveron.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) -ROM_END - -/* - -Fever SOS - - The program code checks for 0x05 & 0x19 at the 17th & 18th byte in the EEPROM. Therefore - you cannot convert a Dangun Feveron over to a Fever SOS by changing the 2 program roms - -Jumper JP1: -INT Version - 2 & 3 -JAP Version - 1 & 2 - -However there are more differences: - -U4: -INT Version - 013 9838EX003 -JAP Version - 013 9807EX004 (The second set of numbers are manufacture day codes) - -UA2 & UB2: -INT Version - 038 9838WX001 -JAP Version - 038 9808WX003 (The second set of numbers are manufacture day codes) - -TA8030S (Beside SW1) -INT Version - NOT MOUNTED -JAP Version - TA8030S (WatchDog Timer, might be controlled by JP1) - -U47 & U48 - Differ -U38 & U37 - Differ - These chips are Static RAM - -It actually looks like the international version is older than -the Japanese version PCB wise, but the software date is 98/09/25 -and mine is 98/09/17! - -The famous full extent of the JAM is inside the image but so is -"full extent" of the LAW. There are also other version strings -inside the same image look here... - - NOTICE - THIS GAME IS FOR USE IN - KOREA ONLY - HONG KONG ONLY - TAIWAN ONLY - SOUTHEAST ASIA ONLY - EUROPE ONLY - U.S.A ONLY - JAPAN ONLY -SALES, EXPORT OR OPERATION -OUTSIDE THIS COUNTRY MAY BE -CONSTRUED AS COPYRIGHT AND -TRADEMARK INFRINGEMENT AND -IS STRICTLY PROHIBITED. -VIOLATOR AND SUBJECT TO -SEVERE PENALTIES AND WILL -BE PROSECUTED TO THE FULL -EXTENT OF THE JAM. - 98/09/10 VER. - -Look at the version date! - - NOTICE -THIS GAME MAY NOT BE SOLD, -EXPORTED OR OPERATED -WITHOUTPROOF OF LEGAL CONSENT -BY CAVE CO.,LTD. -VIOLATION OF THESE TERMS WILL -RESULT IN COPYRIGHT AND -TRADEMARK INFRINGEMENT,AND IS -STRICTLY PROHIBITED. -VIOLATORS ARE SUBJECT TO -SEVERE PENALTIES AND WILL BE -PROSECUTED TO THE FULL EXTENT -OF THE LAW GOVERNED BY THE -COUNTRY OF ORIGIN. - 98/09/25 VER - -This is from Fever SOS image! Both version strings are present! - -The PCB is also different, UD's PCB does not have the Cave logo and -the CV01 marker in the lower left corner of the PCB. - -There is some "engrish" story inside the UD image but this is NOT -present in the japanese images... - -*/ - -ROM_START( feversos ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "cv01-u34.sos", 0x000000, 0x080000, CRC(24ef3ce6) SHA1(42799eebbb2686a837b8972aec684143deadca59) ) - ROM_LOAD16_BYTE( "cv01-u33.sos", 0x000001, 0x080000, CRC(64ff73fd) SHA1(7fc3a8469cec2361d373a4dac4a547c13ca5f709) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "cv01-u25.bin", 0x000000, 0x400000, CRC(a6f6a95d) SHA1(e1eb45cb5d0e6163edfd9d830633b913fb53c6ca) ) - ROM_LOAD( "cv01-u26.bin", 0x400000, 0x400000, CRC(32edb62a) SHA1(3def74e1316b80cc25a8c3ac162cd7bcb8cc807c) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "cv01-u50.bin", 0x000000, 0x200000, CRC(7a344417) SHA1(828bd8f95d2fcc34407e17629ccafc904a4ea12d) ) - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "cv01-u49.bin", 0x000000, 0x200000, CRC(d21cdda7) SHA1(cace4650de580c3c4a037f1f5c32bfc1846b383c) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "cv01-u19.bin", 0x000000, 0x400000, CRC(5f5514da) SHA1(53f27364aee544572a82649c9ff29bacc642b732) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-feversos.bin", 0x0000, 0x0080, CRC(d80303aa) SHA1(8580f7c2223c72614516d800a98465e362c333ef) ) -ROM_END - -/*************************************************************************** - - Dodonpachi (Japan) - -PCB: AT-C03 D2 -CPU: MC68000-16 -Sound: YMZ280B -OSC: 28.0000MHz - 16.0000MHz - 16.9MHz (16.9344MHz?) - -***************************************************************************/ - -ROM_START( ddonpach ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "b1.u27", 0x000000, 0x080000, CRC(b5cdc8d3) SHA1(58757b50e21a27e500a82c03f62cf02a85389926) ) - ROM_LOAD16_BYTE( "b2.u26", 0x000001, 0x080000, CRC(6bbb063a) SHA1(e5de64b9c3efc0a38a2e0e16b78ee393bff63558) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) - ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) - - ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "u62.bin", 0x000000, 0x200000, CRC(292bfb6b) SHA1(11b385991ee990eb5ef36e136b988802b5f90fa4) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) - ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) -ROM_END - - -ROM_START( ddonpachj ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u27.bin", 0x000000, 0x080000, CRC(2432ff9b) SHA1(fbc826c30553f6553ead40b312b73c049e8f4bf6) ) - ROM_LOAD16_BYTE( "u26.bin", 0x000001, 0x080000, CRC(4f3a914a) SHA1(ae98eba049f1462aa1145f6959b9f9a32c97278f) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) - ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) - - ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "u62.bin", 0x000000, 0x200000, CRC(292bfb6b) SHA1(11b385991ee990eb5ef36e136b988802b5f90fa4) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) - ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) -ROM_END - - -ROM_START( ddonpacha ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "arrange_u27.bin", 0x000000, 0x080000, CRC(44b899ae) SHA1(798ec437d861b94fcd90c99a7015dd420887c788) ) - ROM_LOAD16_BYTE( "arrange_u26.bin", 0x000001, 0x080000, CRC(727a09a8) SHA1(91876386855f19e8a3d8d1df71dfe9b3d98e9ea9) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD16_WORD_SWAP( "arrange_u51.bin", 0x200000, 0x200000, CRC(0f3e5148) SHA1(3016f4d075940feae691389606cd2aa7ac53849e) ) - ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(d89b7631) SHA1(a66bb4955ca58fab8973ca37a0f971e9a67ce017) ) - - ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "arrange_u62.bin", 0x000000, 0x200000, CRC(42e4c6c5) SHA1(4d282f7592f5fc5e11839c57f39cae20b8422aa1) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "u6.bin", 0x000000, 0x200000, CRC(9dfdafaf) SHA1(f5cb450cdc78a20c3a74c6dac05c9ac3cba08327) ) - ROM_LOAD( "u7.bin", 0x200000, 0x200000, CRC(795b17d5) SHA1(cbfc29f1df9600c82e0fdae00edd00da5b73e14c) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-ddonpach.bin", 0x0000, 0x0080, CRC(2df16438) SHA1(4881b70589a97e2420feb6d6e6737273beeff303) ) -ROM_END - -/*************************************************************************** - - Donpachi - -Known versions: - -USA Version 1.12 1995/05/2x -Korea Version 1.12 1995/05/2x -Hong Kong Version 1.10 1995/05/17 -Japan Version 1.01 1995/05/11 - -BOARD #: AT-C01DP-2 -CPU: TMP68HC000-16 -VOICE: M6295 x2 -OSC: 28.000/16.000/4.220MHz -EEPROM: ATMEL 93C46 -CUSTOM: ATLUS 8647-01 013 - 038 9429WX727 x3 - NMK 112 (M6295 sample ROM banking) - ---------------------------------------------------- - filenames devices kind ---------------------------------------------------- - PRG.U29 27C4096 68000 main prg. - U58.BIN 27C020 gfx data - ATDP.U32 57C8200 M6295 data - ATDP.U33 57C16200 M6295 data - ATDP.U44 57C16200 gfx data - ATDP.U45 57C16200 gfx data - ATDP.U54 57C8200 gfx data - ATDP.U57 57C8200 gfx data - - USA Version ----------------------------------------------------- - prgu.U29 27C4002 68000 Main Program - text.u58 27C2001 Labeled as "TEXT" - -***************************************************************************/ - -ROM_START( donpachi ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "prgu.u29", 0x00000, 0x80000, CRC(89c36802) SHA1(7857c726cecca5a4fce282e0d2b873774d2c1b1d) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) - - ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ - ROM_LOAD( "text.u58", 0x000000, 0x040000, CRC(5dba06e7) SHA1(f9dab7f6c732a683fddb4cae090a875b3962332b) ) - - ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) - ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-donpachi.u10", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) /* ATMEL 93C46 */ - - ROM_REGION( 0x0155, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( donpachij ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "prg.u29", 0x00000, 0x80000, CRC(6be14af6) SHA1(5b1158071f160efeded816ae4c4edca1d00d6e05) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) - - ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ - ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) - - ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) - ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) - - ROM_REGION( 0x0155, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( donpachikr ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "prgk.u26", 0x00000, 0x80000, CRC(bbaf4c8b) SHA1(0f9d42c8c4c5b69e3d39bf768bc4b663f66b4f36) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) - - ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ - ROM_LOAD( "text.u58", 0x000000, 0x040000, CRC(5dba06e7) SHA1(f9dab7f6c732a683fddb4cae090a875b3962332b) ) - - ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) - ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) - - ROM_REGION( 0x0155, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( donpachihk ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "37.u29", 0x00000, 0x80000, CRC(71f39f30) SHA1(08a028208f21c073d450a29061604f27775786a8) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) - - ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ - ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) - - ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) - ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-donpachi.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) - - ROM_REGION( 0x0155, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ -ROM_END - -/* - When you press the 2p start button, it pauses the game (music still plays). - Pressing the 1p start button unpauses the game. - If you press both 1p start and 2p start at the same time, the game lets you play in slow motion (music still plays normally). - - This was on the label of the ROM chip: 国内撮影用 -*/ - -ROM_START( donpachijs ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "prg.u29", 0x00000, 0x80000, CRC(810dbd42) SHA1(703a5aec90b595a1c5a679ab165643119ba6b2f3) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atdp.u57", 0x000000, 0x100000, CRC(0a0e72b9) SHA1(997e8253777e7acca5a1c0c4026e78eecc122d5d) ) - - ROM_REGION( 0x040000, "layer2", 0 ) /* Text / Character Layer */ - ROM_LOAD( "u58.bin", 0x000000, 0x040000, CRC(285379ff) SHA1(b9552edcec29ddf4b552800b145c398b94117ab0) ) - - ROM_REGION( 0x240000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u33", 0x040000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION( 0x340000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "atdp.u32", 0x040000, 0x100000, CRC(0d89fcca) SHA1(e16ed15fa5e72537822f7b37e83ccfed0fa87338) ) - ROM_LOAD( "atdp.u33", 0x140000, 0x200000, CRC(d749de00) SHA1(64a0acc23eb2515e7d0459f0289919e083c63afc) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-donpachi.u10", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) /* ATMEL 93C46 */ - - ROM_REGION( 0x0155, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u18", 0x0000, 0x0155, CRC(3f4787e9) SHA1(fc7da25c9f36c9cbc6ba5a7314c4828d405d1261) ) /* PEEL18CV8P-15 */ -ROM_END - -/*************************************************************************** - - ESP Ra.De. - -ATC04 -OSC: 28.0, 16.0, 16.9 MHz - -***************************************************************************/ - -ROM_START( esprade ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u42.int", 0x000000, 0x080000, CRC(3b510a73) SHA1(ab1666eb826cb4a71588d86831dd18a2ef1c2a33) ) - ROM_LOAD16_BYTE( "u41.int", 0x000001, 0x080000, CRC(97c1b649) SHA1(37a56b7b9662219a356aee3f4b5cbb774ac4950e) ) - - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) - ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) - ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) - ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) - - ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) - ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) - - ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) - ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) -ROM_END - -ROM_START( espradej ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u42_ver.2", 0x000000, 0x080000, CRC(75d03c42) SHA1(1c176185b6f1531752b633a97f705ffa0cfeb5ad) ) - ROM_LOAD16_BYTE( "u41_ver.2", 0x000001, 0x080000, CRC(734b3ef0) SHA1(f584227b85c347d62d5f179445011ce0f607bcfd) ) - - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) - ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) - ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) - ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) - - ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) - ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) - - ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) - ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) -ROM_END - -ROM_START( espradejo ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u42.bin", 0x000000, 0x080000, CRC(0718c7e5) SHA1(c7d1f30bd2ef363cad15b6918f9980312a15809a) ) - ROM_LOAD16_BYTE( "u41.bin", 0x000001, 0x080000, CRC(def30539) SHA1(957ad0b06f06689ae71393572592f6b8f818603a) ) - - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD32_WORD_SWAP( "esp_u63.u63", 0x000000, 0x400000, CRC(2f2fe92c) SHA1(9519e365248bcec8419786eabb16fe4aae299af5) ) - ROM_LOAD32_WORD_SWAP( "esp_u64.u64", 0x000002, 0x400000, CRC(491a3da4) SHA1(53549a2bd3edc7b5e73fb46e1421b156bb0c190f) ) - ROM_LOAD32_WORD_SWAP( "esp_u65.u65", 0x800000, 0x400000, CRC(06563efe) SHA1(94e72da1f542b4e0525b4b43994242816b43dbdc) ) - ROM_LOAD32_WORD_SWAP( "esp_u66.u66", 0x800002, 0x400000, CRC(7bbe4cfc) SHA1(e77d0ed7a11b5abca1df8a0eb20ac9360cf79e76) ) - - ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "esp_u54.u54", 0x000000, 0x400000, CRC(e7ca6936) SHA1(b7f5ab67071a1d9dd3d2c1cd2304d9cdad68850c) ) - ROM_LOAD( "esp_u55.u55", 0x400000, 0x400000, CRC(f53bd94f) SHA1(d0a74fb3d36fe522ef075e5ae44a9980da8abe2f) ) - - ROM_REGION( 0x800000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "esp_u52.u52", 0x000000, 0x400000, CRC(e7abe7b4) SHA1(e98da45497e1aaf0d6ab352ec3e43c7438ed792a) ) - ROM_LOAD( "esp_u53.u53", 0x400000, 0x400000, CRC(51a0f391) SHA1(8b7355cbad119f4e1add14e5cd5e343ec6706104) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "esp_u51.u51", 0x000000, 0x400000, CRC(0b9b875c) SHA1(ef05447cd8565ae24bb71db42342724622ad1e3e) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "esp_u19.u19", 0x000000, 0x400000, CRC(f54b1cab) SHA1(34d70bb5798de85d892c062001d9ac1d6604fd9f) ) - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-esprade.bin", 0x0000, 0x0080, CRC(315fb546) SHA1(7f597107d1610fc286413e0e93c794c80c0c554f) ) -ROM_END - - -/*************************************************************************** - - Gaia Crusaders - -Noise Factory, 1999 - -PCB Layout ----------- - -|------------------------------------------------| -| YAC516 YMZ280B XC9536 68000 | -| 16MHz PRG2 PAL| -| TC51832 PRG1 | -| SND3 SND2 TC51832 28.322MHz | -| SND1 62256 16MHz | -| 62256 | -|J 62256 62256 62256 62256 62256 62256 | -|A KM416C256 | -|M KM416C256| -|M ------------------- --------------- | -|A | | | | | | 62256| -| | | | | | | | -| DSW1 | | | | |013 9918EX008| 62256| -| |038 9838WX003(x3)| | | | -| ------------------- --------------- | -| DSW2 | -| XC9536 OBJ2 | -| | -| BG2 BG3 BG1 OBJ1 | -| | -|------------------------------------------------| - -Notes: - 68000 clock : 16.000MHz - YMZ280B clock: 16.000MHz - VSync : 58Hz - HSync : 15.40kHz - -***************************************************************************/ - -ROM_START( gaia ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "prg1.127", 0x000000, 0x080000, CRC(47b904b2) SHA1(58b9b55f59cf00f70b690a0371096e86f4d723c2) ) - ROM_LOAD16_BYTE( "prg2.128", 0x000001, 0x080000, CRC(469b7794) SHA1(502f855c51005a866900b19c3a0a170d9ea02392) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD( "obj1.736", 0x000000, 0x400000, CRC(f4f84e5d) SHA1(8f445dd7a5c8a996939c211e5aec5742121a6e7e) ) - ROM_LOAD( "obj2.738", 0x400000, 0x400000, CRC(15c2a9ce) SHA1(631eb2968395be86ef2403733e7d4ec769a013b9) ) - - ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "bg1.989", 0x000000, 0x400000, CRC(013a693d) SHA1(2cc5be6f47c13febed942e1c3167946efedc5f9b) ) - - ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "bg2.995", 0x000000, 0x400000, CRC(783cc62f) SHA1(8b6e4212688b53be5ecc29ff2d41fd43e7d0a420) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "bg3.998", 0x000000, 0x400000, CRC(bcd61d1c) SHA1(660a3b02a8c39e1117b00d0ad06f73221fef4ce8) ) - - ROM_REGION( 0xc00000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "snd1.447", 0x000000, 0x400000, CRC(92770a52) SHA1(81f6835e1b45eb0f367e4586fdda92466f02edb9) ) - ROM_LOAD( "snd2.454", 0x400000, 0x400000, CRC(329ae1cf) SHA1(0c5e5074a5d8f4fb85ab4893bc953f192dcb301a) ) - ROM_LOAD( "snd3.455", 0x800000, 0x400000, CRC(4048d64e) SHA1(5e4ec6d37e70484e2fcd04188385e79ef0b53026) ) -ROM_END - -/* -Thunder Heroes -Primetek Investments Ltd. , 2001 - -A quasi-clone, remake or continuation of Gaia Crusaders but is clearly a different game. - -PCB Layout ----------- - -|------------------------------------------------------| -| 4558 YAC516 YMZ280B XILINX | -| 4558 16MHz XC9536 68000 PAL | -| SND2 | -| VOL SND3 TC51832 EPM0 | -| SND1 | -| TC51832 EPM1 | -| 58257 28.322MHz | -|J 58257 16MHz | -|A 58257 58257 58257 58257 58257 | -|M DSW1 58257 M514260 M514260 | -|M | -|A DSW2 |------| |------| |------| |--------|58257 | -| | 038 | | 038 | | 038 | | 013 | | -| | | | | | | | |58257 | -| |------| |------| |------| | | | -| |--------| | -| XILINX OBJ2 | -| XC9536 | -| BG2 BG3 BG1 OBJ1 | -|------------------------------------------------------| -Notes: - 68000 clock 16.00MHz - YMZ280B clock 16.000MHz - HSync 15.4kHz - VSync 58Hz - 038/013 = Same video chips used on some Banpresto games -*/ - -ROM_START( theroes ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "t-hero-epm1.u0127", 0x000000, 0x080000, CRC(09db7195) SHA1(6aa5aa80e3b74e405ed8f1b9b801ce4367756986) ) - ROM_LOAD16_BYTE( "t-hero-epm0.u0129", 0x000001, 0x080000, CRC(2d4e3310) SHA1(7c3284a2adc7943db50933a209d037422f87f80b) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD( "t-hero-obj1.u0736", 0x000000, 0x400000, CRC(35090f7c) SHA1(035e6c12a87d9c7241eea34fc7e2170bec842acc) ) - ROM_LOAD( "t-hero-obj2.u0738", 0x400000, 0x400000, CRC(71605108) SHA1(6070c26d8f22fafc81d97cacfef96ae652e355d0) ) - - ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "t-hero-bg1.u0999", 0x000000, 0x400000, CRC(47b0fb40) SHA1(a7217b3d805b4255c589821cdadd9b190cada525) ) - - ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "t-hero-bg2.u0995", 0x000000, 0x400000, CRC(b16237a1) SHA1(66aed2c5036492a17d20de90333e172a6f117851) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "t-hero-bg3.u0998", 0x000000, 0x400000, CRC(08eb5604) SHA1(3d32966708c73198272c40e6ddc680bf4c7919eb) ) - - ROM_REGION( 0xc00000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "crvsaders-snd1.u0447", 0x000000, 0x400000, CRC(92770a52) SHA1(81f6835e1b45eb0f367e4586fdda92466f02edb9) ) - ROM_LOAD( "crvsaders-snd2.u0454", 0x400000, 0x400000, CRC(329ae1cf) SHA1(0c5e5074a5d8f4fb85ab4893bc953f192dcb301a) ) - ROM_LOAD( "t-hero-snd3.u0455", 0x800000, 0x400000, CRC(52b0b2c0) SHA1(6e96698905391c21a4fedd60e2768734b58add4e) ) -ROM_END - - -/*************************************************************************** - - Guwange (Japan) - -PCB: ATC05 -CPU: MC68000-16 -Sound: YMZ280B -OSC: 28.0000MHz - 16.0000MHz - 16.9MHz - -***************************************************************************/ - -ROM_START( guwange ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "gu-u0127.bin", 0x000000, 0x080000, CRC(f86b5293) SHA1(f8b1cd77cc25328d5010889850e4b86c27d9e396) ) - ROM_LOAD16_BYTE( "gu-u0129.bin", 0x000001, 0x080000, CRC(6c0e3b93) SHA1(aaad6569b9a7b6f9a315062f9fedfc95851c1bc6) ) - - ROM_REGION( 0x2000000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD32_WORD_SWAP( "u083.bin", 0x0000000, 0x800000, CRC(adc4b9c4) SHA1(3f9fb004e19187bbfa87ddfe8cfc69740656a1bd) ) - ROM_LOAD32_WORD_SWAP( "u082.bin", 0x0000002, 0x800000, CRC(3d75876c) SHA1(705b8c2dbdc31e9516f429969f87988beec796d7) ) - ROM_LOAD32_WORD_SWAP( "u086.bin", 0x1000000, 0x400000, CRC(188e4f81) SHA1(626074d81782a6de0b52406331b4b8561d3e36f5) ) - ROM_RELOAD( 0x1800000, 0x400000 ) - ROM_LOAD32_WORD_SWAP( "u085.bin", 0x1000002, 0x400000, CRC(a7d5659e) SHA1(10abac022ebe106a3ca7186ff18ca2757f903033) ) - ROM_RELOAD( 0x1800002, 0x400000 ) -// sprite bug fix? -// ROM_FILL( 0x1800000, 0x800000, 0xff ) - - ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "u101.bin", 0x000000, 0x800000, CRC(0369491f) SHA1(ca6b1345506f13a17c9bace01637d1f61a278644) ) - - ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "u10102.bin", 0x000000, 0x400000, CRC(e28d6855) SHA1(7001a6e298c6a1fcceb79586bf5f4bf0f30027f6) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "u10103.bin", 0x000000, 0x400000, CRC(0fe91b8e) SHA1(8b71ebeef5e4d2b00fdaaab97776d74e1c96dc59) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "u0462.bin", 0x000000, 0x400000, CRC(b3d75691) SHA1(71d8dae92be1542a3cff50efeec0bf3c14ab59f5) ) - - ROM_REGION( 0x0004, "plds", 0 ) - ROM_LOAD( "atc05-1.bin", 0x0000, 0x0001, NO_DUMP ) /* GAL16V8D-15LP located at U159 */ - ROM_LOAD( "u0259.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U0249. (Chip label different then label silk screened onto the board.) */ - ROM_LOAD( "u108.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U108. */ - ROM_LOAD( "u084.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U084. */ - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-guwange.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) -ROM_END - -ROM_START( guwanges ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "gu-u0127b.bin", 0x000000, 0x080000, CRC(64667d2e) SHA1(a5893eb38e309e2bced4a46559f02850ab39afe7) ) - ROM_LOAD16_BYTE( "gu-u0129b.bin", 0x000001, 0x080000, CRC(a99c6b6c) SHA1(614a3cd1de9b325f73e461eaf250ff9cf773f4a5) ) - - ROM_REGION( 0x2000000, "sprites0", 0 ) /* Sprites */ - ROM_LOAD32_WORD_SWAP( "u083.bin", 0x0000000, 0x800000, CRC(adc4b9c4) SHA1(3f9fb004e19187bbfa87ddfe8cfc69740656a1bd) ) - ROM_LOAD32_WORD_SWAP( "u082.bin", 0x0000002, 0x800000, CRC(3d75876c) SHA1(705b8c2dbdc31e9516f429969f87988beec796d7) ) - ROM_LOAD32_WORD_SWAP( "u086.bin", 0x1000000, 0x400000, CRC(188e4f81) SHA1(626074d81782a6de0b52406331b4b8561d3e36f5) ) - ROM_RELOAD( 0x1800000, 0x400000 ) - ROM_LOAD32_WORD_SWAP( "u085.bin", 0x1000002, 0x400000, CRC(a7d5659e) SHA1(10abac022ebe106a3ca7186ff18ca2757f903033) ) - ROM_RELOAD( 0x1800002, 0x400000 ) -// sprite bug fix? -// ROM_FILL( 0x1800000, 0x800000, 0xff ) - - ROM_REGION( 0x800000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "u101.bin", 0x000000, 0x800000, CRC(0369491f) SHA1(ca6b1345506f13a17c9bace01637d1f61a278644) ) - - ROM_REGION( 0x400000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "u10102.bin", 0x000000, 0x400000, CRC(e28d6855) SHA1(7001a6e298c6a1fcceb79586bf5f4bf0f30027f6) ) - - ROM_REGION( 0x400000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "u10103.bin", 0x000000, 0x400000, CRC(0fe91b8e) SHA1(8b71ebeef5e4d2b00fdaaab97776d74e1c96dc59) ) - - ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "u0462.bin", 0x000000, 0x400000, CRC(b3d75691) SHA1(71d8dae92be1542a3cff50efeec0bf3c14ab59f5) ) - - ROM_REGION( 0x0004, "plds", 0 ) - ROM_LOAD( "atc05-1.bin", 0x0000, 0x0001, NO_DUMP ) /* GAL16V8D-15LP located at U159 */ - ROM_LOAD( "u0259.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U0249. (Chip label different then label silk screened onto the board.) */ - ROM_LOAD( "u108.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U108. */ - ROM_LOAD( "u084.bin", 0x0000, 0x0001, NO_DUMP ) /* XC9536-15PC44C Located at U084. */ - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-guwange.bin", 0x0000, 0x0080, CRC(c3174959) SHA1(29b5c94722756481e4f84bfd75dee15fdb5c8cf7) ) -ROM_END - - -/*************************************************************************** - -Hotdog Storm -Marble 1996 - -+------------------------------------------------------+ -| 6295 MP1 MP2 6264 6264 LED 68257 | -| GAL 68257 68257 | -| VOL Y3014 Z80 +--------+ | -|LA4460N YM2203 | | 9 8 | -| | 013 | P P | -| | | M M | -| 68257 +--------+ | -| 68000P12 68257 | -|J | -|A 93C46 MP3 +------+ +------+ +------+ | -|M MP4 | 038 | | 038 | | 038 | | -|M | | | | | | | -|A +------+ +------+ +------+ | -| | -| 4 4 4 4 4 4 | -| 6264 5 6 6 6 6 6 7 6 6 | -| P1 P2 6264 P 2 2 P 2 2 P 2 2 | -| 32MHz M 6 6 M 6 6 M 6 6 | -+------------------------------------------------------+ - -BOARD #: ASCT9501 -CPU: MC68HC00P12, Z0840006PSC -Sound: M6295, YM2203C + Y3014B - LA4460N Sanyo High Gain 51dB, 12W AF Power Amplifier -OSC: 32.000MHz -EEPROM: ATMEL 93C46 -CUSTOM: 038 9341EX702 x3 - 013 ????? -P1 & P2 Pushbuttons for Reset & Service -VOL Volume pot -LED Power indicator LED - -Have seen bootleg boards without the standard JAMMA "key" slot and with a -small daughter card that splits MP8 & MP9 into two roms each: -+-------------+ -| 8 9 8 9 ::| -| P P P P ::| -| M M M M ::| -+-------------+ - -***************************************************************************/ - -ROM_START( hotdogst ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "mp3.u29", 0x00000, 0x80000, CRC(1f4e5479) SHA1(5c3d7b36b1eda4c87c53e4f7cf89951cc5bcc871) ) - ROM_LOAD16_BYTE( "mp4.u28", 0x00001, 0x80000, CRC(6f1c3c4b) SHA1(ab4e4d9b2ef74a2eefda718e120bef05fd0346ff) ) - - ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "mp2.u19", 0x00000, 0x40000, CRC(ff979ebe) SHA1(4cb80086cfdc69a321c7f75455cef89e20488b76) ) // FIRST AND SECOND HALF IDENTICAL - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "mp9.u55", 0x000000, 0x200000, CRC(258d49ec) SHA1(f39e30c82d8f680f248e1eb59d7c5acb479fa277) ) - ROM_LOAD( "mp8.u54", 0x200000, 0x200000, CRC(bdb4d7b8) SHA1(0dd490988aa84b0e9a21ade5fd606b03eca13f6c) ) - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "mp7.u56", 0x00000, 0x80000, CRC(87c21c50) SHA1(fc0eea79abdd96edb4fa2c7047aaa728ef838234) ) - - ROM_REGION( 0x80000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "mp6.u61", 0x00000, 0x80000, CRC(4dafb288) SHA1(4756259adfe49ba42cde25e7902655b0f0731a6c) ) - - ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "mp5.u64", 0x00000, 0x80000, CRC(9b26458c) SHA1(acef62422fa3f92e6ca1eba0ee6fb914cd1ee190) ) - - ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ - ROM_LOAD( "mp1.u65", 0x00000, 0x80000, CRC(4868be1b) SHA1(32b8234b19fdbe07fa5057fa7965e36807e35e77) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF, 4 x 0x20000 - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-hotdogst.u14", 0x0000, 0x0080, CRC(12b4f934) SHA1(5b28d8fbd78869db78ce49e541a9d65558841966) ) -ROM_END - - -/*************************************************************************** - -Koro Koro Quest -Takumi, 1999 - -Hardware is kind of Banpresto-ish - -TUG-01B -MP-001 -|--------------------------------------------------| -| NJM4560 ROM.U0130 | -| 68000 | -| | -| YAC516 16MHz PAL | -| PAL | -| PAL PAL | -|M 62256 3V_BATT | -|A 93C46 62256 | -|H | -|J 28MHz |---------| | -|O |------| | 013 | | -|N | 038 | | 9838E | M5M44260 | -|G | 9838W| 62256 | X004 | M5M44260 | -|5 | X004 | 62256 | | | -|6 |------| |---------| | -| YMZ280B 62256 | -| 16.9344MHz 62256 | -| | -| PAL | -| | -|ROM.U1186 X | -| | -| X ROM.U1060 ROM.U1051 ROM.U1066 | -|--------------------------------------------------| - - PCB Number - TUG-01B MP001-00175 - 68000-16 + 16MHZ OSC - YMZ280B + YAC516-M + Xtal 16.9344MHz - 93C46 EEPROM - Custom - 013 9838EX004 (QFP240), 038 9838WX004 (QFP144) + OSC 28MHz - RAM - 62256 (x8), M5M44260 (x2) - 3volt battery - GAL16V8H (x5) - -***************************************************************************/ - -ROM_START( korokoro ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_WORD_SWAP( "mp-001_ver07.u0130", 0x000000, 0x080000, CRC(86c7241f) SHA1(c9f0ab63c4fe36df1300445e9bb0d5c6a1bb733f) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF - - ROM_REGION( 0x180000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "mp-001_ver01.u1066", 0x000000, 0x100000, CRC(c5c6af7e) SHA1(13ac26fd703672a01d629be4e5efe9fb8720a4fb) ) - ROM_LOAD( "mp-001_ver01.u1051", 0x100000, 0x080000, CRC(fe5e28e8) SHA1(44da1a7d813b149f9bae351bbcbd0bc2d4c70e10) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "mp-001_ver01.u1060", 0x000000, 0x100000, CRC(ec9cf9d8) SHA1(32fa7120e30c14e484de3b3a9c93efe3654d43c8) ) - - ROM_REGION( 0x100000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "mp-001_ver01.u1186", 0x000000, 0x100000, CRC(d16e7c5d) SHA1(1f825ace3ed2e23c8d3212320c4645d3d52214c7) ) -ROM_END - -ROM_START( crusherm ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_WORD_SWAP( "mp-003ver01.u0130", 0x000000, 0x080000, CRC(a4f56e6b) SHA1(1d3af7602c48a6b6c76c376dbc8ad3823b56868a) ) - - ROM_REGION( 0x200000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "mp-003ver01.u1067", 0x000000, 0x100000, CRC(268a4921) SHA1(8bb818466616051af01680b381af53b8b6a18428) ) - ROM_LOAD( "mp-003ver01.u1066", 0x100000, 0x100000, CRC(79e77a6e) SHA1(9d03dd083769851d628ba6b3d77cfde9603e74f4) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "mp-003ver01.u1060", 0x000000, 0x100000, CRC(7661893e) SHA1(d51645c96247b039214393ba5eae7357144dfd65) ) - - ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "mp-003ver01.u1186", 0x000000, 0x100000, CRC(c3aeb745) SHA1(1bb8ab0512a9a9b0d3ce15f90b49cda431fb14eb) ) - ROM_LOAD( "mp-003ver01.u1187", 0x100000, 0x100000, CRC(d9312497) SHA1(a349cfdbcad96701a74f06394e87f0e0614e115d) ) -ROM_END - -/*************************************************************************** - - Mazinger Z - -Banpresto 1994 - -U63 038 62256 - 9335EX706 62256 -3664 62256 62256 -3664 U924 32MHz - U24 -U60 038 68000 - 9335EX706 -3664 U21 YM2203 92E422 -3664 Z80 - 3664 - 013 - 9341E7009 -U56 -U55 - -62256 62256 514260 514260 U64 M6295 - -***************************************************************************/ - -#define ROMS_MAZINGER \ - ROM_REGION( 0x80000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "mzp-0.u24", 0x00000, 0x80000, CRC(43a4279f) SHA1(2c17eb31040bb7f1554bc1c9a968eec5e72af097) ) \ - \ - ROM_REGION16_BE( 0x80000, "user1", 0 ) \ - ROM_LOAD16_WORD_SWAP( "mzp-1.924", 0x00000, 0x80000, CRC(db40acba) SHA1(797a3046b6ab33773c5c4d6bb6d045ea60c1eb45) ) \ - \ - ROM_REGION( 0x20000, "audiocpu", 0 ) \ - ROM_LOAD( "mzs.u21", 0x00000, 0x20000, CRC(c5b4f7ed) SHA1(01f3cd1dd4045029260544e0e1c15dd08817012e) ) \ - \ - ROM_REGION( 0x400000, "sprites0", ROMREGION_ERASEFF ) \ - ROM_LOAD( "bp943a-2.u56", 0x000000, 0x200000, CRC(97e13959) SHA1(c30b1093aacebafefcae701af767dd36fc55fac7) ) \ - ROM_LOAD( "bp943a-3.u55", 0x200000, 0x080000, CRC(9c4957dd) SHA1(e775605a01b6cadc318855ac046dad03c4fc5bb4) ) \ - \ - ROM_REGION( 0x200000, "layer0", 0 ) \ - ROM_LOAD( "bp943a-1.u60", 0x000000, 0x200000, CRC(46327415) SHA1(679d26caefa975569198fac550105c370e2be00d) ) \ - \ - ROM_REGION( 0x200000, "layer1", 0 ) \ - ROM_LOAD( "bp943a-0.u63", 0x000000, 0x200000, CRC(c1fed98a) SHA1(c276505f80a49b129862966a19db507f97153e45) ) \ - \ - ROM_REGION( 0x080000, "oki1", 0 ) \ - ROM_LOAD( "bp943a-4.u64", 0x000000, 0x080000, CRC(3fc7f29a) SHA1(feb21b918243c0a03dfa4a80cc80b86be4f62680) ) - -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( mazinger ) - ROMS_MAZINGER - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "mazinger_world.nv", 0x0000, 0x0080, CRC(4f6225c6) SHA1(ed8e1c3ca9b961778cd317deb0dd8a0143eaab4f) ) -ROM_END - -ROM_START( mazingerj ) - ROMS_MAZINGER - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "mazinger_japan.nv", 0x0000, 0x0080, CRC(f84a2a45) SHA1(2e8ad10994bba9a3952889ed0ec3bcaca9b41d03) ) -ROM_END - -/*************************************************************************** - - Metamoqester (World) / Oni - The Ninja Master (Japan) - -(C) 1995 Banpresto - -PCB: BP947A -CPU: MC68HC000P16 (68000, 64 pin DIP) -SND: Z0840008PSC (Z80, 40 pin DIP), AD-65 x 2 (= OKI M6295), YM2151, CY5002 (= YM3012) -OSC: 32.000 MHz -RAM: LGS GM76C88ALFW-15 x 9 (28 pin SOP), LGS GM71C4260AJ70 x 2 (40 pin SOJ) - Hitachi HM62256LFP-12T x 2 (40 pin SOJ) - -Other Chips: -AT93C46 (EEPROM) -PAL (not dumped, located near 68000): ATF16V8 x 1 - -GFX: (Same GFX chips as "Sailor Moon") - - 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 013 9346E7002 (240 pin PQFP) - -On PCB near JAMMA connector is a small push button labelled SW1 to access test mode. - -ROMS: -BP947A.U37 16M Mask \ Oki Samples -BP947A.U42 16M Mask / - -BP947A.U46 16M Mask \ -BP947A.U47 16M Mask | -BP947A.U48 16M Mask | -BP947A.U49 16M Mask | GFX -BP947A.U50 16M Mask | -BP947A.U51 16M Mask | -BP947A.U52 16M Mask / - -BP947A.U20 27C020 Sound PRG - -BP947A.U25 27C240 \ -BP947A.U28 27C240 | Main PRG -BP947A.U29 27C240 / - -***************************************************************************/ - -ROM_START( metmqstr ) - ROM_REGION( 0x280000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "bp947a.u25", 0x000000, 0x80000, CRC(0a5c3442) SHA1(684b79912dedc103f45c42fdebf9983e091b1308) ) - ROM_LOAD16_WORD_SWAP( "bp947a.u28", 0x100000, 0x80000, CRC(8c55decf) SHA1(76c6ce4c8e621273258d31ceb9ec4442fcf1a393) ) - ROM_LOAD16_WORD_SWAP( "bp947a.u29", 0x200000, 0x80000, CRC(cf0f3f3b) SHA1(49a3c0e7536edd53bbf09353e43e9166d736b3f4) ) - - ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "bp947a.u20", 0x00000, 0x40000, CRC(a4a36170) SHA1(ae55094518bd968ea0d04613a133c1421e412012) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "bp947a.u49", 0x000000, 0x200000, CRC(09749531) SHA1(6deeed2712241611ec3202c49a66beed28698af8) ) - ROM_LOAD( "bp947a.u50", 0x200000, 0x200000, CRC(19cea8b2) SHA1(87fb29458074f0e4852237e0184b8b3b44b0eb29) ) - ROM_LOAD( "bp947a.u51", 0x400000, 0x200000, CRC(c19bed67) SHA1(ac664a15512c0e8c8b701833aede95f53cd46a45) ) - ROM_LOAD( "bp947a.u52", 0x600000, 0x200000, CRC(70c64875) SHA1(1c20ab100ccfdf42c97a25e4deb9041b83f5ca8d) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "bp947a.u48", 0x000000, 0x100000, CRC(04ff6a3d) SHA1(7187db436f7a2ab59a3f5c6ab297b3d740e20f1d) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "bp947a.u47", 0x000000, 0x100000, CRC(0de42827) SHA1(05d452ca11a31f941cb8a9b0cbb0b59c6b0cbdcb) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "bp947a.u46", 0x000000, 0x100000, CRC(0f9c906e) SHA1(03872e8be28637df66373bddb04ed91de4f9db75) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "bp947a.u42", 0x000000, 0x100000, CRC(2ce8ff2a) SHA1(8ef8c5b7d4a0e60c980c2962e75f7977faafa311) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - ROM_LOAD( "bp947a.u37", 0x000000, 0x100000, CRC(c3077c8f) SHA1(0a76316a81b7de78279b859549eb5161a721ac71) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) -ROM_END - -ROM_START( nmaster ) - ROM_REGION( 0x280000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "bp947a_n.u25",0x000000, 0x80000, CRC(748cc514) SHA1(11d882e77a539407c314f087386e50d691a6bc0b) ) - ROM_LOAD16_WORD_SWAP( "bp947a.u28" , 0x100000, 0x80000, CRC(8c55decf) SHA1(76c6ce4c8e621273258d31ceb9ec4442fcf1a393) ) - ROM_LOAD16_WORD_SWAP( "bp947a.u29", 0x200000, 0x80000, CRC(cf0f3f3b) SHA1(49a3c0e7536edd53bbf09353e43e9166d736b3f4) ) - - ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "bp947a.u20", 0x00000, 0x40000, CRC(a4a36170) SHA1(ae55094518bd968ea0d04613a133c1421e412012) ) - - ROM_REGION( 0x800000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "bp947a.u49", 0x000000, 0x200000, CRC(09749531) SHA1(6deeed2712241611ec3202c49a66beed28698af8) ) - ROM_LOAD( "bp947a.u50", 0x200000, 0x200000, CRC(19cea8b2) SHA1(87fb29458074f0e4852237e0184b8b3b44b0eb29) ) - ROM_LOAD( "bp947a.u51", 0x400000, 0x200000, CRC(c19bed67) SHA1(ac664a15512c0e8c8b701833aede95f53cd46a45) ) - ROM_LOAD( "bp947a.u52", 0x600000, 0x200000, CRC(70c64875) SHA1(1c20ab100ccfdf42c97a25e4deb9041b83f5ca8d) ) - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "bp947a.u48", 0x000000, 0x100000, CRC(04ff6a3d) SHA1(7187db436f7a2ab59a3f5c6ab297b3d740e20f1d) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "bp947a.u47", 0x000000, 0x100000, CRC(0de42827) SHA1(05d452ca11a31f941cb8a9b0cbb0b59c6b0cbdcb) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "bp947a.u46", 0x000000, 0x100000, CRC(0f9c906e) SHA1(03872e8be28637df66373bddb04ed91de4f9db75) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "bp947a.u42", 0x000000, 0x100000, CRC(2ce8ff2a) SHA1(8ef8c5b7d4a0e60c980c2962e75f7977faafa311) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) - - ROM_REGION( 0x100000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - ROM_LOAD( "bp947a.u37", 0x000000, 0x100000, CRC(c3077c8f) SHA1(0a76316a81b7de78279b859549eb5161a721ac71) ) // FIRST AND SECOND HALF IDENTICAL - ROM_CONTINUE( 0x000000, 0x100000 ) -ROM_END - - -/*************************************************************************** - - Pac-Slot by Namco, 1996 (according to http://pacman.com/ja/museum/index.html) - Namco N-44 EM VIDEO platform, PCB A0442 - - TMP 68HC000P-16 - - 013 9345E7006 - 038 9444WX010 - - OKI M6295 x 2 - - Battery - 93C46 EEPROM (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( pacslot ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "pa1-mprob.u41", 0x00000, 0x80000, CRC(56281370) SHA1(b75a7c5997adac14486cef7be4e41d113c86021f) ) - - ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "pa1-obj0.u52", 0x00000, 0x80000, CRC(bf9232ce) SHA1(9a887a964e9a75e16c59dcf217c664404e74cc2a) ) - ROM_LOAD16_BYTE( "pa1-obj1.u53", 0x00001, 0x80000, CRC(6eb76a04) SHA1(66c8e36bee4439c203a02b30898e4f741205d681) ) - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD16_BYTE( "pa1-cha0.u60", 0x00000, 0x40000, CRC(314b51a6) SHA1(eef102c4f0c0e0f668a7cf228cd4fbe45b2ce45f) ) - ROM_LOAD16_BYTE( "pa1-cha1.u61", 0x00001, 0x40000, CRC(f7a2c846) SHA1(3b505a7a3c7f30e6cd87803f5ae7e962205fc1f0) ) - - ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "pa1-voi0.u27", 0x00000, 0x40000, CRC(e3e623e1) SHA1(396accc7f7384277b700f019b5083def8a48ccd7) ) - - ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) /* OKIM6295 #2 Samples */ - // empty ROM socket - - ROM_REGION( 0x117 * 3, "plds", 0 ) - ROM_LOAD( "n44u1a.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8B-15LP (Protected) - ROM_LOAD( "n44u3a.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8B-15LP (Protected) - ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, CRC(3c5e9bc5) SHA1(b4e04c4fa91ff33542b73971f67e71d13e24c5ec) ) // GAL16V8B-15LP (Protected, dumped from the paceight PCB) -ROM_END - - -/*************************************************************************** - - Pac-Eight by Namco, 1996 (according to http://pacman.com/ja/museum/index.html) - Namco N-44 EM VIDEO platform, PCB C0348 - - TMP 68HC000P-16 - - 013 9341E7002 - 038 9635WY003 - - OKI M6295 x 2 - - Battery - 93C46 EEPROM (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( paceight ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "pae1-mpro.u41", 0x00000, 0x80000, CRC(bb026f97) SHA1(70d48f05275c64b25f37f03206219ef3ee9c0ee2) ) // 27c240 - - ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "pae1-obj0.u52", 0x00000, 0x80000, CRC(2cd99155) SHA1(146ed2b3f2763232a60e6b238a16067d3ccfa959) ) // 27c040 - ROM_LOAD16_BYTE( "pae1-obj1.u53", 0x00001, 0x80000, CRC(9ae2685b) SHA1(5eed5f00d28d803358c8ffaf42c4979af23a0a8c) ) // "" - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD16_BYTE( "pae1-cha0.u60", 0x00000, 0x40000, CRC(757263e3) SHA1(668060e9e209752474f48362752a3f819ff82d72) ) // 27c020? not readable - ROM_LOAD16_BYTE( "pae1-cha1.u61", 0x00001, 0x40000, CRC(0396d241) SHA1(79382805fa4486d8dae792f9afc0f02aee1bbb33) ) // "" - - ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "pae1-vo10.u27", 0x00000, 0x40000, CRC(0be7b94f) SHA1(4179e2ab2d2d1df0cc6cfd71e277ea114578f147) ) // 27c? not readable - - ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) /* OKIM6295 #2 Samples */ - // empty ROM socket - - ROM_REGION( 0x117 * 3, "plds", 0 ) - ROM_LOAD( "n44u1c.u1", 0x117*0, 0x117, CRC(903fc2d8) SHA1(becbae356efde873225ef64af462d9702aac03f0) ) // GAL16V8B-15LP - ROM_LOAD( "n44u3c.u3", 0x117*1, 0x117, CRC(72201412) SHA1(6ad7d22e612e27343eac5c38f00d548df644d52c) ) // GAL16V8B-15LP - ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, CRC(3c5e9bc5) SHA1(b4e04c4fa91ff33542b73971f67e71d13e24c5ec) ) // GAL16V8B-15LP -ROM_END - -/*************************************************************************** - - Pac-Carnival by Namco, 1996 - Namco N-44 EM VIDEO platform, PCB B0445 - - TMP 68HC000P-16 - - 013 9341E7005 - 038 9429WX704 - - OKI M6295 x 2 - - Battery - 93C46 EEPROM (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( paccarn ) - ROM_REGION( 0x80000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "pl1-mpr0b.u41", 0x00000, 0x80000, CRC(ef6b08ea) SHA1(61fe4db433a154233c4e1efd248ad51ba1d265d0) ) - - ROM_REGION( 0x100000, "sprites0", 0 ) - ROM_LOAD16_BYTE( "pl1-obj0.u52", 0x00000, 0x80000, CRC(1dd7c292) SHA1(e78d4be35c24616a1954910039e381869246a246) ) - ROM_LOAD16_BYTE( "pl1-obj1.u53", 0x00001, 0x80000, CRC(7b9935d0) SHA1(ef05230689124d0999ba9e472968e04d6e75c405) ) - - ROM_REGION( 0x80000, "layer0", 0 ) - ROM_LOAD16_BYTE( "pl1-cha0.u60", 0x00000, 0x40000, CRC(7977662e) SHA1(5aaa69ffaa62b20196a7b638232716b7c6391490) ) - ROM_LOAD16_BYTE( "pl1-cha1.u61", 0x00001, 0x40000, CRC(2150eafa) SHA1(e744a0861ee8a76c2bb24f681df38966df5dc9f0) ) - - ROM_REGION( 0x40000, "oki1", 0 ) - ROM_LOAD( "pl1-voi0.u27", 0x00000, 0x40000, CRC(e22b87e3) SHA1(83a6952fb0f695bb74cc5a3a1e24a916b6de9c8e) ) - - ROM_REGION( 0x40000, "oki2", ROMREGION_ERASE00 ) - // empty ROM socket - - ROM_REGION( 0x117 * 3, "plds", 0 ) // all protected - ROM_LOAD( "n44u1b.u1", 0x117*0, 0x117, NO_DUMP ) - ROM_LOAD( "n44u3b.u3", 0x117*1, 0x117, NO_DUMP ) - ROM_LOAD( "n44u51a.u51", 0x117*2, 0x117, NO_DUMP ) -ROM_END - -/*************************************************************************** - - Poka Poka Satan - wack-a-mole game with one frontal upright screen and two - table-top touch screens to bang on with plastic "hammers" - - PPS-MAIN (Sticker: 96. 4. 5 017) - - TMP 68HC000P-16 - - 013 9607EX013 x 3 - 038 9444WX010 x 3 - - OKI M6295 - - DSW8 - BR93LC46 EEPROM - - 16MHz XTAL - 28MHz XTAL - -***************************************************************************/ - -ROM_START( ppsatan ) - ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF ) /* 68000 Code */ - ROM_LOAD16_BYTE( "66a5.u79", 0x00000, 0x20000, CRC(60efeed3) SHA1(72095cef77065a8f1089273050f60a2e99582cf1) ) // checksum = 60D5 (OK?). 1xxxxxxxxxxxxxxxx = 0xFF - ROM_LOAD16_BYTE( "43b1.u61", 0x00001, 0x20000, CRC(f14e6287) SHA1(75c0465780a10ec8f533349b008f0d489bf362a5) ) // checksum = 43B1 (OK). 1xxxxxxxxxxxxxxxx = 0xFF - - ROM_REGION( 0x200000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "ver1.0.u27", 0x00000, 0x80000, CRC(d1b02639) SHA1(19bbcf951a6ace91da72af9232f3d808afa8416c) ) - ROM_LOAD16_BYTE( "ver1.0.u17", 0x00001, 0x80000, CRC(c66730ca) SHA1(75c18c80c1d2ced69edd4f013685c4eaf015049c) ) - - ROM_REGION( 0x200000, "sprites1", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "ver1.0.u13", 0x00000, 0x80000, CRC(24c31e01) SHA1(c2c96bdd0a2a764ac0e1c8d64334d0ab76c46aa5) ) - ROM_LOAD16_BYTE( "ver1.0.u19", 0x00001, 0x80000, CRC(ffbc6284) SHA1(05a735f3193218d32ad253c5abe21e1d00d1a5ca) ) - - ROM_REGION( 0x200000, "sprites2", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "ver1.0.u15", 0x00000, 0x80000, CRC(24c31e01) SHA1(c2c96bdd0a2a764ac0e1c8d64334d0ab76c46aa5) ) - ROM_LOAD16_BYTE( "ver1.0.u23", 0x00001, 0x80000, CRC(ffbc6284) SHA1(05a735f3193218d32ad253c5abe21e1d00d1a5ca) ) - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "ver1.0.u57", 0x00000, 0x80000, CRC(5faa697a) SHA1(308ea0a4dee7510b3bdd1b3b3c0a86c6508df40b) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 - - ROM_REGION( 0x80000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "ver1.0.u49", 0x00000, 0x80000, CRC(f21787b0) SHA1(e29ffcf948ef55f8ee11949903e5a363e6c4fa44) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 - - ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "ver1.0.u53", 0x00000, 0x80000, CRC(f21787b0) SHA1(e29ffcf948ef55f8ee11949903e5a363e6c4fa44) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 - - ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ - ROM_LOAD( "7a1f.u83", 0x000000, 0x80000, CRC(2ae77933) SHA1(a5eb0915813efd538b0812a6bbd5239b4b203f4a) ) - - ROM_REGION( 0x117, "plds", 0 ) - ROM_LOAD( "u90.u90", 0x000, 0x117, CRC(dae5e82a) SHA1(718ad537a917a0fdc3ef3c2307f04499a0029451) ) - ROM_LOAD( "u91.u91", 0x000, 0x117, CRC(28382623) SHA1(9fd4b4964f71807ae35a92bd5e81d6d1a5fdf469) ) - ROM_LOAD( "u92.u92", 0x000, 0x117, CRC(40b16ace) SHA1(1cdf39743713109e9510aeb6323df2bedfddbeb1) ) - ROM_LOAD( "u94.u94", 0x000, 0x117, CRC(eefe343a) SHA1(c7627d20711c3bf00f5d498d67ff43c8a0962a23) ) - ROM_LOAD( "u95.u95", 0x000, 0x117, CRC(b1a78112) SHA1(65a4da294c74ce4d36ceead8284b79be6cbb6379) ) - ROM_LOAD( "u111.u111", 0x000, 0x117, CRC(7f93cbdd) SHA1(7432b21c83249ab53d8f37e0c6fffd28f8de4ef3) ) -ROM_END - - -/* - -Power Instinct 2 (US) / Gouketsuji Ichizoku 2 (Japan) -Atlus, 1994 - -PCB Layout ----------- - -AT047G2-B ATLUS -|---------------------------------------------------------------| -|LM324 M6295 G02_U53 Z80 16MHz 28MHz 12MHz TA8030S | -|VOL G02_U54 |------| G02_U3A G02_U82A | -| M6295 G02_U55 |NMK112| 6264 6264 | -|uPC2505 G02_U56 | | |------| | -| 4558 |------| 6264 |038 | | -| Y3014 YM2203 PAL |9429WX| | -| G02_U89 |------| | -|J TEST_SW 62256 | -|A 93C46 62256 6264 |------| | -|M |038 | | -|M |---| G G G G PAL 6264 |9429WX| | -|A | | 0 0 0 0 |------| | -| | 6 | 2 2 2 2 G02_U81 | -| | 8 | - - - - |------| | -| | 0 | U U U U 6264 |038 | | -| | 0 | 4 4 4 4 |9429WX| | -| | 0 | 5 3 4 2 62256 6264 |------| | -| | | A A A A 62256 | -| |---| PAL |-------| G02_U78 |------| | -| |8647-01| |038 | | -| |013 | KM416C256 |9429WX| | -| |9341E70| |------| | -| G02_U66 G02_U63 |-------| 6264 | -| G02_U65 G02_U62 62256 KM416C256 | -| G02_U67 G02_U64 G02_U61 62256 6264 | -|---------------------------------------------------------------| -Notes: - 68000 clock - 16.000MHz - Z80 clock - 8.000MHz [16/2] - 6295 clocks - 3.000MHz [12/4], sample rate = 3000000 / 165 - YM2203 clock- 4.000MHz [16/4] - VSync - 57.5Hz - HSync - 15.23kHz - - ROMs - - U3 : 27C1001 EPROM - U82 : 27C040 EPROM - U42-45 : 27C040 EPROMs - U81, U89 : 8M 42 pin mask ROM (read as 27C800) - ALL other ROMs are soldered-in 16M 42 pin mask ROM (read as 27C160) -*/ - -ROM_START( pwrinst2 ) /* 94.04.08 */ - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "g02.u45a", 0x000000, 0x80000, CRC(ddfff811) SHA1(720f577dc77fc12aeb67511251e995169df754b6) ) - ROM_LOAD16_BYTE( "g02.u44a", 0x000001, 0x80000, CRC(5561f620) SHA1(3241ccc47e909930d79ad0a1a1b11a11879b17be) ) - ROM_LOAD16_BYTE( "g02.u43a", 0x100000, 0x80000, CRC(c4fd5d62) SHA1(8d00adfe5da9b0d0134fc9921c12f20b80954c3b) ) - ROM_LOAD16_BYTE( "g02.u42a", 0x100001, 0x80000, CRC(56279c1c) SHA1(f86edc2264758f9dc920a162d2dc71cc1f63d22e) ) - - ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ - /* not used */ - - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "g02.u3a", 0x00000, 0x20000, CRC(ebea5e1e) SHA1(4d3af9e5f29d0c1b26563f51250039c9e8bd3735) ) - - ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) - ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) - ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) - ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) - ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) - ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) - ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) - - ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) - - ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ - ROM_LOAD( "g02.82a", 0x000000, 0x080000, CRC(4b3567d6) SHA1(d3e14783b312d2bea9722a8e3c22bcec81e26166) ) - - ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) - ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) - - ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) - ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) - - ROM_REGION( 0x03ff, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( pwrinst2a ) /* also 94.04.08 like pwrinst2, but different program roms */ - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "g02.u45", 0x000000, 0x80000, CRC(7b33bc43) SHA1(a68eb94e679f03c354932b8c5cd1bb2922fec0aa) ) - ROM_LOAD16_BYTE( "g02.u44", 0x000001, 0x80000, CRC(8f6f6637) SHA1(024b12c0fe40e27c79e38bd7601a9183a62d75fd) ) - ROM_LOAD16_BYTE( "g02.u43", 0x100000, 0x80000, CRC(178e3d24) SHA1(926234f4196a5d5e3bd1438abbf73355f2c65b06) ) - ROM_LOAD16_BYTE( "g02.u42", 0x100001, 0x80000, CRC(a0b4ee99) SHA1(c6df4aa2543b04d8bda7683f503e5eb763e506af) ) - - ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ - /* not used */ - - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "g02.u3a", 0x00000, 0x20000, CRC(ebea5e1e) SHA1(4d3af9e5f29d0c1b26563f51250039c9e8bd3735) ) - - ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) - ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) - ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) - ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) - ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) - ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) - ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) - - ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) - - ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ - ROM_LOAD( "g02.82a", 0x000000, 0x080000, CRC(4b3567d6) SHA1(d3e14783b312d2bea9722a8e3c22bcec81e26166) ) - - ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) - ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) - - ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) - ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) - - ROM_REGION( 0x03ff, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( pwrinst2j ) - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "g02j.u45", 0x000000, 0x80000, CRC(42d0abd7) SHA1(c58861d43c4539ccc8b2f93eabc56aab37d3aa34)) - ROM_LOAD16_BYTE( "g02j.u44", 0x000001, 0x80000, CRC(362b7af3) SHA1(2d15611530cef76f0f9c82ee0411966079ae19c3)) - ROM_LOAD16_BYTE( "g02j.u43", 0x100000, 0x80000, CRC(c94c596b) SHA1(ee755a344f769e3ed05d8ca57f517b9e8c02f22e) ) - ROM_LOAD16_BYTE( "g02j.u42", 0x100001, 0x80000, CRC(4f4c8270) SHA1(1fa964f5646bd1d078e3661c21e191b0789c05c9) ) - - ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* 68000 extra data roms */ - /* not used */ - - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "g02j.u3a", 0x00000, 0x20000, CRC(eead01f1) SHA1(0ced6755e471e0303fe397b3d54a5c799762ebd8) ) - - ROM_REGION( 0xe00000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) - ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) - ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) - ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) - ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) - ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) - ROM_LOAD( "g02.u67", 0xc00000, 0x200000, CRC(52fe2b8b) SHA1(dd50aa62f7db995e28f47de9b3fb749aeeaaa5b0) ) - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "g02.u78", 0x000000, 0x200000, CRC(1eca63d2) SHA1(538942b43301f950e3d5139461331c54dc90129d) ) - - ROM_REGION( 0x100000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "g02.u81", 0x000000, 0x100000, CRC(8a3ff685) SHA1(4a59ec50ec4470453374fe10f76d3e894494b49f) ) - - ROM_REGION( 0x100000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "g02.u89", 0x000000, 0x100000, CRC(373e1f73) SHA1(ec1ae9fab37eee41be8e1bc6dad03809b62fdbce) ) - - ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ - ROM_LOAD( "g02j.82a", 0x000000, 0x080000, CRC(3be86fe1) SHA1(313bfe5fb8dc5fee4462db259738e079759f9390) ) - - ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) - ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) - - ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) - ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) - - ROM_REGION( 0x03ff, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ -ROM_END - -/* - -Power Instinct Legends (US) / Gouketsuji Ichizoku Saikyou Densetsu (Japan) -Atlus, 1995 - -PCB Layout ----------- - -AT047G2-B ATLUS -|---------------------------------------------------------------| -|LM324 M6295 G02_U53 Z80 16MHz 28MHz 12MHz TA8030S | -|VOL G02_U54 |------| SOUND_U3 TEXT_U82 | -| M6295 G02_U55 |NMK112| 6264 6264 | -|uPC2505 G02_U56 | | |------| | -| 4558 |------| 6264 |038 | | -| Y3014 YM2203 PAL |9429WX| | -| ATGS_U89 |------| | -|J TEST_SW 62256 | -|A 93C46 62256 6264 |------| | -|M |----SUB-BOARD-----| |038 | | -|M |---| |*P P *P P *P *P | PAL 6264 |9429WX| | -|A | | | R R R R R R | |------| | -| | 6 | | 1 O 1 O 1 1 | ATGS_U81 | -| | 8 | | 2 G 2 G 2 2 | |------| | -| | 0 | | U U U U U U | 6264 |038 | | -| | 0 | | 2 4 4 4 3 5 | |9429WX| | -| | 0 | | 5 4 |62256 6264 |------| | -| | | |------------------|62256 | -| |---| PAL |-------| ATGS_U78 |------| | -|--------| |8647-01| |038 | | -|*ATGS_U1| |013 | KM416C256 |9429WX| | -| | |9341E70| |------| | -| |G02_U66 G02_U63 |-------| 6264 | -| | G02_U65 G02_U62 62256 KM416C256 | -|*ATGS_U2| G02_U64 G02_U61 62256 6264 | -|--------|------------------------------------------------------| -Notes: - ROMs marked with * are located on a plug-in sub board - 68000 clock - 16.000MHz - Z80 clock - 8.000MHz [16/2] - 6295 clocks - 3.000MHz [12/4], sample rate = 3000000 / 165 - YM2203 clock- 4.000MHz [16/4] - VSync - 57.5Hz - HSync - 15.23kHz - - ROMs - - U3 : 27C1001 EPROM - U82 : 27C040 EPROM - PR12* : 27C040 EPROMs - PROG* : 27C040 EPROMs - ALL other ROMs are soldered-in 16M 42 pin mask ROM (read as 27C160) -*/ - -ROM_START( plegends ) - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "d12.u45", 0x000000, 0x80000, CRC(ed8a2e3d) SHA1(0a09c58cd8a726189cd7679d06343e0b8c3de945) ) - ROM_LOAD16_BYTE( "d13.u44", 0x000001, 0x80000, CRC(25821731) SHA1(7c6ece92b36dc7eb489879d9ae3e8af9380b9f62) ) - ROM_LOAD16_BYTE( "d14.u2", 0x100000, 0x80000, CRC(c2cb1402) SHA1(78e70915ca32b97c22605a304dc8611e1fe01ae9) ) /* Contains text strings */ - ROM_LOAD16_BYTE( "d16.u3", 0x100001, 0x80000, CRC(50a1c63e) SHA1(5a8431a81aa61034e67141944b9e7cf97842773a) ) /* Contains text strings */ - - ROM_REGION16_BE( 0x100000, "user1", 0 ) /* 68000 extra data roms */ - ROM_LOAD16_BYTE( "d15.u4", 0x000000, 0x80000, CRC(6352cec0) SHA1(a54d55b8d642e438158268d0d41880b6589e48e2) ) - ROM_LOAD16_BYTE( "d17.u5", 0x000001, 0x80000, CRC(7af810d8) SHA1(5e24f78a228809a001f3f3372c1b32ea05070e17) ) - - ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "d19.u3", 0x00000, 0x40000, CRC(47598459) SHA1(4e9dcfebfbd160230768965e8c6e5ed446c1aa7b) ) /* Same as sound.u3 below, but twice the size? */ - - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) - ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) - ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) - ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) - ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) - ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) - ROM_LOAD( "atgs.u1", 0xc00000, 0x200000, CRC(aa6f34a9) SHA1(00de85de1b413bd2c46931c13365f8556b50b634) ) /* US version's rom labeled "sp6_u67-1" */ - ROM_LOAD( "atgs.u2", 0xe00000, 0x200000, CRC(553eda27) SHA1(5b9126f966f0c64b3ac7c06526064d71e4df60c5) ) /* US version's rom labeled "sp6_u67-2" */ - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atgs.u78", 0x000000, 0x200000, CRC(16710ecb) SHA1(6277f7f6095457df649932550b04242e5853ec5e) ) /* US version's rom labeled "bg0_u78" */ - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atgs.u81", 0x000000, 0x200000, CRC(cb2aca91) SHA1(869f0f2db35c45ec90b74d33d521cbb598e60a3f) ) /* US version's rom labeled "bg1_u81" */ - - ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "atgs.u89", 0x000000, 0x200000, CRC(65f45a0f) SHA1(b7f4b56308dcdc144100d0a92d91255459a320a4) ) /* US version's rom labeled "bg2_u89" */ - - ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ - ROM_LOAD( "text.u82", 0x000000, 0x080000, CRC(f57333ea) SHA1(409d8005ffcf91943e4a743b2434ce425f5bdc36) ) /* US version's rom labeled "d20" */ - - ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) - ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) - - ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) - ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) - - ROM_REGION( 0x03ff, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ -ROM_END - -ROM_START( plegendsj ) - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "prog.u45", 0x000000, 0x80000, CRC(94f53db2) SHA1(34c671f160cfcb7d46cc964731ff2b77dc0be928) ) - ROM_LOAD16_BYTE( "prog.u44", 0x000001, 0x80000, CRC(db0ad756) SHA1(9c1510491cdc9442062ee3bd8a1bb93f00d33d97) ) - ROM_LOAD16_BYTE( "pr12.u2", 0x100000, 0x80000, CRC(0e202559) SHA1(217a8e47d5c679aff02ca43de1641230e4f78b01) ) /* Contains text in Japanese */ - ROM_LOAD16_BYTE( "pr12.u3", 0x100001, 0x80000, CRC(54742f21) SHA1(fae7bb7381478eb077f0409acd521f77417aa968) ) /* Contains text in Japanese */ - - ROM_REGION16_BE( 0x100000, "user1", 0 ) /* 68000 extra data roms */ - ROM_LOAD16_BYTE( "d15.u4", 0x000000, 0x80000, CRC(6352cec0) SHA1(a54d55b8d642e438158268d0d41880b6589e48e2) ) - ROM_LOAD16_BYTE( "d17.u5", 0x000001, 0x80000, CRC(7af810d8) SHA1(5e24f78a228809a001f3f3372c1b32ea05070e17) ) - - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */ - ROM_LOAD( "sound.u3", 0x00000, 0x20000, CRC(36f71520) SHA1(11d0a059ddba3e1aa4c54ccdde7b3f5c7bde482f) ) - - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "g02.u61", 0x000000, 0x200000, CRC(91e30398) SHA1(2b59a5e40bed2a988382054fe30d92808dad3348) ) - ROM_LOAD( "g02.u62", 0x200000, 0x200000, CRC(d9455dd7) SHA1(afa69fe9a540cd78b8cfecf09cffa1401c01141a) ) - ROM_LOAD( "g02.u63", 0x400000, 0x200000, CRC(4d20560b) SHA1(ceaee8cf0b69cc366b95ddcb689a5594d79e5114) ) - ROM_LOAD( "g02.u64", 0x600000, 0x200000, CRC(b17b9b6e) SHA1(fc6213d8322cda4c7f653e2d7d6d314ce84c97b7) ) - ROM_LOAD( "g02.u65", 0x800000, 0x200000, CRC(08541878) SHA1(138cf077a49a26440a3da1bdc2c399a208359e57) ) - ROM_LOAD( "g02.u66", 0xa00000, 0x200000, CRC(becf2a36) SHA1(f8b386d0292b1dc745b7253a3df51d1aa8d5e9db) ) - ROM_LOAD( "atgs.u1", 0xc00000, 0x200000, CRC(aa6f34a9) SHA1(00de85de1b413bd2c46931c13365f8556b50b634) ) /* US version's rom labeled "sp6_u67-1" */ - ROM_LOAD( "atgs.u2", 0xe00000, 0x200000, CRC(553eda27) SHA1(5b9126f966f0c64b3ac7c06526064d71e4df60c5) ) /* US version's rom labeled "sp6_u67-2" */ - - ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "atgs.u78", 0x000000, 0x200000, CRC(16710ecb) SHA1(6277f7f6095457df649932550b04242e5853ec5e) ) /* US version's rom labeled "bg0_u78" */ - - ROM_REGION( 0x200000, "layer1", 0 ) /* Layer 1 */ - ROM_LOAD( "atgs.u81", 0x000000, 0x200000, CRC(cb2aca91) SHA1(869f0f2db35c45ec90b74d33d521cbb598e60a3f) ) /* US version's rom labeled "bg1_u81" */ - - ROM_REGION( 0x200000, "layer2", 0 ) /* Layer 2 */ - ROM_LOAD( "atgs.u89", 0x000000, 0x200000, CRC(65f45a0f) SHA1(b7f4b56308dcdc144100d0a92d91255459a320a4) ) /* US version's rom labeled "bg2_u89" */ - - ROM_REGION( 0x080000, "layer3", 0 ) /* Layer 3 */ - ROM_LOAD( "text.u82", 0x000000, 0x080000, CRC(f57333ea) SHA1(409d8005ffcf91943e4a743b2434ce425f5bdc36) ) /* US version's rom labeled "d20" */ - - ROM_REGION( 0x440000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u53", 0x040000, 0x200000, CRC(c4bdd9e0) SHA1(a938a831e789ddf6f3cc5f3e5f3877ec7bd62d4e) ) - ROM_LOAD( "g02.u54", 0x240000, 0x200000, CRC(1357d50e) SHA1(433766177ce9d6933f90de85ba91bfc6d8d5d664) ) - - ROM_REGION( 0x440000, "oki2", 0 ) /* OKIM6295 #2 Samples */ - /* Leave the 0x40000 bytes addressable by the chip empty */ - ROM_LOAD( "g02.u55", 0x040000, 0x200000, CRC(2d102898) SHA1(bd81f4cd2ba100707db0c5bb1419f0b23c998574) ) - ROM_LOAD( "g02.u56", 0x240000, 0x200000, CRC(9ff50dda) SHA1(1121685e387c20e228032f2b0f5cbb606376fc15) ) - - ROM_REGION( 0x03ff, "pal", 0 ) - ROM_LOAD( "peel18cv8p-15.u7", 0x0000, 0x0155, CRC(e02b2d2b) SHA1(26293538ca17674e1b249ed82a6df2570c6e5155) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u21", 0x0155, 0x0155, CRC(7ca78400) SHA1(1cebdd64e08bbc535f23592daf9380696bd2c281) ) /* PEEL18CV8P-15 */ - ROM_LOAD( "peel18cv8p-15.u25", 0x02aa, 0x0155, CRC(61b414df) SHA1(f12c5e62f83114f83108895ee58ceea31cdcb9fd) ) /* PEEL18CV8P-15 */ -ROM_END - - -/*************************************************************************** - - Pretty Soldier Sailor Moon - -(C) 1995 Banpresto -PCB: BP945A -CPU: TMP68HC000P16 (68000, 64 pin DIP) -SND: Z84C0008PEC (Z80, 40 pin DIP), OKI M6295 x 2, YM2151, YM3012 -OSC: 28.000MHz, 16.000MHz -RAM: NEC 43256 x 8, NEC 424260 x 2, Sanyo LC3664 x 5 - -Other Chips: -SGS Thomson ST93C46CB1 (EEPROM?) -PALS (not dumped): - 18CV8 label SMBG - 18CV8 label SMZ80 - 18CV8 label SMCPU - GAL16V8 (located near BPSM-U47) - -GFX: 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 038 9437WX711 (176 pin PQFP) - 013 9346E7002 (240 pin PQFP) - -On PCB near JAMMA connector is a small push button to access test mode. - -ROMS: -BP945A.U9 27C040 Sound Program -BP945A.U45 27C240 Main Program -BPSM.U46 23C16000 Main Program? -BPSM.U47 23C4000 Sound? -BPSM.U48 23C16000 Sound? -BPSM.U53 23C16000 GFX -BPSM.U54 23C16000 GFX -BPSM.U57 23C16000 GFX -BPSM.U58 23C16000 GFX -BPSM.U59 23C16000 GFX -BPSM.U60 23C16000 GFX -BPSM.U61 23C16000 GFX -BPSM.U62 23C16000 GFX -BPSM.U63 23C16000 GFX -BPSM.U64 23C16000 GFX -BPSM.U65 23C16000 GFX -BPSM.U76 23C16000 GFX -BPSM.U77 23C16000 GFX - -***************************************************************************/ - - -#define ROMS_SAILORMN \ - ROM_REGION( 0x400000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "bpsm945a.u45", 0x000000, 0x080000, CRC(898c9515) SHA1(0fe8d7f13f5cfe2f6e79a0a21b2e8e7e70e65c4b) ) \ - ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ - \ - ROM_REGION( 0x80000, "audiocpu", 0 ) \ - ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ - \ - ROM_REGION( 0x400000, "sprites0", 0 ) \ - ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ - ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ - \ - ROM_REGION( 0x200000, "layer0", 0 ) \ - ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ - \ - ROM_REGION( 0x200000, "layer1", 0 ) \ - ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ - \ - ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ - \ - ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ - ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ - ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ - ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ - ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ - \ - ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ - ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ - ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ - ROM_CONTINUE( 0xe00000, 0x100000 ) \ - \ - ROM_REGION( 0x200000, "oki1", 0 ) \ - ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ - \ - ROM_REGION( 0x200000, "oki2", 0 ) \ - ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ - ROM_RELOAD( 0x080000, 0x080000 ) \ - ROM_RELOAD( 0x100000, 0x080000 ) \ - ROM_RELOAD( 0x180000, 0x080000 ) -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( sailormn ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) -ROM_END - -ROM_START( sailormnu ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) -ROM_END - -ROM_START( sailormnj ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) -ROM_END - -ROM_START( sailormnk ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) -ROM_END - -ROM_START( sailormnt ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) -ROM_END - -ROM_START( sailormnh ) - ROMS_SAILORMN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) -ROM_END - - -#define ROMS_SAILORMNN \ - ROM_REGION( 0x400000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "smprg.u45", 0x000000, 0x080000, CRC(234f1152) SHA1(8fc6d4a8995d550862d328011d3357c09334f0fa) ) \ - ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ - \ - ROM_REGION( 0x80000, "audiocpu", 0 ) \ - ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ - \ - ROM_REGION( 0x400000, "sprites0", 0 ) \ - ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ - ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ - \ - ROM_REGION( 0x200000, "layer0", 0 ) \ - ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ - \ - ROM_REGION( 0x200000, "layer1", 0 ) \ - ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ - \ - ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ - \ - ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ - ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ - ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ - ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ - ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ - \ - ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ - ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ - ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ - ROM_CONTINUE( 0xe00000, 0x100000 ) \ - \ - ROM_REGION( 0x200000, "oki1", 0 ) \ - ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ - \ - ROM_REGION( 0x200000, "oki2", 0 ) \ - ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ - ROM_RELOAD( 0x080000, 0x080000 ) \ - ROM_RELOAD( 0x100000, 0x080000 ) \ - ROM_RELOAD( 0x180000, 0x080000 ) -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( sailormnn ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) -ROM_END - -ROM_START( sailormnnu ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) -ROM_END - -ROM_START( sailormnnj ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) -ROM_END - -ROM_START( sailormnnk ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) -ROM_END - -ROM_START( sailormnnt ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) -ROM_END - -ROM_START( sailormnnh ) - ROMS_SAILORMNN - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) -ROM_END - - -#define ROMS_SAILORMNO \ - ROM_REGION( 0x400000, "maincpu", 0 ) \ - ROM_LOAD16_WORD_SWAP( "smprg.u45", 0x000000, 0x080000, CRC(97837ab4) SHA1(bf5a8cf3fbb942c2bb74c3b93312d9018ae6e2fd) ) \ - ROM_LOAD16_WORD_SWAP( "bpsm.u46", 0x200000, 0x200000, CRC(32084e80) SHA1(0ac503190d95009620b5ad7e7e0e63324f6fa4eb) ) \ - \ - ROM_REGION( 0x80000, "audiocpu", 0 ) \ - ROM_LOAD( "bpsm945a.u9", 0x00000, 0x80000, CRC(438de548) SHA1(81a0ca1cd662e2017aa980da162d39cfd0a19f14) ) \ - \ - ROM_REGION( 0x400000, "sprites0", 0 ) \ - ROM_LOAD( "bpsm.u76", 0x000000, 0x200000, CRC(a243a5ba) SHA1(3a32d685e53e0b75977f7acb187cf414a50c7f8b) ) \ - ROM_LOAD( "bpsm.u77", 0x200000, 0x200000, CRC(5179a4ac) SHA1(ceb8d3d889aae885debb2c9cf2263f60be3f1212) ) \ - \ - ROM_REGION( 0x200000, "layer0", 0 ) \ - ROM_LOAD( "bpsm.u53", 0x000000, 0x200000, CRC(b9b15f83) SHA1(8c574c97d38fb9e2889648c8d677b171e80a4229) ) \ - \ - ROM_REGION( 0x200000, "layer1", 0 ) \ - ROM_LOAD( "bpsm.u54", 0x000000, 0x200000, CRC(8f00679d) SHA1(4ea412f8ecdb9fd46f2d1378809919d1a62fcc2b) ) \ - \ - ROM_REGION( (5*0x200000)*2, "layer2", 0 ) \ - \ - ROM_LOAD( "bpsm.u57", 0x000000, 0x200000, CRC(86be7b63) SHA1(6b7d3d41fb1e4045c765b3cc98304464d91e6e3d) ) \ - ROM_LOAD( "bpsm.u58", 0x200000, 0x200000, CRC(e0bba83b) SHA1(9e1434814efd9321b2e5210b995d2fe66cca37dd) ) \ - ROM_LOAD( "bpsm.u62", 0x400000, 0x200000, CRC(a1e3bfac) SHA1(4528887d57e519df8dd60b2392db4c175c57b239) ) \ - ROM_LOAD( "bpsm.u61", 0x600000, 0x200000, CRC(6a014b52) SHA1(107c687479b59c455fc514cd61d290853c95ad9a) ) \ - ROM_LOAD( "bpsm.u60", 0x800000, 0x200000, CRC(992468c0) SHA1(3c66cc08313a9a326badc44f53a98cdfe0643da4) ) \ - \ - ROM_LOAD( "bpsm.u65", 0xa00000, 0x200000, CRC(f60fb7b5) SHA1(72cb8908cd687a330e14657664cd35037a52c39e) ) \ - ROM_LOAD( "bpsm.u64", 0xc00000, 0x200000, CRC(6559d31c) SHA1(bf688123a4beff625652cc1844bf0dc192f5c90f) ) \ - ROM_LOAD( "bpsm.u63", 0xe00000, 0x100000, CRC(d57a56b4) SHA1(e039b336887b66eba4e0630a3cb04cbd8fe14073) ) \ - ROM_CONTINUE( 0xe00000, 0x100000 ) \ - \ - ROM_REGION( 0x200000, "oki1", 0 ) \ - ROM_LOAD( "bpsm.u48", 0x000000, 0x200000, CRC(498e4ed1) SHA1(28d45a41702d9e5af4e214c1800b2e513ec84d51) ) \ - \ - ROM_REGION( 0x200000, "oki2", 0 ) \ - ROM_LOAD( "bpsm.u47", 0x000000, 0x080000, CRC(0f2901b9) SHA1(ebd3e9e39e8d2bc91688dac19b99548a28b4733c) ) \ - ROM_RELOAD( 0x080000, 0x080000 ) \ - ROM_RELOAD( 0x100000, 0x080000 ) \ - ROM_RELOAD( 0x180000, 0x080000 ) -/* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ -ROM_START( sailormno ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_europe.nv", 0x0000, 0x0080, CRC(59a7dc50) SHA1(6b116bdfbde42192b01678cb0b9bab0f2e56fd28) ) -ROM_END - -ROM_START( sailormnou ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_usa.nv", 0x0000, 0x0080, CRC(3915abe3) SHA1(1b8d3b8c65cf2298939c27607ec52630c017c7ea) ) -ROM_END - -ROM_START( sailormnoj ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_japan.nv", 0x0000, 0x0080, CRC(ea03c30a) SHA1(2afc71f932674e34fc4491db0e2027e0371569fc) ) -ROM_END - -ROM_START( sailormnok ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_korea.nv", 0x0000, 0x0080, CRC(0e7de398) SHA1(b495bf43d8596a0dc9843c74fc04fd21499bd115) ) -ROM_END - -ROM_START( sailormnot ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_taiwan.nv", 0x0000, 0x0080, CRC(6c7e8c2a) SHA1(68ef4e6593e4c12e6488a20dcc6dda920b01de67) ) -ROM_END - -ROM_START( sailormnoh ) - ROMS_SAILORMNO - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "sailormn_hongkong.nv", 0x0000, 0x0080, CRC(4d24c874) SHA1(93b87ef18cff98e4f6a60234692e7a9a9c8e7552) ) -ROM_END - - -/*************************************************************************** - - Tekken Card World by Namco, 1997 - Namco EMG4 platform, PCB 8824960101 (sticker: D 0049) - - TMP 68HC000P-16 - - 013 9651EX001 - 038 9701WX001 - - OKI M6295 (the second OKI location is unpopulated) - - 3V Button Battery - 93C46 EEPROM (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( tekkencw ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "mpr0.u41", 0x00000, 0x80000, CRC(5b8919f3) SHA1(580298b6dc36527ab69889c848acab97726a6cc6) ) // 27c240 - - ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "obj0.u52", 0x00000, 0x80000, CRC(6d3c0c76) SHA1(92f9c9beae222a2c2a3242f812030e08036c9963) ) // 27c040 - ROM_LOAD16_BYTE( "obj1.u53", 0x00001, 0x80000, CRC(8069b731) SHA1(9f0409c28466503092b74f635602962d9f127de8) ) // "" - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD16_BYTE( "cha0.u60", 0x00000, 0x40000, CRC(2a245ade) SHA1(7217017975c88c3edea613152ee6f2158f8777d7) ) // 27c020 - ROM_LOAD16_BYTE( "cha1.u61", 0x00001, 0x40000, CRC(43f62cce) SHA1(aa12ed0ccb94115ff8f9acf17850e1186c68bcf9) ) // "" - - ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "voi0.u27", 0x00000, 0x40000, CRC(3bcd9b7d) SHA1(7ecb47127733187f385a75b9db655e35c249de18) ) // 27c020 - - ROM_REGION( 0x117 * 2, "plds", 0 ) - ROM_LOAD( "n44u1d.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8D-15LP - ROM_LOAD( "n44u3a.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8D-15LP -ROM_END - - -/*************************************************************************** - - Tekken Battle Scratch by Namco, 1998 - Namco EMG4 platform, PCB 8824960101 (sticker: D 0880) - - TMP 68HC000P-16 - - 013 9???????? - 038 9748WX001 - - OKI M6295 (the second OKI location is unpopulated) - - 3V Button Battery - 93C46 EEPROM (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( tekkenbs ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "tbs1_mpr-0a.u41", 0x00000, 0x80000, CRC(625487d3) SHA1(6bdc0f0f9877eeb1041f8f5b0d44e41b83ddcc76) ) // 27c4002 - - ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "tbs1_obj-0a.u52", 0x00000, 0x80000, CRC(a870481b) SHA1(644370e10b197832ee828b22e43f114d40740432) ) // 27c4001 - ROM_LOAD16_BYTE( "tbs1_obj-1a.u53", 0x00001, 0x80000, CRC(73d8f520) SHA1(70ab5abeeaf0b3f5a263a7ece21d000a27148994) ) // "" - - ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD16_BYTE( "tbs1_cha-0a.u60", 0x00000, 0x80000, CRC(73e5c069) SHA1(5e4e8a0bc1fdf57e4cdf7075704dc0b60d9629e3) ) // 27c4001 - ROM_LOAD16_BYTE( "tbs1_cha-1a.u61", 0x00001, 0x80000, CRC(f41d3f2f) SHA1(d44f1506110fe9b7ef74ca05874146526ddaf020) ) // "" - - ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "tbs1_voi-0a.u27", 0x00000, 0x40000, CRC(bdccb92e) SHA1(7efcce4028fe492891e6f47b266d68a22dbe4c63) ) // 27c2001 - - ROM_REGION( 0x117 * 2, "plds", 0 ) - ROM_LOAD( "n44u1e.u1", 0x117*0, 0x117, NO_DUMP ) // GAL16V8D-15LP - ROM_LOAD( "n44u3e.u3", 0x117*1, 0x117, NO_DUMP ) // GAL16V8D-15LP -ROM_END - - -/*************************************************************************** - - Tobikose! Jumpman by Namco, 1999 - Namco EMG4 platform, PCB TJ0476 - - TMP 68HC000P-16 - - 013 9934WX002 - 038 9919WX007 - - OKI M6295 - - Battery - 93C46 EEPROM? (at U24) - - 28MHz XTAL - -***************************************************************************/ - -ROM_START( tjumpman ) - ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "tj1_mpr-0c.u41", 0x00000, 0x80000, CRC(de3030b8) SHA1(5f2165ea039c34cab605ebddc0b61eadc47b1532) ) - - ROM_REGION( 0x100000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD16_BYTE( "tj1_obj-0a.u52", 0x00000, 0x80000, CRC(b42cf8e8) SHA1(9ed7fb3574ed163a81f34a0d8cfa7a4661439932) ) - ROM_LOAD16_BYTE( "tj1_obj-1a.u53", 0x00001, 0x80000, CRC(5f0124d7) SHA1(4d9cfa464159998c176a178c668273d128dedff8) ) - - ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD16_BYTE( "tj1_cha-0a.u60", 0x00000, 0x40000, CRC(8aa08a38) SHA1(92b4df72fb8a833bb686ea478811243c5b868470) ) - ROM_LOAD16_BYTE( "tj1_cha-1a.u61", 0x00001, 0x40000, CRC(50072c82) SHA1(f8823e5a865afb8824cafd3b6483e2b6250ee77f) ) - - ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ - ROM_LOAD( "tj1_voi-0a.u27", 0x00000, 0x40000, CRC(b5693aae) SHA1(8887ae98030cb5d184e3d57d2b4e48bf1e76a232) ) - - ROM_REGION( 0x117 * 2, "plds", 0 ) - ROM_LOAD( "n44u1g.u1", 0x117*0, 0x117, CRC(e226ec18) SHA1(c14098e06413d6fc88926e31538d496ef7314903) ) // GAL16V8D-15LP - ROM_LOAD( "n44u3b.u3", 0x117*1, 0x117, CRC(4cd79750) SHA1(cfb3331cd8bb2eaaf5d2a80ae76a5a15ae92d379) ) // GAL16V8D-15LP -ROM_END - - -/*************************************************************************** - - Puzzle Uo Poko -Board: CV02 -OSC: 28.0, 16.0, 16.9 MHz - -PCB found with hand written labels in Japanese (translated): - -Program (O) Program (E) -Eigo U25 Eigo U26 -C553 AOU ECB7 AOU - -Eigo means English and AOU is Amusement Operators Union. This board looks -to be an AOU show board. The data contents remained the same for the -actual International production release. - -***************************************************************************/ - -ROM_START( uopoko ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u26.u26", 0x000000, 0x080000, CRC(b445c9ac) SHA1(4dda1c6e19de629ea4d9061560c32a9f0deabd53) ) - ROM_LOAD16_BYTE( "u25.u25", 0x000001, 0x080000, CRC(a1258482) SHA1(7f4adc4a6d069032aaf3d93eb60fde16b59483f8) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "cave_cv-02_u33.u33", 0x000000, 0x400000, CRC(5d142ad2) SHA1(f26abcf7a625a322b83df44fbd6e852bfb03663c) ) /* mask ROM */ - - ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "cave_cv-02_u49.u49", 0x000000, 0x400000, CRC(12fb11bb) SHA1(953df1b16b5c9a6c3eb2fdebec4669a879270e73) ) /* mask ROM */ - - ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "cave_cv-02_u4.u4", 0x000000, 0x200000, CRC(a2d0d755) SHA1(f8493ef7f367f3dc2a229ba785ac67bc5c2c54c0) ) /* mask ROM */ - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-uopoko.bin", 0x0000, 0x0080, CRC(f4a24b95) SHA1(4043f0ffed24e38b4f7dbe1a5a4a9e79bdde7dfd) ) -ROM_END - -ROM_START( uopokoj ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "u26j.u26", 0x000000, 0x080000, CRC(e7eec050) SHA1(cf3a77741029f96dbbec5ca7217a1723e4233cff) ) - ROM_LOAD16_BYTE( "u25j.u25", 0x000001, 0x080000, CRC(68cb6211) SHA1(a6db0bc2e3e54b6992a44b7d52395917e66db49b) ) - - ROM_REGION( 0x400000, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "cave_cv-02_u33.u33", 0x000000, 0x400000, CRC(5d142ad2) SHA1(f26abcf7a625a322b83df44fbd6e852bfb03663c) ) /* mask ROM */ - - ROM_REGION( 0x400000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "cave_cv-02_u49.u49", 0x000000, 0x400000, CRC(12fb11bb) SHA1(953df1b16b5c9a6c3eb2fdebec4669a879270e73) ) /* mask ROM */ - - ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */ - ROM_LOAD( "cave_cv-02_u4.u4", 0x000000, 0x200000, CRC(a2d0d755) SHA1(f8493ef7f367f3dc2a229ba785ac67bc5c2c54c0) ) /* mask ROM */ - - ROM_REGION16_BE( 0x80, "eeprom", 0 ) - ROM_LOAD16_WORD( "eeprom-uopoko.bin", 0x0000, 0x0080, CRC(f4a24b95) SHA1(4043f0ffed24e38b4f7dbe1a5a4a9e79bdde7dfd) ) -ROM_END - - -/*************************************************************************** - - - Drivers Init Routines - Rom decryption/unpacking, global vars etc. - - -***************************************************************************/ - -/* Tiles are 6 bit, 4 bits stored in one rom, 2 bits in the other. - Expand the 2 bit part into a 4 bit layout, so we can decode it */ -void cave_z80_state::sailormn_unpack_tiles(int chip) -{ - const u32 len= m_tileregion[chip]->bytes(); - u8 *rgn = m_tileregion[chip]->base(); - u8 *src = rgn + (len/4)*3 - 1; - u8 *dst = rgn + (len/4)*4 - 2; - - while (src <= dst) - { - u8 data = src[0]; - - dst[0] = ((data & 0x03) << 4) + ((data & 0x0c) >> 2); - dst[1] = ((data & 0x30) >> 0) + ((data & 0xc0) >> 6); - - src -= 1; - dst -= 2; - } -} - -void cave_state::init_cave() -{ - m_spritetype[0] = TYPE_ZOOM; // Normal sprites - m_kludge = 0; - m_time_vblank_irq = 100; - - m_irq_level = 1; -} - -void cave_z80_state::init_z80_bank() -{ - u8 *ROM = m_z80region->base(); - u32 max = m_z80region->bytes() / 0x4000; - m_z80bank->configure_entries(0, max, &ROM[0x00000], 0x4000); -} - -void cave_z80_state::init_oki_bank(int chip) -{ - u8 *ROM = m_okiregion[chip]->base(); - u32 max = m_okiregion[chip]->bytes() / 0x20000; - m_okibank_lo[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); - m_okibank_hi[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); -} - -void cave_z80_state::init_agallet() -{ - init_cave(); - - init_z80_bank(); - init_oki_bank(0); - init_oki_bank(1); - - sailormn_unpack_tiles(2); - - unpack_sprites(0); -} - -void cave_state::init_dfeveron() -{ - init_cave(); - - unpack_sprites(0); - m_kludge = 2; -} - -void cave_state::init_feversos() -{ - init_cave(); - - unpack_sprites(0); - m_kludge = 2; -} - -void cave_state::init_ddonpach() -{ - init_cave(); - - unpack_sprites(0); - m_spritetype[0] = TYPE_NOZOOM; // "different" sprites (no zooming?) - m_time_vblank_irq = 90; - - /* 4bpp but Only first 16 colors are used in palette index for Layer 0, 1. */ - m_gfxdecode[0]->gfx(0)->set_granularity(256); - m_gfxdecode[0]->gfx(1)->set_granularity(256); -} - -void cave_state::init_donpachi() -{ - init_cave(); - - unpack_sprites(0); - m_spritetype[0] = TYPE_NOZOOM; // "different" sprites (no zooming?) - m_time_vblank_irq = 90; -} - -void cave_state::init_esprade() -{ - init_cave(); - - unpack_sprites(0); - m_time_vblank_irq = 2000; /**/ - -#if 0 //ROM PATCH - { - u16 *rom = (u16 *)memregion("maincpu")->base(); - rom[0x118A/2] = 0x4e71; //palette fix 118A: 5548 SUBQ.W #2,A0 --> NOP - } -#endif -} - -void cave_state::init_gaia() -{ - init_cave(); - - /* No EEPROM */ - - unpack_sprites(0); - m_time_vblank_irq = 2000; /**/ -} - -void cave_state::init_guwange() -{ - init_cave(); - - unpack_sprites(0); - m_time_vblank_irq = 2000; /**/ -} - -void cave_z80_state::init_hotdogst() -{ - init_cave(); - - init_z80_bank(); - init_oki_bank(0); - - unpack_sprites(0); - m_time_vblank_irq = 2000; /**/ -} - -void cave_z80_state::init_mazinger() -{ - u8 *src = m_spriteregion[0]->base(); - const u32 len = m_spriteregion[0]->bytes(); - - init_cave(); - - init_z80_bank(); - init_oki_bank(0); - - /* decrypt sprites */ - std::vector buffer(len); - { - for (int i = 0; i < len; i++) - buffer[i ^ 0xdf88] = src[(i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,9,7,3,15,4,17,14,18,2,16,5,11,8,6,13,1,10,12,0)]; - std::copy(buffer.begin(), buffer.end(), &src[0]); - } - - unpack_sprites(0); - m_kludge = 3; - m_time_vblank_irq = 2100; -} - -void cave_z80_state::init_metmqstr() -{ - init_cave(); - - init_z80_bank(); - init_oki_bank(0); - init_oki_bank(1); - - unpack_sprites(0); - m_kludge = 3; - m_time_vblank_irq = 17376; -} - -void ppsatan_state::init_ppsatan() -{ - init_cave(); - - unpack_sprites(0); - unpack_sprites(1); - unpack_sprites(2); - - m_time_vblank_irq = 2000; /**/ -} - -void cave_z80_state::init_pwrinst2() -{ - u8 *src = m_spriteregion[0]->base(); - const u32 len = m_spriteregion[0]->bytes(); - - init_cave(); - - init_z80_bank(); - - std::vector buffer(len); - { - for (u32 i = 0; i < len; i++) - { - u32 j = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7, 2,4,6,1,5,3, 0); - if(((j & 6) == 0) || ((j & 6) == 6)) - j ^= 6; - buffer[j ^ 7] = src[i]; - } - - std::copy(buffer.begin(), buffer.end(), &src[0]); - } - - unpack_sprites(0); - m_spritetype[0] = TYPE_NOZOOM | TYPE_ISPWRINST2; - m_kludge = 4; - m_time_vblank_irq = 2000; /**/ -} - -void cave_z80_state::init_pwrinst2a() -{ - /* this patch fixes on of the moves, why is it needed? is the rom bad or is there another - problem? does the Japan set need it or not? */ - init_pwrinst2(); - -#if 1 //ROM PATCH - { - u16 *rom = (u16 *)memregion("maincpu")->base(); - rom[0xd46c / 2] = 0xd482; // kurara dash fix 0xd400 -> 0xd482 - } -#endif - -} - -void cave_z80_state::init_sailormn() -{ - u8 *src = m_spriteregion[0]->base(); - const u32 len = m_spriteregion[0]->bytes(); - - init_cave(); - - init_z80_bank(); - init_oki_bank(0); - init_oki_bank(1); - - /* decrypt sprites */ - std::vector buffer(len); - { - for (int i = 0; i < len; i++) - buffer[i ^ 0x950c4] = src[(i & ~0xffffff) | bitswap<24>(i,23,22,21,20,15,10,12,6,11,1,13,3,16,17,2,5,14,7,18,8,4,19,9,0)]; - std::copy(buffer.begin(), buffer.end(), &src[0]); - } - - sailormn_unpack_tiles(2); - - unpack_sprites(0); - m_kludge = 1; - m_time_vblank_irq = 2000; - - m_sailormn_tilebank = 0; - save_item(NAME(m_sailormn_tilebank)); -} - -void cave_state::init_tjumpman() -{ - init_cave(); - - unpack_sprites(0); - m_kludge = 3; - m_time_vblank_irq = 17376; - - m_hopper = 0; - save_item(NAME(m_hopper)); -} - -void cave_state::init_uopoko() -{ - init_cave(); - - unpack_sprites(0); - m_kludge = 2; - m_time_vblank_irq = 2000; /**/ -} - -void cave_state::init_korokoro() -{ - init_cave(); - - m_irq_level = 2; - - unpack_sprites(0); - m_time_vblank_irq = 2000; /**/ - - m_leds[0] = 0; - m_leds[1] = 0; - m_hopper = 0; - save_item(NAME(m_leds)); - save_item(NAME(m_hopper)); -} - -/*************************************************************************** - - - Game Drivers - - -***************************************************************************/ -// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS -GAME( 1994, pwrinst2, 0, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Power Instinct 2 (US, Ver. 94.04.08, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pwrinst2a, pwrinst2, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2a, ROT0, "Atlus", "Power Instinct 2 (US, Ver. 94.04.08, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, pwrinst2j, pwrinst2, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gouketsuji Ichizoku 2 (Japan, Ver. 94.04.08)", MACHINE_SUPPORTS_SAVE ) - -// Version/Date string is stored at 68000 ROM 0x1200-0x121f -// The EEPROM determines the region, program roms are the same between sets -GAME( 1994, mazinger, 0, mazinger, cave, cave_z80_state, init_mazinger, ROT90, "Banpresto / Dynamic Pl. Toei Animation", "Mazinger Z (World)", MACHINE_SUPPORTS_SAVE ) // 1994/06/27 08:00 -GAME( 1994, mazingerj, mazinger, mazinger, cave, cave_z80_state, init_mazinger, ROT90, "Banpresto / Dynamic Pl. Toei Animation", "Mazinger Z (Japan)", MACHINE_SUPPORTS_SAVE ) // 1994/06/27 08:00 - -// Version/Date string is stored at 68000 ROM 0x400-0x41f -GAME( 1995, donpachi, 0, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (US)", MACHINE_SUPPORTS_SAVE ) // Ver.1.12 1995/05/2x XXXXX -GAME( 1995, donpachij, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Japan)", MACHINE_SUPPORTS_SAVE ) // Ver.1.01 1995/05/11 -GAME( 1995, donpachijs, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Japan, Satsuei version)", MACHINE_SUPPORTS_SAVE ) // Ver.1.01 1995/05/11 -GAME( 1995, donpachikr, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Korea)", MACHINE_SUPPORTS_SAVE ) // Ver.1.12 1995/05/2x XXXXX -GAME( 1995, donpachihk, donpachi, donpachi, cave, cave_state, init_donpachi, ROT270, "Cave (Atlus license)", "DonPachi (Hong Kong)", MACHINE_SUPPORTS_SAVE ) // Ver.1.10 1995/05/17 asia - -GAME( 1995, metmqstr, 0, metmqstr, metmqstr, cave_z80_state, init_metmqstr, ROT0, "Banpresto / Pandorabox", "Metamoqester (World)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, nmaster, metmqstr, metmqstr, metmqstr, cave_z80_state, init_metmqstr, ROT0, "Banpresto / Pandorabox", "Oni - The Ninja Master (Japan)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1995, plegends, 0, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gogetsuji Legends (US, Ver. 95.06.20)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, plegendsj, plegends, pwrinst2, metmqstr, cave_z80_state, init_pwrinst2, ROT0, "Atlus", "Gouketsuji Gaiden - Saikyou Densetsu (Japan, Ver. 95.06.20)", MACHINE_SUPPORTS_SAVE ) - -// The EEPROM determines the region, program roms are the same between sets -GAME( 1995, sailormn, 0, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnu, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnk, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22B, Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnt, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22B, Hong Kong)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnn, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnnu, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnnj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnnk, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/22, Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnnt, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnnh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/22, Hong Kong)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormno, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnou, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnoj, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnok, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Pretty Soldier Sailor Moon (Version 95/03/21, Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnot, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1995, sailormnoh, sailormn, sailormn, cave, cave_z80_state, init_sailormn, ROT0, "Gazelle (Banpresto license)", "Bishoujo Senshi Sailor Moon (Version 95/03/21, Hong Kong)", MACHINE_SUPPORTS_SAVE ) - -// The EEPROM determines the region, program roms are the same between sets -GAME( 1996, agallet, 0, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletu, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletj, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Akuu Gallet (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletk, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agallett, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalleth, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (Hong Kong)", MACHINE_SUPPORTS_SAVE ) -// this set appears to be older, there is some kind of reset circuit / watchdog circuit check on startup, the same check exists in the above set but the code skips over it so presumably it was removed -// to avoid boards simply hanging on a black screen if the circuit didn't fire. -GAME( 1996, agalleta, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletau, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletaj, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Akuu Gallet (older, Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletak, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletat, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, agalletah, agallet, sailormn, cave, cave_z80_state, init_agallet, ROT270, "Gazelle (Banpresto license)", "Air Gallet (older, Hong Kong)", MACHINE_SUPPORTS_SAVE ) - -// 68000 ROM string 0x328e-32b5 has 1993 copyright and publisher string, it's planned release date but cancelled? -GAME( 1996, hotdogst, 0, hotdogst, cave, cave_z80_state, init_hotdogst, ROT90, "Marble (Ace International license)", "Hotdog Storm (Korea)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1996, pacslot, 0, pacslot, pacslot, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Slot", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, paceight, 0, paceight, paceight, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Eight", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, paccarn, 0, paccarn, paccarn, cave_state, init_tjumpman, ROT0, "Namco", "Pac-Carnival", MACHINE_SUPPORTS_SAVE ) - -GAME( 1996, ppsatan, 0, ppsatan, ppsatan, ppsatan_state, init_ppsatan, ROT0, "Kato Seisakujo Co., Ltd.", "Poka Poka Satan (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) - -GAME( 1997, tekkencw, 0, tekkencw, tekkencw, cave_state, init_tjumpman, ROT0, "Namco", "Tekken Card World", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, tekkenbs, 0, tekkenbs, tekkenbs, cave_state, init_tjumpman, ROT0, "Namco", "Tekken Battle Scratch", MACHINE_SUPPORTS_SAVE ) - -// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) -GAME( 1997, ddonpach, 0, ddonpach, cave, cave_state, init_ddonpach, ROT270, "Cave (Atlus license)", "DoDonPachi (World, 1997 2/ 5 Master Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, ddonpachj, ddonpach, ddonpach, cave, cave_state, init_ddonpach, ROT270, "Cave (Atlus license)", "DoDonPachi (Japan, 1997 2/ 5 Master Ver.)", MACHINE_SUPPORTS_SAVE ) -// NOT an official CAVE release, but several PCBs have been converted to it and used on location. -GAME( 2012, ddonpacha, ddonpach, ddonpach, cave, cave_state, init_ddonpach, ROT270, "hack (trap15)", "DoDonPachi (2012/02/12 Arrange Ver. 1.1) (hack)", MACHINE_SUPPORTS_SAVE ) - -// Version/Date string is stored at 68000 ROM 0x400-0x427 -GAME( 1998, dfeveron, feversos, dfeveron, cave, cave_state, init_dfeveron, ROT270, "Cave (Nihon System license)", "Dangun Feveron (Japan, 98/09/17 VER.)", MACHINE_SUPPORTS_SAVE ) // ca005 Ver0.01 Thu Sep 17 18:40:02 1998 -GAME( 1998, feversos, 0, dfeveron, cave, cave_state, init_feversos, ROT270, "Cave (Nihon System license)", "Fever SOS (World, 98/09/25 VER)", MACHINE_SUPPORTS_SAVE ) // ca005 Ver0.01 Fri Sep 25 10:10:15 1998 - -// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) -GAME( 1998, esprade, 0, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (World, 1998 4/22 International Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, espradej, esprade, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (Japan, 1998 4/21 Master Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1998, espradejo, esprade, esprade, cave, cave_state, init_esprade, ROT270, "Cave (Atlus license)", "ESP Ra.De. (Japan, 1998 4/14 Master Ver.)", MACHINE_SUPPORTS_SAVE ) - -// Date string is stored at 68000 ROM 0x100-0x1ff -GAME( 1998, uopoko, 0, uopoko, cave, cave_state, init_uopoko, ROT0, "Cave (Jaleco license)", "Puzzle Uo Poko (World)", MACHINE_SUPPORTS_SAVE ) // CAVE 1998.FEB.06 UOPOKO CV-02-00 OVER SEA -GAME( 1998, uopokoj, uopoko, uopoko, cave, cave_state, init_uopoko, ROT0, "Cave (Jaleco license)", "Puzzle Uo Poko (Japan)", MACHINE_SUPPORTS_SAVE ) // CAVE 1998.FEB.06 UOPOKO CV-02-00 JAPAN - -// Version/Date string at 68000 ROM 0x400-0x41f is leftover from donpachi (DONPACHI Ver.1.12 1995/05/2x XXXXX) -GAME( 1999, guwange, 0, guwange, guwange, cave_state, init_guwange, ROT270, "Cave (Atlus license)", "Guwange (Japan, 1999 6/24 Master Ver 16:55)", MACHINE_SUPPORTS_SAVE ) -GAME( 1999, guwanges, guwange, guwange, guwange, cave_state, init_guwange, ROT270, "Cave (Atlus license)", "Guwange (Japan, 2000 7/ 7 Special Ver 13:22)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1999, gaia, 0, gaia, gaia, cave_state, init_gaia, ROT0, "Noise Factory", "Gaia Crusaders", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // cuts out occasionally - -GAME( 1999, korokoro, 0, korokoro, korokoro, cave_state, init_korokoro, ROT0, "Takumi", "Koro Koro Quest (Japan)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1999, crusherm, 0, crusherm, korokoro, cave_state, init_korokoro, ROT0, "Takumi", "Crusher Makochan (Japan)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1999, tjumpman, 0, tjumpman, tjumpman, cave_state, init_tjumpman, ROT0, "Namco", "Tobikose! Jumpman", MACHINE_SUPPORTS_SAVE ) - -GAME( 2001, theroes, 0, gaia, theroes, cave_state, init_gaia, ROT0, "Primetek Investments", "Thunder Heroes", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // cuts out occasionally diff -Nru mame-0.263+dfsg.1/src/mame/misc/cave.h mame-0.264+dfsg.1/src/mame/misc/cave.h --- mame-0.263+dfsg.1/src/mame/misc/cave.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/cave.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,394 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia -#ifndef MAME_MISC_CAVE_H -#define MAME_MISC_CAVE_H - -#pragma once - -/*************************************************************************** - - Cave hardware - -***************************************************************************/ - -#include "machine/eepromser.h" -#include "machine/gen_latch.h" -#include "machine/timer.h" -#include "sound/okim6295.h" -#include "video/tmap038.h" - -#include "emupal.h" -#include "screen.h" - -class cave_state : public driver_device -{ -public: - cave_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_oki(*this, "oki%u", 1) - , m_int_timer(*this, "int_timer") - , m_eeprom(*this, "eeprom") - , m_gfxdecode(*this, "gfxdecode.%u", 0U) - , m_spr_gfxdecode(*this, "spr_gfxdecode.%u", 0U) - , m_screen(*this, "screen.%u", 0U) - , m_palette(*this, "palette.%u", 0U) - , m_tilemap(*this, "tilemap.%u", 0U) - , m_led_outputs(*this, "led%u", 0U) - , m_videoregs(*this, "videoregs.%u", 0) - , m_spriteram(*this, "spriteram.%u", 0) - , m_io_in0(*this, "IN0") - , m_io_bet(*this, "BET") - , m_spriteregion(*this, "sprites%u", 0) - , m_tileregion(*this, "layer%u", 0) - , m_okiregion(*this, "oki%u", 1) - { } - - int korokoro_hopper_r(); - int tjumpman_hopper_r(); - int paccarn_bet4_r(); - int paccarn_bet8_r(); - - void init_ddonpach(); - void init_dfeveron(); - void init_donpachi(); - void init_esprade(); - void init_feversos(); - void init_gaia(); - void init_guwange(); - void init_korokoro(); - void init_tjumpman(); - void init_uopoko(); - - void crusherm(machine_config &config); - void ddonpach(machine_config &config); - void dfeveron(machine_config &config); - void donpachi(machine_config &config); - void esprade(machine_config &config); - void gaia(machine_config &config); - void guwange(machine_config &config); - void korokoro(machine_config &config); - void paccarn(machine_config &config); - void paceight(machine_config &config); - void pacslot(machine_config &config); - void tekkenbs(machine_config &config); - void tekkencw(machine_config &config); - void tjumpman(machine_config &config); - void uopoko(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void device_post_load() override; - - // devices - required_device m_maincpu; - optional_device_array m_oki; - required_device m_int_timer; - optional_device m_eeprom; - optional_device_array m_gfxdecode; - optional_device_array m_spr_gfxdecode; - optional_device_array m_screen; - optional_device_array m_palette; - optional_device_array m_tilemap; - output_finder<9> m_led_outputs; - - // memory pointers - optional_shared_ptr_array m_videoregs; - optional_shared_ptr_array m_spriteram; - - optional_ioport m_io_in0; - optional_ioport m_io_bet; - - // memory regions - optional_memory_region_array<4> m_spriteregion; - optional_memory_region_array<4> m_tileregion; - optional_memory_region_array<2> m_okiregion; - - enum - { - TYPE_ZOOM = 0, - TYPE_NOZOOM = 1, - TYPE_ISPWRINST2 = 2 - }; - - // video-related - enum - { - MAX_PRIORITY = 4, - MAX_SPRITE_NUM = 0x400 - }; - - struct sprite_cave - { - sprite_cave() { } - - int priority = 0, flags = 0; - - const u8 *pen_data = nullptr; // points to top left corner of tile data - int line_offset = 0; - - pen_t base_pen = 0; - int tile_width = 0, tile_height = 0; - int total_width = 0, total_height = 0; // in screen coordinates - int x = 0, y = 0, xcount0 = 0, ycount0 = 0; - int zoomx_re = 0, zoomy_re = 0; - }; - - struct - { - int clip_left = 0, clip_right = 0, clip_top = 0, clip_bottom = 0; - u8 *baseaddr = 0U; - int line_offset = 0; - u8 *baseaddr_zbuf =0U; - int line_offset_zbuf = 0; - } m_blit; - - std::unique_ptr m_sprite[4]; - sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1]{}; - - bitmap_ind16 m_sprite_zbuf[4]; - u16 m_sprite_zbuf_baseval = 0U; - - std::unique_ptr m_sprite_gfx[4]; - offs_t m_sprite_gfx_mask[4]{}; - - u32 m_num_sprites[4]{}; - - u32 m_spriteram_bank[4]{}; - u32 m_spriteram_bank_delay[4]{}; - - s32 m_layers_offs_x = 0; - s32 m_layers_offs_y = 0; - s32 m_row_effect_offs_n = 0; - s32 m_row_effect_offs_f = 0; - u16 m_background_pen[4]{}; - - int m_spritetype[2]{}; - int m_kludge = 0; - emu_timer *m_vblank_end_timer = nullptr; - - u16 m_sprite_granularity = 0U; - u32 m_max_sprite_clk[4]{}; // max usable clock for sprites - - // misc - int m_time_vblank_irq = 0; - u8 m_irq_level = 0U; - u8 m_vblank_irq = 0U; - u8 m_sound_irq = 0U; - u8 m_unknown_irq = 0U; - u8 m_agallet_vblank_irq = 0U; - - // game specific - // korokoro - u16 m_leds[2]{}; - u8 m_hopper = 0; - - int m_rasflag = 0; - int m_old_rasflag = 0; - - void (cave_state::*m_get_sprite_info)(int chip); - void (cave_state::*m_sprite_draw)(int chip, int priority); - - void add_base_config(machine_config &config, int layer); - void add_ymz(machine_config &config); - - u16 irq_cause_r(offs_t offset); - void gaia_coin_w(u8 data); - u16 donpachi_videoregs_r(offs_t offset); - template void videoregs_w(offs_t offset, u16 data, u16 mem_mask); - void korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask); - void tjumpman_leds_w(u8 data); - void pacslot_leds_w(u8 data); - void eeprom_w(u8 data); - void guwange_eeprom_w(u8 data); - void korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask); - void tjumpman_eeprom_w(u8 data); - DECLARE_VIDEO_START(spr_4bpp); - DECLARE_VIDEO_START(spr_8bpp); - u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(interrupt); - TIMER_CALLBACK_MEMBER(vblank_end); - TIMER_DEVICE_CALLBACK_MEMBER(vblank_start); - TIMER_DEVICE_CALLBACK_MEMBER(vblank_start_left); - TIMER_DEVICE_CALLBACK_MEMBER(vblank_start_right); - TIMER_DEVICE_CALLBACK_MEMBER(timer_lev2_cb); - void get_sprite_info(int chip); - void sound_irq_gen(int state); - void update_irq_state(); - void unpack_sprites(int chip); - - inline void tilemap_draw(int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 flags, u32 priority, u32 priority2, int GFX); - void set_pens(int chip); - void vh_start(u16 sprcol_granularity); - void get_sprite_info_cave(int chip); - void get_sprite_info_donpachi(int chip); - void sprite_init(); - void sprite_check(int chip, int screen_no, screen_device &screen, const rectangle &clip); - void do_blit_zoom32(int chip, const sprite_cave *sprite); - void do_blit_zoom32_zb(int chip, const sprite_cave *sprite); - void do_blit_32(int chip, const sprite_cave *sprite); - void do_blit_32_zb(int chip, const sprite_cave *sprite); - void sprite_draw_cave(int chip, int priority); - void sprite_draw_cave_zbuf(int chip, int priority); - void sprite_draw_donpachi(int chip, int priority); - void sprite_draw_donpachi_zbuf(int chip, int priority); - void init_cave(); - void show_leds(); - - void crusherm_map(address_map &map); - void ddonpach_map(address_map &map); - void dfeveron_map(address_map &map); - void donpachi_map(address_map &map); - void esprade_map(address_map &map); - void gaia_map(address_map &map); - void guwange_map(address_map &map); - void korokoro_map(address_map &map); - void paccarn_map(address_map &map); - void paceight_map(address_map &map); - void pacslot_map(address_map &map); - void tekkenbs_map(address_map &map); - void tekkencw_map(address_map &map); - void tjumpman_map(address_map &map); - void uopoko_map(address_map &map); -}; - -// with sound Z80 -class cave_z80_state : public cave_state -{ -public: - cave_z80_state(const machine_config &mconfig, device_type type, const char *tag) - : cave_state(mconfig, type, tag) - , m_audiocpu(*this, "audiocpu") - , m_soundlatch(*this, "soundlatch") - , m_startup(*this, "startup") - , m_z80region(*this, "audiocpu") - , m_z80bank(*this, "z80bank") - , m_okibank_lo(*this, "oki%u_banklo", 1) - , m_okibank_hi(*this, "oki%u_bankhi", 1) - {} - - void init_agallet(); - void init_hotdogst(); - void init_mazinger(); - void init_metmqstr(); - void init_pwrinst2(); - void init_pwrinst2a(); - void init_sailormn(); - - void hotdogst(machine_config &config); - void mazinger(machine_config &config); - void metmqstr(machine_config &config); - void pwrinst2(machine_config &config); - void sailormn(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - required_device m_audiocpu; - required_device m_soundlatch; - optional_device m_startup; - required_memory_region m_z80region; - required_memory_bank m_z80bank; - optional_memory_bank_array<2> m_okibank_lo; - optional_memory_bank_array<2> m_okibank_hi; - - // sound related - u8 m_soundbuf_wptr = 0; - u8 m_soundbuf_rptr = 0; - u8 m_soundbuf_data[32]{}; - bool m_soundbuf_empty = false; - //u8 m_sound_flag[2]{}; - - // sailormn - u8 m_sailormn_tilebank = 0; - - u8 soundflags_r(); - u16 soundflags_ack_r(); - void sound_cmd_w(u16 data); - u8 soundlatch_lo_r(); - u8 soundlatch_hi_r(); - u16 soundlatch_ack_r(); - void soundlatch_ack_w(u8 data); - - template void pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask); - u16 sailormn_input0_r(); - template void z80_rombank_w(u8 data); - template void oki1_bank_w(u8 data); - template void oki2_bank_w(u8 data); - void sailormn_eeprom_w(u8 data); - void hotdogst_eeprom_w(u8 data); - void metmqstr_eeprom_w(u8 data); - u16 pwrinst2_eeprom_r(); - void sailormn_get_banked_code(bool tiledim, u32 &color, u32 &pri, u32 &code); - DECLARE_MACHINE_RESET(sailormn); - TIMER_DEVICE_CALLBACK_MEMBER(sailormn_startup); - void sailormn_tilebank_w(int bank); - void sailormn_unpack_tiles(int chip); - void init_z80_bank(); - void init_oki_bank(int chip); - - void hotdogst_map(address_map &map); - void hotdogst_sound_map(address_map &map); - void hotdogst_sound_portmap(address_map &map); - void mazinger_map(address_map &map); - void mazinger_sound_map(address_map &map); - void mazinger_sound_portmap(address_map &map); - void metmqstr_map(address_map &map); - void metmqstr_sound_portmap(address_map &map); - void oki2_map(address_map &map); - void oki_map(address_map &map); - void pwrinst2_map(address_map &map); - void pwrinst2_sound_map(address_map &map); - void pwrinst2_sound_portmap(address_map &map); - void sailormn_map(address_map &map); - void sailormn_sound_map(address_map &map); - void sailormn_sound_portmap(address_map &map); -}; - -// with 3 screens -class ppsatan_state : public cave_state -{ -public: - ppsatan_state(const machine_config &mconfig, device_type type, const char *tag) - : cave_state(mconfig, type, tag) - , m_int_timer_left(*this, "int_timer_left") - , m_int_timer_right(*this, "int_timer_right") - , m_touch_x(*this, "TOUCH%u_X", 1U) - , m_touch_y(*this, "TOUCH%u_Y", 1U) - {} - - void init_ppsatan(); - - void ppsatan(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void video_start() override; - -private: - required_device m_int_timer_left; - required_device m_int_timer_right; - required_ioport_array<2> m_touch_x; - required_ioport_array<2> m_touch_y; - - // ppsatan - u16 m_ppsatan_io_mux = 0U; - - void ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask); - void ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask); - template u16 ppsatan_touch_r(); - void ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask); - - INTERRUPT_GEN_MEMBER(interrupt_ppsatan); - u32 screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip); - u32 screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - u32 screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - u32 screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - void ppsatan_map(address_map &map); -}; - -#endif // MAME_MISC_CAVE_H diff -Nru mame-0.263+dfsg.1/src/mame/misc/cave_v.cpp mame-0.264+dfsg.1/src/mame/misc/cave_v.cpp --- mame-0.263+dfsg.1/src/mame/misc/cave_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/cave_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1445 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia -/*************************************************************************** - - -= Cave Hardware =- - - driver by Luca Elia (l.elia@tin.it) - - -Note: if MAME_DEBUG is defined, pressing: - - X/C/V/B/Z with Q shows layer 0 (tiles with priority 0/1/2/3/All) - X/C/V/B/Z with W shows layer 1 (tiles with priority 0/1/2/3/All) - X/C/V/B/Z with E shows layer 2 (tiles with priority 0/1/2/3/All) - X/C/V/B/Z with R shows layer 3 (tiles with priority 0/1/2/3/All) - X/C/V/B/Z with A shows sprites (tiles with priority 0/1/2/3/All) - - Keys can be used together! - - [ 1 Layer per chip (games use as many as 4 chips) ] - - Layer Size: 512 x 512 - Tiles: 8 x 8 & 16 x 16. - - There are 2 tilemaps in memory, one per tiles dimension. - A bit decides which one gets displayed. - The tiles depth varies with games, from 16 to 256 colors. - - A per layer row-scroll / row-select effect can be enabled: - - a different scroll value is fetched (from tile RAM) for each - scan line, and a different tilemap line for each scan line - - [ 1024 Zooming Sprites ] - - There are 2 or 4 0x4000 Sprite RAM Areas. A hardware register's - bit selects an area to display (sprites double buffering). - - The sprites are NOT tile based: the "tile" size and start address - is selectable for each sprite with a 16 pixel granularity. - - Also note that the zoom is of a peculiar type: pixels are never - drawn more than once. So shrinking works as usual (some pixels are - just not drawn) while enlarging adds some transparent pixels to - the image, uniformly, to reach the final size. - -**************************************************************************/ - -#include "emu.h" -#include "crsshair.h" -#include "cave.h" - - -static constexpr u8 CAVE_SPRITETYPE_ZBUF = 0x01; -static constexpr u8 CAVE_SPRITETYPE_ZOOM = 0x02; - -static constexpr u8 SPRITE_FLIPX_CAVE = 0x01; -static constexpr u8 SPRITE_FLIPY_CAVE = 0x02; -static constexpr u8 SPRITE_VISIBLE_CAVE = 0x04; - - -/* Sailormn: the lower 2 Megabytes of tiles banked */ - -void cave_z80_state::sailormn_tilebank_w(int bank) -{ - if (m_sailormn_tilebank != bank) - { - m_sailormn_tilebank = bank; - m_tilemap[2]->mark_all_dirty(); - } -} - -void cave_z80_state::sailormn_get_banked_code(bool tiledim, u32 &color, u32 &pri, u32 &code) -{ - if (!tiledim) - { - if ((code < 0x10000) && (m_sailormn_tilebank)) - code += 0x40000; - } -} - - -/*************************************************************************** - - Video Init Routines - - Depending on the game, there can be from 1 to 4 layers and the - tile sizes can be 8x8 or 16x16. - -***************************************************************************/ - -void cave_state::vh_start(u16 sprcol_granularity) -{ - m_sprite_granularity = sprcol_granularity; - - sprite_init(); - - m_layers_offs_x = 0x13; - m_layers_offs_y = -0x12; - - m_row_effect_offs_n = -1; - m_row_effect_offs_f = 1; - - m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() + - (m_gfxdecode[0]->gfx(0)->colors() - 1) * - m_gfxdecode[0]->gfx(0)->granularity(); - - switch (m_kludge) - { - case 1: /* sailormn */ - m_row_effect_offs_n = -1; - m_row_effect_offs_f = -1; - break; - case 2: /* uopoko dfeveron */ - m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); - break; - case 4: /* pwrinst2 */ - m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); - m_layers_offs_y++; - break; - } -} - -// 4 bit sprite granularity -VIDEO_START_MEMBER(cave_state,spr_4bpp) -{ - vh_start(16); -} - -// 8 bit sprite granularity -VIDEO_START_MEMBER(cave_state,spr_8bpp) -{ - vh_start(256); -} - -// ppsatan (3 screen) -void ppsatan_state::video_start() -{ - vh_start(16); - for (int chip = 1; chip < 3; chip++) - { - m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() + - (m_gfxdecode[chip]->gfx(0)->colors() - 1) * - m_gfxdecode[chip]->gfx(0)->granularity(); - - switch (m_kludge) - { - case 2: /* uopoko dfeveron */ - case 4: /* pwrinst2 */ - m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() - m_gfxdecode[chip]->gfx(0)->granularity(); - break; - } - } -} - -/*************************************************************************** - - Zoomed Sprites Drawing - - Sprite format with zoom, 16 bytes per each sprites - - Offset: Bits: Value: - - 00.w X Position* - - 02.w Y Position* - - 04.w fe-- ---- ---- ---- - --dc ba98 ---- ---- Color - ---- ---- 76-- ---- - ---- ---- --54 ---- Priority - ---- ---- ---- 3--- Flip X - ---- ---- ---- -2-- Flip Y - ---- ---- ---- --10 Code High Bit(s?) - - 06.w Code Low Bits - - 08/0A.w Zoom X / Y - - 0C.w fedc ba98 ---- ---- Tile Size X - ---- ---- 7654 3210 Tile Size Y - - 0E.w Unused - - * S.9.6 Fixed point or 10 bit signed integer, - Configured from videoregs - - - Sprites Drawing - - Sprite format without zoom, 16 bytes per each sprites - - Offset: Bits: Value: - - 00.w fe-- ---- ---- ---- - --dc ba98 ---- ---- Color - ---- ---- 76-- ---- - ---- ---- --54 ---- Priority - ---- ---- ---- 3--- Flip X - ---- ---- ---- -2-- Flip Y - ---- ---- ---- --10 Code High Bit(s?) - - 02.w Code Low Bits - - 04.w fedc ba-- ---- ---- - ---- --98 7654 3210 X Position** - - 06.w fedc ba-- ---- ---- - ---- --98 7654 3210 Y Position** - - 08.w fedc ba98 ---- ---- Tile Size X - ---- ---- 7654 3210 Tile Size Y - - 0A.w Unused - - 0C.w Unused - - 0E.w Unused - - ** 10 bit signed only? need verifications. - -***************************************************************************/ - -void cave_state::get_sprite_info_cave(int chip) -{ - chip %= 4; - - if (m_sprite[chip] == nullptr) - return; - - gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); - sprite_cave *sprite = m_sprite[chip].get(); - - const int glob_flipx = m_videoregs[chip][0] & 0x8000; - const int glob_flipy = m_videoregs[chip][1] & 0x8000; - - const int max_x = m_screen[chip]->width(); - const int max_y = m_screen[chip]->height(); - - const u16 *source = &m_spriteram[chip][(0x4000 / 2) * m_spriteram_bank[chip]]; - const u16 *finish = source + (0x4000 / 2); - u32 clk = 0; // used clock cycle for sprites - - for (; source < finish; source += 8) - { - clk += 32; // 32 clock per each sprites - if (clk > m_max_sprite_clk[chip]) - break; - - int x, y; - int total_width_f, total_height_f; - - if ((m_videoregs[chip][5] & 0x3000) == 0) // if bit 12/13 is 0 (or separated per X and Y?) - { - x = (source[0] & 0x3ff) << 8; - y = (source[1] & 0x3ff) << 8; - } - else - { - x = source[0] << 2; - y = source[1] << 2; - } - const u16 attr = source[2]; - u32 code = source[3] + ((attr & 3) << 16); - int zoomx = source[4]; - int zoomy = source[5]; - const u16 size = source[6]; - - sprite->tile_width = ((size >> 8) & 0x1f) * 16; - sprite->tile_height = ((size >> 0) & 0x1f) * 16; - - if (!sprite->tile_width || !sprite->tile_height) - continue; - - clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks - if (clk > m_max_sprite_clk[chip]) - break; - - /* Bound checking */ - sprite->pen_data = &m_sprite_gfx[chip][(code << 8) & m_sprite_gfx_mask[chip]]; - - int flipx = attr & 0x0008; - int flipy = attr & 0x0004; - - sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 0x100; - sprite->total_height = (total_height_f = sprite->tile_height * zoomy) / 0x100; - - if (sprite->total_width <= 1) - { - sprite->total_width = 1; - sprite->zoomx_re = sprite->tile_width << 16; - sprite->xcount0 = sprite->zoomx_re / 2; - x -= 0x80; - } - else - { - sprite->zoomx_re = 0x1000000 / zoomx; - sprite->xcount0 = sprite->zoomx_re - 1; - } - - if (sprite->total_height <= 1) - { - sprite->total_height = 1; - sprite->zoomy_re = sprite->tile_height << 16; - sprite->ycount0 = sprite->zoomy_re / 2; - y -= 0x80; - } - else - { - sprite->zoomy_re = 0x1000000 / zoomy; - sprite->ycount0 = sprite->zoomy_re - 1; - } - - if ((m_videoregs[chip][5] & 0x3000) == 0) - { - x >>= 8; - y >>= 8; - if (flipx && (zoomx != 0x100)) x += sprite->tile_width - sprite->total_width; - if (flipy && (zoomy != 0x100)) y += sprite->tile_height - sprite->total_height; - } - else - { - if (flipx && (zoomx != 0x100)) x += (sprite->tile_width << 8) - total_width_f - 0x80; - if (flipy && (zoomy != 0x100)) y += (sprite->tile_height << 8) - total_height_f - 0x80; - x >>= 8; - y >>= 8; - } - - if (x > 0x1ff) x -= 0x400; - if (y > 0x1ff) y -= 0x400; - - if (x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) - {continue;} - - sprite->priority = (attr & 0x0030) >> 4; - sprite->flags = SPRITE_VISIBLE_CAVE; - sprite->line_offset = sprite->tile_width; - sprite->base_pen = gfx->colorbase() + (((attr & 0x3f00) >> 8) * gfx->granularity()); // first 0x4000 colors - - if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } - if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } - - sprite->x = x; - sprite->y = y; - - if (flipx) sprite->flags |= SPRITE_FLIPX_CAVE; - if (flipy) sprite->flags |= SPRITE_FLIPY_CAVE; - - sprite++; - } - m_num_sprites[chip] = sprite - m_sprite[chip].get(); -} - -void cave_state::get_sprite_info_donpachi(int chip) -{ - chip %= 4; - - if (m_sprite[chip] == nullptr) - return; - - gfx_element *gfx = m_spr_gfxdecode[chip]->gfx(0); - sprite_cave *sprite = m_sprite[chip].get(); - - const int glob_flipx = m_videoregs[chip][0] & 0x8000; - const int glob_flipy = m_videoregs[chip][1] & 0x8000; - - const int max_x = m_screen[chip]->width(); - const int max_y = m_screen[chip]->height(); - - const u16 *source = &m_spriteram[chip][(0x4000 / 2) * m_spriteram_bank[chip]]; - const u16 *finish = source + (0x4000 / 2); - u32 clk = 0; // used clock cycle for sprites - - for (; source < finish; source += 8) - { - clk += 32; // 32 clock per each sprites - if (clk > m_max_sprite_clk[chip]) - break; - - int y; - - const u16 attr = source[0]; - u32 code = source[1] + ((attr & 3) << 16); - int x = source[2] & 0x3ff; - - if (m_spritetype[0] & TYPE_ISPWRINST2) /* pwrinst2 */ - y = (source[3] + 1) & 0x3ff; - else - y = source[3] & 0x3ff; - - const u16 size = source[4]; - - sprite->tile_width = sprite->total_width = ((size >> 8) & 0x1f) * 16; - sprite->tile_height = sprite->total_height = ((size >> 0) & 0x1f) * 16; - - /* Bound checking */ - sprite->pen_data = &m_sprite_gfx[chip][(code << 8) & m_sprite_gfx_mask[chip]]; - - if (x > 0x1ff) x -= 0x400; - if (y > 0x1ff) y -= 0x400; - - if (!sprite->tile_width || !sprite->tile_height || - x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) - {continue;} - - clk += sprite->tile_width * sprite->tile_height; // 256 clock per each sprite blocks - if (clk > m_max_sprite_clk[chip]) - break; - - int flipx = attr & 0x0008; - int flipy = attr & 0x0004; - - if (m_spritetype[0] & TYPE_ISPWRINST2) /* pwrinst2 */ - { - sprite->priority = ((attr & 0x0010) >> 4) + 2; - sprite->base_pen = gfx->colorbase() + ((((attr & 0x3f00) >> 8) + ((attr & 0x0020) << 1)) * gfx->granularity()); - } - else - { - sprite->priority = (attr & 0x0030) >> 4; - sprite->base_pen = gfx->colorbase() + (((attr & 0x3f00) >> 8) * gfx->granularity()); // first 0x4000 colors - } - - sprite->flags = SPRITE_VISIBLE_CAVE; - sprite->line_offset = sprite->tile_width; - - if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } - if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } - - sprite->x = x; - sprite->y = y; - - if (flipx) sprite->flags |= SPRITE_FLIPX_CAVE; - if (flipy) sprite->flags |= SPRITE_FLIPY_CAVE; - - sprite++; - } - m_num_sprites[chip] = sprite - m_sprite[chip].get(); -} - - -void cave_state::sprite_init() -{ - if ((m_spritetype[0] & TYPE_NOZOOM) == 0) // most of the games - { - m_get_sprite_info = &cave_state::get_sprite_info_cave; - m_spritetype[1] = CAVE_SPRITETYPE_ZOOM; - } - else // donpachi ddonpach - { - m_get_sprite_info = &cave_state::get_sprite_info_donpachi; - m_spritetype[1] = 0; - } - - m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; - for (int screen = 0; screen < 4; screen++) - { - if (m_screen[screen]) - { - m_screen[screen]->register_screen_bitmap(m_sprite_zbuf[screen]); - - save_item(NAME(m_sprite_zbuf[screen]), screen); - } - } - - for (int chip = 0; chip < 4; chip++) - { - m_max_sprite_clk[chip] = 0; - if (m_videoregs[chip] && m_spr_gfxdecode[chip]) - { - for (int screen = 0; screen < 4; screen++) - { - if (m_screen[screen]) - { - const u32 new_clk = (m_screen[screen]->visible_area().width() > 360 ? 512 : 448) * 272 * 2; // whole screen size related? - if (m_max_sprite_clk[chip] < new_clk) - { - m_max_sprite_clk[chip] = new_clk; - } - } - } - m_num_sprites[chip] = m_spriteram[chip].bytes() / 0x10 / 2; - m_sprite[chip] = std::make_unique(m_num_sprites[chip]); - m_spr_gfxdecode[chip]->gfx(0)->set_granularity(m_sprite_granularity); - } - else - { - m_num_sprites[chip] = 0; - m_sprite[chip] = nullptr; - } - for (auto &prio : m_sprite_table[chip]) - for (sprite_cave *&spr : prio) - spr = nullptr; - m_spriteram_bank[chip] = m_spriteram_bank_delay[chip] = 0; - } - - m_sprite_draw = &cave_state::sprite_draw_donpachi; - - save_item(NAME(m_sprite_zbuf_baseval)); - save_item(NAME(m_num_sprites)); - save_item(NAME(m_spriteram_bank)); - save_item(NAME(m_spriteram_bank_delay)); - - save_item(NAME(m_blit.clip_left)); - save_item(NAME(m_blit.clip_right)); - save_item(NAME(m_blit.clip_top)); - save_item(NAME(m_blit.clip_bottom)); -} - -void cave_state::sprite_check(int chip, int screen_no, screen_device &screen, const rectangle &clip) -{ - if (m_sprite[chip] == nullptr) - return; - - { /* set clip */ - const int left = clip.min_x; - const int top = clip.min_y; - const int right = clip.max_x + 1; - const int bottom = clip.max_y + 1; - - m_blit.clip_left = left; - m_blit.clip_top = top; - m_blit.clip_right = right; - m_blit.clip_bottom = bottom; - } - - { /* check priority & sprite type */ - sprite_cave *sprite = m_sprite[chip].get(); - const sprite_cave *const finish = &sprite[m_num_sprites[chip]]; - int i[4] = {0,0,0,0}; - int priority_check = 0; - int spritetype = m_spritetype[1]; - const rectangle &visarea = screen.visible_area(); - - while (sprite < finish) - { - if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right && - sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom ) - { - m_sprite_table[chip][sprite->priority][i[sprite->priority]++] = sprite; - - if (!(spritetype & CAVE_SPRITETYPE_ZBUF)) - { - if (priority_check > sprite->priority) - spritetype |= CAVE_SPRITETYPE_ZBUF; - else - priority_check = sprite->priority; - } - } - sprite++; - } - - m_sprite_table[chip][0][i[0]] = nullptr; - m_sprite_table[chip][1][i[1]] = nullptr; - m_sprite_table[chip][2][i[2]] = nullptr; - m_sprite_table[chip][3][i[3]] = nullptr; - - switch (spritetype) - { - case CAVE_SPRITETYPE_ZOOM: - m_sprite_draw = &cave_state::sprite_draw_cave; - break; - - case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF: - m_sprite_draw = &cave_state::sprite_draw_cave_zbuf; - if (clip.min_y == visarea.min_y) - { - if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - m_sprite_zbuf[screen_no].fill(0, visarea); - } - break; - - case CAVE_SPRITETYPE_ZBUF: - m_sprite_draw = &cave_state::sprite_draw_donpachi_zbuf; - if (clip.min_y == visarea.min_y) - { - if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - m_sprite_zbuf[screen_no].fill(0, visarea); - } - break; - - default: - case 0: - m_sprite_draw = &cave_state::sprite_draw_donpachi; - } - } -} - -void cave_state::do_blit_zoom32(int chip, const sprite_cave *sprite) -{ - /* assumes SPRITE_LIST_RAW_DATA flag is set */ - int x1, x2, y1, y2, dx, dy; - int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; - - if (sprite->flags & SPRITE_FLIPX_CAVE) - { - x2 = sprite->x; - x1 = x2 + sprite->total_width; - dx = -1; - if (x2 < m_blit.clip_left) - x2 = m_blit.clip_left; - - if (x1 > m_blit.clip_right) - { - xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; - x1 = m_blit.clip_right; - while ((xcount0 & 0xffff) >= sprite->zoomx_re) - { - xcount0 += sprite->zoomx_re; - x1--; - } - } - - if (x2 >= x1) - return; - x1--; x2--; - } - else - { - x1 = sprite->x; - x2 = x1 + sprite->total_width; - dx = 1; - if (x1 < m_blit.clip_left) - { - xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; - x1 = m_blit.clip_left; - while ((xcount0 & 0xffff) >= sprite->zoomx_re) - { - xcount0 += sprite->zoomx_re; - x1++; - } - } - if (x2 > m_blit.clip_right) - x2 = m_blit.clip_right; - if (x1 >= x2) - return; - } - - if (sprite->flags & SPRITE_FLIPY_CAVE) - { - y2 = sprite->y; - y1 = y2 + sprite->total_height; - dy = -1; - if (y2 < m_blit.clip_top) - y2 = m_blit.clip_top; - if (y1 > m_blit.clip_bottom) - { - ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; - y1 = m_blit.clip_bottom; - while ((ycount0 & 0xffff) >= sprite->zoomy_re) - { - ycount0 += sprite->zoomy_re; - y1--; - } - } - if (y2 >= y1) - return; - y1--; y2--; - } - else - { - y1 = sprite->y; - y2 = y1 + sprite->total_height; - dy = 1; - if (y1 < m_blit.clip_top) - { - ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; - y1 = m_blit.clip_top; - while ((ycount0 & 0xffff) >= sprite->zoomy_re) - { - ycount0 += sprite->zoomy_re; - y1++; - } - } - if (y2 > m_blit.clip_bottom) - y2 = m_blit.clip_bottom; - if (y1 >= y2) - return; - } - - { - const u8 *pen_data = sprite->pen_data -1 -sprite->line_offset; - const pen_t base_pen = sprite->base_pen; - const int pitch = m_blit.line_offset * dy / 4; - u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); - int ycount = ycount0; - - for (int y = y1; y != y2; y += dy) - { - if (ycount & 0xffff0000) - { - int xcount = xcount0; - pen_data += sprite->line_offset * (ycount >> 16); - ycount &= 0xffff; - const u8 *source = pen_data; - for (int x = x1; x != x2; x += dx) - { - if (xcount & 0xffff0000) - { - source += xcount >> 16; - xcount &= 0xffff; - const u8 pen = *source; - if (pen) - dest[x] = m_palette[chip]->pen_color(base_pen + pen); - } - xcount += sprite->zoomx_re; - } - } - ycount += sprite->zoomy_re; - dest += pitch; - } - } -} - - -void cave_state::do_blit_zoom32_zb(int chip, const sprite_cave *sprite) -{ - /* assumes SPRITE_LIST_RAW_DATA flag is set */ - int x1, x2, y1, y2, dx, dy; - int xcount0 = 0x10000 + sprite->xcount0, ycount0 = 0x10000 + sprite->ycount0; - - if (sprite->flags & SPRITE_FLIPX_CAVE) - { - x2 = sprite->x; - x1 = x2 + sprite->total_width; - dx = -1; - if (x2 < m_blit.clip_left) - x2 = m_blit.clip_left; - if (x1 > m_blit.clip_right) - { - xcount0 += (x1 - m_blit.clip_right) * sprite->zoomx_re; - x1 = m_blit.clip_right; - while ((xcount0 & 0xffff) >= sprite->zoomx_re) - { - xcount0 += sprite->zoomx_re; - x1--; - } - } - if (x2 >= x1) - return; - x1--; x2--; - } - else - { - x1 = sprite->x; - x2 = x1 + sprite->total_width; - dx = 1; - if (x1 < m_blit.clip_left) - { - xcount0 += (m_blit.clip_left - x1) * sprite->zoomx_re; - x1 = m_blit.clip_left; - while ((xcount0 & 0xffff) >= sprite->zoomx_re) - { - xcount0 += sprite->zoomx_re; - x1++; - } - } - if (x2 > m_blit.clip_right) - x2 = m_blit.clip_right; - if (x1 >= x2) - return; - } - if (sprite->flags & SPRITE_FLIPY_CAVE) - { - y2 = sprite->y; - y1 = y2 + sprite->total_height; - dy = -1; - if (y2 < m_blit.clip_top) - y2 = m_blit.clip_top; - if (y1 > m_blit.clip_bottom) - { - ycount0 += (y1 - m_blit.clip_bottom) * sprite->zoomy_re; - y1 = m_blit.clip_bottom; - while ((ycount0 & 0xffff) >= sprite->zoomy_re) - { - ycount0 += sprite->zoomy_re; - y1--; - } - } - if (y2 >= y1) - return; - y1--; y2--; - } - else - { - y1 = sprite->y; - y2 = y1 + sprite->total_height; - dy = 1; - if (y1 < m_blit.clip_top) - { - ycount0 += (m_blit.clip_top - y1) * sprite->zoomy_re; - y1 = m_blit.clip_top; - while ((ycount0 & 0xffff) >= sprite->zoomy_re) - { - ycount0 += sprite->zoomy_re; - y1++; - } - } - if (y2 > m_blit.clip_bottom) - y2 = m_blit.clip_bottom; - if (y1 >= y2) - return; - } - - { - const u8 *pen_data = sprite->pen_data - 1 - sprite->line_offset; - const pen_t base_pen = sprite->base_pen; - const int pitch = m_blit.line_offset * dy / 4; - u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); - const int pitchz = m_blit.line_offset_zbuf * dy / 2; - u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); - const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; - int ycount = ycount0; - - for (int y = y1; y != y2; y += dy) - { - if (ycount & 0xffff0000) - { - int xcount = xcount0; - pen_data += sprite->line_offset * (ycount >> 16); - ycount &= 0xffff; - const u8 *source = pen_data; - for (int x = x1; x != x2; x += dx) - { - if (xcount & 0xffff0000) - { - source += xcount >> 16; - xcount &= 0xffff; - const u8 pen = *source; - if (pen && (zbf[x] <= pri_sp)) - { - dest[x] = m_palette[chip]->pen_color(base_pen + pen); - zbf[x] = pri_sp; - } - } - xcount += sprite->zoomx_re; - } - } - ycount += sprite->zoomy_re; - dest += pitch; - zbf += pitchz; - } - } -} - -void cave_state::do_blit_32(int chip, const sprite_cave *sprite) -{ - /* assumes SPRITE_LIST_RAW_DATA flag is set */ - int x1, x2, y1, y2, dx, dy; - int xcount0 = 0, ycount0 = 0; - - if (sprite->flags & SPRITE_FLIPX_CAVE) - { - x2 = sprite->x; - x1 = x2 + sprite->total_width; - dx = -1; - if (x2 < m_blit.clip_left) - x2 = m_blit.clip_left; - if (x1 > m_blit.clip_right) - { - xcount0 = x1 - m_blit.clip_right; - x1 = m_blit.clip_right; - } - if (x2 >= x1) - return; - x1--; x2--; - } - else - { - x1 = sprite->x; - x2 = x1 + sprite->total_width; - dx = 1; - if (x1 < m_blit.clip_left) - { - xcount0 = m_blit.clip_left - x1; - x1 = m_blit.clip_left; - } - if (x2 > m_blit.clip_right) - x2 = m_blit.clip_right; - if (x1 >= x2) - return; - } - if (sprite->flags & SPRITE_FLIPY_CAVE) - { - y2 = sprite->y; - y1 = y2 + sprite->total_height; - dy = -1; - if (y2 < m_blit.clip_top) - y2 = m_blit.clip_top; - if (y1 > m_blit.clip_bottom) - { - ycount0 = y1 - m_blit.clip_bottom; - y1 = m_blit.clip_bottom; - } - if (y2 >= y1) - return; - y1--; y2--; - } - else - { - y1 = sprite->y; - y2 = y1 + sprite->total_height; - dy = 1; - if (y1 < m_blit.clip_top) - { - ycount0 = m_blit.clip_top - y1; - y1 = m_blit.clip_top; - } - if (y2 > m_blit.clip_bottom) - y2 = m_blit.clip_bottom; - if (y1 >= y2) - return; - } - - { - const u8 *pen_data = sprite->pen_data; - const pen_t base_pen = sprite->base_pen; - const int pitch = m_blit.line_offset * dy / 4; - u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); - - pen_data += sprite->line_offset * ycount0 + xcount0; - for (int y = y1; y != y2; y += dy) - { - const u8 *source = pen_data; - for (int x = x1; x != x2; x += dx) - { - const u8 pen = *source; - if (pen) - dest[x] = m_palette[chip]->pen_color(base_pen + pen); - source++; - } - pen_data += sprite->line_offset; - dest += pitch; - } - } -} - - -void cave_state::do_blit_32_zb(int chip, const sprite_cave *sprite) -{ - /* assumes SPRITE_LIST_RAW_DATA flag is set */ - int x1, x2, y1, y2, dx, dy; - int xcount0 = 0, ycount0 = 0; - - if (sprite->flags & SPRITE_FLIPX_CAVE) - { - x2 = sprite->x; - x1 = x2 + sprite->total_width; - dx = -1; - if (x2 < m_blit.clip_left) - x2 = m_blit.clip_left; - if (x1 > m_blit.clip_right) - { - xcount0 = x1 - m_blit.clip_right; - x1 = m_blit.clip_right; - } - if (x2 >= x1) - return; - x1--; x2--; - } - else - { - x1 = sprite->x; - x2 = x1 + sprite->total_width; - dx = 1; - if (x1 < m_blit.clip_left) - { - xcount0 = m_blit.clip_left - x1; - x1 = m_blit.clip_left; - } - if (x2 > m_blit.clip_right) - x2 = m_blit.clip_right; - if (x1 >= x2) - return; - } - if (sprite->flags & SPRITE_FLIPY_CAVE) - { - y2 = sprite->y; - y1 = y2 + sprite->total_height; - dy = -1; - if (y2 < m_blit.clip_top) - y2 = m_blit.clip_top; - if (y1 > m_blit.clip_bottom) - { - ycount0 = y1 - m_blit.clip_bottom; - y1 = m_blit.clip_bottom; - } - if (y2 >= y1) - return; - y1--; y2--; - } - else - { - y1 = sprite->y; - y2 = y1 + sprite->total_height; - dy = 1; - if (y1 < m_blit.clip_top) - { - ycount0 = m_blit.clip_top - y1; - y1 = m_blit.clip_top; - } - if (y2 > m_blit.clip_bottom) - y2 = m_blit.clip_bottom; - if (y1 >= y2) - return; - } - - { - const u8 *pen_data = sprite->pen_data; - const pen_t base_pen = sprite->base_pen; - const int pitch = m_blit.line_offset * dy / 4; - u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); - const int pitchz = m_blit.line_offset_zbuf * dy / 2; - u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); - const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; - - pen_data += sprite->line_offset * ycount0 + xcount0; - for (int y = y1; y != y2; y += dy) - { - const u8 *source; - source = pen_data; - for (int x = x1; x != x2; x += dx) - { - const u8 pen = *source; - if (pen && (zbf[x] <= pri_sp)) - { - dest[x] = m_palette[chip]->pen_color(base_pen + pen); - zbf[x] = pri_sp; - } - source++; - } - pen_data += sprite->line_offset; - dest += pitch; - zbf += pitchz; - } - } -} - - -void cave_state::sprite_draw_cave(int chip, int priority) -{ - if (m_sprite[chip] == nullptr) - return; - - int i = 0; - while (m_sprite_table[chip][priority][i]) - { - const sprite_cave *sprite = m_sprite_table[chip][priority][i++]; - if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) - do_blit_32(chip, sprite); - else - do_blit_zoom32(chip, sprite); - } -} - -void cave_state::sprite_draw_cave_zbuf(int chip, int priority) -{ - if (m_sprite[chip] == nullptr) - return; - - int i = 0; - while (m_sprite_table[chip][priority][i]) - { - const sprite_cave *sprite = m_sprite_table[chip][priority][i++]; - if ((sprite->tile_width == sprite->total_width) && (sprite->tile_height == sprite->total_height)) - do_blit_32_zb(chip, sprite); - else - do_blit_zoom32_zb(chip, sprite); - } -} - -void cave_state::sprite_draw_donpachi(int chip, int priority) -{ - if (m_sprite[chip] == nullptr) - return; - - int i = 0; - while (m_sprite_table[chip][priority][i]) - do_blit_32(chip, m_sprite_table[chip][priority][i++]); -} - -void cave_state::sprite_draw_donpachi_zbuf(int chip, int priority) -{ - if (m_sprite[chip] == nullptr) - return; - - int i = 0; - while (m_sprite_table[chip][priority][i]) - do_blit_32_zb(chip, m_sprite_table[chip][priority][i++]); -} - - -/*************************************************************************** - - Screen Drawing - - - Layers Control Registers (vctrl_0..3) - - - Offset: Bits: Value: - - 0.w f--- ---- ---- ---- 0 = Layer Flip X - -e-- ---- ---- ---- Activate Row-scroll - --d- ---- ---- ---- - ---c ba9- ---- ---- - ---- ---8 7654 3210 Scroll X - - 2.w f--- ---- ---- ---- 0 = Layer Flip Y - -e-- ---- ---- ---- Activate Row-select - --d- ---- ---- ---- 0 = 8x8 tiles, 1 = 16x16 tiles - ---c ba9- ---- ---- - ---- ---8 7654 3210 Scroll Y - - 4.w fedc ba98 765- ---- - ---- ---- ---4 ---- Layer Disable - ---- ---- ---- 32-- - ---- ---- ---- --10 Layer Priority (decides the order - of the layers for tiles with the - same tile priority) - - - Row-scroll / row-select data is fetched from tile RAM + $1000. - - Row-select: a tilemap line is specified for each scan line. - Row-scroll: a different scroll value is specified for each scan line. - - - Sprites Registers (videoregs) - - - Offset: Bits: Value: - - 0.w f--- ---- ---- ---- Sprites Flip X - -edc ba98 7654 3210 Sprites Offset X - - 2.w f--- ---- ---- ---- Sprites Flip Y - -edc ba98 7654 3210 Sprites Offset Y - - .. - - 8.w fedc ba98 7654 32-- - ---- ---- ---- --10 Sprite RAM Bank - - There are more! - -***************************************************************************/ - -inline void cave_state::tilemap_draw(int chip, - screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, - u32 flags, u32 priority, u32 priority2, int GFX) -{ - tilemap038_device *TILEMAP = m_tilemap[GFX]; - - /* Bail out if ... */ - - if (!TILEMAP) /* no tilemap; */ - return; - - if (((TILEMAP->external() & 0x0003) != priority2) || /* tilemap's global priority not the requested one; */ - ((!TILEMAP->enable()))) /* tilemap's disabled. */ - return; - - const bool flipx = TILEMAP->flipx(); - const bool flipy = TILEMAP->flipy(); - TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); - - int offs_x = m_layers_offs_x; - const int offs_y = m_layers_offs_y; - - const int offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n; - - /* An additional 8 pixel offset for layers with 8x8 tiles. Plus - Layer 0 is displaced by 1 pixel wrt Layer 1, so is Layer 2 wrt - Layer 1 */ - if (TILEMAP == m_tilemap[0]) offs_x -= (TILEMAP->tile_is_16x16() ? 1 : (1 + 8)); - else if (TILEMAP == m_tilemap[1]) offs_x -= (TILEMAP->tile_is_16x16() ? 2 : (2 + 8)); - else if (TILEMAP == m_tilemap[2]) offs_x -= (TILEMAP->tile_is_16x16() ? 3 : (3 + 8)); - else if (TILEMAP == m_tilemap[3]) offs_x -= (TILEMAP->tile_is_16x16() ? 4 : (4 + 8)); - - const int sx = TILEMAP->scrollx() - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x); - const int sy = TILEMAP->scrolly() - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y); - - if (TILEMAP->rowselect_en()) // row-select - { - rectangle clip; - int endline, vramdata0, vramdata1; - - /* - Row-select: - - A tilemap line is specified for each scan line. This is handled - using many horizontal clipping regions (slices) and calling - tilemap_draw multiple times. - */ - - clip.min_x = cliprect.min_x; - clip.max_x = cliprect.max_x; - - for (int startline = cliprect.min_y; startline <= cliprect.max_y;) - { - /* Find the largest slice */ - vramdata0 = (vramdata1 = TILEMAP->rowselect(sy + offs_row + startline)); - for (endline = startline + 1; endline <= cliprect.max_y; endline++) - if ((++vramdata1) != TILEMAP->rowselect(sy + offs_row + endline)) break; - - TILEMAP->set_scrolly(0, vramdata0 - startline); - - if (TILEMAP->rowscroll_en()) // row-scroll, row-select - { - /* - Row-scroll: - - A different scroll value is specified for each scan line. - This is handled using tilemap->set_scroll_rows and calling - tilemap->draw just once. - */ - - TILEMAP->set_scroll_rows(512); - for (int line = startline; line < endline; line++) - TILEMAP->set_scrollx((vramdata0 - startline + line) & 511, - sx + TILEMAP->rowscroll(sy + offs_row + line)); - } - else // no row-scroll, row-select - { - TILEMAP->set_scroll_rows(1); - TILEMAP->set_scrollx(0, sx); - } - - if (flipy) - { - clip.min_y = cliprect.max_y - (endline - 1 - cliprect.min_y); - clip.max_y = cliprect.max_y - (startline - cliprect.min_y); - } - else - { - clip.min_y = startline; - clip.max_y = endline - 1; - } - - TILEMAP->draw(screen, bitmap, clip, flags, priority); - - startline = endline; - } - } - else if (TILEMAP->rowscroll_en()) // row-scroll, no row-select - { - TILEMAP->set_scroll_rows(512); - for (int line = cliprect.min_y; line <= cliprect.max_y; line++) - TILEMAP->set_scrollx((line + sy) & 511, - sx + TILEMAP->rowscroll(sy + offs_row + line)); - TILEMAP->set_scrolly(0, sy); - TILEMAP->draw(screen, bitmap, cliprect, flags, priority); - } - else - { - /* Normal scrolling */ - TILEMAP->set_scroll_rows(1); - TILEMAP->set_scroll_cols(1); - TILEMAP->set_scrollx(0, sx); - TILEMAP->set_scrolly(0, sy); - TILEMAP->draw(screen, bitmap, cliprect, flags, priority); - } -} - - -u32 cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - int layers_ctrl = -1; - - m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); - m_blit.line_offset = bitmap.rowbytes(); - m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[0].raw_pixptr(0)); - m_blit.line_offset_zbuf = m_sprite_zbuf[0].rowbytes(); - - for (int GFX = 0; GFX < 4; GFX++) - { - if (m_tilemap[GFX]) - m_tilemap[GFX]->prepare(); - } - -#ifdef MAME_DEBUG -{ - if (machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) || machine().input().code_pressed(KEYCODE_C) || - machine().input().code_pressed(KEYCODE_V) || machine().input().code_pressed(KEYCODE_B)) - { - int msk = 0, val = 0; - - if (machine().input().code_pressed(KEYCODE_X)) val = 1; // priority 0 only - if (machine().input().code_pressed(KEYCODE_C)) val = 2; // "" 1 - if (machine().input().code_pressed(KEYCODE_V)) val = 4; // "" 2 - if (machine().input().code_pressed(KEYCODE_B)) val = 8; // "" 3 - if (machine().input().code_pressed(KEYCODE_Z)) val = 1|2|4|8; // All of the above priorities - - if (machine().input().code_pressed(KEYCODE_Q)) msk |= val << 0; // for layer 0 - if (machine().input().code_pressed(KEYCODE_W)) msk |= val << 4; // for layer 1 - if (machine().input().code_pressed(KEYCODE_E)) msk |= val << 8; // for layer 2 - if (machine().input().code_pressed(KEYCODE_R)) msk |= val << 12; // for layer 3 - if (machine().input().code_pressed(KEYCODE_A)) msk |= val << 16; // for sprites - if (msk != 0) layers_ctrl &= msk; - -#if 1 - /* Show the video registers (cave_videoregs) */ - popmessage("%04X %04X %04X %04X %04X %04X %04X %04X", - m_videoregs[0][0], m_videoregs[0][1], m_videoregs[0][2], m_videoregs[0][3], - m_videoregs[0][4], m_videoregs[0][5], m_videoregs[0][6], m_videoregs[0][7]); -#endif - /* Show the scroll / flags registers of the selected layer */ - if ((m_tilemap[0]) && (msk & 0x000f)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[0]->vregs(0),m_tilemap[0]->vregs(1),m_tilemap[0]->vregs(2)); - if ((m_tilemap[1]) && (msk & 0x00f0)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[1]->vregs(0),m_tilemap[1]->vregs(1),m_tilemap[1]->vregs(2)); - if ((m_tilemap[2]) && (msk & 0x0f00)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[2]->vregs(0),m_tilemap[2]->vregs(1),m_tilemap[2]->vregs(2)); - if ((m_tilemap[3]) && (msk & 0xf000)) popmessage("x:%04X y:%04X f:%04X", m_tilemap[3]->vregs(0),m_tilemap[3]->vregs(1),m_tilemap[3]->vregs(2)); - } - - /* Show the row / "column" scroll enable flags, when they change state */ - m_rasflag = 0; - for (int GFX = 0; GFX < 4; GFX++) - { - if (m_tilemap[GFX]) - { - m_rasflag |= (m_tilemap[GFX]->vregs(0) & 0x4000) ? 0x0001 << (4*GFX) : 0; - m_rasflag |= (m_tilemap[GFX]->vregs(1) & 0x4000) ? 0x0002 << (4*GFX) : 0; - } - } - - if (m_rasflag != m_old_rasflag) - { - popmessage("Line Effect: 0:%c%c 1:%c%c 2:%c%c 3:%c%c", - (m_rasflag & 0x0001) ? 'x' : ' ', (m_rasflag & 0x0002) ? 'y' : ' ', - (m_rasflag & 0x0010) ? 'x' : ' ', (m_rasflag & 0x0020) ? 'y' : ' ', - (m_rasflag & 0x0100) ? 'x' : ' ', (m_rasflag & 0x0200) ? 'y' : ' ', - (m_rasflag & 0x1000) ? 'x' : ' ', (m_rasflag & 0x2000) ? 'y' : ' '); - m_old_rasflag = m_rasflag; - } -} -#endif - - sprite_check(0, 0, screen, cliprect); - - bitmap.fill(m_palette[0]->pen_color(m_background_pen[0]), cliprect); - - /* - Tiles and sprites are ordered by priority (0 back, 3 front) with - sprites going below tiles of their same priority. - - Sprites with the same priority are ordered by their place in - sprite RAM (last sprite is the frontmost). - - Tiles with the same priority are ordered by the priority of their layer. - - Tiles with the same priority *and* the same priority of their layer - are ordered by layer (0 back, 2 front) - */ - for (int pri = 0; pri <= 3; pri++) // tile / sprite priority - { - if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(0, pri); - - for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer - { - if (layers_ctrl & (1 << (pri + 0))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 0); - if (layers_ctrl & (1 << (pri + 4))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 1); - if (layers_ctrl & (1 << (pri + 8))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 2); - if (layers_ctrl & (1 << (pri + 12))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 3); - } - } - return 0; -} - - - -/**************************************************************/ - -void cave_state::get_sprite_info(int chip) -{ - if (m_videoregs[chip] == nullptr) - return; - - const int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; - - if (m_kludge == 3) /* mazinger metmqstr */ - { - if (machine().video().skip_this_frame() == 0) - { - m_spriteram_bank[chip] = m_spriteram_bank_delay[chip]; - (this->*m_get_sprite_info)(chip); - } - m_spriteram_bank_delay[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; - } - else - { - if (machine().video().skip_this_frame() == 0) - { - m_spriteram_bank[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; - (this->*m_get_sprite_info)(chip); - } - } -} - -void cave_state::device_post_load() -{ - for (int chip = 0; chip < 4; chip++) - get_sprite_info(chip); -} - - -// Poka Poka Satan: 3 screens * (1 Sprite chip + 1 Tilemap chip) - -u32 ppsatan_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip) -{ - m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); - m_blit.line_offset = bitmap.rowbytes(); - m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[chip].raw_pixptr(0)); - m_blit.line_offset_zbuf = m_sprite_zbuf[chip].rowbytes(); - - m_tilemap[chip]->prepare(); - - sprite_check(chip, chip, screen, cliprect); - - bitmap.fill(m_palette[chip]->pen_color(m_background_pen[chip]), cliprect); - - for (int pri = 0; pri <= 3; pri++) // tile / sprite priority - { - (this->*m_sprite_draw)(chip, pri); - - for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer - tilemap_draw(chip, screen, bitmap, cliprect, pri, 0, pri2, chip); - } - - return 0; -} - -u32 ppsatan_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - return screen_update_ppsatan_core(screen, bitmap, cliprect, 0); -} -u32 ppsatan_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - machine().crosshair().get_crosshair(1).set_screen(&screen); - return screen_update_ppsatan_core(screen, bitmap, cliprect, 1); -} -u32 ppsatan_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - machine().crosshair().get_crosshair(0).set_screen(&screen); - return screen_update_ppsatan_core(screen, bitmap, cliprect, 2); -} diff -Nru mame-0.263+dfsg.1/src/mame/misc/cavepc.cpp mame-0.264+dfsg.1/src/mame/misc/cavepc.cpp --- mame-0.263+dfsg.1/src/mame/misc/cavepc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/cavepc.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,157 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/************************************************************************************************** - - CAVE PC hardware - placeholder file for information - -TODO: -- Cannot continue without a proper Athlon 64 X2 core (uses lots of unsupported RDMSR / WRMSR) - -*************************************************************************************************** - - Cave used a one-off PC platform for - - Deathsmiles II (c)2009 - - According to - http://forum.arcadeotaku.com/viewtopic.php?f=26&t=9851 - It uses a ASUS M3A78-EM motherboard (boot screen is shown) - http://www.asus.com/Motherboards/M3A78EM/ - - fitted with - AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache - 2048MB (2GB) 800MHz DDR - - and a custom JVS I/O board providing security etc. - 'CV2000XP Rev 2.0' - - The game is contained on a - Transcend 2GB 300x UDMA Compact Flash Card - plugged into an adapter board - with 'Windows(r) Embedded Standard' - - There don't appear to be any dedicated video / sound boards so it - presumably uses the onboard capabilities of the board - 'Integrated ATI Radeon(tm) HD 3200 GPU' - 'Realtek(r) ALC1200 8 -Channel High Definition Audio CODEC' - - There should be at least 3 game revisions? - - Pictures of the hardware can be seen at - http://ikotsu.blogspot.co.uk/2010/03/deathsmiles-ii-pos-arcade-pc.html - however this revision is using a Gigabyte motherboard instead, possibly - different boards were used? - appears to be this one - http://www.gigabyte.com/products/product-page.aspx?pid=3016#ov - GA-MA78GPM-UD2H (rev. 1.0) - - The JVS board is said to be quite problematic, and the game will boot - to an error screen if it isn't functioning correctly. - http://forum.arcadeotaku.com/viewtopic.php?f=26&t=14850&start=60 - -*/ - - -#include "emu.h" -#include "cpu/i386/i386.h" -#include "machine/pci.h" - - -namespace { - -class cavepc_state : public driver_device -{ -public: - cavepc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - { } - - - void cavepc(machine_config &config); - -private: - required_device m_maincpu; - void cavepc_io(address_map &map); - void cavepc_map(address_map &map); -}; - -/*****************************************************************************/ - -void cavepc_state::cavepc_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000e0000, 0x000fffff).rom().region("bios", 0xe0000); - map(0xfff00000, 0xffffffff).rom().region("bios", 0); -} - -void cavepc_state::cavepc_io(address_map &map) -{ -} - -/*****************************************************************************/ - - -static INPUT_PORTS_START(cavepc) -INPUT_PORTS_END - - -void cavepc_state::cavepc(machine_config &config) -{ - PENTIUM3(config, m_maincpu, 200'000'000); /* AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache ! */ - m_maincpu->set_addrmap(AS_PROGRAM, &cavepc_state::cavepc_map); - m_maincpu->set_addrmap(AS_IO, &cavepc_state::cavepc_io); - - PCI_ROOT(config, "pci", 0); - // ... -} - - -/*****************************************************************************/ - -/* - -Deathshmiles II (2009/10/14 MASTER VER 4.00) - -CAVE's venture into PC based hardware platforms. The game did not -sell that well and was plagued by BSODs and hardware issues. The -motherboard bios version that shipped out with the game is F2 on -a Gigabyte GA-MA78GPM-UD2H board -( http://www.gigabyte.com/products/product-page.aspx?pid=3016#ov ) - -The following versions are known to have existed. - -1.00 - released 2009/05/14 -2.00 -3.00 - sometimes scrolls the text "2ND UPDATE MASTER VER 3.00" at - the bottom of the title screen - -The archive contains the following: - -./images, documentaiton -./cf_card_2gb, a dd image of the 2GB CF FLASH card -./usb_drive, the game is updated using a USB drive and will not - start if it is not present -./motherboard manual -./motherboard bios download version F2 - -*/ - -ROM_START(deathsm2) - ROM_REGION32_LE(0x100000, "bios", 0) - ROM_LOAD( "ma78gu2h.f2", 0x000000, 0x100000, CRC(c85742c4) SHA1(9e2a4b4a2137d1a19bf4cce20a3e2642fc6c6e05) ) - - DISK_REGION( "cfcard" ) - DISK_IMAGE( "ds2_4.0", 0, SHA1(111c2c7a3b987d47f4b6666a8ba9c5d9552b9653) ) - - DISK_REGION( "usb" ) // the USB stick used to upgrade the game to Version 4.00 MUST be present for it to run once upgraded - DISK_IMAGE( "cave_ds2_usb", 0, SHA1(b601985c7f6e6a20b0b7999167b7ccdd12ab80d0) ) -ROM_END - -} // anonymous namespace - - -/*****************************************************************************/ - -GAME(2009, deathsm2, 0, cavepc, cavepc, cavepc_state, empty_init, ROT0, "Cave", "Deathsmiles II: Makai no Merry Christmas (2009/10/14 MASTER VER 4.00)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/chicago.cpp mame-0.264+dfsg.1/src/mame/misc/chicago.cpp --- mame-0.263+dfsg.1/src/mame/misc/chicago.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/chicago.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -147,4 +147,4 @@ } // anonymous namespace -GAME( 1976, dmodrbcc, 0, chicago, 0, chicago_state, empty_init, ROT0, "Chicago Coin", "Demolition Derby [TTL]", MACHINE_IS_SKELETON ) +GAME( 1976, dmodrbcc, 0, chicago, 0, chicago_state, empty_init, ROT0, "Chicago Coin", "Demolition Derby (Chicago Coin)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/coinmvga.cpp mame-0.264+dfsg.1/src/mame/misc/coinmvga.cpp --- mame-0.263+dfsg.1/src/mame/misc/coinmvga.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/coinmvga.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -219,12 +219,14 @@ *******************************************************************************/ #include "emu.h" + #include "cpu/h8/h83002.h" //#include "cpu/h8/h83006.h" #include "sound/ymz280b.h" #include "machine/i2cmem.h" #include "machine/msm6242.h" #include "video/ramdac.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -250,9 +252,6 @@ , m_palette(*this, "palette%u", 0U) { } - void init_colorama(); - void init_cmrltv75(); - void coinmvga(machine_config &config); protected: @@ -938,19 +937,6 @@ ROM_LOAD( "rwc497ym.sp4", 0x300000, 0x100000, CRC(b5729ae7) SHA1(0e63fbb81ff5f2fef3c653f769db8073dff1214b) ) ROM_END - -/************************* -* Driver Init * -*************************/ - -void coinmvga_state::init_colorama() -{ -} - -void coinmvga_state::init_cmrltv75() -{ -} - } // anonymous namespace @@ -958,11 +944,11 @@ * Game Drivers * *************************/ -// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS -GAME( 2000, colorama, 0, coinmvga, coinmvga, coinmvga_state, init_colorama, ROT0, "Coinmaster-Gaming, Ltd.", "Colorama (P521, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2000, coloramas, colorama, coinmvga, coinmvga, coinmvga_state, init_colorama, ROT0, "Coinmaster-Gaming, Ltd.", "Colorama (P521 V13, Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2000, wof_v16, 0, coinmvga, coinmvga, coinmvga_state, init_colorama, ROT0, "Coinmaster-Gaming, Ltd.", "Wheel of Fortune (P517 V16, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2000, wof_v11, wof_v16, coinmvga, coinmvga, coinmvga_state, init_colorama, ROT0, "Coinmaster-Gaming, Ltd.", "Wheel of Fortune (P517 V11, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2001, cmrltv75, 0, coinmvga, coinmvga, coinmvga_state, init_cmrltv75, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Roulette P497 V75 (Y2K, Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2000, cmkenosp, 0, coinmvga, coinmvga, coinmvga_state, empty_init, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Keno (Y2K, Spanish, 2000-12-14)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) -GAME( 2000, cmkenospa, cmkenosp, coinmvga, coinmvga, coinmvga_state, empty_init, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Keno (Y2K, Spanish, 2000-12-02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS +GAME( 2000, colorama, 0, coinmvga, coinmvga, coinmvga_state, empty_init, ROT0, "Coinmaster-Gaming, Ltd.", "Colorama (P521, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2000, coloramas, colorama, coinmvga, coinmvga, coinmvga_state, empty_init, ROT0, "Coinmaster-Gaming, Ltd.", "Colorama (P521 V13, Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2000, wof_v16, 0, coinmvga, coinmvga, coinmvga_state, empty_init, ROT0, "Coinmaster-Gaming, Ltd.", "Wheel of Fortune (P517 V16, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2000, wof_v11, wof_v16, coinmvga, coinmvga, coinmvga_state, empty_init, ROT0, "Coinmaster-Gaming, Ltd.", "Wheel of Fortune (P517 V11, English)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2001, cmrltv75, 0, coinmvga, coinmvga, coinmvga_state, empty_init, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Roulette P497 V75 (Y2K, Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2000, cmkenosp, 0, coinmvga, coinmvga, coinmvga_state, empty_init, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Keno (Y2K, Spanish, 2000-12-14)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 2000, cmkenospa, cmkenosp, coinmvga, coinmvga, coinmvga_state, empty_init, ROT90, "Coinmaster-Gaming, Ltd.", "Coinmaster Keno (Y2K, Spanish, 2000-12-02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/crazybal.cpp mame-0.264+dfsg.1/src/mame/misc/crazybal.cpp --- mame-0.263+dfsg.1/src/mame/misc/crazybal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/crazybal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -127,4 +127,4 @@ } // anonymous namespace -GAME( 1978, crazybal, 0, crazybal, 0, crazybal_state, empty_init, ROT0, "Electronic Games Systems", "Crazy Balls [TTL]", MACHINE_IS_SKELETON ) +GAME( 1978, crazybal, 0, crazybal, 0, crazybal_state, empty_init, ROT0, "Electronic Games Systems", "Crazy Balls", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/cv1k.cpp mame-0.264+dfsg.1/src/mame/misc/cv1k.cpp --- mame-0.263+dfsg.1/src/mame/misc/cv1k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/cv1k.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1075 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Luca Elia, MetalliC -/* - -Cave CV1000 hardware - -U2 flash rom note: - -Cave often programmed the u2 roms onto defective flash chips, programming around the bad blocks. -As a result these are highly susceptible to failure, blocks around the known bad blocks appear to -decay at an alarming rate in some cases, and in others data has clearly been programmed over -blocks that were already going bad. - this is why the same game often has different u2 roms -in the different sets at the moment. - these will be reconstructed at some point. - -The flash roms do contain a 'bad block' table, so it should be possible to rebuild a 'clean' -flash ROM for each game by comparing multiple dumps of each game and ensuring no other data has -decayed. Naturally this is not an ideal situation for the less common games! - --------------------------------------------------------------------------------- - -Games by Cave ID number: -ID is labeled on U13 chip, not always -Serial is on a sticker on PCB, eg. "CAVE DS-10104" - -ID Serial PCB Title -------------------------------------- -CA011 - B Mushihime-Sama -CA??? MHN B Mushihime-Sama Cave Matsuri 1.5 -CA012 - B Ibara -CA012B IB B Ibara Kuro Black Label -CA013 E B Espgaluda II -CA??? M B Puzzle! Mushihime-Tama -CA014 CA B Pink Sweets: Ibara Sorekara -CA015 CA B Mushihime-Sama Futari -CA015B MFBA/MMB B Mushihime-Sama Futari Black Label -CA016 MP B Muchi Muchi Pork! -CA017 DS B Deathsmiles -CA017B DSB D Deathsmiles Black Label -CA019 DD D DoDonPachi DaiFukkatsu -CA019B DDB D DoDonPachi DaiFukkatsu Black Label -CA021 AK D Akai Katana -CA??? SDO D DoDonPachi SaiDaiOuJou - -CMDL01 - Medal Mahjong Moukari Bancho -?????? - Pirates of Gappori: http://web.archive.org/web/20090907145501/http://www.cave.co.jp/gameonline/gappori/ -?????? - Uhauha Ooku: http://web.archive.org/web/20141104001322/http://www.cave.co.jp/gameonline/oooku/ - -Note: CA018 - Deathsmiles II: Makai no Merry Christmas on PC based platform (see cavepc.cpp) - CA020 - DoDonPachi DaiOuJou Tamashii on PGM2 platform - - -PCB CV1000-B / CV1000-D -+--------------------------------------------+ -| | -| | -| | -| VOL | -| | -+-+ +-----+ +-----+ X3 | - | | U24 | | U23 | | -+-+ +-----+ +-----+ +------+ | -| |Yamaha| | -| U25* U26* |YMZ770| | -| | | | -|J D5 +------+ | -|A D2 | -|M D3 +-----+ +-----+ | -|M D4 P2* | U7 | | U6 | | -|A D1 +-----+ +-----+ | -| +-------+ | -|C |P4 JTAG| | -|o +-------+ +-------+ | -|n |Altera | +--+ | -|n D6 |Cyclone| | | | -|e X1 S1 | | |U1| | -|c S3 +---------+ +-------+ | | | -|t | | +--+ | -|e | Hitachi | | -|r | | S2 | -| | SH3 | +-----------------+ | -| | | | P3 | | -| +---------+ +-----------------+ | -+-+ X2 | - | +--+ +--+ +---+ U27 | -+-+ | | | | |U13| | -|+-+ |U2| |U4| +---+ | -||P| | | | | __ | -||8| U12* +--+ +--+ U10 / \ | -|+-+ |C126| | -| P5* P7* \__/ | -+--------------------------------------------+ - -* Denotes not populated - - CPU: Hitachi 6417709S SH3 clocked at 102.4MHz (12.800MHz * 8) -Sound: Yamaha YMZ770C-F clocked at 16.384MHz -Other: Altera Cyclone EP1C12 FPGA - Altera EPM7032 (MAX 7000 Series) at U13 - -OSC: - X1 12.800MHz (SH3 clock derived from this) - X2 32.768kHz (Used by the RTC) - X3 16.384MHz (Yamaha YMZ770C-F clock) - -Memory: - U6 (SDRAM) MT46V16M16 ? 4 MBit x 16 x 4 banks, DDR RAM (256 MBit) - U7 (SDRAM) MT46V16M16 ? 4 MBit x 16 x 4 banks, DDR RAM (256 MBit) - U1 (SDRAM) MT48LC2M32 ? 512K x 32 x 4 banks, (64 MBit) for CV1000-B - U1 (SDRAM) IS42S32400 - 1024K x 32 x 4 banks, (128 MBit) for CV1000-D - -Roms: - U4 (FLASH) 29LV160BB 16M-Bit CMOS 3.0V, Boot device, FPGA bit file, main program code for CV1000-B - U4 (FLASH) S29JL032H 32M-Bit CMOS 3.0V, Boot device, FPGA bit file, main program code for CV1000-D - U2 (FLASH) K9F1G08U0M 128M x 8 Bit / 64M x 16 Bit NAND. Graphics data. - U23-U24 (FLASH) MBM 29DL321, 32M-Bit CMOS 3.0V. Sound data. - U25-U26 (FLASH) MBM 29DL321, not populated - -Battery: - C126 CR2450, Powers the RTC (Real Time Clock) U10. Look at the garden clock in Ibara. NOT present on CV1000-D - -Dipswitches & Push Buttons: - S1 (DIL SWITCH) Half Pitch DIL Switch x 1, function unknown - S2 (DIL SWITCH) Half Pitch DIL Switch x 4, SW1=Setup, other switches unknown - S3 (MICRO PUSH BUTTON) Test switch, same as on the JAMMA connector - -Connectors: - P2 (IDC CONNECTOR 20 PIN) function unknown, P2 is not always mounted - P4 (IDC CONNECTOR 14 PIN) JTAG connector - P8 (IDC CONNECTOR 10 PIN) Advanced User Debugger - P3 (CONNECTOR) Most likely an expansion port, P3 is not always mounted - P5 (CONNECTOR) D9 serial connector. Used for the mahjong Touchscreen titles. Also mounted on early Mushihime-Sama PCB's - P7 (CONNECTOR) Network port pinout. Never seen mounted on any PCB. - -Misc: - U27 (SUPERVISOR) MAX 690S 3.0V Microprocessor Supervisory Circuit. - U10 (RTC & EEPROM) RTC 9701, Serial RTC Module with EEPROM 4 kbit (256x16 bit), controlled by Altera EPM7032 U13. - U12 (RS-232 TRANSCEIVER) MAX 3244E RS-232 Transceiver, only mounted when P5 is mounted. - D1-D6 (LED) Status LED's. D6 lights up at power on then shuts off, D2 indicates coinage. - -Note: * The Altera EPM7032 usually stamped / labeled with the Cave game ID number as listed above. - * U4, U23, U24 flash ROMs will vary by manufacturer but will be compatible with flash ROM listed. - * The game logic does a manufacturer check on U2. K9F1G08U0M and two other device codes are allowed. - Trying to replace U2 with a flash ROM from another manufacturer does not work. Allowed devices are: - - Manufacturer ID: 0x98, ID code: 0x76 - - Manufacturer ID: 0x98, ID code: 0x79 - - Manufacturer ID: 0xEC, ID code: 0xF1 <- This is K9F1G08U0M - * There are two known CV1000-B PCB revisions. The newer one has some minor hardware differences - and uses an updated FPGA firmware, they are not compatible with eachother. - * The CV1000-D revision PCB has double the RAM at U1, double the ROM at U4 and no battery. - The CV1000-D is used for Dodonpachi Daifukkatsu and later games. Commonly referred to as SH3B PCB. - -Information by The Sheep, rtw, Ex-Cyber, BrianT, Guru & buffi - ------------------------------------------------------- - -To enter service mode in most cases hold down Service (F2) for a few seconds - (I believe it's the test button on the PCB) -Some games also use the test dipswitch as an alternative method. - -Common game codes: - - During boot hold P1 Right+A+B+C and P2 Left+A+B+C - Forcibly initialise non-volatile data (EEPROM or NAND settings area) - - During boot hold P1 A and P2 A - Reset random numbers generator at each game start. Probably was used during testing or/and competition events. - -TODO: - -Improve Blending precision? - - I'm not sure what precision the original HW mixes with, source data is 555 RGB with 1 bit transparency (16-bits) - and the real VRAM is also clearly in this format. The Alpha values supplied however are 8bpp, and the 'Tint' - values use 0x20 for 'normal' (not 0x1f) - -Overall screen brightness / contrast (see test mode) - - Could convert ram back to 16-bit and use a palette lookup at the final blit.. probably easiest / quickest. - -Touchscreen - - Used for mmmbanc, needs SH3 serial support. - -Remaining Video issues - - mmpork startup screen flicker - the FOR USE IN JAPAN screen doesn't appear on the real PCB until after the graphics are fully loaded, it still displays 'please wait' until that point. - - Sometimes the 'sprites' in mushisam lag by a frame vs the 'backgrounds' is this a timing problem, does the real game do it? - - End of Blit should send IRQ1. (one game has a valid irq routine that looks like it was used for profiling, but nothing depends on it) - -Timing - - Correct CPU slowdown emulation and flags (and speed of RAM). Most slowdown seems due to SH-3 uncached RAM access wait states, which is not implemented. - -31/12/2021: - Akai Katana and Dodonpachi Saidaioujou removed at the request of the - current rightholder, exA-Arcadia (legal@exa.ac). - -*/ - -#include "emu.h" - -#include "cpu/sh/sh3comn.h" -#include "cpu/sh/sh4.h" -#include "machine/nandflash.h" -#include "machine/rtc9701.h" -#include "sound/ymz770.h" -#include "video/epic12.h" - -#include "screen.h" -#include "speaker.h" - -namespace { - -class cv1k_state : public driver_device -{ -public: - cv1k_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_blitter(*this, "blitter"), - m_nand(*this, "nand"), - m_eeprom(*this, "eeprom"), - m_ram(*this, "mainram"), - m_rombase(*this, "maincpu"), - m_eepromout(*this, "EEPROMOUT"), - m_idleramoffs(0), - m_idlepc(0) - { } - - void cv1k(machine_config &config); - void cv1k_d(machine_config &config); - - void init_mushisam(); - void init_ibara(); - void init_espgal2(); - void init_mushitam(); - void init_pinkswts(); - void init_deathsml(); - void init_ddpdfk(); - -protected: - virtual void machine_reset() override; - -private: - required_device m_maincpu; - required_device m_blitter; - required_device m_nand; - required_device m_eeprom; - - required_shared_ptr m_ram; - required_region_ptr m_rombase; - - uint8_t flash_io_r(offs_t offset); - void flash_io_w(offs_t offset, uint8_t data); - uint8_t serial_rtc_eeprom_r(offs_t offset); - void serial_rtc_eeprom_w(offs_t offset, uint8_t data); - uint64_t flash_port_e_r(); - - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - required_ioport m_eepromout; - - uint32_t m_idleramoffs; - uint32_t m_idlepc; - - uint64_t speedup_r(); - void install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_typed); - - void cv1k_d_map(address_map &map); - void cv1k_map(address_map &map); - void cv1k_port(address_map &map); -}; - - -/**************************************************************************/ - -uint32_t cv1k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - m_blitter->draw_screen(bitmap,cliprect); - return 0; -} - - -// FLASH interface - -uint64_t cv1k_state::flash_port_e_r() -{ - return ((!m_nand->is_busy() ? 0x20 : 0x00)) | 0xdf; -} - - -uint8_t cv1k_state::flash_io_r(offs_t offset) -{ - switch (offset) - { - default: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x07: - // logerror("flash_io_r offset %04x\n", offset); - return 0xff; - - case 0x00: - return m_nand->data_r(); - } -} - -void cv1k_state::flash_io_w(offs_t offset, uint8_t data) -{ - switch (offset) - { - default: - case 0x03: - logerror("unknown flash_io_w offset %04x data %02x\n", offset, data); // 03 enable/disable fgpa access? - break; - - case 0x00: - m_nand->data_w(data); - break; - - case 0x01: - m_nand->command_w(data); - break; - - case 0x2: - m_nand->address_w(data); - break; - } -} - - -// ibarablk uses the rtc to render the clock in the first attract demo -// if this code returns bad values it has gfx corruption. the ibarablka set doesn't do this?! -uint8_t cv1k_state::serial_rtc_eeprom_r(offs_t offset) -{ - switch (offset) - { - case 0x01: - return 0xfe | m_eeprom->read_bit(); - - default: - return 0; - } -} - -void cv1k_state::serial_rtc_eeprom_w(offs_t offset, uint8_t data) -{ - switch (offset) - { - case 0x01: - m_eepromout->write(data, 0xff); - break; - case 0x03: - // Set CE pin of NAND to !(data & 0x01). Unlikely to matter for emulation, since it's just hardware - // handling of who accesses the shared data bus. - break; - - default: - logerror("unknown serial_rtc_eeprom_w access offset %02x data %02x\n", offset, data); - break; - } -} - - -void cv1k_state::cv1k_map(address_map &map) -{ - map(0x00000000, 0x003fffff).rom().region("maincpu", 0).nopw(); // mmmbanc writes here on startup for some reason.. - map(0x0c000000, 0x0c7fffff).ram().share("mainram");// work RAM - map(0x10000000, 0x10000007).rw(FUNC(cv1k_state::flash_io_r), FUNC(cv1k_state::flash_io_w)); - map(0x10400000, 0x10400007).w("ymz770", FUNC(ymz770_device::write)); - map(0x10c00000, 0x10c00007).rw(FUNC(cv1k_state::serial_rtc_eeprom_r), FUNC(cv1k_state::serial_rtc_eeprom_w)); -// map(0x18000000, 0x18000057) // blitter, installed on reset - map(0xf0000000, 0xf0ffffff).ram(); // mem mapped cache (sh3 internal?) -} - -void cv1k_state::cv1k_d_map(address_map &map) -{ - map(0x00000000, 0x003fffff).rom().region("maincpu", 0).nopw(); // mmmbanc writes here on startup for some reason.. - map(0x0c000000, 0x0cffffff).ram().share("mainram"); // work RAM - map(0x10000000, 0x10000007).rw(FUNC(cv1k_state::flash_io_r), FUNC(cv1k_state::flash_io_w)); - map(0x10400000, 0x10400007).w("ymz770", FUNC(ymz770_device::write)); - map(0x10c00000, 0x10c00007).rw(FUNC(cv1k_state::serial_rtc_eeprom_r), FUNC(cv1k_state::serial_rtc_eeprom_w)); -// map(0x18000000, 0x18000057) // blitter, installed on reset - map(0xf0000000, 0xf0ffffff).ram(); // mem mapped cache (sh3 internal?) -} - -void cv1k_state::cv1k_port(address_map &map) -{ - map(SH3_PORT_C, SH3_PORT_C+7).portr("PORT_C"); - map(SH3_PORT_D, SH3_PORT_D+7).portr("PORT_D"); - map(SH3_PORT_E, SH3_PORT_E+7).r(FUNC(cv1k_state::flash_port_e_r)); - map(SH3_PORT_F, SH3_PORT_F+7).portr("PORT_F"); - map(SH3_PORT_L, SH3_PORT_L+7).portr("PORT_L"); - map(SH3_PORT_J, SH3_PORT_J+7).rw(m_blitter, FUNC(epic12_device::fpga_r), FUNC(epic12_device::fpga_w)); -} - - -static INPUT_PORTS_START( cv1k_base ) - PORT_START("DSW") // 18000050.l (18000050.b + 3 i.e. MSB + 3, is shown as DIPSW) - // note: physical switch have default/Off position marked as "ON" which is a bit confusing - PORT_DIPUNUSED_DIPLOC( 0x01, 0x00, "S2:1" ) - PORT_DIPUNUSED_DIPLOC( 0x02, 0x00, "S2:2" ) - PORT_DIPUNUSED_DIPLOC( 0x04, 0x00, "S2:3" ) - PORT_DIPUNUSED_DIPLOC( 0x08, 0x00, "S2:4" ) - PORT_BIT(0xfffffff0, IP_ACTIVE_HIGH, IPT_UNKNOWN) - - PORT_START("PORT_C") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service coin - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) // Test Button on JAMMA Edge - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) // TODO: IMPLEMENT COIN ERROR! - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("PORT_D") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) - - PORT_START("PORT_F") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) // S3 Test Push Button - PORT_BIT( 0xfd, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("PORT_L") // 4000134.b, 4000136.b - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) - - PORT_START( "EEPROMOUT" ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, write_bit) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, set_clock_line) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", rtc9701_device, set_cs_line) -INPUT_PORTS_END - -static INPUT_PORTS_START( cv1k ) - PORT_INCLUDE( cv1k_base ) - - PORT_MODIFY("PORT_F") - PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) // S3 Test Push Button -INPUT_PORTS_END - -static INPUT_PORTS_START( cv1ks ) - PORT_INCLUDE( cv1k_base ) - - PORT_MODIFY("DSW") - PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_HIGH, "S2:1") - PORT_DIPNAME( 0x02, 0x00, "Special Mode" ) PORT_DIPLOCATION("S2:2") // also require hold P1 A+B while booting - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) -INPUT_PORTS_END - -void cv1k_state::machine_reset() -{ - m_blitter->set_rambase(reinterpret_cast(m_ram.target())); - m_blitter->install_handlers( 0x18000000, 0x18000057 ); - m_blitter->reset(); -} - -void cv1k_state::cv1k(machine_config &config) -{ - /* basic machine hardware */ - SH3BE(config, m_maincpu, 12.8_MHz_XTAL*8); // 102.4MHz - m_maincpu->set_md(0, 0); // none of this is verified - m_maincpu->set_md(1, 0); // (the sh3 is different to the sh4 anyway, should be changed) - m_maincpu->set_md(2, 0); - m_maincpu->set_md(3, 0); - m_maincpu->set_md(4, 0); - m_maincpu->set_md(5, 1); - m_maincpu->set_md(6, 0); - m_maincpu->set_md(7, 1); - m_maincpu->set_md(8, 0); - m_maincpu->set_sh4_clock(12.8_MHz_XTAL*8); // 102.4MHz - m_maincpu->set_addrmap(AS_PROGRAM, &cv1k_state::cv1k_map); - m_maincpu->set_addrmap(AS_IO, &cv1k_state::cv1k_port); - m_maincpu->set_vblank_int("screen", FUNC(cv1k_state::irq2_line_hold)); // irq2 actually asserted at V-sync pulse, not at V-blank - - RTC9701(config, m_eeprom); - SAMSUNG_K9F1G08U0M(config, m_nand, 0); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh(HZ_TO_ATTOSECONDS(60.024)); // measured from ibara PCB rates - 60.024Hz, 262 total lines - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(512, 512); - screen.set_visarea(0, 320-1, 0, 240-1); - screen.set_screen_update(FUNC(cv1k_state::screen_update)); - - SPEAKER(config, "mono").front_center(); - YMZ770(config, "ymz770", 16.384_MHz_XTAL).add_route(1, "mono", 1.0); // only Right output used, Left is not connected - - EPIC12(config, m_blitter, 0); - m_blitter->set_cpu(m_maincpu); - m_blitter->port_r_callback().set_ioport("DSW"); - m_blitter->set_mainramsize(0x800000); -} - -void cv1k_state::cv1k_d(machine_config &config) -{ - cv1k(config); - - /* basic machine hardware */ - SH3BE(config.replace(), m_maincpu, 12.8_MHz_XTAL*8); // 102.4MHz - m_maincpu->set_md(0, 0); // none of this is verified - m_maincpu->set_md(1, 0); // (the sh3 is different to the sh4 anyway, should be changed) - m_maincpu->set_md(2, 0); - m_maincpu->set_md(3, 0); - m_maincpu->set_md(4, 0); - m_maincpu->set_md(5, 1); - m_maincpu->set_md(6, 0); - m_maincpu->set_md(7, 1); - m_maincpu->set_md(8, 0); - m_maincpu->set_sh4_clock(12.8_MHz_XTAL*8); // 102.4MHz - m_maincpu->set_addrmap(AS_PROGRAM, &cv1k_state::cv1k_d_map); - m_maincpu->set_addrmap(AS_IO, &cv1k_state::cv1k_port); - m_maincpu->set_vblank_int("screen", FUNC(cv1k_state::irq2_line_hold)); - - m_blitter->set_mainramsize(0x1000000); -} - - - -/************************************************** - -All roms are flash roms with no labels, so keep the - version numbers attached to the roms that differ - - roms which differ have also been prefixed with - the MAME set names to aid readability and prevent - accidental misloading of sets with the wrong - CRCs which causes issues with the speedups. - -**************************************************/ - -ROM_START( mushisam ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("mushisam_u4", 0x000000, 0x200000, CRC(15321b30) SHA1(d2cd714ff2299eeab6f9a7c219dfb559c8f98b45) ) // (2004/10/12.MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) -ROM_END - -ROM_START( mushisama ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("mushisama_u4", 0x000000, 0x200000, CRC(0b5b30b2) SHA1(35fd1bb1561c30b311b4325bc8f4628f2fccd20b) ) // (2004/10/12 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) -ROM_END - -ROM_START( mushisamb ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("mushisamb_u4", 0x000000, 0x200000, CRC(9f1c7f51) SHA1(f82ae72ec03687904ca7516887080be92365a5f3) ) // (2004/10/12 MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD("mushisam_u2", 0x000000, 0x8400000, CRC(4f0a842a) SHA1(33f3550ec676a7088b6348cd72c16cc6594afb84) ) // (2004/10/12.MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(138e2050) SHA1(9e86489a4e65af5efb5495adf6d4b3e01d5b2816) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(e3d05c9f) SHA1(130c3d62317da1729c85bd178bd51500edd73ada) ) -ROM_END - -ROM_START( espgal2 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "espgal2_u4", 0x000000, 0x200000, CRC(2cb37c03) SHA1(da438efc497f72aa345d2cdb0143d269e51576d3) ) // (2005/11/14.MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) -ROM_END - -ROM_START( espgal2a ) // newer CV1000-B PCB revision, updated FPGA firmware, no changes in game code or data - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "espgal2a_u4", 0x000000, 0x200000, CRC(843608b8) SHA1(2f5fcd38e76df531a923cd9956104cef5185aaa9) ) // (2005/11/14 MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) -ROM_END - -ROM_START( espgal2b ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "espgal2b_u4", 0x000000, 0x200000, CRC(09c908bb) SHA1(7d6031fd3542b3e1d296ff218feb40502fd78694) ) // (2005/11/14 MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(222f58c7) SHA1(d47a5085a1debd9cb8c61d88cd39e4f5036d1797) ) // (2005/11/14 MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(b9a10c22) SHA1(4561f95c6018c9716077224bfe9660e61fb84681) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c76b1ec4) SHA1(b98a53d41a995d968e0432ed824b0b06d93dcea8) ) -ROM_END - -ROM_START( mushitam ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("mushitam_u4", 0x000000, 0x200000, CRC(c49eb6b1) SHA1(c40ee5de89e3f1cb49ac19687657dd2b42a88d81) ) // (2005/09/09.MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(6feeb9a1) SHA1(992711c80e660c32f97b343c2ce8184fddd7364e) ) -ROM_END - -ROM_START( mushitama ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("mushitama_u4", 0x000000, 0x200000, CRC(4a23e6c8) SHA1(d44c287bb88e6d413a8d35d75bc1b4928ad52cdf) ) // (2005/09/09 MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) -// ROM_LOAD("mushitama_u2", 0x000000, 0x8400000, CRC(3f93ff82) SHA1(6f6c250aa7134016ffb288d056bc937ea311f538) ) // recycled ROM - only unused areas differ - ROM_LOAD("mushitam_u2", 0x000000, 0x8400000, CRC(8ba498ab) SHA1(459c0b4ab831bbe019bdd5b0ac56955948b9e3a6) ) // (2005/09/09.MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(701a912a) SHA1(85c198946fb693d99928ea2595c84ba4d9dc8157) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(6feeb9a1) SHA1(992711c80e660c32f97b343c2ce8184fddd7364e) ) -ROM_END - -ROM_START( futari15 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("futari15_u4", 0x000000, 0x200000, CRC(e8c5f128) SHA1(45fb8066fdbecb83fdc2e14555c460d0c652cd5f) ) // (2006/12/8.MAST VER. 1.54.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) -ROM_END - -ROM_START( futari15a ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("futari15a_u4", 0x000000, 0x200000, CRC(a609cf89) SHA1(56752fae9f42fa852af8ee2eae79e25ec7f17953) ) // (2006/12/8 MAST VER 1.54) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) -// ROM_LOAD("futari15a_u2", 0x000000, 0x8400000, CRC(b9d815f9) SHA1(6b6f668b0bbb087ffac65e4f0d8bd9d5b28eeb28) ) // recycled ROM - only unused areas differ - ROM_LOAD("futari15_u2", 0x000000, 0x8400000, CRC(b9eae1fc) SHA1(410f8e7cfcbfd271b41fb4f8d049a13a3191a1f9) ) // (2006/12/8.MAST VER. 1.54.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) - ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) -ROM_END - -ROM_START( futari10 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "futari10_u4", 0x000000, 0x200000, CRC(b127dca7) SHA1(e1f518bc72fc1cdf69aefa89eafa4edaf4e84778) ) // (2006/10/23 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "futari10_u2", 0x000000, 0x8400000, CRC(78ffcd0c) SHA1(0e2937edec15ce3f5741b72ebd3bbaaefffb556e) ) // (2006/10/23 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) -ROM_END - -ROM_START( futaribl ) // Title screen shows (c) 2007 despite the 2009 "master" date - Also prints "Another Ver" to the title screen - reworked & re-released for the Chinese market - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "futaribli_u4", 0x000000, 0x200000, CRC(1971dd16) SHA1(e75993f2978cbaaf925b4b8bb33d094a5a7cebf0) ) // (2009/11/27 INTERNATIONAL BL) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) -ROM_END - -ROM_START( futariblj ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "futariblk_u4", 0x000000, 0x200000, CRC(b9467b6d) SHA1(64782807fe69acb4ae028e36c5c689d8bd9b7857) ) // (2007/12/11 BLACK LABEL VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "futariblk_u2", 0x000000, 0x8400000, CRC(08c6fd62) SHA1(e1fc386b2b0e41906c724287cbf82304297e0150) ) // (2007/12/11 BLACK LABEL VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(39f1e1f4) SHA1(53d12f59a56df35c705408c76e6e02118da656f1) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(c631a766) SHA1(8bb6934a2f5b8a9841c3dcf85192b1743773dd8b) ) -ROM_END - -// for newer revision CV1000-B PCB -ROM_START( ibara ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ibara_u4", 0x000000, 0x200000, CRC(d5fb6657) SHA1(4b2c9057cc765054232f520ee1c93495bc6b301e) ) // '06. 3. 7 ver. shown at service menu in special mode, still same as ibarao (2005/03/22 MASTER VER..) text at normal boot - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) // (2005/03/22 MASTER VER..) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(ee5e585d) SHA1(7eeba4ee693060e927f8c46b16e39227c6a62392) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(f0aa3cb6) SHA1(f9d137cd879e718811b2d21a0af2a9c6b7dca2f9) ) -ROM_END - -// for original/older revision CV1000-B PCB -ROM_START( ibarao ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ibarao_u4", 0x000000, 0x200000, CRC(8e6c155d) SHA1(38ac2107dc7824836e2b4e04c7180d5ae43c9b79) ) // (2005/03/22 MASTER VER..) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(55840976) SHA1(4982bdce84f9603adfed7a618f18bc80359ab81e) ) // (2005/03/22 MASTER VER..) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(ee5e585d) SHA1(7eeba4ee693060e927f8c46b16e39227c6a62392) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(f0aa3cb6) SHA1(f9d137cd879e718811b2d21a0af2a9c6b7dca2f9) ) -ROM_END - -ROM_START( ibarablk ) // Title screen shows (c) 2005 despite the 2006 "master" date - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ibarablk_u4", 0x000000, 0x200000, CRC(ee1f1f77) SHA1(ac276f3955aa4dde2544af4912819a7ae6bcf8dd) ) // (2006/02/06. MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "ibarablk_u2", 0x000000, 0x8400000, CRC(5e46be44) SHA1(bed5f1bf452f2cac58747ecabec3c4392566a3a7) ) // (2006/02/06. MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.) -ROM_END - -ROM_START( ibarablka ) // Title screen shows (c) 2005 despite the 2006 "master" date - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ibarablka_u4", 0x000000, 0x200000, CRC(a9d43839) SHA1(507696e616608c05893c7ac2814b3365e9cb0720) ) // (2006/02/06 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "ibarablka_u2", 0x000000, 0x8400000, CRC(33400d96) SHA1(09c22b5431ac3726bf88c56efd970f56793f825a) ) // (2006/02/06 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a436bb22) SHA1(0556e771cc02638bf8814315ba671c2d442594f1) ) // (2006/02/06 MASTER VER.) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(d11ab6b6) SHA1(2132191cbe847e2560423e4545c969f21f8ff825) ) // (2006/02/06 MASTER VER.) -ROM_END - -ROM_START( deathsml ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(1a7b98bf) SHA1(07798a4a846e5802756396b34df47d106895c1f1) ) // (2007/10/09 MASTER VER) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(59ef5d78) SHA1(426e506b6d88948aa55aec71c0db6e91da3d490d) ) // (2007/10/09 MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(aab718c8) SHA1(0e636c46d06151abd6f73232bc479dafcafe5327) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(83881d84) SHA1(6e2294b247dfcbf0ced155dc45c706f29052775d) ) -ROM_END - -ROM_START( mmpork ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x200000, CRC(d06cfa42) SHA1(5707feb4b3e5265daf5926f38c38612b24106f1f) ) // (2007/ 4/17 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(1ee961b8) SHA1(81a2eba704ac1cf7fc44fa7c6a3f50e3570c104f) ) // (2007/ 4/17 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4a4b36df) SHA1(5db5ce6fa47e5ca3263d4bd19315890c6d29df66) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(ce83d07b) SHA1(a5947467c8f5b7c4b0ad8e32df2ee29b787e355f) ) -ROM_END - -ROM_START( mmmbanc ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u4", 0x0000, 0x200000, CRC(5589d8c6) SHA1(43fbdb0effe2bc0e7135698757b6ee50200aecde) ) // (2007/06/05 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(2e38965a) SHA1(2b58d1cd1a3dbc261d4a46805d2ea015fe22c444) ) // (2007/06/05 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4caaa1bf) SHA1(9b92c13eac05601da4d9bb3eb727c156974e9f0c) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(8e3a51ba) SHA1(e34cf9acb13c3d8ca6cd1306b060b1d429872abd) ) -ROM_END - -ROM_START( pinkswts ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "pinkswts_u4", 0x0000, 0x200000, CRC(5d812c9e) SHA1(db821ec3892fd150513749d64a8b60bf147f3275) ) // (2006/04/06 MASTER VER....) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "pinkswts_u2", 0x000000, 0x8400000, CRC(a2fa5363) SHA1(5be327534840871592df523ac82ee1927bd79d67) ) // (2006/04/06 MASTER VER....) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) -ROM_END - -ROM_START( pinkswtsa ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "pnkswtsa_u4", 0x0000, 0x200000, CRC(ee3339b2) SHA1(995988d370731a7074b49ce8752525dadf06a954) ) // (2006/04/06 MASTER VER...) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "pnkswtsa_u2", 0x000000, 0x8400000, CRC(829a862e) SHA1(8c0ee2a0eb33b68869252fd68aed74820a904287) ) // (2006/04/06 MASTER VER...) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) -ROM_END - -ROM_START( pinkswtsb ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "pnkswtsb_u4", 0x0000, 0x200000, CRC(68bcc009) SHA1(2fef544b93c61161a37365f868b431d8262e4b21) ) // (2006/04/06 MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) -// ROM_LOAD( "pnkswtsb_u2", 0x000000, 0x8400000, BAD_DUMP CRC(a5666ed9) SHA1(682e06c84990225bc6bb0c9f38b5f46c4e36b430) ) // (2006/04/06 MASTER VER.) - ROM_LOAD( "pnkswtsx_u2", 0x000000, 0x8400000, CRC(91e4deb2) SHA1(893cb10d6f805df7cb4a1bb709a3ea6de147b7e9) ) // (2006/xx/xx MASTER VER.) and (2006/04/06 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) -ROM_END - -ROM_START( pinkswtsx ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "pnkswtsx_u4", 0x0000, 0x200000, CRC(8fe05bf0) SHA1(5cd45ac0e74690787c83d3fb383a65ed7cd47104) ) // (2006/xx/xx MASTER VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "pnkswtsx_u2", 0x000000, 0x8400000, CRC(91e4deb2) SHA1(893cb10d6f805df7cb4a1bb709a3ea6de147b7e9) ) // (2006/xx/xx MASTER VER.) and (2006/04/06 MASTER VER.) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) -ROM_END - -// modification based on 2006/04/06 MASTER VER.... -// This set is dumped from bootleg PCB with pre-patched Suicide Club hack, These CRC32 checksums are matches compares to authors homepage's one. -ROM_START( pinkswtssc ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "suicideclub.u4", 0x0000, 0x200000, CRC(5e03662f) SHA1(b974204b8dcd55fc1b7775f7c1806150919caff3) ) // (2017/10/31 SUICIDECLUB VER.) - ROM_RELOAD(0x200000,0x200000) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "suicideclub.u2", 0x000000, 0x8400000, CRC(32324608) SHA1(cec1416c943520cb3f91eb295e2ba864a0db7d45) ) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(4b82d250) SHA1(ee98dbc3f791efb6d58f3945bcb2044667ae7978) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(e93f0627) SHA1(6f5ec0ade87f7fc42a58a8f125557a4d1f3f187d) ) -ROM_END - -ROM_START( ddpdfk ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ddpdfk_u4", 0x0000, 0x400000, CRC(9976d699) SHA1(9dfe9d1daf6f638cafce8cdc5230209e2bcb7522) ) // (2008/06/23 MASTER VER 1.5) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "ddpdfk_u2", 0x000000, 0x8400000, CRC(84a51a4f) SHA1(291a6279c0746d2eb8630e7d6d886043f0cfdd94) ) // (2008/06/23 MASTER VER 1.5) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(a6178c2c) SHA1(7742ad1de2e4b0d0206ad11d467ea35da36352df) ) -ROM_END - -ROM_START( ddpdfk10 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ddpdfk10_u4", 0x0000, 0x400000, CRC(a3d650b2) SHA1(46a7551760e18c2cecd372c3f4be16f6600efc2c) ) // (2008/05/16 MASTER VER) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "ddpdfk10_u2", 0x000000, 0x8400000, CRC(d349cb2a) SHA1(c364c36b69b93f8f62390f185d044f51056669ff) ) // (2008/05/16 MASTER VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(27032cde) SHA1(5b58d0140d72b91db4e763ca4af93060d36ac74d) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(a6178c2c) SHA1(7742ad1de2e4b0d0206ad11d467ea35da36352df) ) -ROM_END - -ROM_START( dsmbl ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(77fc5ad1) SHA1(afe044fc16e9494143c876879b033caccd08cf22) ) // (2008/10/06 MEGABLACK LABEL VER) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(d6b85b7a) SHA1(4674f6ad07f6a03904ca3d05060816b8fe061add) ) // (2008/10/06 MEGABLACK LABEL VER) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(a9536a6a) SHA1(4b9dcaf6803b1fcfdf73ae9daabc4508fec71631) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(3b673326) SHA1(1ae847eb4e752fef1d72081d82344f0ad0537c31) ) -ROM_END - -ROM_START( dfkbl ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(8092ca9d) SHA1(75e16cd7c8d0f9c715115ce12da5c245fbcd2416) ) // (2010/1/18 BLACK LABEL) - - ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) - ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(29f9d73a) SHA1(ed978ab5e3ad8c05e7778a91bfb5aaa17b0f72d9) ) - - ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(36d4093b) SHA1(4aed7e2f7c0d2c9bceeb110a9907d8d99d55f4c3) ) - ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(31f9eb0a) SHA1(322158779e969bb321241065dd49c1167b91ff6c) ) -ROM_END - -// ROM_START( akatana ) -// ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) -// ROM_LOAD16_WORD_SWAP( "u4", 0x000000, 0x400000, CRC(613fd380) SHA1(6e28480eef3b483d00b42d811a9d2c7fa1097924) ) // (2010/ 8/13 MASTER VER.) - -// ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) -// ROM_LOAD( "u2", 0x000000, 0x8400000, CRC(89a2e1a5) SHA1(e6f4ec974406283665697fdd52bd606d0337dd11) ) - -// ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) -// ROM_LOAD16_WORD_SWAP( "u23", 0x000000, 0x400000, CRC(34a67e24) SHA1(78a7e82123b86311f1116a80c39f147b8b695549) ) -// ROM_LOAD16_WORD_SWAP( "u24", 0x400000, 0x400000, CRC(10760fed) SHA1(b70f4506c00f3901ff38f5efd4b897af1afc7a0c) ) -// ROM_END - -// ROM_START( ddpsdoj ) -// ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF) -// ROM_LOAD16_WORD_SWAP("u4", 0x000000, 0x400000, CRC(e2a4411c) SHA1(f8b2b6326dd8eeae99b8b1ab2bd5a3f0b9c7f027) ) -// ROM_IGNORE( 0x000100 ) // Flash extra bytes - -// ROM_REGION( 0x8400000, "nand", ROMREGION_ERASEFF) -// ROM_LOAD("u2", 0x000000, 0x8400000, CRC(668e4cd6) SHA1(da0b10865df3a3e46cf8a109ca88a551faba4483) ) - -// ROM_REGION( 0x800000, "ymz770", ROMREGION_ERASEFF) -// ROM_LOAD16_WORD_SWAP("u23", 0x000000, 0x400000, CRC(ac94801c) SHA1(cbcc6d5d89860bc961967e1d3b7c329adaf200c5) ) -// ROM_IGNORE( 0x000100 ) // Flash extra bytes -// ROM_LOAD16_WORD_SWAP("u24", 0x400000, 0x400000, CRC(f593045b) SHA1(91b92870d0dd2a7817cb0059cc750e2393686f4c) ) -// ROM_IGNORE( 0x000100 ) // Flash extra bytes -// ROM_END - -uint64_t cv1k_state::speedup_r() -{ - offs_t pc = m_maincpu->pc(); - - if (pc == m_idlepc || pc == m_idlepc + 2) m_maincpu->spin_until_time(attotime::from_usec(10)); - - return m_ram[m_idleramoffs / 8]; -} - -void cv1k_state::install_speedups(uint32_t idleramoff, uint32_t idlepc, bool is_typed) -{ - m_idleramoffs = idleramoff; - m_idlepc = idlepc; - - m_maincpu->sh2drc_set_options(SH2DRC_FASTEST_OPTIONS); - - m_maincpu->sh2drc_add_pcflush(idlepc+2); - - m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000000+m_idleramoffs, 0xc000000+m_idleramoffs+7, read64smo_delegate(*this, FUNC(cv1k_state::speedup_r))); - - m_maincpu->sh2drc_add_fastram(0x00000000, 0x003fffff, true, m_rombase); - - m_maincpu->sh2drc_add_fastram(0x0c000000, 0x0c000000+m_idleramoffs-1, false, m_ram); - m_maincpu->sh2drc_add_fastram(0x0c000000+m_idleramoffs+8, is_typed ? 0x0cffffff : 0x0c7fffff, false, m_ram + ((m_idleramoffs+8)/8)); -} - - -void cv1k_state::init_mushisam() -{ - install_speedups(0x024d8, 0xc04a2aa, false); -} - -void cv1k_state::init_ibara() -{ - install_speedups(0x022f0, 0xc04a0aa, false); -} - -void cv1k_state::init_espgal2() -{ - install_speedups(0x02310, 0xc05177a, false); -} - -void cv1k_state::init_mushitam() -{ - install_speedups(0x0022f0, 0xc04a0da, false); -} - -void cv1k_state::init_pinkswts() -{ - install_speedups(0x02310, 0xc05176a, false); -} - -void cv1k_state::init_deathsml() -{ - install_speedups(0x02310, 0xc0519a2, false); -} - -void cv1k_state::init_ddpdfk() -{ - install_speedups(0x02310, 0xc1d1346, true); -} - - -} // anonymous namespace - - -// The black label versions are intentionally not set as clones, they were re-releases with different game codes, not bugfixes. - -// CA011 Mushihime-Sama -GAME( 2004, mushisam, 0, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12.MASTER VER.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2004, mushisama, mushisam, cv1k, cv1k, cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2004, mushisamb, mushisam, cv1k, cv1k, cv1k_state, init_mushisam, ROT270, "Cave (AMI license)", "Mushihime-Sama (2004/10/12 MASTER VER)", MACHINE_IMPERFECT_TIMING ) - -// CA012 Ibara -GAME( 2005, ibara, 0, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER.., '06. 3. 7 ver.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2005, ibarao, ibara, cv1k, cv1ks,cv1k_state, init_ibara, ROT270, "Cave (AMI license)", "Ibara (2005/03/22 MASTER VER..)", MACHINE_IMPERFECT_TIMING ) - -// CA012B Ibara Kuro Black Label -GAME( 2006, ibarablk, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06. MASTER VER.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, ibarablka, ibarablk, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Ibara Kuro Black Label (2006/02/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) - -// CA013 Espgaluda II -GAME( 2005, espgal2, 0, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14.MASTER VER.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2005, espgal2a, espgal2, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, newer CV1000-B PCB)", MACHINE_IMPERFECT_TIMING ) -GAME( 2005, espgal2b, espgal2, cv1k, cv1k, cv1k_state, init_espgal2, ROT270, "Cave (AMI license)", "Espgaluda II (2005/11/14 MASTER VER, original CV1000-B PCB)", MACHINE_IMPERFECT_TIMING ) - -// CA??? Puzzle! Mushihime-Tama -GAME( 2005, mushitam, 0, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09.MASTER VER)", MACHINE_IMPERFECT_TIMING ) -GAME( 2005, mushitama, mushitam, cv1k, cv1k, cv1k_state, init_mushitam, ROT0, "Cave (AMI license)", "Puzzle! Mushihime-Tama (2005/09/09 MASTER VER)", MACHINE_IMPERFECT_TIMING ) - -// CA014 Pink Sweets: Ibara Sorekara -GAME( 2006, pinkswts, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER....)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, pinkswtsa, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER...)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, pinkswtsb, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/04/06 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, pinkswtsx, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Pink Sweets: Ibara Sorekara (2006/xx/xx MASTER VER.)", MACHINE_IMPERFECT_TIMING ) // defaults to freeplay, possibly bootlegged from show/dev version? -GAME( 2017, pinkswtssc, pinkswts, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "bootleg (Four Horsemen)", "Pink Sweets: Suicide Club (2017/10/31 SUICIDECLUB VER., bootleg)", MACHINE_IMPERFECT_TIMING ) // dumped from bootleg with pre-patched hack - -// CA015 Mushihime-Sama Futari -GAME( 2006, futari15, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8.MASTER VER. 1.54.)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, futari15a, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.5 (2006/12/8 MASTER VER 1.54)", MACHINE_IMPERFECT_TIMING ) -GAME( 2006, futari10, futari15, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Ver 1.0 (2006/10/23 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) - -// CA015B Mushihime-Sama Futari Black Label -GAME( 2007, futaribl, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label - Another Ver (2009/11/27 INTERNATIONAL BL)", MACHINE_IMPERFECT_TIMING ) // re-released for Chinese market -GAME( 2007, futariblj, futaribl, cv1k, cv1k, cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Mushihime-Sama Futari Black Label (2007/12/11 BLACK LABEL VER)", MACHINE_IMPERFECT_TIMING ) - -// CA016 Muchi Muchi Pork! -GAME( 2007, mmpork, 0, cv1k, cv1ks,cv1k_state, init_pinkswts, ROT270, "Cave (AMI license)", "Muchi Muchi Pork! (2007/ 4/17 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) - -// CA017 Deathsmiles -GAME( 2007, deathsml, 0, cv1k, cv1k, cv1k_state, init_deathsml, ROT0, "Cave (AMI license)", "Deathsmiles (2007/10/09 MASTER VER)", MACHINE_IMPERFECT_TIMING ) - -// CA017B Deathsmiles Black Label -GAME( 2008, dsmbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave (AMI license)", "Deathsmiles MegaBlack Label (2008/10/06 MEGABLACK LABEL VER)", MACHINE_IMPERFECT_TIMING ) - -// CA019 Do-Don-Pachi Dai-Fukkatsu -GAME( 2008, ddpdfk, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.5 (2008/06/23 MASTER VER 1.5)", MACHINE_IMPERFECT_TIMING ) -GAME( 2008, ddpdfk10, ddpdfk, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave (AMI license)", "DoDonPachi Dai-Fukkatsu Ver 1.0 (2008/05/16 MASTER VER)", MACHINE_IMPERFECT_TIMING ) - -// CA019B Do-Don-Pachi Dai-Fukkatsu Black Label -GAME( 2010, dfkbl, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave", "DoDonPachi Dai-Fukkatsu Black Label (2010/1/18 BLACK LABEL)", MACHINE_IMPERFECT_TIMING ) - -// CA021 Akai Katana -//GAME( 2010, akatana, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT0, "Cave", "Akai Katana (2010/ 8/13 MASTER VER.)", MACHINE_IMPERFECT_TIMING ) - -// CA??? DoDonPachi SaiDaiOuJou -//GAME( 2012, ddpsdoj, 0, cv1k_d, cv1k, cv1k_state, init_ddpdfk, ROT270, "Cave", "DoDonPachi SaiDaiOuJou (2012/ 4/20)", MACHINE_IMPERFECT_TIMING ) - -// CMDL01 Medal Mahjong Moukari Bancho -GAME( 2007, mmmbanc, 0, cv1k, cv1k, cv1k_state, init_pinkswts, ROT0, "Cave (AMI license)", "Medal Mahjong Moukari Bancho (2007/06/05 MASTER VER.)", MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/dfruit.cpp mame-0.264+dfsg.1/src/mame/misc/dfruit.cpp --- mame-0.263+dfsg.1/src/mame/misc/dfruit.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/dfruit.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Angelo Salese +// copyright-holders: Angelo Salese + /*************************************************************************** Fruit Dream (c) 1993 Nippon Data Kiki / Star Fish @@ -20,10 +21,12 @@ ***************************************************************************/ #include "emu.h" + #include "machine/i8255.h" #include "machine/tc009xlvc.h" #include "machine/timer.h" #include "sound/ymopn.h" + #include "screen.h" #include "speaker.h" @@ -48,7 +51,7 @@ void output_w(uint8_t data); TIMER_DEVICE_CALLBACK_MEMBER(scanline_callback); - void dfruit_map(address_map &map); + void program_map(address_map &map); void tc0091lvc_map(address_map &map); }; @@ -72,7 +75,7 @@ map(0xff08, 0xff08).rw(m_maincpu, FUNC(tc0091lvc_device::rom_bank_r), FUNC(tc0091lvc_device::rom_bank_w)); } -void dfruit_state::dfruit_map(address_map &map) +void dfruit_state::program_map(address_map &map) { tc0091lvc_map(map); map(0xa000, 0xa003).rw("i8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); @@ -241,7 +244,7 @@ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DS1:4,5") PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Medium ) ) /* Manual states "Somewhat Hard" */ + PORT_DIPSETTING( 0x08, DEF_STR( Medium ) ) // Manual states "Somewhat Hard" PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) PORT_DIPNAME( 0x20, 0x00, "Nudity" ) PORT_DIPLOCATION("DS1:6") PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) @@ -249,7 +252,7 @@ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("DS1:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DS1:8") /* Manual states Not Used */ + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DS1:8") // Manual states Not Used PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -282,17 +285,17 @@ machine().bookkeeping().coin_lockout_w(1, data & 8); } -#define MASTER_CLOCK XTAL(14'000'000) - void dfruit_state::dfruit(machine_config &config) { - /* basic machine hardware */ - TC0091LVC(config, m_maincpu, MASTER_CLOCK/2); //!!! TC0091LVC !!! - m_maincpu->set_addrmap(AS_PROGRAM, &dfruit_state::dfruit_map); + constexpr XTAL MASTER_CLOCK = 14_MHz_XTAL; + + // basic machine hardware + TC0091LVC(config, m_maincpu, MASTER_CLOCK / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &dfruit_state::program_map); TIMER(config, "scantimer").configure_scanline(FUNC(dfruit_state::scanline_callback), "screen", 0, 1); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -307,9 +310,9 @@ ppi.in_pb_callback().set_ioport("IN1"); ppi.in_pc_callback().set_ioport("IN2"); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - ym2203_device &opn(YM2203(config, "opn", MASTER_CLOCK/4)); + ym2203_device &opn(YM2203(config, "opn", MASTER_CLOCK / 4)); //opn.port_a_read_callback().set_ioport("IN4"); opn.port_b_read_callback().set_ioport("DSW"); opn.port_a_write_callback().set(FUNC(dfruit_state::output_w)); @@ -330,16 +333,25 @@ ROM_LOAD( "c2.ic10", 0x00000, 0x80000, CRC(d869ab24) SHA1(382e874a846855a7f6f8811625aaa30d9dfa1ce2) ) ROM_END +ROM_START( dfruita ) // 'PB-1451' PCB + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD( "fruit_dream_ver.1.10.ic2", 0x00000, 0x40000, CRC(bbd41424) SHA1(917143261e1a4526f24f43ddaea55998084cb4b5) ) // actual handwritten label says: title フルーツドリーム Ver. 1.10 Date 94.4.15 + + ROM_REGION( 0x80000, "maincpu:gfx", 0 ) + ROM_LOAD( "c2.ic10", 0x00000, 0x80000, CRC(d869ab24) SHA1(382e874a846855a7f6f8811625aaa30d9dfa1ce2) ) // handwritten label +ROM_END + ROM_START( gemcrush ) ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "gcj_00.ic2", 0x000000, 0x040000, CRC(e1431390) SHA1(f1f63e23d4b73cc099adddeadcf1ea3e27688bcd) ) /* ST M27C2001 EPROM */ + ROM_LOAD( "gcj_00.ic2", 0x000000, 0x040000, CRC(e1431390) SHA1(f1f63e23d4b73cc099adddeadcf1ea3e27688bcd) ) // ST M27C2001 EPROM ROM_REGION( 0x80000, "maincpu:gfx", ROMREGION_ERASE00 ) - ROM_LOAD( "gcj_01.ic10", 0x000000, 0x080000, CRC(5b9e7a6e) SHA1(345357feed8e80e6a06093fcb69f2b38063d057a) ) /* HN27C4096 EPROM */ + ROM_LOAD( "gcj_01.ic10", 0x000000, 0x080000, CRC(5b9e7a6e) SHA1(345357feed8e80e6a06093fcb69f2b38063d057a) ) // HN27C4096 EPROM ROM_END } // anonymous namespace -GAME( 1993, dfruit, 0, dfruit, dfruit, dfruit_state, empty_init, ROT0, "Nippon Data Kiki / Star Fish", "Fruit Dream (Japan)", 0 ) -GAME( 1996, gemcrush, 0, dfruit, gemcrush, dfruit_state, empty_init, ROT270, "Star Fish", "Gemcrush (Japan, prototype)", MACHINE_NO_COCKTAIL ) +GAME( 1993, dfruit, 0, dfruit, dfruit, dfruit_state, empty_init, ROT0, "Nippon Data Kiki / Star Fish", "Fruit Dream (Japan, Ver. 1.20)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, dfruita, dfruit, dfruit, dfruit, dfruit_state, empty_init, ROT0, "Nippon Data Kiki / Star Fish", "Fruit Dream (Japan, Ver. 1.10)", MACHINE_SUPPORTS_SAVE ) // program ROM label says 1994, but title screen is still 1993 +GAME( 1996, gemcrush, 0, dfruit, gemcrush, dfruit_state, empty_init, ROT270, "Star Fish", "Gemcrush (Japan, prototype)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/diamondking.cpp mame-0.264+dfsg.1/src/mame/misc/diamondking.cpp --- mame-0.263+dfsg.1/src/mame/misc/diamondking.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/diamondking.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -34,6 +34,21 @@ required_device m_maincpu; }; +class ss1b550base_state : public driver_device +{ +public: + ss1b550base_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { + } + + void ss1b550base(machine_config &config); + +private: + required_device m_maincpu; +}; + class diamondking_state : public ss1b202base_state { public: @@ -53,6 +68,28 @@ required_device m_okim6376; }; +static INPUT_PORTS_START(caribe) + PORT_START("DSW1") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8") + + PORT_START("DSW2") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW3:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW3:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW3:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW3:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW3:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW3:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW3:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW3:8") +INPUT_PORTS_END + static INPUT_PORTS_START(diamondking) // On main board, near the AY-3-8910 PORT_START("DSW1") @@ -123,6 +160,16 @@ ay8910.add_route(ALL_OUTPUTS, "mono", 1.0); // Guess } +void ss1b550base_state::ss1b550base(machine_config &config) +{ + M68340(config, m_maincpu, 3.68640_MHz_XTAL); + + SPEAKER(config, "mono").front_center(); + + msm6585_device &msm6585(MSM6585(config, "msm6585", 640'000)); // 0.640 MHz resonator + msm6585.add_route(ALL_OUTPUTS, "mono", 1.0); // Guess +} + void diamondking_state::diamondking(machine_config &config) { ss1b202base(config); @@ -136,6 +183,17 @@ OKIM6376(config, m_okim6376, XTAL(4'194'304)/4).add_route(ALL_OUTPUTS, "mono", 1.0); // Frequency divisor is a guess } + +/* Sega S.A. "Caribe" electromechanical slot machine. + Found just one PCB, named "1B-2004-550", which is essentially the same as the "INTEGRATED IO-3 BOARD" found on Diamond King, with minor differences. + May need more PCBs. +*/ +ROM_START(caribe) + ROM_REGION(0x100000, "maincpu", 0) + ROM_LOAD("na.03_segasa_c-2089_1_caribe_01d-0399_b-h240190.u1", 0x00000, 0x80000, CRC(146a565e) SHA1(dcf147b3673c669af9974369d91f7ec9149b897e)) + ROM_LOAD("na.03_segasa_c-2089_2_caribe_01d-0399_b-h240190.u2", 0x80000, 0x80000, CRC(1d1b25eb) SHA1(965132d32ed573d0123ac64d5f16ca31ca2a24ff)) +ROM_END + /* Four PCBs found for Diamond King (there may be more): ____|_|_|_|___|_|_|_|_|_|_|_|_|____|_|_|_|____|_|_|_|____|_|_|_|___|_|_|_|____________________________________ @@ -353,6 +411,7 @@ } // anonymous namespace // YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS +GAME(2001, caribe, 0, ss1b550base, caribe, ss1b550base_state, empty_init, ROT0, "SegaSA / Sonic", "Caribe", MACHINE_IS_SKELETON_MECHANICAL) GAME(1997, diamondking, 0, diamondking, diamondking, diamondking_state, empty_init, ROT0, "SegaSA / Sonic", "Diamond King (with Euro support)", MACHINE_IS_SKELETON_MECHANICAL) GAME(1997, diamondkinp, diamondking, diamondking, diamondking, diamondking_state, empty_init, ROT0, "SegaSA / Sonic", "Diamond King (without Euro support)", MACHINE_IS_SKELETON_MECHANICAL) GAME(19??, goldenchip, 0, ss1b202base, goldenchip, ss1b202base_state, empty_init, ROT0, "SegaSA / Sonic", "Golden Chip", MACHINE_IS_SKELETON_MECHANICAL) diff -Nru mame-0.263+dfsg.1/src/mame/misc/electra.cpp mame-0.264+dfsg.1/src/mame/misc/electra.cpp --- mame-0.263+dfsg.1/src/mame/misc/electra.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/electra.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,5 +145,5 @@ } // anonymous namespace -GAME( 1975, avenger, 0, electra, 0, electra_state, empty_init, ROT0, "Electra", "Avenger [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, flyingf, 0, electra, 0, electra_state, empty_init, ROT0, "Electra", "Flying Fortress [TTL]", MACHINE_IS_SKELETON ) +GAME( 1975, avenger, 0, electra, 0, electra_state, empty_init, ROT0, "Electra", "Avenger", MACHINE_IS_SKELETON ) +GAME( 1976, flyingf, 0, electra, 0, electra_state, empty_init, ROT0, "Electra", "Flying Fortress", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/epos.cpp mame-0.264+dfsg.1/src/mame/misc/epos.cpp --- mame-0.263+dfsg.1/src/mame/misc/epos.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/epos.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -183,8 +183,6 @@ }; -// video - /*************************************************************************** These games has one 32 byte palette PROM, connected to the RGB output this way: @@ -277,8 +275,6 @@ } -// machine - void tristar9000_state::decrypt_rom(offs_t offset, uint8_t data) { if (offset & 0x04) diff -Nru mame-0.263+dfsg.1/src/mame/misc/ez2d.cpp mame-0.264+dfsg.1/src/mame/misc/ez2d.cpp --- mame-0.263+dfsg.1/src/mame/misc/ez2d.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/ez2d.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Ivan Vangelista +// copyright-holders: /* TODO: @@ -7,7 +7,6 @@ $3a000 contains an "= Award Decompression BIOS =" header. Original ASUS CUBX BIOSes actually have valid opcodes in that range, the dump should be bad. - ASUS CUBX fails reading RTC, needs virtualizing thru ISA. -- Needs Riva TNT2 to be a proper PCI device; - In pcipc ez2d2m HDD boots to a Korean Windows 98SE, it will error out with a "Error 7 : Set up the system correctly." after driver installation. Follows dump heuristics: @@ -189,14 +188,14 @@ serport1.cts_handler().set("board4:w83977tf", FUNC(fdc37c93x_device::ncts2_w)); #endif - PCI_SLOT(config, "pci:01.0:1", pci_cards, 0, 0, 1, 2, 3, "rivatnt").set_fixed(true); + PCI_SLOT(config, "pci:01.0:1", agp_cards, 0, 0, 1, 2, 3, "rivatnt").set_fixed(true); } void ez2d_state::ez2d(machine_config &config) { ez2d_state::cubx(config); - PCI_SLOT(config.replace(), "pci:01.0:1", pci_cards, 0, 0, 1, 2, 3, "rivatnt2_m64").set_fixed(true); + PCI_SLOT(config.replace(), "pci:01.0:1", agp_cards, 0, 0, 1, 2, 3, "rivatnt2_m64").set_fixed(true); // TODO: Sound Blaster Live CT4830 } diff -Nru mame-0.263+dfsg.1/src/mame/misc/freekick.cpp mame-0.264+dfsg.1/src/mame/misc/freekick.cpp --- mame-0.263+dfsg.1/src/mame/misc/freekick.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/freekick.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -285,8 +285,6 @@ }; -// video - TILE_GET_INFO_MEMBER(base_state::get_tile_info) { int const tileno = m_videoram[tile_index] + ((m_videoram[tile_index + 0x400] & 0xe0) << 3); @@ -425,8 +423,6 @@ } -// machine - /************************************* * * Machines' structure diff -Nru mame-0.263+dfsg.1/src/mame/misc/fungames.cpp mame-0.264+dfsg.1/src/mame/misc/fungames.cpp --- mame-0.263+dfsg.1/src/mame/misc/fungames.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/fungames.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -191,8 +191,8 @@ } // Anonymous namespace -GAME( 1975, biplane, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Biplane [TTL]", MACHINE_IS_SKELETON ) -//GAME( 1975, skywar, biplane, 0, fungames, 0, fungames_state, empty_init, ROT0, "Mirco Games", "Sky War [TTL]", MACHINE_IS_SKELETON ) -GAME( 1976, biplane4, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Biplane 4 [TTL]", MACHINE_IS_SKELETON ) -GAME( 1975, take5, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Take 5 [TTL]", MACHINE_IS_SKELETON ) -//GAME( 1975, tankers, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Tankers [TTL]", MACHINE_IS_SKELETON ) +GAME( 1975, biplane, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Biplane", MACHINE_IS_SKELETON ) +//GAME( 1975, skywar, biplane, 0, fungames, 0, fungames_state, empty_init, ROT0, "Mirco Games", "Sky War", MACHINE_IS_SKELETON ) +GAME( 1976, biplane4, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Biplane 4", MACHINE_IS_SKELETON ) +GAME( 1975, take5, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Take 5", MACHINE_IS_SKELETON ) +//GAME( 1975, tankers, 0, fungames, 0, fungames_state, empty_init, ROT0, "Fun Games", "Tankers", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/gambl186.cpp mame-0.264+dfsg.1/src/mame/misc/gambl186.cpp --- mame-0.263+dfsg.1/src/mame/misc/gambl186.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/gambl186.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -387,13 +387,13 @@ { map(0x00000, 0x0ffff).ram().share("nvram"); map(0x40000, 0x7ffff).bankr(m_data_bank); - map(0xa0000, 0xbffff).rw("vga", FUNC(cirrus_gd5428_device::mem_r), FUNC(cirrus_gd5428_device::mem_w)); + map(0xa0000, 0xbffff).rw("vga", FUNC(cirrus_gd5428_vga_device::mem_r), FUNC(cirrus_gd5428_vga_device::mem_w)); map(0xc0000, 0xfffff).rom().region("ipl", 0); } void gambl186_state::gambl186_io(address_map &map) { - map(0x03b0, 0x03df).m("vga", FUNC(cirrus_gd5428_device::io_map)); + map(0x03b0, 0x03df).m("vga", FUNC(cirrus_gd5428_vga_device::io_map)); map(0x0400, 0x0401).w(FUNC(gambl186_state::upd_w)); // upd7759 sample index/input map(0x0500, 0x0501).portr("IN0"); map(0x0502, 0x0503).portr("IN1"); @@ -509,9 +509,9 @@ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480); - screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update)); + screen.set_screen_update("vga", FUNC(cirrus_gd5428_vga_device::screen_update)); - cirrus_gd5428_device &vga(CIRRUS_GD5428(config, "vga", 0)); + cirrus_gd5428_vga_device &vga(CIRRUS_GD5428_VGA(config, "vga", 0)); vga.set_screen("screen"); vga.set_vram_size(0x200000); diff -Nru mame-0.263+dfsg.1/src/mame/misc/gammagic.cpp mame-0.264+dfsg.1/src/mame/misc/gammagic.cpp --- mame-0.263+dfsg.1/src/mame/misc/gammagic.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/gammagic.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -54,17 +54,11 @@ #include "bus/rs232/sun_kbd.h" #include "bus/rs232/terminal.h" #include "cpu/i386/i386.h" +#include "cpu/m68000/m68020.h" #include "machine/fdc37c93x.h" -#include "machine/i82371eb_acpi.h" -#include "machine/i82371eb_ide.h" -#include "machine/i82371eb_isa.h" -#include "machine/i82371eb_usb.h" #include "machine/i82371sb.h" #include "machine/i82439hx.h" -#include "machine/i82439tx.h" -#include "machine/i82443bx_host.h" #include "machine/pci.h" -#include "machine/pci-ide.h" #include "video/voodoo_pci.h" namespace { @@ -83,6 +77,8 @@ void gammagic_map(address_map &map); static void smc_superio_config(device_t *device); + + void v8000_map(address_map &map); }; void gammagic_state::gammagic_map(address_map &map) @@ -95,6 +91,14 @@ map.unmap_value_high(); } +void gammagic_state::v8000_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); + map(0x100000, 0x13ffff).ram(); + map(0x1ff800, 0x1fffff).ram(); + //map(0x500010, 0x50001f).rw("asc", FUNC(i82510_device::read), FUNC(i82510_device::write)).umask32(0xff00ff00); +} + static INPUT_PORTS_START( gammagic ) INPUT_PORTS_END @@ -178,7 +182,7 @@ ISA16_SLOT(config, "isa3", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); ISA16_SLOT(config, "isa4", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); - rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); // "microsoft_mouse")); + rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); serport0.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd1_w)); serport0.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd1_w)); serport0.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr1_w)); @@ -191,6 +195,11 @@ serport1.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr2_w)); serport1.ri_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::nri2_w)); serport1.cts_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ncts2_w)); + + // TODO: unknown clock/type, at least '020 core, needs to be moved as a RS232 option + cpu_device &subcpu(M68EC020(config, "v8000", 12_MHz_XTAL)); + subcpu.set_addrmap(AS_PROGRAM, &gammagic_state::v8000_map); + // TODO: setchip mentions a 82510 as DUART & an ACRTC!? } @@ -198,9 +207,14 @@ ROM_REGION32_LE(0x40000, "pci:07.0", 0) ROM_LOAD("m7s04.rom", 0, 0x40000, CRC(3689f5a9) SHA1(8daacdb0dc6783d2161680564ffe83ac2515f7ef)) - ROM_REGION(0x20000, "v8000", 0) - // 68k code, unknown size/number of roms - ROM_LOAD("v8000.bin", 0x0000, 0x20000, NO_DUMP) + ROM_REGION(0x80000, "v8000", 0) + ROM_LOAD16_BYTE("m0.bin", 0x00001, 0x40000, CRC(805ea951) SHA1(81974f1a0b4dfbfc743e97485dc113c270bd21a7)) + ROM_LOAD16_BYTE("m1.bin", 0x00000, 0x40000, CRC(a8ca8d37) SHA1(a4b50726dbe164d1cc4043f447a846448160f351)) + ROM_LOAD16_BYTE("m0-v4.bin", 0x00001, 0x40000, CRC(805ea951) SHA1(81974f1a0b4dfbfc743e97485dc113c270bd21a7)) + ROM_LOAD16_BYTE("m1-v4.bin", 0x00000, 0x40000, CRC(a8ca8d37) SHA1(a4b50726dbe164d1cc4043f447a846448160f351)) + + ROM_REGION(0x10000, "setchip", 0) + ROM_LOAD("clear_mem.bin", 0, 0x10000, CRC(7832028a) SHA1(a3d9f599ed7501fa7b2088c22d9666404b0e585e)) DISK_REGION( "pci:07.1:ide1:0:xm3301" ) DISK_IMAGE_READONLY( "gammagic", 0, SHA1(947650b13f87eea6608a32a1bae7dca19d911f15) ) @@ -213,9 +227,15 @@ // TODO: move to OTI card //ROM_LOAD("otivga_tx2953526.rom", 0x0000, 0x8000, CRC(916491af) SHA1(d64e3a43a035d70ace7a2d0603fc078f22d237e1)) - ROM_REGION(0x20000, "v8000", 0) - // 68k code, unknown size/number of roms - ROM_LOAD("v8000.bin", 0x0000, 0x20000, NO_DUMP) + // assume same as gammagic for now + ROM_REGION(0x80000, "v8000", 0) + ROM_LOAD16_BYTE("m0.bin", 0x00001, 0x40000, CRC(805ea951) SHA1(81974f1a0b4dfbfc743e97485dc113c270bd21a7)) + ROM_LOAD16_BYTE("m1.bin", 0x00000, 0x40000, CRC(a8ca8d37) SHA1(a4b50726dbe164d1cc4043f447a846448160f351)) + ROM_LOAD16_BYTE("m0-v4.bin", 0x00001, 0x40000, CRC(805ea951) SHA1(81974f1a0b4dfbfc743e97485dc113c270bd21a7)) + ROM_LOAD16_BYTE("m1-v4.bin", 0x00000, 0x40000, CRC(a8ca8d37) SHA1(a4b50726dbe164d1cc4043f447a846448160f351)) + + ROM_REGION(0x10000, "setchip", 0) + ROM_LOAD("clear_mem.bin", 0, 0x10000, CRC(7832028a) SHA1(a3d9f599ed7501fa7b2088c22d9666404b0e585e)) DISK_REGION( "pci:07.1:ide1:0:xm3301" ) DISK_IMAGE_READONLY( "99bottles", 0, BAD_DUMP SHA1(0b874178c8dd3cfc451deb53dc7936dc4ad5a04f)) diff -Nru mame-0.263+dfsg.1/src/mame/misc/gms.cpp mame-0.264+dfsg.1/src/mame/misc/gms.cpp --- mame-0.263+dfsg.1/src/mame/misc/gms.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/gms.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,64 +1,78 @@ // license:BSD-3-Clause // copyright-holders: Tomasz Slanina, David Haywood +// thanks-to:Hammy -/* -实战麻将王 (Shízhàn Májiàng Wáng) by 'Game Men System Co. Ltd.' - -PCB Layout ----------- +/******************************************************************* +实战麻将王 (Shízhàn Májiàng Wáng), GMS, 1998 +实战頂凰麻雀 (Shízhàn Dǐng Huáng Máquè), GMS, 1998 +实战三国记加強版 (Shízhàn Sānguó Jì Jiāqiáng Bǎn), GMS, 1998 +Hardware info by Guru +--------------------- + +Note: Hardware is called 'Game Men System'. Company is Game Master System Co., Ltd. + +These games run on a near identical board with a slightly different sound chip. +6899-B: YM2151 and the PIC circuit is part of the main board but not used. Pin header holes for a small PCB are present but not used. +9899-B: YM3812 and the PIC is on a separate PCB soldered into the same pin header holes and the PCB area under it contains nothing. -No.6899-B +No.6899-B (Shizhan Majiang Wang and Shizhan Ding Huang Maque) +No.9899-B (Shizhan Sanguo Ji Jiaqiang Ban) |--------------------------------------------------------| -|UPC1241H YM3014 YM2151 14.31818MHz | -| VOL 358 89C51 B1 | +|UPC1241H YM3014 SNDCHIP 14.31818MHz | +| VOL 358 89C51 B1/M1 | | M6295 | | S1 PAL | | A1 | -| | +| T518B | |J 6116 | |A P1 6116 | -|M DSW3 | -|M DSW2 | -|A DSW1 DSW4 | +|M SW3 | +|M SW2 | +|A SW1 SW4 | | |-------| 6116 | | |LATTICE| 6116 PAL | | 62256 62256 |1032E | | | | | T1 | -| 68000 |-------| | +| 68HC000 |-------| | | 3.6V_BATT |-------------| | | | 93C46| | | | | | -| | * | 6116 | -| | | 22MHz 6116 | +|SW5 | * | 6116 | +| 7805 | | 22MHz 6116 | |---------------|PLASTIC COVER|--------------------------| Notes: - 68000 clock - 11.000MHz [22/2] - VSync - 58Hz - Hsync - none (dead board, no signal) - M6295 clock - 1.100MHz [22/20], sample rate = 1100000 / 165, chip is printed 'AD-65' - YM2151 clock- 2.750MHz [22/8], chip is printed 'K-666'. YM3014 chip is printed 'K-664' - * - Unpopulated position for PIC16F84 - 3.6V_BATT - Purpose of battery unknown, does not appear to be used for backup of suicide RAM, - and there's no RTC on the board. - 93C46 - 128 x8 EEPROM. This chip was covered by a plastic cover. There's nothing else under - the cover, but there was an unpopulated position for a PIC16F84 - 89C51 - Atmel 89C51 Microcontroller (protected) - - ROMs - - P1 - Hitachi HN27C4096 (Main PRG) - T1 - Macronix MX27C4000 (GFX) - A1 - Atmel AT27C080 (GFX) - B1 - Macronix MX261000 (GFX?? or PRG/data for 89C51?) - S1 - Macronix MX27C2000 (OKI samples) + 68HC000 - Toshiba TMP68HC000P-16 CPU. Clock 11.0MHz [22/2] + 6116 - 2kB x8-bit SRAM + 62256 - 32kB x8-bit SRAM (only one is battery-backed) + 6295 - OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock input 1.100MHz [22/20]. Pin 7 HIGH + SNDCHIP - 6899-B PCB - Yamaha YM2151 FM Operator Type-M (OPM). Clock 2.750MHz [22/8]. Chip is marked 'K-666'. YM3014 chip is marked 'K-664' + 9899-B PCB - Yamaha YM3812 FM Operator Type-L (OPL2). Clock 2.750MHz [22/8]. Chip is marked 'KS8001' YM3014 chip is marked 'KS8002' + * - 6899-B PCB - Unpopulated position for PIC16F84 + 9899-B PCB - Separate PCB containing two unknown chips (SOIC16, SOIC8) and a TO92 IC marked 'H HE 9013I' + 89C51 - Atmel AT89C51 Microcontroller (protected). Clock input 14.31818MHz + 93C46 - On 6899-B PCB - 93C46 EEPROM, covered by a plastic cover. No other parts populated. There is an unpopulated position for a PIC16F84 + T518B - Mitsumi PST518B Master Reset IC (TO92) + 358 - LM358 Dual Operational Amplifier + SW1-4 - 8-position DIP Switch + SW5 - Reset/Clear Switch + uPC1241H - NEC uPC1241H Audio Power Amp + 7805 - LM7805 5V Linear Regulator + 3.6V_BATT - Back-up battery maintains power to one 62256 RAM when main power supply is off. + P1 - 27C4096 (Main PRG) + T1 - 27C4000 / 234000 mask ROM (GFX) + A1 - 27C080 / 238000 mask ROM (GFX) + B1/M1 - 26C1000 / 27C1001 (PRG/data for 89C51?) + S1 - 27C2000 / 232000 mask ROM (OKI samples) + +Hold service credit (9) and reset (F3) to enter service mode. -Keep pressed 9 and press reset to enter service mode. TODO: - correct decode for 1st layer in sc2in1 and magslot (magslot also uses more videoram for tilemap 1) - cots and magslot seem to toggle between two tilemap 1 modes with 0 or 1 writes to 0x300000 (other dumped games always write 1) 1 only uses 0x940c00-0x940fff RAM, while 0 uses the whole 0x940000-0x940fff. 0 seems to be reels related. - fix 1st tilemap transparency enable -- correct EEPROM hookup for all games +- correct EEPROM hookup for all games (this would get rid of a lot of ROM patches) - hookup MCU and YM2151 sound for the mahjong games - hookup PIC16F84 for rbspm once a CPU core is available - emulate protection devices correctly instead of patching @@ -77,6 +91,7 @@ #include "cpu/mcs51/mcs51.h" #include "machine/eepromser.h" #include "sound/okim6295.h" +#include "sound/ymopl.h" #include "sound/ymopm.h" #include "emupal.h" @@ -117,6 +132,7 @@ void rbmk(machine_config &config); void rbspm(machine_config &config); + void ssanguoj(machine_config &config); void super555(machine_config &config); void train(machine_config &config); @@ -124,6 +140,8 @@ void init_ballch(); void init_cots(); void init_rbspm(); + void init_ssanguoj(); + void init_sscs(); void init_super555(); protected: @@ -156,6 +174,7 @@ void mcu_io(address_map &map); void rbmk_mem(address_map &map); void rbspm_mem(address_map &map); + void ssanguoj_mem(address_map &map); uint16_t unk_r(); uint16_t input_matrix_r(); @@ -300,6 +319,27 @@ map(0x9c0000, 0x9c0fff).ram().w(FUNC(gms_2layers_state::vram_w<1>)).share(m_vidram[1]); } +void gms_2layers_state::ssanguoj_mem(address_map &map) +{ + map(0x000000, 0x07ffff).rom().nopw(); + map(0x100000, 0x10ffff).ram(); + map(0x800000, 0x80ffff).ram(); + map(0x900000, 0x900fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0x940000, 0x940bff).ram(); + map(0x940c00, 0x940fff).ram().w(FUNC(gms_2layers_state::vram_w<0>)).share(m_vidram[0]); + map(0x980300, 0x983fff).ram(); // 0x2048 words ???, byte access + map(0x980380, 0x9803ff).ram().share(m_scrolly); + map(0x9c0000, 0x9c0fff).ram().w(FUNC(gms_2layers_state::vram_w<1>)).share(m_vidram[1]); + map(0xa00000, 0xa00001).rw(FUNC(gms_2layers_state::input_matrix_r), FUNC(gms_2layers_state::input_matrix_w)); + map(0xa08000, 0xa08001).portr("IN1").w(FUNC(gms_2layers_state::tilebank_w)); + map(0xa10000, 0xa10001).portr("IN2"); + map(0xa18080, 0xa18081).r(FUNC(gms_2layers_state::unk_r)); // TODO: from MCU? + map(0xa20000, 0xa20000).r(m_oki, FUNC(okim6295_device::read)); + //map(0xa20080, 0xa20081) // TODO: to MCU? + map(0xa28000, 0xa28000).w(m_oki, FUNC(okim6295_device::write)); + map(0xe00000, 0xe00001).w(FUNC(gms_2layers_state::eeprom_w)); +} + void gms_2layers_state::super555_mem(address_map &map) { map(0x000000, 0x07ffff).rom(); @@ -308,7 +348,7 @@ map(0x608000, 0x608001).portr("IN1").w(FUNC(gms_2layers_state::tilebank_w)); // ok map(0x610000, 0x610001).portr("IN2"); map(0x618080, 0x618081).nopr();//.lr16(NAME([this] () -> uint16_t { return m_prot_data; })); // reads something here from below, if these are hooked up booting stops with '0x09 U64 ERROR', like it's failing some checksum test - map(0x620000, 0x620000).r(m_oki, FUNC(okim6295_device::read)); // TODO: Oki controlled through a GAL at 18C, should be banked, too + map(0x620000, 0x620000).r(m_oki, FUNC(okim6295_device::read)); // Oki controlled through a GAL at 18C // map(0x620080, 0x620081).lw16(NAME([this] (uint16_t data) { m_prot_data = data; })); // writes something here that expects to read above map(0x628000, 0x628000).w(m_oki, FUNC(okim6295_device::write)); map(0x638000, 0x638001).nopw(); // lamps / outputs? @@ -564,6 +604,198 @@ INPUT_PORTS_END +static INPUT_PORTS_START( ssanguoj ) + PORT_START("IN1") // 16bit + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") // 16bit + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_TOGGLE + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) PORT_TOGGLE + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) + + // Only 4 DIP banks are actually populated on PCBs (2 empty spaces), but test mode reads all 6. + // TODO: dips + PORT_START("DSW1") // 16bit, in test mode first 8 are recognised as dsw1, second 8 as dsw4. + PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, "Controls" ) PORT_DIPLOCATION("DSW1:8") // should default to keyboard, but set on joystick since the former isn't emulated yet + PORT_DIPSETTING( 0x0080, DEF_STR( Joystick ) ) + PORT_DIPSETTING( 0x0000, "Keyboard" ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + + PORT_START("DSW2") // 16bit, in test mode first 8 are recognised as dsw2, second 8 as dsw5 + PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Version ) ) PORT_DIPLOCATION("DSW2:7") + PORT_DIPSETTING( 0x0040, "8.9" ) + PORT_DIPSETTING( 0x0000, "8.9-" ) + PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:1") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:2") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:3") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:4") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:5") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:6") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:7") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:8") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("DSW3") // 16bit, in test mode first 8 are recognised as dsw3, second 8 as dsw6 + PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:1") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:2") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:3") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:4") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:5") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:6") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:7") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:8") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + + static INPUT_PORTS_START( magslot ) PORT_START("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -721,7 +953,7 @@ //PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) // TODO: verify - // There are 4 8-DIP banks on PCB but only 3 are shown in test mode. Dips' effects as per test mode. + // There are 4 banks of 8 DIP switches on the PCB but only 3 are shown in test mode. DIP switch settings as per test mode. PORT_START("DSW1") PORT_DIPNAME( 0x0003, 0x0000, "Main Game Rate" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x0003, DEF_STR( Easy ) ) @@ -805,6 +1037,128 @@ PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( sscs ) + PORT_START("IN1") // TODO: PORT_NAMEs are machine translated, should be checked and adapted + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME( "Open card" ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME( "1 key" ) // also used for up in the 'secret' test mode + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) // used for down in the 'secret' test mode + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Abandon" ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME( "Look at the card" ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + //PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) // TODO: verify + + + // There are 4 banks of 8 DIP switches on PCB, but only 3 are shown in test mode. + // DIP switch settings as per test mode. 'Secret' test mode shows all 4 banks. + PORT_START("DSW1") + PORT_DIPNAME( 0x0003, 0x0000, "Main Game Pay Out Rate" ) PORT_DIPLOCATION("SW1:1,2") // 主遊戲機率 + PORT_DIPSETTING( 0x0003, DEF_STR( Easy ) ) // 易 + PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) ) // 中 + PORT_DIPSETTING( 0x0002, DEF_STR( Hard ) ) // 難 + PORT_DIPSETTING( 0x0001, DEF_STR( Hardest ) ) // 最難 + PORT_DIPNAME( 0x000c, 0x0000, "Double-Up Game Pay Out Rate" ) PORT_DIPLOCATION("SW1:3,4") // 比倍遊戲機率 - disabled if SW1:5 is off + PORT_DIPSETTING( 0x000c, DEF_STR( Easy ) ) // 易 + PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) ) // 中 + PORT_DIPSETTING( 0x0008, DEF_STR( Hard ) ) // 難 + PORT_DIPSETTING( 0x0004, DEF_STR( Hardest ) ) // 最難 + PORT_DIPNAME( 0x0010, 0x0000, "Double-Up On/Off" ) PORT_DIPLOCATION("SW1:5") // 比倍有無 + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) // 無 + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) // 有 + PORT_DIPNAME( 0x0020, 0x0000, "Double-Up Nudity" ) PORT_DIPLOCATION("SW1:6") // 比倍脫衣 - disabled if SW1:5 is off + PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) ) // 正常 + PORT_DIPSETTING( 0x0020, "Nudity" ) // 脫衣 + PORT_DIPNAME( 0x0040, 0x0000, "Double-Up Win Points" ) PORT_DIPLOCATION("SW1:7") // 比倍爆機分數 - disabled if SW1:5 is off + PORT_DIPSETTING( 0x0000, "10,000" ) + PORT_DIPSETTING( 0x0040, "30,000" ) + PORT_DIPNAME( 0x0080, 0x0000, "Main Game Background Music") PORT_DIPLOCATION("SW1:8") // 主遊戲背景音樂 + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) // 無 + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) // 有 + PORT_DIPUNKNOWN_DIPLOC( 0x0100, 0x0000, "SW4:1" ) + PORT_DIPUNKNOWN_DIPLOC( 0x0200, 0x0000, "SW4:2" ) + PORT_DIPUNKNOWN_DIPLOC( 0x0400, 0x0000, "SW4:3" ) + PORT_DIPUNKNOWN_DIPLOC( 0x0800, 0x0000, "SW4:4" ) + PORT_DIPUNKNOWN_DIPLOC( 0x1000, 0x0000, "SW4:5" ) + PORT_DIPUNKNOWN_DIPLOC( 0x2000, 0x0000, "SW4:6" ) + PORT_DIPUNKNOWN_DIPLOC( 0x4000, 0x0000, "SW4:7" ) + PORT_DIPUNKNOWN_DIPLOC( 0x8000, 0x0000, "SW4:8" ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x0007, 0x0000, "Coin Rate" ) PORT_DIPLOCATION("SW2:1,2,3") // 投幣比例 + PORT_DIPSETTING( 0x0001, "5" ) + PORT_DIPSETTING( 0x0002, "10" ) + PORT_DIPSETTING( 0x0003, "20" ) + PORT_DIPSETTING( 0x0004, "30" ) + PORT_DIPSETTING( 0x0000, "50" ) + PORT_DIPSETTING( 0x0005, "100" ) + PORT_DIPSETTING( 0x0006, "200" ) + PORT_DIPSETTING( 0x0007, "300" ) + PORT_DIPNAME( 0x0018, 0x0000, "Coin Rate x Key In Multiplier" ) PORT_DIPLOCATION("SW2:4,5") // 投幣比例x開分倍率 - Key In rate as a multiple of coin rate + PORT_DIPSETTING( 0x0000, "2" ) + PORT_DIPSETTING( 0x0008, "5" ) + PORT_DIPSETTING( 0x0010, "10" ) + PORT_DIPSETTING( 0x0018, "20" ) + PORT_DIPNAME( 0x0020, 0x0000, "Show Title" ) PORT_DIPLOCATION("SW2:6") // 片頭名稱 + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) // 無 + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) // 有 + PORT_DIPNAME( 0x0040, 0x0000, "Double-Up Win Points Method" ) PORT_DIPLOCATION("SW2:7") // 比倍爆機得分方式 + PORT_DIPSETTING( 0x0000, "By Key Out" ) // 按洗分键 + PORT_DIPSETTING( 0x0040, "By Pressing Button" ) // 按得键 + PORT_DIPNAME( 0x0080, 0x0000, "Control Panel" ) PORT_DIPLOCATION("SW2:8") // 操作介面 + PORT_DIPSETTING( 0x0000, "Amusement/Poker Panel" ) // 娛樂/撲克介面 + PORT_DIPSETTING( 0x0080, "Mahjong Panel" ) // 麻將介面 + + PORT_START("DSW3") + PORT_DIPNAME( 0x0003, 0x0000, "Ante Points" ) PORT_DIPLOCATION("SW3:1,2") // 底注分數 + PORT_DIPSETTING( 0x0000, "10" ) + PORT_DIPSETTING( 0x0001, "20" ) + PORT_DIPSETTING( 0x0002, "50" ) + PORT_DIPSETTING( 0x0003, "80" ) + PORT_DIPNAME( 0x000c, 0x0000, "Main Game Win Points" ) PORT_DIPLOCATION("SW3:3,4") // 主遊戲爆機分數 + PORT_DIPSETTING( 0x0004, "10,000" ) + PORT_DIPSETTING( 0x0000, "20,000" ) + PORT_DIPSETTING( 0x0008, "50,000" ) + PORT_DIPSETTING( 0x000c, "100.000" ) + PORT_DIPNAME( 0x0010, 0x0000, "Score Upper Limit" ) PORT_DIPLOCATION("SW3:5") // 進分上限 + PORT_DIPSETTING( 0x0000, "10,000" ) + PORT_DIPSETTING( 0x0010, "20,000" ) + PORT_DIPNAME( 0x0020, 0x0000, "Mahjong Numbers" ) PORT_DIPLOCATION("SW3:6") // 麻將數字 - only affects display when SW3:7,8 set to Mahjong Cards + PORT_DIPSETTING( 0x0020, "Don't Show" ) // 不顯示 - only shows characters for winds + PORT_DIPSETTING( 0x0000, "Show" ) // 顯示 - additionally shows numeric values for winds + PORT_DIPNAME( 0x00c0, 0x0000, "Card Display" ) PORT_DIPLOCATION("SW3:7,8") // 畫面顯示 - changes in-game card face style + PORT_DIPSETTING( 0x0000, "Poker Cards" ) // 撲克畫面 - playing cards + PORT_DIPSETTING( 0x0040, "Mahjong Cards" ) // 麻將畫面 - mahjong numbers and winds + PORT_DIPSETTING( 0x0080, "Caishen Cards" ) // 財神財神 - plain coloured numbers + PORT_DIPSETTING( 0x00c0, "Poker Cards" ) // 撲克畫面 - playing cards +INPUT_PORTS_END + static INPUT_PORTS_START( sc2in1 ) PORT_START("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1259,6 +1613,21 @@ // PIC16F84 but no CPU core available } +void gms_2layers_state::ssanguoj(machine_config &config) +{ + rbmk(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &gms_2layers_state::ssanguoj_mem); + + m_mcu->set_disable(); // undumped internal ROM + + config.device_remove("ymsnd"); + + ym3812_device &ym(YM3812(config, "ym3812", 22_MHz_XTAL / 8)); + ym.add_route(0, "lspeaker", 0.60); + ym.add_route(1, "rspeaker", 0.60); +} + void gms_2layers_state::super555(machine_config &config) { rbmk(config); @@ -1345,6 +1714,30 @@ ROM_END +ROM_START( ssanguoj ) + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code + ROM_LOAD( "sgc-pro_8.9_4af0.u64", 0x00000, 0x80000, CRC(c779e5c4) SHA1(d6c4833e4e2b3f8af1b7cf38fb4eef879259f214) ) + + ROM_REGION( 0x1000, "mcu", 0 ) // protected MCU + ROM_LOAD( "at89c51.bin", 0x0000, 0x1000, NO_DUMP ) + + ROM_REGION( 0x20000, "user1", 0 ) // ??? MCU data / code + ROM_LOAD( "scg-m1.u72", 0x00000, 0x20000, CRC(9ad7be80) SHA1(c5d3a55520173662034650a4a8458200f47e76ac) ) + + ROM_REGION( 0x080000, "oki", 0 ) + ROM_LOAD( "mje2bf-s1.u83", 0x00000, 0x80000, CRC(dabb41a1) SHA1(ad809d8a4d5362a02b3ca49a75278943a824df1e) ) // 1ST AND 2ND HALF IDENTICAL + + ROM_REGION( 0x100000, "gfx1", 0 ) + ROM_LOAD( "99a-a02_m5042j-a1.u41", 0x000000, 0x100000, CRC(4b0823f4) SHA1(69e5448a9fe06430625c7c407ff4a7fd5b58d445) ) + + ROM_REGION( 0x80000, "gfx2", 0 ) + ROM_LOAD( "sgc-t1.u39", 0x00000, 0x80000, CRC(50776a8f) SHA1(141bd23fc237a0e8d31ae0504ea2b9cf39859319) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD_SWAP( "93c46.u51", 0x00, 0x080, NO_DUMP ) +ROM_END + + ROM_START( super555 ) // GMS branded chips: A66, A68, M06 ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code ROM_LOAD( "super555-v1.5e-0d9b.u64", 0x00000, 0x80000, CRC(9a9c16cc) SHA1(95609dbd45feb591190a2b62dee8846cdcec3462) ) @@ -1363,6 +1756,78 @@ ROM_END +/******************************************************************* +Sān Sè Cáishén (三色財神), GMS, 1999 +Hardware Info by Guru +--------------------- + +M3-16-V3 89-01-A2 +GAME MASTER SYSTEM CO.,LTD. +|-------------------------------------------------| +| A1 T1 6116 6116 | +| 6116 |-------| 18CV8 | +| 6116 6116| | | +|-| |GMS-A68| 22MHz| + | | | | +|-| |-------| | +| 14.31818MHz| +|1 6116 6116 | +|8 |----| | +|W |-----| |M05 | | +|A SW1 SW3 |99A-A1 93C46 |----| | +|Y SW2 SW4 |A66 | |-------| | +|-| |-----| | | 62256 | + | |68HC000| 62256 | +|-| 6295 |FN16 | P1 | +| S1 TLP521 |-------| | +|10 VOL TLP521 | +|WA 7805 T518B TLP521 | +| uPC1241H TLP521 BATT| +|-| JAMMA |--| SW5 | + |------------------------| |-------------------| +Notes: + 68HC000 - Motorola MC68HC000FN16 CPU. Clock 11.0MHz [22/2] + 6295 - OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock input 1.100MHz [22/20]. Pin 7 HIGH + 6116 - 2kB x8-bit SRAM + 62256 - 32kB x8-bit SRAM (both battery-backed) + 99A-A1 A66 - GMS Custom PLCC44 Chip (CPLD) + M05 - GMS Custom PLCC68 Chip (CPLD) + GMS-A68 - GMS Custom PLCC44 Chip (CPLD) + TLP521 - Toshiba TLP521 Photocoupler + uPC1241H - NEC uPC1241H Audio Power Amp + 7805 - LM7805 5V Linear Regulator + 18CV8 - GAL18CV8 PLD + 93C46 - Atmel AT93C46 EEPROM + T518B - Mitsumi PST518B Master Reset IC (TO92) + SW1-4 - 8-position DIP Switch + SW5 - Reset/Clear Switch + VOL - Volume Pot + BATT - CR2032 3V Lithium Battery + P1 - 27C4096 EPROM (main program) + S1 - 23C4000 mask ROM (oki samples) + A1/T1 - 23C8000 mask ROM (gfx) + +*******************************************************************/ + +ROM_START( sscs ) + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code + ROM_LOAD( "p1_7177.u64", 0x00000, 0x80000, CRC(687ad5c8) SHA1(176a635753243882933e8db1aebcde142dc611f9 ) ) + + ROM_REGION( 0x80000, "oki", 0 ) + ROM_LOAD( "s1_sh-s1-s08.u83", 0x00000, 0x80000, CRC(9112ece2) SHA1(0ec9859b8925cdda2edfb93c8fc0d747933b365f) ) + + ROM_REGION( 0x100000, "gfx1", 0 ) + ROM_LOAD( "a1_bj-a1-a06.u41", 0x000000, 0x100000, CRC(f758d95e) SHA1(d1da16f3ef618a8c1118784bdc39dd93acf86aff) ) + + ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_LOAD( "t1_a11u-t07d.u39", 0x080000, 0x080000, CRC(f0ecbc72) SHA1(536288d21a5720111cb3392c974ee5ccdc4a2c6b) ) + ROM_CONTINUE( 0x000000, 0x080000 ) // TODO: shouldn't be needed but the game doesn't seem to enable tile bank? + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD16_WORD_SWAP( "93c46.u136", 0x00, 0x080, CRC(9ad1b39c) SHA1(2fed7e0918119b2354a9f1944d501dc817ffd5dc) ) +ROM_END + + // Basically same PCB as magslot, but with only 1 dip bank. Most labels have been covered with other labels with 'TETRIS' hand-written // GMS-branded chips: A66, A89, A201, A202. Not populated: M88 ROM_START( sc2in1 ) @@ -1504,7 +1969,7 @@ // the following inits patch out protection (?) checks to allow for testing - // unfortunately the various U errors shown don't correspond to correct PCB locations + // unfortunately the various U errors shown don't always correspond to correct PCB locations void gms_2layers_state::init_rbspm() { @@ -1516,6 +1981,13 @@ rom[0x1f1fc / 2] = 0x6000; } +void gms_2layers_state::init_ssanguoj() +{ + uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); + + rom[0x2fc0 / 2] = 0x6000; // loops endlessly after ROM / RAM test +} + void gms_3layers_state::init_sc2in1() { uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); @@ -1560,20 +2032,37 @@ // the password to enter test mode is all Start } +void gms_2layers_state::init_sscs() +{ + uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); + + rom[0x32b2 / 2] = 0x6000; // loops endlessly after ROM / RAM test + rom[0xcc1c / 2] = 0x6000; // U135 ERROR + rom[0xcc2e / 2] = 0x4e71; // U135 ERROR + rom[0xcc30 / 2] = 0x4e71; // U135 ERROR + rom[0xcc5e / 2] = 0x6000; // U136 ERROR + rom[0xce2a / 2] = 0x6000; // U136 ERROR + rom[0xce3c / 2] = 0x4e71; // U136 ERROR + rom[0xce3e / 2] = 0x4e71; // U136 ERROR + rom[0x19c1a / 2 ] = 0x6000; // U85 ERROR +} + } // anonymous namespace // mahjong -GAME( 1998, rbmk, 0, rbmk, rbmk, gms_2layers_state, empty_init, ROT0, "GMS", "Shizhan Majiang Wang (Version 8.8)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // misses YM2151 hookup, Oki hookup may be imperfect -GAME( 1998, rbspm, 0, rbspm, rbspm, gms_2layers_state, init_rbspm, ROT0, "GMS", "Shizhan Ding Huang Maque (Version 4.1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 1998, rbmk, 0, rbmk, rbmk, gms_2layers_state, empty_init, ROT0, "GMS", "Shizhan Majiang Wang (Version 8.8)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // misses YM2151 hookup +GAME( 1998, rbspm, 0, rbspm, rbspm, gms_2layers_state, init_rbspm, ROT0, "GMS", "Shizhan Ding Huang Maque (Version 4.1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 1998, ssanguoj, 0, ssanguoj, ssanguoj, gms_2layers_state, init_ssanguoj, ROT0, "GMS", "Shizhan Sanguo Ji Jiaqiang Ban (Version 8.9 980413)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now. YM3812 isn't hooked up (goes through undumped MCU). // card games -GAME( 1999, super555, 0, super555, super555, gms_2layers_state, init_super555, ROT0, "GMS", "Super 555 (English version V1.5)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now -GAME( 2001, sc2in1, 0, magslot, sc2in1, gms_3layers_state, init_sc2in1, ROT0, "GMS", "Super Card 2 in 1 (English version 03.23)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 1999, super555, 0, super555, super555, gms_2layers_state, init_super555, ROT0, "GMS", "Super 555 (English version V1.5)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 1999, sscs, 0, super555, sscs, gms_2layers_state, init_sscs, ROT0, "GMS", "San Se Caishen (Version 0502)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now, inputs / DIPs to be figured out +GAME( 2001, sc2in1, 0, magslot, sc2in1, gms_3layers_state, init_sc2in1, ROT0, "GMS", "Super Card 2 in 1 (English version 03.23)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now // slot, on slightly different PCB -GAME( 2003, magslot, 0, magslot, magslot, gms_3layers_state, empty_init, ROT0, "GMS", "Magic Slot (normal 1.0C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // needs implementing of 3rd GFX layer, correct GFX decode for 1st layer, inputs +GAME( 2003, magslot, 0, magslot, magslot, gms_3layers_state, empty_init, ROT0, "GMS", "Magic Slot (normal 1.0C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // needs implementing of 3rd GFX layer, correct GFX decode for 1st layer, inputs // train games -GAME( 2002, ballch, 0, train, ballch, gms_2layers_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now -GAME( 2005, cots, 0, train, cots, gms_2layers_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 2002, ballch, 0, train, ballch, gms_2layers_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now +GAME( 2005, cots, 0, train, cots, gms_2layers_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now diff -Nru mame-0.263+dfsg.1/src/mame/misc/gumbo.cpp mame-0.264+dfsg.1/src/mame/misc/gumbo.cpp --- mame-0.263+dfsg.1/src/mame/misc/gumbo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/gumbo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -98,8 +98,6 @@ }; -// video - void gumbo_state::bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { @@ -142,8 +140,6 @@ } -// machine - void gumbo_state::gumbo_map(address_map &map) { map(0x000000, 0x03ffff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/misc/itgamble.cpp mame-0.264+dfsg.1/src/mame/misc/itgamble.cpp --- mame-0.263+dfsg.1/src/mame/misc/itgamble.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/itgamble.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,7 +4,7 @@ Nazionale Elettronica + others (mostly Italian) Gambling games mostly based on H8/3048 + OKI 6295 or similar. -. + These all use MCUs with internal ROM for their programs, they can't be dumped easily, and thus we can't emulate them at the moment because there is nothing to emulate diff -Nru mame-0.263+dfsg.1/src/mame/misc/jaminator.cpp mame-0.264+dfsg.1/src/mame/misc/jaminator.cpp --- mame-0.263+dfsg.1/src/mame/misc/jaminator.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/jaminator.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,292 @@ +// license: BSD-3-Clause +// copyright-holders: Devin Acker + +/*************************************************************************** + Noise Toys Inc. "Jaminator" + + This toy guitar was originally sold by Worlds of Wonder in 1990, along with + six optional ROM cartridges. In 1993, it was also licensed to Arrow Micro-Techs + (AMT) and Yamaha, who distributed it along with several new cartridges. + + A message from the development team is used as ROM padding: + """ + (C)1990 Noise Toys Inc + Code by Steve Capps(MAD - Je t'aime beaucoup) + Hardware by Ray DuFlon + Music by Ed Bogas(Des - te amo) + """ + + Main hardware: + U101: "DEVO" sound and mapper ASIC + ("(C)1987 NOISE TOYS INC", "WOW DEVO 33073-01 CF61909N" or "AMT DEVO CF61909N") + U102: OKI MSM80C39 + U104: 1Mbit mask ROM (DIP28, 23C1000 pinout) + + TODO: + - Link cable + - Clickable layout? + +***************************************************************************/ + + +#include "emu.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/rescap.h" +#include "sound/cf61909.h" +#include "sound/flt_biquad.h" +#include "sound/flt_rc.h" + +#include "softlist_dev.h" +#include "speaker.h" + +namespace { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class jaminator_state : public driver_device +{ +public: + jaminator_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_devo(*this, "devo"), + m_cart(*this, "cart"), + m_inputs(*this, "COL%u", 1), // labeling from PCB silkscreen + m_bender(*this, "BENDER"), + m_led_power(*this, "led_power") + { } + + void jaminator(machine_config &config); + + void input_sel_w(u8 data); + DECLARE_CUSTOM_INPUT_MEMBER(input_r); + DECLARE_CUSTOM_INPUT_MEMBER(bender_r); + + // link cable not emulated yet, but output needs to be looped back too (used for starting songs, etc) + void link_data_w(u8 data) { m_link_data = data; } + DECLARE_CUSTOM_INPUT_MEMBER(link_data_r) { return m_link_data; } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + void main_map(address_map &map); + void io_map(address_map &map); + void sound_map(address_map &map); + + required_device m_maincpu; + required_device m_devo; + required_device m_cart; + required_ioport_array<7> m_inputs; + required_ioport m_bender; + output_finder<> m_led_power; + + u8 m_input_sel; + u8 m_link_data; +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void jaminator_state::main_map(address_map &map) +{ + // TODO: program ROM banking for executable cartridges (do any exist?) + map(0x000, 0x7ff).mirror(0x800).rom().region("devo", 0); +} + +void jaminator_state::io_map(address_map &map) +{ + map(0x00, 0xff).rw(m_devo, FUNC(cf61909_device::read), FUNC(cf61909_device::write)); +} + +void jaminator_state::sound_map(address_map &map) +{ + map(0x00000, 0x1ffff).rom().region("devo", 0); + map(0x20000, 0x3ffff).nopr(); // cart +} + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( jaminator ) + PORT_START("COL1") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("String 1") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("String 2") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("String 3") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Start / Next") + + PORT_START("COL2") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Key 1") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Key 2") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Key 3") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Key 4") + + PORT_START("COL3") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Drum Pad 1") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Drum Pad 2") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Drum Pad 3") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Finale") + + PORT_START("COL4") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("Fret 1") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("Fret 2") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("Fret 3") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4) PORT_NAME("Fret 4") + + PORT_START("COL5") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5) PORT_NAME("Fret 5") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6) PORT_NAME("Fret 6") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7) PORT_NAME("Fret 7") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8) PORT_NAME("Fret 8") + + PORT_START("COL6") + PORT_BIT(0x1, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9) PORT_NAME("Fret 9") + PORT_BIT(0x2, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_0) PORT_NAME("Fret 10") + PORT_BIT(0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Fret 11") + PORT_BIT(0x8, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fret 12") + + PORT_START("COL7") + PORT_BIT(0xf, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(jaminator_state, bender_r) + + PORT_START("BENDER") + PORT_BIT(0xff, 0x78, IPT_PADDLE) PORT_NAME("Bender Bar") PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_MINMAX(0x00, 0xef) + + PORT_START("P1") + PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(jaminator_state, input_r) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OUTPUT ) // link cable clock + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(jaminator_state, link_data_w) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Select") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(jaminator_state, link_data_r) + + PORT_START("P2") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(jaminator_state, input_sel_w) + + /* + * T0 is connected to pin 1 on the link port, which is pulled up by a 10k resistor. + * Connecting it to ground causes percussion tracks to be omitted when playing songs + */ + PORT_START("T0") + PORT_CONFNAME(0x1, 0x1, "Percussion Tracks") + PORT_CONFSETTING(0x0, DEF_STR( Off )) + PORT_CONFSETTING(0x1, DEF_STR( On )) +INPUT_PORTS_END + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void jaminator_state::machine_start() +{ + m_led_power.resolve(); + m_input_sel = 0; + m_link_data = 0; + + if (m_cart->exists()) + m_devo->space().install_read_handler(0x20000, 0x3ffff, read8sm_delegate(*m_cart, FUNC(generic_slot_device::read_rom))); + + save_item(NAME(m_input_sel)); + save_item(NAME(m_link_data)); +} + +//************************************************************************** +void jaminator_state::machine_reset() +{ + m_led_power = 1; +} + +//************************************************************************** +void jaminator_state::input_sel_w(u8 data) +{ + m_input_sel = data & 0xf; + + if (m_input_sel == 0x7) + { + m_led_power = 0; + m_devo->reset(); + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + } +} + +//************************************************************************** +CUSTOM_INPUT_MEMBER(jaminator_state::input_r) +{ + if (m_input_sel < 0x7) + return m_inputs[m_input_sel]->read(); + + return 0; +} + +//************************************************************************** +CUSTOM_INPUT_MEMBER(jaminator_state::bender_r) +{ + // the bender PCB only has 15 contact positions (0-14), but the ROM recognizes 16 values + static const u8 bendval[] = { + 0xf, 0x7, 0x3, 0xb, 0x9, 0x1, 0x5, 0xd, + 0xc, 0x4, 0x0, 0x8, 0xa, 0x2, 0x6, 0xe + }; + return bendval[m_bender->read() >> 4]; +} + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** + +void jaminator_state::jaminator(machine_config &config) +{ + I8039(config, m_maincpu, 11_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &jaminator_state::main_map); + m_maincpu->set_addrmap(AS_IO, &jaminator_state::io_map); + m_maincpu->p1_in_cb().set_ioport("P1"); + m_maincpu->p1_out_cb().set_ioport("P1"); + m_maincpu->p2_out_cb().set_ioport("P2"); + m_maincpu->t0_in_cb().set_ioport("T0"); + + GENERIC_CARTSLOT(config, m_cart, generic_linear_slot, "jaminator", "bin"); + SOFTWARE_LIST(config, "cart_list").set_original("jaminator"); + + SPEAKER(config, "speaker").front_center(); + + CF61909(config, m_devo, 11_MHz_XTAL); + m_devo->set_addrmap(0, &jaminator_state::sound_map); + m_devo->add_route(0, "rcfilter", 1.0); + m_maincpu->t1_in_cb().set(m_devo, FUNC(cf61909_device::sync_r)); + + filter_rc_device &rcfilter(FILTER_RC(config, "rcfilter")); + rcfilter.set_lowpass(RES_R(510) + RES_K(15), CAP_N(6.8)); + rcfilter.add_route(0, "biquad", 1.0); + + filter_biquad_device &biquad(FILTER_BIQUAD(config, "biquad")); + biquad.opamp_sk_lowpass_setup(RES_K(10), RES_K(10), RES_K(39), RES_K(1), CAP_N(6.8), CAP_N(6.8)); + biquad.add_route(0, "speaker", 1.0); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( jaminator ) + ROM_REGION(0x20000, "devo", 0) + ROM_LOAD("amta361.u104", 0x00000, 0x20000, CRC(f3f798ed) SHA1(08bef43e9689608f40a57b77724de5f6d2652693)) +ROM_END + +} // anonymous namespace + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +SYST( 1990, jaminator, 0, 0, jaminator, jaminator, jaminator_state, empty_init, "Noise Toys Inc.", "Jaminator", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/magreel.cpp mame-0.264+dfsg.1/src/mame/misc/magreel.cpp --- mame-0.263+dfsg.1/src/mame/misc/magreel.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/magreel.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause // copyright-holders: Scott Stone + /*************************************************************************** Magic Reels - Casino Slots @@ -24,8 +25,10 @@ ***************************************************************************/ #include "emu.h" + #include "cpu/m68000/m68000.h" #include "cpu/pic16c62x/pic16c62x.h" + #include "screen.h" #include "speaker.h" @@ -197,7 +200,7 @@ // descramble address. TODO: gives M68000-looking code structure, but probably isn't correct for (int i = 0; i < 0x100000; i++) - rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 16, 17, 18, 1, 3, 2, 4, 7, 5, 6, 8, 9, 10, 11, 14, 12, 13, 15, 0)]; + rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 16, 17, 18, 1, 3, 2, 4, 6, 5, 7, 8, 9, 10, 11, 14, 12, 13, 15, 0)]; uint16_t *rom16 = (uint16_t *)memregion("maincpu")->base(); @@ -206,6 +209,6 @@ rom16[i] = bitswap<16>(rom16[i] ^ 0x0000, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); } -} // Anonymous namespace +} // anonymous namespace GAME( 199?, magreel, 0, magreel, magreel, magreel_state, init_magreel, ROT0, "Play System", "Magic Reels", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/matrix.cpp mame-0.264+dfsg.1/src/mame/misc/matrix.cpp --- mame-0.263+dfsg.1/src/mame/misc/matrix.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/matrix.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -30,20 +30,16 @@ #include "emu.h" #include "bus/isa/isa_cards.h" -#include "bus/pci/rivatnt.h" #include "cpu/i386/i386.h" #include "machine/8042kbdc.h" #include "machine/mc146818.h" #include "machine/mediagx_cs5530_bridge.h" #include "machine/mediagx_cs5530_ide.h" +#include "machine/mediagx_cs5530_video.h" #include "machine/mediagx_host.h" #include "machine/pci.h" #include "machine/zfmicro_usb.h" -#include "screen.h" - -#define ENABLE_VGA 0 - namespace { class matrix_state : public driver_device @@ -79,7 +75,6 @@ void matrix_state::matrix(machine_config &config) { - // basic machine hardware MEDIAGX(config, m_maincpu, 233'000'000); // Cyrix MediaGX GXm-266GP m_maincpu->set_addrmap(AS_PROGRAM, &matrix_state::main_map); m_maincpu->set_irq_acknowledge_callback("pci:12.0:pic8259_master", FUNC(pic8259_device::inta_cb)); @@ -108,10 +103,6 @@ // Tries to initialize MediaGX F4 -> ISA -> PCI // May actually be a ZFMicro PCI Bridge (0x10780400)? PCI_BRIDGE(config, "pci:01.0", 0, 0x10780000, 0); -#if ENABLE_VGA - // NOTE: most MediaGX boards don't even provide an AGP port, at best you get PCI slots. - PCI_SLOT(config, "pci:01.0:1", pci_cards, 0, 0, 1, 2, 3, "rivatnt").set_fixed(true); -#endif // "pci:12.0" or "pci:10.0" depending on pin H26 (readable in bridge thru PCI index $44) mediagx_cs5530_bridge_device &isa(MEDIAGX_CS5530_BRIDGE(config, "pci:12.0", 0, "maincpu", "pci:12.2")); @@ -129,7 +120,7 @@ ide.irq_sec().set("pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq15_w)); // "pci:12.3" XpressAUDIO - // "pci:12.4" XpressVIDEO + MEDIAGX_CS5530_VIDEO(config, "pci:12.4", 0); ZFMICRO_USB(config, "pci:13.0", 0); diff -Nru mame-0.263+dfsg.1/src/mame/misc/mcatadv.cpp mame-0.264+dfsg.1/src/mame/misc/mcatadv.cpp --- mame-0.263+dfsg.1/src/mame/misc/mcatadv.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/mcatadv.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -226,8 +226,6 @@ }; -// video - void mcatadv_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { u16 *source = (m_spriteram->buffer() + (m_spriteram->bytes() / 2) /2); @@ -430,8 +428,6 @@ } -// machine - template void mcatadv_state::get_banked_color(bool tiledim, u32 &color, u32 &pri, u32 &code) { diff -Nru mame-0.263+dfsg.1/src/mame/misc/mosaic.cpp mame-0.264+dfsg.1/src/mame/misc/mosaic.cpp --- mame-0.263+dfsg.1/src/mame/misc/mosaic.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/mosaic.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -118,8 +118,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -189,8 +187,6 @@ } -// machine - void mosaic_state::protection_w(uint8_t data) // TODO: hook up PIC dump and remove this simulation (PIC dump contains the exact values in this jumptable) { if (!BIT(data, 7)) diff -Nru mame-0.263+dfsg.1/src/mame/misc/neomania.cpp mame-0.264+dfsg.1/src/mame/misc/neomania.cpp --- mame-0.263+dfsg.1/src/mame/misc/neomania.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/neomania.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,6 +1,23 @@ // license:BSD-3-Clause // copyright-holders: -/* +/************************************************************************************************** + +TODO: +- SIGABRT in pcipc/pciagp trying to execute ppm.exe, + in shutms11 will draw "Parallel Port Manager v4.0" then fail on device check. +\- "Testing I/O board connection" + bp 100027e2, edit $25dd11 = 0x02 (board identifier?) +\- "Testing I/O board communications" + bp 10002942 (checks acknowledge from control bit 6 @ $37a, for 0xe0-0xe7. Buffers at $25dd48-4f) + Expected ack values: 40 40 00 00 40 00 40 00 + bp 10002d57,1,{ebx=8;g} for a quick workaround +\- "Testing I/O board input bits" / "BAD 0 1 2 3 7" + Goes ahead in checking each port r/w, TBD +\- Fails win98 PS/2 PnP afterwards, which isn't supposed to be connected in the first place. +- Extract "Guard.zip" and understand what is for; + +=================================================================================================== + Neo Mania: The Portuguese (Vila Nova de Gaia) company "Hyper M.A.R." created this machine on 2002 with 40 games, and updated it on 2003 increasing the number of games up to 48. There was a latest newer version @@ -21,15 +38,10 @@ It also contains a password protected "Guard.zip", copy protection? C:\Windows has driver installs for: - a Sound Blaster AudioPCI 128 -- an ATI All-In-Wonder / All-In-Wonder Pro (with leftover "SYSTEM.I~I" footprint with "display.drv=ATI Rage IIC AGP (Português)"). - -TODO: -- HDD image doesn't boot in neither shutms11 nor pcipc, mangled MBR boot record or geometry params (has -chs 3532,16,38 but WinImage reports back ~20 GB partition?); -- (With manually c&p files in a CHD that works) SIGABRT in pcipc trying to execute ppm.exe, in shutms11 will draw "Parallel Port Manager v4.0" then fail on device check; -- Extract "Guard.zip" and understand what is for; - +- an ATI All-In-Wonder / All-In-Wonder Pro (with leftover "SYSTEM.I~I" footprint with + "display.drv=ATI Rage IIC AGP (Português)"). -*/ +**************************************************************************************************/ #include "emu.h" #include "cpu/i386/i386.h" diff -Nru mame-0.263+dfsg.1/src/mame/misc/news.cpp mame-0.264+dfsg.1/src/mame/misc/news.cpp --- mame-0.263+dfsg.1/src/mame/misc/news.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/news.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -69,8 +69,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -162,8 +160,6 @@ } -// machine - void news_state::prg_map(address_map &map) { map(0x0000, 0x7fff).rom(); // 4000-7fff is written to during startup, probably leftover code diff -Nru mame-0.263+dfsg.1/src/mame/misc/odyssey.cpp mame-0.264+dfsg.1/src/mame/misc/odyssey.cpp --- mame-0.263+dfsg.1/src/mame/misc/odyssey.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/odyssey.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,6 +1,6 @@ // license:BSD-3-Clause // copyright-holders:Roberto Fresca -/***************************************************************** +/****************************************************************************** Odyssey. Silicon Gaming. @@ -8,7 +8,13 @@ Preliminary driver by Roberto Fresca. -****************************************************************** + TODO: + - bp f7ae6,1,{eip+=0xf;g} fails ISA state $0f; + - Accesses S3 video in New MMIO mode, core fumbles on video mode setup + (prepares linear for 32bpp, core sets SVGA 8bpp instead) + - Hangs after playing with LPT1 & IDE checks; + +******************************************************************************* Hardware Notes -------------- @@ -63,7 +69,7 @@ chassis is manufactured by Neotec. -******************************************************************/ +******************************************************************************/ #include "emu.h" @@ -73,12 +79,12 @@ #include "machine/i82371sb.h" #include "machine/i82439hx.h" #include "bus/isa/isa_cards.h" -#include "bus/pci/virge_pci.h" +#include "bus/pci/vision.h" //#include "bus/rs232/hlemouse.h" //#include "bus/rs232/null_modem.h" -//#include "bus/rs232/rs232.h" +#include "bus/rs232/rs232.h" //#include "bus/rs232/sun_kbd.h" -//#include "bus/rs232/terminal.h" +#include "bus/rs232/terminal.h" #include "machine/pc87306.h" @@ -131,17 +137,14 @@ fdc.gp25_gatea20().set_inputline(":maincpu", INPUT_LINE_A20); fdc.irq1().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq1_w)); fdc.irq8().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq8n_w)); -#if 0 fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); -#endif } -#if 0 static void isa_com(device_slot_interface &device) { // device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); @@ -149,18 +152,17 @@ // device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); // device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); // device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); -// device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("terminal", SERIAL_TERMINAL); // device.option_add("null_modem", NULL_MODEM); // device.option_add("sun_kbd", SUN_KBD_ADAPTOR); } -#endif // This emulates a Tucson / Triton-II chipset, earlier i430fx TBD -// PCI config space is trusted by Intel TC430HX "Technical Product Specification" +// PCI config space is trusted by Intel TC430HX "Technical Product Specification" page 39 void odyssey_state::odyssey(machine_config &config) { // a Celeron at 1.70 GHz on the MB I checked. <- doesn't match being a Triton/Triton-II ... -AS - // It also fails refresh check if it's 133 MHz + // It also fails refresh check if it's barely above 66 MHz (ISA state $08) PENTIUM(config, m_maincpu, 66'000'000); m_maincpu->set_addrmap(AS_PROGRAM, &odyssey_state::odyssey_map); m_maincpu->set_addrmap(AS_IO, &odyssey_state::odyssey_io); @@ -171,6 +173,7 @@ I82439HX(config, "pci:00.0", 0, m_maincpu, 64*1024*1024); // TODO: 82371FB + // accesses both mbirq regs, regular PIIX rather than PIIX3? i82371sb_isa_device &isa(I82371SB_ISA(config, "pci:07.0", 0, "maincpu")); isa.boot_state_hook().set([](u8 data) { /* printf("%02x\n", data); */ }); isa.smi().set_inputline("maincpu", INPUT_LINE_SMI); @@ -181,14 +184,20 @@ // TODO: 82371FB USB at 07.2 - // On-board Virge or Virge/DX - // TODO: actually a S3 Vision 968 - PCI_SLOT(config, "pci:1", pci_cards, 8, 0, 1, 2, 3, "virge"); + // On-board S3 Vision 968 + VISION968_PCI(config, "pci:08.0", 0); // pci:0d.0 (J4E1) PCI expansion slot 1 + //PCI_SLOT(config, "pci:1", pci_cards, 13, 0, 1, 2, 3, nullptr); + // pci:0e.0 (J4D2) PCI expansion slot 2 + //PCI_SLOT(config, "pci:2", pci_cards, 14, 0, 1, 2, 3, nullptr); + // pci:0f.0 (J4D1) PCI expansion slot 3 + //PCI_SLOT(config, "pci:3", pci_cards, 15, 0, 1, 2, 3, nullptr); + // pci:10.0 (J4C1) PCI expansion slot 4 + PCI_SLOT(config, "pci:4", pci_cards, 16, 0, 1, 2, 3, nullptr); ISA16_SLOT(config, "board4", 0, "pci:07.0:isabus", isa_internal_devices, "pc87306", true).set_option_machine_config("pc87306", national_superio_config); ISA16_SLOT(config, "isa1", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); @@ -197,21 +206,19 @@ ISA16_SLOT(config, "isa4", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); ISA16_SLOT(config, "isa5", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); -#if 0 - rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); // "microsoft_mouse")); - serport0.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd1_w)); - serport0.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd1_w)); - serport0.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr1_w)); - serport0.ri_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::nri1_w)); - serport0.cts_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ncts1_w)); + rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); + serport0.rxd_handler().set("board4:pc87306", FUNC(pc87306_device::rxd1_w)); + serport0.dcd_handler().set("board4:pc87306", FUNC(pc87306_device::ndcd1_w)); + serport0.dsr_handler().set("board4:pc87306", FUNC(pc87306_device::ndsr1_w)); + serport0.ri_handler().set("board4:pc87306", FUNC(pc87306_device::nri1_w)); + serport0.cts_handler().set("board4:pc87306", FUNC(pc87306_device::ncts1_w)); rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); - serport1.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd2_w)); - serport1.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd2_w)); - serport1.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr2_w)); - serport1.ri_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::nri2_w)); - serport1.cts_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ncts2_w)); -#endif + serport1.rxd_handler().set("board4:pc87306", FUNC(pc87306_device::rxd2_w)); + serport1.dcd_handler().set("board4:pc87306", FUNC(pc87306_device::ndcd2_w)); + serport1.dsr_handler().set("board4:pc87306", FUNC(pc87306_device::ndsr2_w)); + serport1.ri_handler().set("board4:pc87306", FUNC(pc87306_device::nri2_w)); + serport1.cts_handler().set("board4:pc87306", FUNC(pc87306_device::ncts2_w)); } @@ -242,19 +249,22 @@ ROM_REGION32_LE( 0x100000, "pmb", ROMREGION_ERASE00 ) // Peripheral Memory Board (II) ROMS ROM_LOAD( "sgi_u13_165_0017_0_rev_a_l97_1352.bin", 0x00000, 0x80000, CRC(31ca868c) SHA1(d1db4ef12add336e25374fcf5d3238b8fbca05dd) ) // U13 - 165-0017 BIOS (27C040/27C4001 EPROM) + // boot image? Contains valid x86 code at $f50, login info to a network at $000 ROM_LOAD( "sgi_u5_165_0030_0_at28c010.bin", 0x80000, 0x20000, CRC(75a80169) SHA1(a8ece0f82a49f721fb178dbe25fc859bd65ce44f) ) // U5 - 165-0030 CONFIG (Atmel 28C010-12PC EEPROM) - ROM_REGION32_LE( 0x80000, "pci:07.0", 0 ) - ROM_COPY( "pmb", 0x00000, 0x00000, 0x80000 ) - - ROM_REGION( 0x300000, "other", 0 ) // remaining BIOS + ROM_REGION( 0x380000, "other", 0 ) // remaining BIOS // doesn't seem to have valid x86 boot vectors, may be reused later. ROM_LOAD( "sgi_bios_76.bin", 0x000000, 0x80000, CRC(00592222) SHA1(29281d25aaf2051e0794dece8be146bb63d5c488) ) ROM_LOAD( "sgi_bios_65.bin", 0x080000, 0x80000, CRC(af970c2a) SHA1(0fb49bca34dbd0725b5abb9c876bb849be31b3ed) ) - ROM_LOAD( "sgi_bios_55.bin", 0x100000, 0x80000, CRC(0138ef08) SHA1(fad1c0edf37042fffcb5a4006fd69ac59b55ab33) ) - ROM_LOAD( "sgi_bios_46.bin", 0x180000, 0x80000, CRC(37090b87) SHA1(431c0a1954d5bf7fd4fa6f2b983010fbf3c8ce13) ) - ROM_LOAD( "sgi_bios_31.bin", 0x200000, 0x80000, CRC(0954278b) SHA1(dc04a0604159ddd3d24bdd292b2947cc443054f8) ) - ROM_LOAD( "sgi_bios_00.bin", 0x280000, 0x80000, CRC(41480fb5) SHA1(073596d3ba40ae67e3be3f410d7b29c77988df47) ) + ROM_LOAD( "sgi_bios_62.bin", 0x100000, 0x80000, CRC(e76b0ec1) SHA1(e537a8592759e34c6c039f2d4cb77c9b58459841) ) + ROM_LOAD( "sgi_bios_55.bin", 0x180000, 0x80000, CRC(0138ef08) SHA1(fad1c0edf37042fffcb5a4006fd69ac59b55ab33) ) + ROM_LOAD( "sgi_bios_46.bin", 0x200000, 0x80000, CRC(37090b87) SHA1(431c0a1954d5bf7fd4fa6f2b983010fbf3c8ce13) ) + ROM_LOAD( "sgi_bios_31.bin", 0x280000, 0x80000, CRC(0954278b) SHA1(dc04a0604159ddd3d24bdd292b2947cc443054f8) ) + ROM_LOAD( "sgi_bios_00.bin", 0x300000, 0x80000, CRC(41480fb5) SHA1(073596d3ba40ae67e3be3f410d7b29c77988df47) ) + + ROM_REGION32_LE( 0x100000, "pci:07.0", 0 ) + ROM_COPY( "other", 0x00000, 0x00000, 0x80000 ) + ROM_COPY( "pmb", 0x00000, 0x80000, 0x80000 ) ROM_REGION( 0x10000, "vbios", 0 ) // video card BIOS ROM_LOAD( "videobios", 0x000000, 0x00d000, NO_DUMP ) @@ -274,5 +284,5 @@ * Game Driver(s) * **************************************/ -/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 1998, odyssey, 0, odyssey, odyssey, odyssey_state, empty_init, ROT0, "Silicon Gaming", "Odyssey", MACHINE_IS_SKELETON ) +/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ +GAME( 1998, odyssey, 0, odyssey, odyssey, odyssey_state, empty_init, ROT270, "Silicon Gaming", "Odyssey", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/oneshot.cpp mame-0.264+dfsg.1/src/mame/misc/oneshot.cpp --- mame-0.263+dfsg.1/src/mame/misc/oneshot.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/oneshot.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -249,8 +249,6 @@ }; -// video - // bg tilemap TILE_GET_INFO_MEMBER(maddonna_state::get_bg_tile_info) { @@ -443,8 +441,6 @@ } -// machine - u16 oneshot_state::in0_word_r() { const u16 data = m_io_dsw1->read(); diff -Nru mame-0.263+dfsg.1/src/mame/misc/pass.cpp mame-0.264+dfsg.1/src/mame/misc/pass.cpp --- mame-0.263+dfsg.1/src/mame/misc/pass.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/pass.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -158,8 +158,6 @@ }; -// video - // background tilemap stuff TILE_GET_INFO_MEMBER(pass_state::get_bg_tile_info) @@ -212,8 +210,6 @@ } -// machine - // TODO: check all memory regions actually readable / read from void pass_state::main_map(address_map &map) { diff -Nru mame-0.263+dfsg.1/src/mame/misc/pse.cpp mame-0.264+dfsg.1/src/mame/misc/pse.cpp --- mame-0.263+dfsg.1/src/mame/misc/pse.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/pse.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -212,9 +212,9 @@ } // anonymous namespace -GAME( 1976, bazooka, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Bazooka [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, bazookabr, bazooka, pse, 0, pse_state, empty_init, ROT0, "Taito do Brasil", "Bazooka (Brazil) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, dpatrol, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Desert Patrol [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, dpatrola, dpatrol, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering (Telegames license)", "Desert Patrol (set 2) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1978, gametree, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Game Tree [TTL]", MACHINE_IS_SKELETON ) -//GAME( 1976, knightar, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Knights in Armor [TTL]", MACHINE_IS_SKELETON ) +GAME( 1976, bazooka, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Bazooka", MACHINE_IS_SKELETON ) +GAME( 1977, bazookabr, bazooka, pse, 0, pse_state, empty_init, ROT0, "Taito do Brasil", "Bazooka (Brazil)", MACHINE_IS_SKELETON ) +GAME( 1977, dpatrol, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Desert Patrol", MACHINE_IS_SKELETON ) +GAME( 1977, dpatrola, dpatrol, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering (Telegames license)", "Desert Patrol (set 2)", MACHINE_IS_SKELETON ) +GAME( 1978, gametree, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Game Tree", MACHINE_IS_SKELETON ) +//GAME( 1976, knightar, 0, pse, 0, pse_state, empty_init, ROT0, "Project Support Engineering", "Knights in Armor", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/rawthrillspc.cpp mame-0.264+dfsg.1/src/mame/misc/rawthrillspc.cpp --- mame-0.263+dfsg.1/src/mame/misc/rawthrillspc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/rawthrillspc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -147,5 +147,5 @@ } // Anonymous namespace GAME(2013, doodlejmp, 0, rawthrillspc, rawthrillspc, rawthrillspc_state, empty_init, ROT0, "ICE / Raw Thrills (Lima Sky license)", "Doodle Jump Arcade (v1.16)", MACHINE_IS_SKELETON) -GAME(2004, fnf, 0, rawthrillspc, rawthrillspc, rawthrillspc_state, empty_init, ROT0, "Raw Thrills", "The Fast And The Furious (v3.06)", MACHINE_IS_SKELETON) +GAME(2004, fnf, 0, rawthrillspc, rawthrillspc, rawthrillspc_state, empty_init, ROT0, "Raw Thrills", "The Fast And The Furious (v3.06)", MACHINE_IS_SKELETON) GAME(2008, guitarheroac, 0, rawthrillspc, rawthrillspc, rawthrillspc_state, empty_init, ROT0, "Raw Thrills (Activision / Konami license)", "Guitar Hero Arcade (v1.0.5)", MACHINE_IS_SKELETON) diff -Nru mame-0.263+dfsg.1/src/mame/misc/savquest.cpp mame-0.264+dfsg.1/src/mame/misc/savquest.cpp --- mame-0.263+dfsg.1/src/mame/misc/savquest.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/savquest.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -112,7 +112,7 @@ std::unique_ptr m_smram; - required_device m_vga; + required_device m_vga; required_device m_voodoo; int m_haspind = 0; @@ -788,7 +788,7 @@ map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); map(0x0378, 0x037b).rw(FUNC(savquest_state::parallel_port_r), FUNC(savquest_state::parallel_port_w)); - map(0x03b0, 0x03df).m("vga", FUNC(s3_vga_device::io_map)); + map(0x03b0, 0x03df).m("vga", FUNC(s3trio64_vga_device::io_map)); map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); @@ -871,9 +871,9 @@ // TODO: map to ISA bus, make sure that the Voodoo can override s3 in screen update screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480); - screen.set_screen_update("vga", FUNC(s3_vga_device::screen_update)); + screen.set_screen_update("vga", FUNC(s3trio64_vga_device::screen_update)); - s3_vga_device &vga(S3_VGA(config, "vga", 0)); + s3trio64_vga_device &vga(S3_TRIO64_VGA(config, "vga", 0)); vga.set_screen("screen"); vga.set_vram_size(0x100000); diff -Nru mame-0.263+dfsg.1/src/mame/misc/truco.cpp mame-0.264+dfsg.1/src/mame/misc/truco.cpp --- mame-0.263+dfsg.1/src/mame/misc/truco.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/truco.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -267,8 +267,6 @@ }; -// video - void truco_state::palette(palette_device &palette) const { for (int i = 0; i < palette.entries(); i++) @@ -309,8 +307,6 @@ } -// machine - /******************************************* * Read/Write Handlers * *******************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/misc/trucocl.cpp mame-0.264+dfsg.1/src/mame/misc/trucocl.cpp --- mame-0.263+dfsg.1/src/mame/misc/trucocl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/trucocl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - void trucocl_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -150,8 +148,6 @@ } -// machine - // TODO: doesn't seem suited to neither irq nor nmi void trucocl_state::irq_enable_w(uint8_t data) { diff -Nru mame-0.263+dfsg.1/src/mame/misc/usbilliards.cpp mame-0.264+dfsg.1/src/mame/misc/usbilliards.cpp --- mame-0.263+dfsg.1/src/mame/misc/usbilliards.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/usbilliards.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,4 +140,4 @@ } // anonymous namespace -GAME( 1975, sharkusb, 0, usbilliards, 0, usbilliards_state, empty_init, ROT0, "US Billiards Inc.", "Shark [TTL]", MACHINE_IS_SKELETON ) +GAME( 1975, sharkusb, 0, usbilliards, 0, usbilliards_state, empty_init, ROT0, "US Billiards Inc.", "Shark (US Billiards)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/vampire.cpp mame-0.264+dfsg.1/src/mame/misc/vampire.cpp --- mame-0.263+dfsg.1/src/mame/misc/vampire.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/vampire.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,666 @@ +// license:BSD-3-Clause +// copyright-holders:Tomasz Slanina +/* + +Entertainment Enterprises Vampire + +TODO: +- correct interrupt handling (main and sound cpu) +- communication between main and audio cpu +- PIT outputs +- correct clocks +- color decode +- fix gfx glitches - extra pixels (column?) on edges (only when gfx is flipped) + +Hardware notes: + +MAIN CPU: + - 6809P, 8 MHz xtal + - NMI - main interrupt vector, currectly there's a hack (int vectors) to use standard irq/firq vectors + Currently NMI writes error messages to the terminal(?) output ($814, $815) + +VIDEO: + - custom blitter - ROM (256x512, 1bpp) -> VRAM (256x256, 4bpp?, double buffered?) + - blitter data (8 bytes long 'slots') stored in RAM, format: + + 0 - src address (ROM) + 1 / + 2 - 256 - height + 3 - 32 - width (bytes) + 4 - flags + 76543210 + x------- end of list + --x----- flip + -?-????? unknown (unused?) + 5 - pen (0-15) + 6 - dsty + 7 - dstx + +- there's a base (x,y) offset for each blit($7fa-$7fb writes), write to this address triggers the blitter +- blitter starts to copy gfx from the last accessed slot (even if ram is locked) and stops on the slot with 'end of list' bit set +- blitter control ($7f8): + + 76543210 + x------- flip screen + -x------ blitter ram lock + ---x---- front/back buffer (?) + --?-???? unknown + +AUDIO: +- 6502 ? (empty socket) +- 4MHz xtal near the cpu socket +- IRQ - ? +- NMI - triggered by main cpu, sound latch read +- AY-3-8910 +- PPI (8253) - used to sync the audio +- game works without the sound cpu + ++-----------------------------------------------------------------------------------------------------------------------------------+ +| | +| C D E F H J | +| | +| A B +-------+ +------------+ +-------------+ | +| |74LS14N| | MSM2128RS | |H1 1F| | +| +----+ +-------+ +-------+ +-------+ | 22075 | | M5L2764K | 1 | +| |8Mhz| |74LS123| |74LS367| +------------+ +-------------+ | +| |xtal| +-------+ +-------+ +-------+ +-------+ +------------+ +-------------+ | +| +----+ |74LS367| |74LS367| | MSM2128RS | |H2 2F| 2 | +| +---------------------+ +-------+ +-------+ | 22075 | | M5L2764K | | ++------+ | | +------------+ +-------------+ | +| | | HD68B09P | +-------+ +-------+ +------------+ +-------------+ | +| | | JAPAN | |74LS04P| |74LS139| | MSM2128RS | |H3 3F| 3 | +| | +---------------------+ +-------+ +-------+ | 22075 | | M5L2764K | | +| | +------------+ +-------------+ | +|CONNEC| +-------+ +---------+ +-------+ +-------+ +------------+ +-------------+ | +|TOR | |74LS04P| |74LS245N | |74LS00N| |74LS138| | MSM2128RS | |H4 4F| +---------+ | +| | +-------+ +---------+ +-------+ +-------+ | 22075 | | M5L2764K | |74LS273N | 4 | +|RIBBON| +------------+ +-------------+ +---------+ | +|CABLE | +-------+ +---------+ +-------+ +-------+ | +| | |74LS02N| |74LS245N | |74LS138| |74LS08N| +-------+ +---------+ | +|TO | +-------+ +---------+ +-------+ +-------+ +---------------+ |74LS166| |74LS273N | 5 | +|SECOND| |P1 6E| +-------+ +---------+ | +|PCB | +-------+ +-------+ +-------+ +-------+ | M5L2764K | +-------+ +-------+ +-------+ | +| | |74LS74A| | | |74LS32N| |74LS30N| +---------------+ |74LS161| |74LS161| |74LS138| 6 | +| | +-------+ +-------+ +-------+ +-------+ +---------------+ +-------+ +-------+ +-------+ | +| | |P2 7E| +-------+ +-------+ +-------+ | +| | +---------+ +-------+ +-------+ | M5L2764K | |74LS161| |74LS161| |74LS04P| 7 | +| | |74LS130N | |74LS173| |74LS138| +---------------+ +-------+ +-------+ +-------+ | ++------+ +---------+ +-------+ +-------+ +------------+ +---------+ +-------+ | +| | MSM2128RS | |74LS245N | |74LS138| +-------+ +-------+ | +| +-------+ +-------+ | 22075 | +---------+ +-------+ |74LS74A| |74LS74A| 8 | ++------+ |74LS139| |74LS125| +------------+ +-------+ +-------+ | +| | +-------+ +-------+ +---------------------+ | +| | | EMPTY SOCKET | +-------+ +----+ | +| | +-------+ +---------+ |most likely sound-cpu| |74LS04P| |4Mhz| 9 | +| | |74LS74A| |M74LS373P| +---------------------+ +-------+ |xtal| | +|CONNEC| +-------+ +---------+ +----+ | +|TOR | | +| | +-------+ +-------+ +------------+ +------------+ +-------+ +-------+ +---------+ +---------+ | +|RIBBON| |MC14053| |74LS174| | M5L8253P-5 | |9D | |74LS367| |74LS367| | SW2 | | SW1 | 10 | +|CABLE | +-------+ +-------+ | | | M5L2732K | +-------+ +-------+ +---------+ +---------+ | +| | +------------+ +------------+ | +|TO | +---------+ +---------+ +---------+ +---------+ | +|SECOND| |74LS245N | |74LS273N | |74LS240N | |74LS240N | 11 | +|PCB | +---------+ +---------+ +---------+ +---------+ | +| | | +| | | +| | | +| | | +| | +----------------------+ +---------+ +---------+ +---------+ +---------+ | ++------+ | SOUND | |74LS244P | |74LS240N | |74LS240N | |74LS240N | 12 | +| | AY-3-8910 | +---------+ +---------+ +---------+ +---------+ | +| +----------------------+ | +| | +| +----+ | +| |3080| | +| +----+ +----+ +-------+ | +| |3080| |LM324N | 13 | +| +----+ +-------+ | +| | +| | +| | +| +-----+B1 CONNECTOR B22+-----+ | +| | ||||||||||||||||||||||||||||||||||||||||| | P1422-1 | ++---------------------------------------+ +---------------------------------------+ +---------------------------------------+ + + + ++-----------------------------------------------------------------------------------------------------------------------------------+ +| +---------+ A B C D E F G H | +| |60.00000 | +-------+ +-------+ +-------+ +-------+ | +| |Mhz | |74S114N| |74S20N | |74S163N| |74S04N | 1 | +| +---------+ +-------+ +-------+ +-------+ +-------+ | +| | +| +-------+ +-------+ +-------+ +---------+ +-------+ +-------+ +-------+ | +| |74S04N | |74S114N| |74S163N| |PAL12H6CJ| |74S174N| |74S04N | |74LS74N| 2 | +| +-------+ +-------+ +-------+ +---------+ +-------+ +-------+ +-------+ | +| 2D | +| +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| |74S174N| |74S20N | |74S08N | |74LS669| |74LS107| |74LS74A| 3 | +| +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | ++------+ +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | |74S08N | |PAL16R8CN| |74LS161| |74LS161| |74LS138| |74LS74A| |74LS10N| 4 | +| | +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | 4B | +| | +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | |74S02N | |74S195N| |74LS161| |74LS161| |74LS08N| |74LS04P| |74LS86P| |74153N | 5 | +|CONNEC| +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +|TOR | | +| | +-------+ +-------+ +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ | +|RIBBON| |74LS86P| |74LS74A| |74LS174| |74LS374N | |74LS161| |74LS161| |74LS86P| |74153N | 6 | +|CABLE | +-------+ +-------+ +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ | +| | | +|TO | +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ | +|SECOND| |74LS197| |74LS374N | |74LS669| |74LS669| |74LS86P| |74153N | 7 | +|PCB | +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ | +| | | +| | +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | |74LS197| |74LS374N | |74LS669| |74LS669| |74LS669| |74LS669| |74LS86P| |74153N | 8 | +| | +-------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | ++------+ | +| +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| |74LS197| |74LS283| |74LS174| |74LS174| |74LS74A| |74LS74A| |74LS00N| 9 | ++------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | | +| | +-------+ +-------+ +-------+ +---------+ | +| | |74LS74A| |74LS283| |74S194N| |74LS377N | +-------+ +-------+ +-------+ +-------+ | +| | +-------+ +-------+ +-------+ +---------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | 10 | +| | +-------+ +--------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +|CONNEC| |74LS32N| |74LS374N| |74S194N| |74173N | +-------+ +-------+ +-------+ +-------+ | +|TOR | +-------+ +--------+ +-------+ +-------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | 11 | +| | +---------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +|RIBBON| |74LS245N | |74LS374N | |74LS04P| |74173N | +-------+ +-------+ +-------+ +-------+ | +|CABLE | +---------+ +---------+ +-------+ +-------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | 12 | +| | +-------+ +-------+ +-------+ +-------+ | +|TO | +---------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +|SECOND| |74LS245N | |74LS374N | |74LS194| |74Ls194| |MB8264 | |MB8264 | |MB8264 | |MB8264 | 13 | +|PCB | +---------+ +---------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | +-------+ +-------+ +-------+ +-------+ | +| | +------------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | | +| | | M58725P-15 | +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | | JAPAN | |74LS157| |74LS194| |74Ls194| +-------+ +-------+ +-------+ +-------+ 14 | ++------+ +------------+ +-------+ +-------+ +-------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | | +| +-------+ +-------+ +-------+ +-------+ | +| +------------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| | M58725P-15 | |74LS157| |74LS194| |74Ls194| |MB8264 | |MB8264 | |MB8264 | |MB8264 | 15 | +| | JAPAN | +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ +-------+ | +| +------------+ +-------+ +-------+ +-------+ +-------+ | +| +-------+ +-------+ +-------+ |MB8264 | |MB8264 | |MB8264 | |MB8264 | | +| +-------+ |TB24S10| |74LS194| |74Ls194| +-------+ +-------+ +-------+ +-------+ 16 | +| |TB24S10| +-------+ +-------+ +-------+ | +| +-------+ 16B | +| 16A P1422-2 | ++-----------------------------------------------------------------------------------------------------------------------------------+ + +*/ + +#include "emu.h" + +#include "cpu/m6809/m6809.h" +#include "cpu/m6502/m6502.h" +#include "machine/gen_latch.h" +#include "machine/pit8253.h" +#include "sound/ay8910.h" +#include "sound/dac.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + + +namespace { + +class vampire_state : public driver_device +{ +public: + vampire_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this,"audiocpu"), + m_soundlatch(*this, "soundlatch"), + m_palette(*this, "palette"), + m_gfxrom(*this, "gfx") + { } + + void vampire(machine_config &config); + void init_vampire(); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_audiocpu; + required_device m_soundlatch; + required_device m_palette; + required_region_ptr m_gfxrom; + + struct + { + u8 base_x = 0; + u8 base_y = 0; + + offs_t last_offset = 0; + u8 last_data = 0; + + u8 flags = 0xff; + + std::unique_ptr layer_1; + std::unique_ptr layer_2; + std::unique_ptr slots; + } m_blitter; + + u8 m_pit_output = 0; + + void palette(palette_device &palette) const; + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + u8 blitter_r(offs_t offset); + void blitter_w(offs_t offset, u8 data); + void blit_trigger(offs_t offset); + + void vampire_memory(address_map &map); + void vampire_audio(address_map &map); + + void pit_out_w0(int state); + void pit_out_w1(int state); + void pit_out_w2(int state); + + u8 sound_sync_r(); + u8 sound_ack_r(); + void blitter_flags_w(u8 data); + void blitter_control_w(offs_t offset, u8 data); + u8 io814_r(); + u8 io815_r(); +}; + +void vampire_state::machine_start() +{ + m_blitter.layer_1 = make_unique_clear(256 * 256); + m_blitter.layer_2 = make_unique_clear(256 * 256); + m_blitter.slots = make_unique_clear(0x1000); + + save_item(NAME(m_blitter.base_x)); + save_item(NAME(m_blitter.base_y)); + save_item(NAME(m_blitter.last_offset)); + save_item(NAME(m_blitter.last_data)); + save_item(NAME(m_blitter.flags)); + save_pointer(NAME(m_blitter.layer_1), 256 * 256); + save_pointer(NAME(m_blitter.layer_2), 256 * 256); + save_pointer(NAME(m_blitter.slots), 0x1000); + + save_item(NAME(m_pit_output)); +} + + + +/******************************************************************************* + Video +*******************************************************************************/ + +void vampire_state::palette(palette_device& palette) const +{ + u8 *proms = memregion("proms")->base(); + for (int i = 0; i < 256; ++i) + { + int g = ((proms[i] & 0b00000011) >> 0) * 85; + int r = ((proms[i] & 0b00011100) >> 2) * 36; + int b = ((proms[i] & 0b11100000) >> 5) * 36; + palette.set_pen_color(i, rgb_t(r, g, b)); + } +} + +u32 vampire_state::screen_update(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect) +{ + // replace with data copy + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + { + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + bitmap.pix(y, x) = (m_blitter.flags & 0x10) ? m_blitter.layer_1[256 * y + x] : m_blitter.layer_2[256 * y + x]; + } + } + + return 0; +} + +void vampire_state::blit_trigger(offs_t offset) +{ + u8 *ptr = (m_blitter.flags & 0x10) ? m_blitter.layer_2.get() : m_blitter.layer_1.get(); + u32 index = offset >> 3; // start of the 8 byte-long slot + + while (index < 0x200) + { + const u8 *slot = &m_blitter.slots[index << 3]; + + u32 desty = slot[6]; // pixels + const u32 destx = slot[7]; // pixels + + const u32 start_offset = ((slot[0] << 8) | slot[1]) << 3; // start offset + const u8 pen = slot[5]; // 0xf is max used + + const int32_t sy = 256 - slot[2]; // pixels + const int32_t sx = (32 - slot[3]) << 3; // bytes (src ROM) + + for (int yy = 0; yy < sy; ++yy) + { + for (int xx = 0; xx < sx; ++xx) + { + const u32 srcptr = start_offset + 256 * yy + xx; + const u32 dstptr = (desty + m_blitter.base_y) * 256 + destx + xx + m_blitter.base_x; + + if (desty + m_blitter.base_y > 255 || destx + xx + m_blitter.base_x > 255) + continue; + + u8 pix = 0; + + if (dstptr < 256 * 256) + pix = m_gfxrom[(srcptr >> 3) & 0x3fff] & (1 << (7 - (srcptr & 7))); + + // when source is above the 256x512 (ROM size) image = solid fill (rom read returns 0xff? + // could be handled by extended rom region, ff filled) + if (slot[0] & 0x80) + pix = 1; + + if (pix) + ptr[dstptr] = pen; + } + desty += (slot[4] & 0x20) ? 1 : -1; // flip + } + if (slot[4] & 0x80) + break; // end mark + + ++index; + } +} + + + +/******************************************************************************* + Main CPU I/O +*******************************************************************************/ + +void vampire_state::blitter_flags_w(u8 data) +{ + m_blitter.flags = data; +} + +void vampire_state::blitter_control_w(offs_t offset, u8 data) +{ + if (!(offset & 1)) + { + m_blitter.base_y = data; + } + else + { + m_blitter.base_x = data; + blit_trigger(m_blitter.last_offset); + m_maincpu->set_input_line(0, HOLD_LINE); + } +} + +u8 vampire_state::sound_ack_r() +{ + return m_soundlatch->pending_r() << 7 ^ 0x80; +} + + +// Main CPU NMI +u8 vampire_state::io814_r() +{ + // bit 1 + return machine().rand(); +} + +u8 vampire_state::io815_r() +{ + return machine().rand(); +} + + +u8 vampire_state::blitter_r(offs_t offset) +{ + return m_blitter.slots[offset]; +} + +void vampire_state::blitter_w(offs_t offset, u8 data) +{ + m_blitter.last_offset = offset; + + if (m_blitter.flags & 0x40) + { + m_blitter.last_data = data; // not used? + return; + } + + m_blitter.slots[offset] = data; +} + + +void vampire_state::vampire_memory(address_map &map) +{ + map(0x07f0, 0x07f0).portr("IN1"); + map(0x07f1, 0x07f1).portr("IN2"); + map(0x07f2, 0x07f2).portr("DSW1"); + map(0x07f3, 0x07f3).portr("DSW2"); + map(0x07f4, 0x07f4).w(m_soundlatch, FUNC(generic_latch_8_device::write)); + map(0x07f5, 0x07f5).r(FUNC(vampire_state::sound_ack_r)); + map(0x07f8, 0x07f8).w(FUNC(vampire_state::blitter_flags_w)); + map(0x07fa, 0x07fb).w(FUNC(vampire_state::blitter_control_w)); + + map(0x0814, 0x0814).r(FUNC(vampire_state::io814_r)); + map(0x0815, 0x0815).r(FUNC(vampire_state::io815_r)); + + map(0x1000, 0x1fff).r(FUNC(vampire_state::blitter_r)).w(FUNC(vampire_state::blitter_w)); + map(0x2000, 0x3fff).ram(); + map(0x8000, 0xffff).rom(); +} + + + +/******************************************************************************* + Audio CPU I/O +*******************************************************************************/ + +void vampire_state::pit_out_w0(int state) +{ + m_pit_output = state; +} + +void vampire_state::pit_out_w1(int state) +{ + // unknown +} + +void vampire_state::pit_out_w2(int state) +{ + // unknown +} + +u8 vampire_state::sound_sync_r() +{ + return m_pit_output << 6; +} + +void vampire_state::vampire_audio(address_map &map) +{ + map(0x0000, 0x03ff).ram(); + map(0x4000, 0x4000).ram(); // unk write + map(0x6000, 0x6000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); + map(0x8000, 0x8000).w(m_soundlatch, FUNC(generic_latch_8_device::acknowledge_w)); + map(0xa000, 0xa001).w("aysnd", FUNC(ay8910_device::data_address_w)); + map(0xa008, 0xa00b).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0xa00c, 0xa00c).r(FUNC(vampire_state::sound_sync_r)); + map(0xf000, 0xffff).rom(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( vampire ) + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x10, "5" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // $d831 + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Infinite Time (Cheat)" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Upright ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "Infinite Lives (Cheat)" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // unused? + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) // unused? + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void vampire_state::vampire(machine_config &config) +{ + // basic machine hardware + MC6809(config, m_maincpu, 8_MHz_XTAL); // HD68B09P + m_maincpu->set_addrmap(AS_PROGRAM, &vampire_state::vampire_memory); + + pit8253_device &pit(PIT8253(config, "pit", 0)); + pit.set_clk<0>(4_MHz_XTAL/2); + pit.set_clk<1>(4_MHz_XTAL/2); + pit.set_clk<2>(4_MHz_XTAL/2); + pit.out_handler<0>().set(FUNC(vampire_state::pit_out_w0)); + pit.out_handler<1>().set(FUNC(vampire_state::pit_out_w1)); + pit.out_handler<2>().set(FUNC(vampire_state::pit_out_w2)); + + M6502(config, m_audiocpu, 4_MHz_XTAL/2); + m_audiocpu->set_addrmap(AS_PROGRAM, &vampire_state::vampire_audio); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(256, 256); + screen.set_visarea(0*8, 32*8 - 1, 2*8, 30*8 - 1); + screen.set_screen_update(FUNC(vampire_state::screen_update)); + screen.screen_vblank().set_inputline(m_maincpu, M6809_FIRQ_LINE, HOLD_LINE); + + screen.set_palette(m_palette); + PALETTE(config, m_palette, FUNC(vampire_state::palette), 256); + + // sound hardware + GENERIC_LATCH_8(config, m_soundlatch); + m_soundlatch->set_separate_acknowledge(true); + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); + m_soundlatch->data_pending_callback().append([this](int state) { if (state) machine().scheduler().perfect_quantum(attotime::from_usec(100)); }); + + SPEAKER(config, "speaker").front_center(); + AY8910(config, "aysnd", 4_MHz_XTAL/4).add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( vampire ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "h1.1f", 0x8000, 0x2000, CRC(7e69ff9b) SHA1(85f6303803a0577f96b879e0b9d280a4f22cca8c) ) + ROM_LOAD( "h2.2f", 0xa000, 0x2000, CRC(e94155f8) SHA1(f60d82d9204f7b13aa9be189ca74ca48bf9e879a) ) + ROM_LOAD( "h3.3f", 0xc000, 0x2000, CRC(ce27dd90) SHA1(4edd8ba08f828a0c3c6eb21a2d9e0d1e53fac407) ) + ROM_LOAD( "h4.4f", 0xe000, 0x2000, CRC(a25f00bc) SHA1(db445c1876b79c4d553d4f9cc881f41f68b6667c) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "9d", 0xf000, 0x1000, CRC(e13a7aef) SHA1(77a49cb0f3f037826a32bbfa8fab524f17895992) ) + + ROM_REGION( 0x4000, "gfx", 0 ) + ROM_LOAD( "cg_p1.6e", 0x0000, 0x2000, CRC(042661a4) SHA1(58ed7c782a2486aa8c2c650d6d9e54929e5dd50b) ) + ROM_LOAD( "cg_p2.7e", 0x2000, 0x2000, CRC(e9dd9dff) SHA1(8a9ad8659763a9c010d0b482af3a40978c02cec7) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD_NIB_LOW( "16a", 0x0000, 0x0100, CRC(bc60a2eb) SHA1(73b8f5f6eee90a4d59a5c62a6a342fa49185938c) ) + ROM_LOAD_NIB_HIGH( "16b", 0x0000, 0x0100, CRC(aa6b627b) SHA1(556d6bab46419ce55dd254de9615981852be6e6f) ) +ROM_END + +void vampire_state::init_vampire() +{ + u8 *rom = memregion("maincpu")->base(); + + // hack interrupt vectors + rom[0xfff6] = rom[0xffe0]; + rom[0xfff7] = rom[0xffe1]; + rom[0xfff8] = rom[0xffe2]; + rom[0xfff9] = rom[0xffe3]; +} + +} // anonymous namestate + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// it is unclear if the game saw a wide release, or was only location tested +GAME( 1983, vampire, 0, vampire, vampire, vampire_state, init_vampire, ROT90, "Entertainment Enterprises, Ltd.", "Vampire (prototype?)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/misc/wms.cpp mame-0.264+dfsg.1/src/mame/misc/wms.cpp --- mame-0.263+dfsg.1/src/mame/misc/wms.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/misc/wms.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -349,6 +349,19 @@ ROM_LOAD( "xu-18.bin", 0x0000, 0x100000, CRC(8a42ac41) SHA1(3e56e369938d4789d4677f8ad0a7c0e1eb38942d) ) ROM_END +ROM_START( inwinners ) // Instant Winner (Spanish) + ROM_REGION(0x100000, "maincpu", 0) + ROM_LOAD( "instant_winner_xu3_spanish.bin", 0x0000, 0x100000, CRC(8c3f81bb) SHA1(ae1722763f5b9d2a1b72f3889752979af150b8b0) ) + + ROM_REGION(0x100000, "rom", 0) + ROM_LOAD( "instant_winner_xu2_spanish.bin", 0x0000, 0x100000, CRC(54895461) SHA1(6b2cb92fc82ddbe96924758c130e271848bf5b0b) ) + // sound + ROM_LOAD( "instant_winner_xu30_spanish.bin", 0x0000, 0x100000, CRC(c2e6f321) SHA1(e4251b0c42fd03932cd94d18edca8d33a42d9670) ) + ROM_LOAD( "instant_winner_xu31_spanish.bin", 0x0000, 0x100000, CRC(9dcd7705) SHA1(8c543b4be6e51edfc512c2449086e418f8d32310) ) + ROM_LOAD( "instant_winner_xu17_spanish.bin", 0x0000, 0x100000, CRC(8cbf7b46) SHA1(b95fbd1c11bbbb2e97a06e541442bd5c396b500f) ) + ROM_LOAD( "instant_winner_xu18_spanish.bin", 0x0000, 0x100000, CRC(906451f6) SHA1(9da2ff04d28632fd68ab08cb3786aa19b904fdc9) ) +ROM_END + ROM_START( jptparty ) // Jackpot Party (Russian) / U5 04/01/98 ROM_REGION(0x100000, "maincpu", 0) @@ -650,6 +663,7 @@ GAME( 2003, hottop, 0, wms, wms, wms_state, init_wms, ROT0, "WMS", "Hot Toppings (English)", MACHINE_IS_SKELETON ) // U5 04/22/103 GAME( 2001, hottopa, hottop, wms, wms, wms_state, init_wms, ROT0, "WMS", "Hot Toppings (Russian?)", MACHINE_IS_SKELETON ) // U5 06/26/101 GAME( 1998, inwinner, 0, wms, wms, wms_state, init_wms, ROT0, "WMS", "Instant Winner (Russian)", MACHINE_IS_SKELETON ) // U5 11/25/98 +GAME( 1998, inwinners, inwinner, wms, wms, wms_state, init_wms, ROT0, "WMS", "Instant Winner (Spanish)", MACHINE_IS_SKELETON ) // ??? GAME( 1998, jptparty, 0, wms, wms, wms_state, init_wms, ROT0, "WMS", "Jackpot Party (Russian)", MACHINE_IS_SKELETON ) // U5 04/01/98 GAME( 2001, leprgld, 0, wms, wms, wms_state, init_wms, ROT0, "WMS", "Leprechaun's Gold (Russian)", MACHINE_IS_SKELETON ) // U5 08/20/101 GAME( 2001, leprglds, leprgld, wms, wms, wms_state, init_wms, ROT0, "WMS", "Leprechaun's Gold (Spanish)", MACHINE_IS_SKELETON ) // U5 08/20/101 diff -Nru mame-0.263+dfsg.1/src/mame/mr/dribling.cpp mame-0.264+dfsg.1/src/mame/mr/dribling.cpp --- mame-0.263+dfsg.1/src/mame/mr/dribling.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mr/dribling.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,6 +1,5 @@ // license:BSD-3-Clause -// copyright-holders: Aaron Giles - +// copyright-holders: Aaron Giles, Enzo Lombardi /*************************************************************************** Model Racing Dribbling hardware @@ -12,7 +11,6 @@ * Dribbling TODO: - * Audio (discrete components, schematics available) * Implement the 2 banks of 8 dips which determine coinage for the 2 players * Actual game duration doesn't match the time reported in the manual @@ -36,12 +34,16 @@ #include "emu.h" +#include "nl_dribling.h" + #include "cpu/z80/z80.h" #include "machine/i8255.h" +#include "machine/netlist.h" #include "machine/watchdog.h" #include "emupal.h" #include "screen.h" +#include "speaker.h" // configurable logging @@ -72,7 +74,18 @@ m_colorram(*this, "colorram"), m_mux(*this, "MUX%u", 0), m_proms(*this, "proms"), - m_gfxroms(*this, "gfx") + m_gfxroms(*this, "gfx"), + m_i_pb(*this, "snd_nl:pb%u", 0U), + m_i_folla_b(*this, "snd_nl:folla_b"), + m_i_folla_m(*this, "snd_nl:folla_m"), + m_i_folla_a(*this, "snd_nl:folla_a"), + m_i_calcio_b(*this, "snd_nl:calcio_b"), + m_i_fischio(*this, "snd_nl:fischio"), + m_i_calcio_a(*this, "snd_nl:calcio_a"), + m_i_contrasto(*this, "snd_nl:contrasto"), + m_i_stop_palla(*this, "snd_nl:stop_palla"), + m_i_parata(*this, "snd_nl:parata"), + m_i_enable(*this, "snd_nl:enable") { } void dribling(machine_config &config); @@ -94,6 +107,19 @@ required_region_ptr m_proms; required_region_ptr m_gfxroms; + // sound + required_device_array m_i_pb; + required_device m_i_folla_b; + required_device m_i_folla_m; + required_device m_i_folla_a; + required_device m_i_calcio_b; + required_device m_i_fischio; + required_device m_i_calcio_a; + required_device m_i_contrasto; + required_device m_i_stop_palla; + required_device m_i_parata; + required_device m_i_enable; + // misc uint8_t m_abca = 0U; uint8_t m_dr = 0U; @@ -119,8 +145,6 @@ }; -// video - /************************************* * * Convert the palette PROM into @@ -193,7 +217,6 @@ } -// machine /************************************* * @@ -244,45 +267,68 @@ void dribling_state::misc_w(uint8_t data) { + LOGMISC("%s:misc_w(%02X)\n", machine().describe_context(), data); + // bit 7 = di - m_di = (data >> 7) & 1; + m_di = BIT(data, 7); if (!m_di) m_maincpu->set_input_line(0, CLEAR_LINE); // bit 6 = parata (save by goalkeeper) + m_i_parata->write_line(BIT(data, 6)); // bit 5 = ab. campo (field enable) - m_abca = (data >> 5) & 1; + m_abca = BIT(data, 5); // bit 4 = ab. a.b.f. - // bit 3 = n/c + m_i_enable->write_line(BIT(data, 4)); + // bit 3 = n/c // bit 2 = (9) = PC2 // bit 1 = (10) = PC1 // bit 0 = (32) = PC0 m_input_mux = data & 7; - LOGMISC("%s:misc_w(%02X)\n", machine().describe_context(), data); } void dribling_state::sound_w(uint8_t data) { + LOGSOUND("%s:sound_w(%02X)\n", machine().describe_context(), data); + // bit 7 = stop palla (ball stop) + m_i_stop_palla->write_line(BIT(data, 7)); + // bit 6 = contrasto (tackle) + m_i_contrasto->write_line(BIT(data, 6)); + // bit 5 = calcio a (kick a) + m_i_calcio_a->write_line(BIT(data, 5)); + // bit 4 = fischio (whistle) + m_i_fischio->write_line(BIT(data, 4)); + // bit 3 = calcio b (kick b) + m_i_calcio_b->write_line(BIT(data, 3)); + // bit 2 = folla a (crowd a) + m_i_folla_a->write_line(BIT(data, 2)); + // bit 1 = folla m (crowd m) + m_i_folla_m->write_line(BIT(data, 1)); + // bit 0 = folla b (crowd b) - LOGSOUND("%s:sound_w(%02X)\n", machine().describe_context(), data); + m_i_folla_b->write_line(BIT(data, 0)); } void dribling_state::pb_w(uint8_t data) { - // write PB0-7 LOGPB("%s:pb_w(%02X)\n", machine().describe_context(), data); + + for (int i = 0; i < 8; i++) + { + m_i_pb[i]->write_line(BIT(data, i)); + } } @@ -457,8 +503,32 @@ PALETTE(config, "palette", FUNC(dribling_state::palette), 256); // sound hardware -} + SPEAKER(config, "mono").front_center(); + NETLIST_SOUND(config, "snd_nl", 48000) + .set_source(NETLIST_NAME(dribling)) + .add_route(ALL_OUTPUTS, "mono", 1.0); + + NETLIST_LOGIC_INPUT(config, m_i_pb[0], "I_PB0.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[1], "I_PB1.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[2], "I_PB2.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[3], "I_PB3.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[4], "I_PB4.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[5], "I_PB5.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[6], "I_PB6.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[7], "I_PB7.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_b, "I_FOLLA_B.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_m, "I_FOLLA_M.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_a, "I_FOLLA_A.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_calcio_a, "I_CALCIO_A.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_fischio, "I_FISCHIO.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_calcio_b, "I_CALCIO_B.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_contrasto, "I_CONTRASTO.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_stop_palla, "I_STOP_PALLA.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_parata, "I_PARATA.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_enable, "ENABLE_SOUND.IN", 0); + NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "OUTPUT").set_mult_offset(1.0, 0); +} /************************************* @@ -528,7 +598,26 @@ ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) ROM_END -ROM_START( driblingbr ) +// Original Model Racing PCB (EF00284) +ROM_START( driblingam ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2532.5p", 0x0000, 0x1000, BAD_DUMP CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) // ROM damaged on this set, borrowed from 'dribling' + ROM_LOAD( "2532.5n", 0x1000, 0x1000, BAD_DUMP CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) // ROM damaged on this set, borrowed from 'dribling' + ROM_LOAD( "2532.5l", 0x4000, 0x1000, BAD_DUMP CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) // ROM damaged on this set, borrowed from 'dribling' + ROM_LOAD( "2532.5k", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) + ROM_LOAD( "2532.5h", 0x6000, 0x1000, CRC(f1d6925e) SHA1(858fd13aad2c684a73b7458f18a759923b1defae) ) + + ROM_REGION( 0x2000, "gfx", 0 ) + ROM_LOAD( "2532.3p", 0x0000, 0x1000, BAD_DUMP CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) // ROM damaged on this set, borrowed from 'dribling' + ROM_LOAD( "2532.3n", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) + + ROM_REGION( 0x600, "proms", 0 ) + ROM_LOAD( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) +ROM_END + +ROM_START( driblingvm ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "1", 0x0000, 0x1000, CRC(35d97f4f) SHA1(c82b1d2a91e25cf3e3f049e0127d300572f0f54c) ) ROM_LOAD( "2", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) @@ -555,7 +644,8 @@ * *************************************/ -GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, driblingbr, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (bootleg, Brazil)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblingam, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Automave license)", "Dribbling (Automave)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, driblingvm, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (Videomac bootleg, Brazil)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE) diff -Nru mame-0.263+dfsg.1/src/mame/mr/nl_dribling.cpp mame-0.264+dfsg.1/src/mame/mr/nl_dribling.cpp --- mame-0.263+dfsg.1/src/mame/mr/nl_dribling.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mr/nl_dribling.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,566 @@ +// license:CC0-1.0 +// copyright-holders: Enzo Lombardi + +// Netlist for Model Racing Dribbling: derived from the schematics in the Dribbling manual, located here: +// https://archive.org/details/ArcadeGameManualDribbling +// Known issues: +// In the PARATA netlist the JFET emulation based on MOSFET doesn't work well. The whole netlist has been +// replaced with a quite similar one, at least to my ears. The real netlist is commented behind the FAKE_PARATA +// define. + +#include "netlist/devices/net_lib.h" + +#define TTL_74LS86_DIP TTL_7486_DIP +#define TTL_74LS107_DIP TTL_74107_DIP +#define TTL_74LS161_DIP TTL_74161_DIP +#define TTL_74LS164_DIP TTL_74164_DIP +#define ATTENUATE_FOLLA 200 +#define USE_SIMPLIFIED_LM339 +#define USE_FAKE_PARATA + +// The schematic incorrectly labels two JFETS in the PARATA circuit as 2N3812. They're actually 2N3819. +// JFET transistors not supported, but this should do the trick; but not for this game. +#define Q_2N3819(name) MOSFET(name, "NMOS(VTO=-3 KP=0.001 CAPMOD=0)") + +#ifdef USE_SIMPLIFIED_LM339 +// Simplified LM339 model - uses high-level simulation of differential input stage. +static NETLIST_START(LM339) +{ + // * CONNECTIONS: NON-INVERTING INPUT + // * | INVERTING INPUT + // * | | POSITIVE POWER SUPPLY + // * | | | NEGATIVE POWER SUPPLY + // * | | | | OPEN COLLECTOR OUTPUT + // * | | | | | + // * 1 2 3 4 5 + NET_MODEL("LM339_QO NPN(BF=200)") + + AFUNC(CMP, 2, "min(max(A1 - A0, 0), 1e-6)") + VCCS(QB, 80) + QBJT_EB(QO, "LM339_QO") + ANALOG_INPUT(XGND, 0) + RES(RDUMMY, RES_M(1000)) + + NET_C(CMP.Q, QB.IP) + NET_C(QB.OP, QO.B) + NET_C(XGND, QB.IN) + NET_C(QB.ON, QO.E, RDUMMY.2) + + ALIAS(1, CMP.A0) + ALIAS(2, CMP.A1) + ALIAS(3, RDUMMY.1) + ALIAS(4, QO.E) + ALIAS(5, QO.C) +} +#else // USE_SIMPLIFIED_LM339 +// LM339 model adapted from here: https://github.com/evenator/LTSpice-Libraries/blob/master/sub/LM339.sub +// It's too slow for the circuits emulated in this netlist, but might be useful in the future. +static NETLIST_START(LM339) +{ + // * CONNECTIONS: NON-INVERTING INPUT + // * | INVERTING INPUT + // * | | POSITIVE POWER SUPPLY + // * | | | NEGATIVE POWER SUPPLY + // * | | | | OPEN COLLECTOR OUTPUT + // * | | | | | + // * 1 2 3 4 5 + NET_MODEL("LM339A_TI_QIN PNP(IS=800.0E-18 BF=2.000E3)") + NET_MODEL("LM339A_TI_QMI NPN(IS=800.0E-18 BF=1002)") + NET_MODEL("LM339A_TI_QMO NPN(IS=800.0E-18 BF=1000 CJC=1E-15 TR=807.4E-9)") + NET_MODEL("LM339A_TI_QOC NPN(IS=800.0E-18 BF=20.29E3 CJC=1E-15 TF=942.6E-12 TR=543.8E-9)") + NET_MODEL("LM339A_TI_DX D(IS=800.0E-18)") + ALIAS(1, VI1.2) + ALIAS(2, VI2.2) + ALIAS(3, F10.ON) + ALIAS(4, Q3.E) + ALIAS(5, Q5.C) + DIODE(DP, "LM339A_TI_DX") + VCVS(E1, 1) + CCCS(F10, 1) + CS(IEE, 0.0001) + QBJT_EB(Q1, "LM339A_TI_QIN") + QBJT_EB(Q2, "LM339A_TI_QIN") + QBJT_EB(Q3, "LM339A_TI_QMO") + QBJT_EB(Q4, "LM339A_TI_QMI") + QBJT_EB(Q5, "LM339A_TI_QOC") + RES(RP, 46.300000) + VS(V1, 0) + VS(VI1, 0.75) + VS(VI2, 0.75) + NET_C(E1.OP, F10.IP) + NET_C(Q2.C, Q3.B, Q4.C, Q4.B) + NET_C(VI1.1, Q1.B) + NET_C(VI2.1, Q2.B) + NET_C(IEE.2, Q1.E, Q2.E) + NET_C(F10.IN, V1.1) + NET_C(F10.ON, IEE.1, DP.K, RP.1) + NET_C(F10.OP, Q1.C, Q3.C, E1.IP) + NET_C(V1.2, Q5.B) + NET_C(Q3.E, Q4.E, E1.ON, E1.IN, Q5.E, DP.A, RP.2) +} +#endif // USE_SIMPLIFIED_LM339 + +// CALCIO_A and CALCIO_B differ only for the parameters of 3 capacitors. +static NETLIST_START(calcio) +{ + DEFPARAM(CAP1, 33) + DEFPARAM(CAP2, 68) + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(I_V6, 6) + ANALOG_INPUT(I_V12, 12) + QBJT_EB(Q8, "BC239C") + QBJT_EB(Q9, "BC239C") + ALIAS(INPUT, R45.2) + RES(R45, 420) + RES(R46, RES_K(8.2)) + RES(R48, RES_K(220)) + RES(R49, RES_K(56)) + RES(R50, RES_K(56)) + RES(R51, RES_M(1)) + RES(R52, RES_K(68)) + RES(R53, RES_K(82)) + RES(R54, RES_K(1.9)) // WAS POT + RES(R55, RES_K(10)) + RES(R56, RES_K(100)) + RES(R57, RES_K(10)) + RES(R58, RES_K(3.9)) + CAP(C29, CAP_U(4.2)) + CAP(C30, CAP_N($(@.CAP2))) + CAP(C31, CAP_N(150)) + CAP(C32, CAP_U(4.7)) + CAP(C33, CAP_N($(@.CAP1))) + CAP(C34, CAP_N($(@.CAP1))) + NET_C(INPUT, R46.1) + ALIAS(GND, R45.1) + NET_C(R46.2, C33.2, C34.1) + NET_C(C33.1, R49.1, C29.1) + NET_C(C34.2, R50.2, R51.1, Q8.B) + NET_C(R49.2, C30.2, R50.1) + NET_C(C30.1, GND) + NET_C(C29.2, R52.1, R51.2, R53.1, Q8.C) + NET_C(R52.2, I_V5) + NET_C(Q8.E, R54.2) + NET_C(R54.1, GND) + NET_C(R53.2, C31.1) + NET_C(C31.2, R48.1, R56.2, Q9.B) + NET_C(R48.2, I_V5) + NET_C(R56.1, GND) + NET_C(Q9.C, R55.1) + ALIAS(OUTPUT, Q9.C) + NET_C(R55.2, I_V5) + NET_C(Q9.E, R57.2, C32.2) + NET_C(R57.1, GND) + NET_C(C32.1, R58.2) + NET_C(R58.1, GND) +} + +static NETLIST_START(stop_palla) +{ + ANALOG_INPUT(I_V5, 5) + QBJT_EB(Q1, "BC309") + RES(R5, RES_K(1)) + RES(R6, RES_K(160)) + RES(R7, RES_K(150)) + RES(R8, RES_K(10)) + RES(R9, RES_K(2.2)) + CAP(C5, CAP_U(1)) + CAP(C6, CAP_U(1)) + DIODE(D1, "1N914") + SUBMODEL(LM339, IC_B9) + ALIAS(GND, IC_B9.4) + ALIAS(INPUT, R5.1) + NET_C(R5.2, Q1.B) + NET_C(Q1.E, I_V5) + NET_C(Q1.C, C5.2, R7.2, R6.1) + NET_C(C5.1, GND) + NET_C(R7.1, GND) + NET_C(R6.2, IC_B9.1, D1.A) + NET_C(D1.K, R9.1, IC_B9.5, R8.2) + NET_C(IC_B9.2, C6.2, R8.1) + NET_C(C6.1, GND) + NET_C(R9.2, I_V5) + NET_C(IC_B9.3, I_V5) + + ALIAS(OUTPUT, IC_B9.5) +} + +// The actual PARATA schematics requires JFETs (2N3819) and using 'MOSFET(Q21, "NMOS(VTO=-1.0)")' as proposed in the FAQ +// doesn't work. So using the same circuit STOP_PALLA with different values to emulate the sound which has a higher pitch. +#ifdef USE_FAKE_PARATA +static NETLIST_START(parata) +{ + ANALOG_INPUT(I_V5, 5) + QBJT_EB(Q1, "BC309") + RES(R5, RES_K(1)) + RES(R6, RES_K(160)) + RES(R7, RES_K(75)) + RES(R8, RES_K(3.75)) + RES(R9, RES_K(2.2)) + CAP(C5, CAP_U(1)) + CAP(C6, CAP_U(1)) + DIODE(D1, "1N914") + SUBMODEL(LM339, IC_B9) + ALIAS(GND, IC_B9.4) + ALIAS(INPUT, R5.1) + NET_C(R5.2, Q1.B) + NET_C(Q1.E, I_V5) + NET_C(Q1.C, C5.2, R7.2, R6.1) + NET_C(C5.1, GND) + NET_C(R7.1, GND) + NET_C(R6.2, IC_B9.1, D1.A) + NET_C(D1.K, R9.1, IC_B9.5, R8.2) + NET_C(IC_B9.2, C6.2, R8.1) + NET_C(C6.1, GND) + NET_C(R9.2, I_V5) + NET_C(IC_B9.3, I_V5) + + ALIAS(OUTPUT, IC_B9.5) +} +#else // USE_FAKE_PARATA +static NETLIST_START(parata) +{ + ANALOG_INPUT(I_V5, 5) + QBJT_EB(Q1, "BC309") + Q_2N3819(Q2) + Q_2N3819(Q3) + RES(R5, RES_K(1)) + RES(R6, RES_K(150)) + RES(R7, RES_K(220)) + RES(R8, RES_K(1)) + RES(R9, RES_K(2.2)) + CAP(C5, CAP_U(2.2)) + CAP(C6, CAP_U(1)) + DIODE(D1, "1N914") + SUBMODEL(LM339, IC_B9) + ALIAS(GND, IC_B9.4) + ALIAS(INPUT, R5.1) + NET_C(R5.2, Q1.B) + NET_C(Q1.E, I_V5) + NET_C(Q1.C, C5.2, R7.2, R6.1) + NET_C(C5.1, GND) + NET_C(R7.1, GND) + NET_C(R6.2, IC_B9.1, D1.A) + NET_C(D1.K, R9.1, IC_B9.5, Q2.G, Q2.S) + NET_C(IC_B9.2, C6.2, Q2.D, Q3.G) + NET_C(C6.1, GND) + NET_C(R9.2, Q3.D, I_V5) + NET_C(IC_B9.3, I_V5) + NET_C(Q3.D, R8.2) + NET_C(R8.1, GND) + ALIAS(OUTPUT, Q3.S) +} +#endif // USE_FAKE_PARATA + +// Sallen-Key approximation of a third-order Butterworth filter with 15KHz cutoff frequency. +// Values computed using http://sim.okawa-denshi.jp/en/Sallen3tool.php . +// This is because the tone generator outputs a 40KHz square wave at idle, and this is to avoid aliasing when outputing at 48KHz. +static NETLIST_START(output_filter) +{ + OPAMP(AMP, "OPAMP(TYPE=1 FPF=5 RI=1M RO=50 UGF=1M SLEW=1M VLH=0.5 VLL=0.03 DAB=0.0015)") + RES(R1, RES_K(11)) + RES(R2, RES_K(110)) + RES(R3, RES_K(33)) + CAP(C1, CAP_U(0.001)) + CAP(C2, CAP_P(470)) + CAP(C3, CAP_P(68)) + ANALOG_INPUT(VPLUS, 12) + ANALOG_INPUT(VMINUS, -12) + NET_C(VPLUS, AMP.VCC) + NET_C(VMINUS, AMP.GND) + ALIAS(INPUT, R1.1) + ALIAS(OUTPUT, AMP.OUT) + ALIAS(GND, C1.2) + + NET_C(GND, C3.2) + NET_C(R1.2, R2.1, C1.1) + NET_C(R2.2, R3.1, C2.1) + NET_C(R3.2, C3.1, AMP.PLUS) + NET_C(OUTPUT, C2.2, AMP.MINUS) +} + +NETLIST_START(dribling) +{ + NET_MODEL("BC239C NPN(IS=1.5813E-15 ISE=4.637E-14 ISC=8.0864E-18 XTI=3 BF=113.32 BR=86.718 IKF=1.4907 IKR=0.03360 XTB=0 VAF=12.331 VAR=31.901 VJE=0.71518 VJC=1.1381 RE=0.22081 RC=0.01636 RB=1.0078 CJE=3.3904E-14 CJC=2.9774E-12 XCJC=0.02899 FC=0.99886 NF=1.0653 NR=1.8047 NE=1.4254 NC=1.8821 MJE=0.36824 MJC=0.31461 TF=2.0691E-11 TR=1.0033E-09 EG=1.11 IRB=0.00083992 RBM=0 XTF=0.31338 VTF=0.10174 ITF=0.0045579 PTF=0 CJS=0 MJS=0 VJS=0.75)") // )") + NET_MODEL("BC309 PNP(IS=1.0366E-15 ISE=1.6295E-14 ISC=9.4971E-17 XTI=3 BF=80 BR=16.116 IKF=0.47497 IKR=0.012081 XTB=0 VAF=8.486 VAR=9.5149 VJE=0.84456 VJC=1.0282 RE=1.9597 RC=1.1393 RB=3.2133 CJE=2.0636E-14 CJC=2.6904E-12 XCJC=0.075977 FC=0.54298 NF=1.03136 NR=1.2907 NE=1.3702 NC=1.038 MJE=0.68352 MJC=0.5401 TF=5.4303E-11 TR=3.4233E-10 EG=1.11 IRB=0.00046855 RBM=2.0822 XTF=0.27447 VTF=0.19311 ITF=0.0030573 PTF=0 CJS=0 VJS=0.75 MJS=0)") + + SOLVER(Solver, 1000) + PARAM(Solver.DYNAMIC_TS, 1) + PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 1e-5) + + CLOCK(clk, 40000) // 40KHz + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(I_V6, 6) + ANALOG_INPUT(I_V12, 12) + + TTL_7414_DIP(IC_L9) // SHARED INVERTER, FISCHIO 1-2, TOS 3-9 + NC_PIN(NC) + NET_C(IC_L9.10, GND.Q) + NET_C(IC_L9.12, GND.Q) + + LOCAL_SOURCE(LM339) + LOCAL_SOURCE(calcio) + LOCAL_SOURCE(stop_palla) + LOCAL_SOURCE(parata) + LOCAL_SOURCE(output_filter) + + // TOS Section + TTL_INPUT(I_PB0, 0) + TTL_INPUT(I_PB1, 0) + TTL_INPUT(I_PB2, 0) + TTL_INPUT(I_PB3, 0) + TTL_INPUT(I_PB4, 0) + TTL_INPUT(I_PB5, 0) + TTL_INPUT(I_PB6, 0) + TTL_INPUT(I_PB7, 0) + NET_C(GND, I_PB0.GND, I_PB1.GND, I_PB2.GND, I_PB3.GND, I_PB4.GND, I_PB5.GND, I_PB6.GND, I_PB7.GND, clk.GND) + NET_C(I_V5, I_PB0.VCC, I_PB1.VCC, I_PB2.VCC, I_PB3.VCC, I_PB4.VCC, I_PB5.VCC, I_PB6.VCC, I_PB7.VCC, clk.VCC) + CAP(C7_1, CAP_P(330)) + CAP(C7_2, CAP_P(330)) + TTL_74161_DIP(IC_D7) // 4 bit counter + TTL_74161_DIP(IC_E7) // same + TTL_74LS107_DIP(IC_C7) // dual JK flip flop + NET_C(GND, IC_C7.7, IC_D7.8, IC_E7.8, C7_1.2) + NET_C(I_V5, IC_C7.14, IC_D7.16, IC_E7.16) + NET_C(I_PB0, IC_D7.3) + NET_C(I_PB1, IC_D7.4) + NET_C(I_PB2, IC_D7.5) + NET_C(I_PB3, IC_D7.6) + NET_C(I_PB4, IC_E7.3) + NET_C(I_PB5, IC_E7.4) + NET_C(I_PB6, IC_E7.5) + NET_C(I_PB7, IC_E7.6) + NET_C(IC_E7.1, IC_D7.1, I_V5) // CLEAR FLAG + NET_C(IC_D7.7, IC_D7.10, I_V5) + NET_C(IC_E7.9, IC_D7.9, C7_1.1, IC_L9.4) + NET_C(IC_D7.15, IC_E7.7, IC_E7.10) + NET_C(IC_E7.15, IC_L9.3) + NET_C(IC_L9.6, IC_E7.2, IC_D7.2) + NET_C(IC_L9.5, C7_2.1, IC_C7.9, IC_L9.8) + NET_C(GND, C7_2.2) + NET_C(IC_L9.9, clk) + NET_C(IC_C7.10, I_V5) + NET_C(IC_C7.1, IC_C7.13, IC_C7.4, IC_C7.12, GND.Q) + NET_C(IC_C7.8, IC_E7.15) // FLIP-FLOP + NET_C(IC_C7.11, IC_E7.15) + ALIAS(TOS, IC_C7.5) + + // FISCHIO + TTL_INPUT(I_FISCHIO, 0) + NET_C(GND, I_FISCHIO.GND) + NET_C(I_V5, I_FISCHIO.VCC) + SUBMODEL(NE556_DIP, IC_N9) + TTL_74393_DIP(IC_M9) + NET_C(IC_L9.7, GND) + NET_C(IC_L9.14, I_V5) + NET_C(IC_M9.7, GND) + NET_C(IC_M9.14, I_V5) + NET_C(IC_N9.7, GND) + NET_C(IC_N9.14, I_V5) + RES(R1, RES_K(6.8)) + RES(R2, RES_K(39)) + RES(R3, RES_K(100)) + RES(R4, RES_K(47)) + CAP(C42, CAP_U(4.2)) + CAP(C2, CAP_N(2.2)) + NET_C(IC_M9.6, IC_L9.1) + NET_C(IC_N9.4, IC_L9.2) + NET_C(IC_N9.10, IC_L9.2) + NET_C(I_V5, R1.1) + NET_C(I_V5, R2.1) + NET_C(R1.2, IC_N9.1, R3.1, IC_N9.2, IC_N9.6, C42.1) + NET_C(C42.2, GND) + NET_C(R3.2, R4.2, IC_N9.8, IC_N9.12, C2.1) + NET_C(R4.1, R2.2, IC_N9.13) + NET_C(C2.2, GND) + NET_C(IC_N9.5, IC_M9.1) // Counter tick + NET_C(I_FISCHIO, IC_M9.2) // Counter CLEAR + NET_C(I_FISCHIO, IC_M9.12) + NET_C(GND.Q, IC_L9.11, IC_L9.13 ) + NET_C(IC_M9.6, IC_M9.13) + HINT(IC_M9.3, NC) + HINT(IC_M9.4, NC) + HINT(IC_M9.5, NC) + HINT(IC_M9.8, NC) + HINT(IC_M9.9, NC) + HINT(IC_M9.10, NC) + HINT(IC_M9.11, NC) + ALIAS(FISCHIO, IC_N9.9) + + // STOP_PALLA + TTL_INPUT(I_STOP_PALLA, 0) + NET_C(GND, I_STOP_PALLA.GND) + NET_C(I_V6, I_STOP_PALLA.VCC) + SUBMODEL(stop_palla, STOP_PALLA) + NET_C(STOP_PALLA.GND, GND) + NET_C(STOP_PALLA.INPUT, I_STOP_PALLA) + + // PARATA + TTL_INPUT(I_PARATA, 0) + NET_C(GND, I_PARATA.GND) + NET_C(I_V6, I_PARATA.VCC) + SUBMODEL(parata, PARATA) + NET_C(PARATA.GND, GND) + NET_C(PARATA.INPUT, I_PARATA) + + // CALCIO_A and CALCIO_B + TTL_INPUT(I_CALCIO_A, 0) + NET_C(GND, I_CALCIO_A.GND) + NET_C(I_V5, I_CALCIO_A.VCC) + TTL_INPUT(I_CALCIO_B, 0) + NET_C(GND, I_CALCIO_B.GND) + NET_C(I_V5, I_CALCIO_B.VCC) + SUBMODEL(calcio, CALCIO_A) + PARAM(CALCIO_A.CAP1, 22) + PARAM(CALCIO_A.CAP1, 47) + NET_C(I_CALCIO_A, CALCIO_A.INPUT) + NET_C(CALCIO_A.GND, GND) + SUBMODEL(calcio, CALCIO_B) + PARAM(CALCIO_B.CAP1, 33) + PARAM(CALCIO_B.CAP1, 68) + NET_C(I_CALCIO_B, CALCIO_B.INPUT) + NET_C(CALCIO_B.GND, GND) + + // FOLLA A, M, B + TTL_INPUT(I_FOLLA_A, 0) + TTL_INPUT(I_FOLLA_M, 0) + TTL_INPUT(I_FOLLA_B, 0) + TTL_INPUT(I_CONTRASTO, 0) + NET_C(GND, I_FOLLA_A.GND, I_FOLLA_M.GND, I_FOLLA_B.GND, I_CONTRASTO.GND) + NET_C(I_V5, I_FOLLA_A.VCC, I_FOLLA_M.VCC, I_FOLLA_B.VCC, I_CONTRASTO.VCC) + NET_C(GND, IC_E8.5, IC_C8.9, IC_C8.6, IC_C8.2, IC_C8.3, IC_8B.12, IC_8B.5, IC_8B.9, IC_7B.12, IC_7B.10, IC_7B.2, IC_7B.8) + NET_C(GND, IC_8B.4, IC_C8.5, IC_7B.8, IC_8B.10, IC_8B.13, IC_C8.10, IC_E8.4) + TTL_74LS164_DIP(IC_7A) + TTL_7414_DIP(IC_7B) + TTL_74LS164_DIP(IC_8A) + TTL_74LS86_DIP(IC_8B) + LM324_DIP(IC_C8) + TTL_7408_DIP(IC_E8) + NET_C(I_V5, IC_7A.14, IC_7B.14, IC_8A.14, IC_8B.14, IC_E8.14) + NET_C(I_V12, IC_C8.4) + NET_C(GND, IC_7A.7, IC_7B.7, IC_8A.7, IC_8B.7, IC_E8.7, IC_C8.11) + RES(R32, RES_K(1)) + RES(R33, RES_K(220 + ATTENUATE_FOLLA)) + RES(R34, RES_K(100 + ATTENUATE_FOLLA)) + RES(R35, RES_K(1)) + RES(R36, RES_K(56 + ATTENUATE_FOLLA)) + RES(R37, RES_K(10)) + RES(R47, RES_K(330)) + CAP(C20, CAP_N(100)) + CAP(C21, CAP_N(10)) + CAP(C22, CAP_N(22)) + CAP(C24, CAP_U(10)) + NET_C(IC_8B.1, IC_7B.4) + NET_C(IC_8B.2, IC_8A.3) + NET_C(IC_8B.3, IC_8A.1, IC_8A.2) + NET_C(IC_8A.9, IC_7A.9, I_V5) + NET_C(IC_8A.8, IC_7A.8, R32.1, IC_7B.6) + NET_C(IC_8A.13, IC_7A.1, IC_7A.2) + NET_C(IC_7A.12, IC_7B.3) + NET_C(R32.2, IC_7B.5, C20.2) + NET_C(C20.1, GND) + ALIAS(NOISE, IC_7A.13) + ALIAS(C_IN, IC_8A.8) + NET_C(I_FOLLA_B, IC_E8.10) + NET_C(I_FOLLA_M, IC_E8.12) + NET_C(I_FOLLA_A, IC_E8.1) + NET_C(IC_E8.9, IC_E8.13, IC_E8.2, NOISE) + NET_C(IC_E8.8, R33.1) + NET_C(IC_E8.11, R34.1) + NET_C(IC_E8.3, R36.1) + NET_C(R35.1, GND) + NET_C(R33.2, R34.2, R35.2, R36.2, C22.1, C21.1) + NET_C(C21.2, R47.2, IC_C8.14) + ALIAS(FOLLA, IC_C8.14) + NET_C(R37.2, I_V5) + NET_C(C22.2, R47.1, IC_C8.13) + NET_C(R37.1, C24.2, IC_C8.12) + NET_C(C24.1, GND) + + // CONTRASTO + SUBMODEL(NE556_DIP, IC_Q9) + NET_C(IC_Q9.7, GND) + NET_C(IC_Q9.14, I_V5) + RES(R38, RES_M(1)) + RES(R39, RES_K(100)) + CAP(C23, CAP_U(0.1)) + CAP(C25, CAP_U(0.1)) + CAP(C26, CAP_U(0.47)) + NET_C(R38.1, I_V5) + NET_C(R39.1, I_V5) + NET_C(R38.2, IC_Q9.1, IC_Q9.2, C25.1) + NET_C(C25.2, C26.2, GND) + NET_C(R39.2, IC_Q9.13, IC_Q9.12, IC_Q9.8, C26.1) + NET_C(IC_Q9.5, IC_Q9.10) + NET_C(IC_Q9.9, C23.1) + NET_C(IC_Q9.4, I_V5) + NET_C(I_CONTRASTO, IC_Q9.6) + ALIAS(CONT_OUT, C23.2) + NET_C(C23.2, R36.2) + + + + // OUTPUT SECTION ---------------------- + // TOS + CAP(C_TOS, CAP_N(100)) + RES(R_TOS, RES_K(220)) + NET_C(TOS, C_TOS.1) + NET_C(R_TOS.1, C_TOS.2) + + // FISCHIO + CAP(C_FISCHIO, CAP_N(1000)) + RES(R_FISCHIO, RES_K(220)) + NET_C(FISCHIO, C_FISCHIO.1) + NET_C(R_FISCHIO.1, C_FISCHIO.2) + + // FOLLA + CAP(C_FOLLA, CAP_N(10)) + RES(R_FOLLA, RES_K(100)) + NET_C(FOLLA, C_FOLLA.1) + NET_C(C_FOLLA.2, R_FOLLA.1) + + // CALCIO_A + CAP(C_CALCIO_A, CAP_U(1)) + RES(R_CALCIO_A, RES_K(10)) + NET_C(CALCIO_A.OUTPUT, C_CALCIO_A.1) + NET_C(C_CALCIO_A.2, R_CALCIO_A.1) + + // CALCIO_B + CAP(C_CALCIO_B, CAP_U(1)) + RES(R_CALCIO_B, RES_K(10)) + NET_C(CALCIO_B.OUTPUT, C_CALCIO_B.1) + NET_C(C_CALCIO_B.2, R_CALCIO_B.1) + + // STOP_PALLA + CAP(C_STOP_PALLA, CAP_U(1)) + RES(R_STOP_PALLA, RES_K(100)) + NET_C(STOP_PALLA.OUTPUT, C_STOP_PALLA.1) + NET_C(C_STOP_PALLA.2, R_STOP_PALLA.1) + + // PARATA + CAP(C_PARATA, CAP_U(1)) + RES(R_PARATA, RES_K(100)) + NET_C(PARATA.OUTPUT, C_PARATA.1) + NET_C(C_PARATA.2, R_PARATA.1) + + + + // FINAL MIX, DISABLE CIRCUITRY AND OUTPUT FILTER + TTL_INPUT(ENABLE_SOUND, 0) + NET_C(ENABLE_SOUND.VCC, I_V5) + NET_C(ENABLE_SOUND.GND, GND) + QBJT_EB(Q_OUT, "BC239C") + RES(R_OUT, RES_K(2.2)) + RES(R_PU_OUT, RES_K(10)) + NET_C(R_PU_OUT.1, I_V5) + NET_C(ENABLE_SOUND, R_OUT.1, R_PU_OUT.2) + NET_C(Q_OUT.B, R_OUT.2) + NET_C(Q_OUT.C, R_TOS.2, R_FISCHIO.2, R_FOLLA.2, R_CALCIO_A.2, R_CALCIO_B.2, R_STOP_PALLA.2, R_PARATA.2) + NET_C(Q_OUT.E, GND) + SUBMODEL(output_filter, OUTPUT_FILTER) + NET_C(OUTPUT_FILTER.INPUT, Q_OUT.C) + NET_C(OUTPUT_FILTER.GND, GND) + + + + ALIAS(OUTPUT, OUTPUT_FILTER.OUTPUT) +} diff -Nru mame-0.263+dfsg.1/src/mame/mr/nl_dribling.h mame-0.264+dfsg.1/src/mame/mr/nl_dribling.h --- mame-0.263+dfsg.1/src/mame/mr/nl_dribling.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/mr/nl_dribling.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,10 @@ +// license:BSD-3-Clause +// copyright-holders: Enzo Lombardi +#ifndef MAME_MR_NL_DRIBLING_H +#define MAME_MR_NL_DRIBLING_H + +#include "netlist/nl_setup.h" + +NETLIST_EXTERNAL(dribling) + +#endif // MAME_MR_NL_DRIBLING_H diff -Nru mame-0.263+dfsg.1/src/mame/msx/msx_matsushita.cpp mame-0.264+dfsg.1/src/mame/msx/msx_matsushita.cpp --- mame-0.263+dfsg.1/src/mame/msx/msx_matsushita.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/msx/msx_matsushita.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -51,14 +51,14 @@ bool msx_matsushita_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(&m_sram[0], m_sram.size(), actual) && actual == m_sram.size(); + auto const [err, actual] = read(file, &m_sram[0], m_sram.size()); + return !err && (actual == m_sram.size()); } bool msx_matsushita_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(&m_sram[0], m_sram.size(), actual) && actual == m_sram.size(); + auto const [err, actual] = write(file, &m_sram[0], m_sram.size()); + return !err; } u8 msx_matsushita_device::switched_read(offs_t offset) diff -Nru mame-0.263+dfsg.1/src/mame/msx/msx_s1985.cpp mame-0.264+dfsg.1/src/mame/msx/msx_s1985.cpp --- mame-0.263+dfsg.1/src/mame/msx/msx_s1985.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/msx/msx_s1985.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -37,15 +37,15 @@ bool msx_s1985_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_backup_ram, sizeof(m_backup_ram), actual) && actual == sizeof(m_backup_ram); + auto const [err, actual] = read(file, m_backup_ram, sizeof(m_backup_ram)); + return !err && (actual == sizeof(m_backup_ram)); } bool msx_s1985_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_backup_ram, sizeof(m_backup_ram), actual) && actual == sizeof(m_backup_ram); + auto const [err, actual] = write(file, m_backup_ram, sizeof(m_backup_ram)); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/namco/baraduke.cpp mame-0.264+dfsg.1/src/mame/namco/baraduke.cpp --- mame-0.263+dfsg.1/src/mame/namco/baraduke.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/baraduke.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -196,8 +196,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs. @@ -518,8 +516,6 @@ } -// machine - void baraduke_state::inputport_select_w(uint8_t data) { if ((data & 0xe0) == 0x60) diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcofl.cpp mame-0.264+dfsg.1/src/mame/namco/namcofl.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcofl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcofl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -267,8 +267,6 @@ }; -// video - void namcofl_state::tilemap_cb(uint16_t code, int *tile, int *mask) { *tile = code; @@ -329,8 +327,6 @@ } -// machine - uint32_t namcofl_state::unk1_r() { return 0xffffffff; diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcond1.cpp mame-0.264+dfsg.1/src/mame/namco/namcond1.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcond1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcond1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -242,11 +242,11 @@ required_shared_ptr m_shared_ram; uint8_t m_h8_irq5_enabled = 0; - uint16_t m_p8 = 0; + uint8_t m_p8 = 0; - uint16_t mcu_p7_read(); - uint16_t mcu_pa_read(); - void mcu_pa_write(uint16_t data); + uint8_t mcu_p7_read(); + uint8_t mcu_pa_read(); + void mcu_pa_write(uint8_t data); uint16_t cuskey_r(offs_t offset); void cuskey_w(offs_t offset, uint16_t data); uint16_t printer_r(); @@ -441,17 +441,17 @@ INPUT_PORTS_END -uint16_t namcond1_state::mcu_p7_read() +uint8_t namcond1_state::mcu_p7_read() { return 0xff; } -uint16_t namcond1_state::mcu_pa_read() +uint8_t namcond1_state::mcu_pa_read() { return 0xff; } -void namcond1_state::mcu_pa_write(uint16_t data) +void namcond1_state::mcu_pa_write(uint8_t data) { m_p8 = data; } @@ -504,7 +504,6 @@ m_mcu->read_porta().set(FUNC(namcond1_state::mcu_pa_read)); m_mcu->write_porta().set(FUNC(namcond1_state::mcu_pa_write)); - config.set_maximum_quantum(attotime::from_hz(6000)); YGV608(config, m_ygv608, 0); diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos10.cpp mame-0.264+dfsg.1/src/mame/namco/namcos10.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcos10.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos10.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1359,7 +1359,7 @@ HOPPER(config, m_mgexio_hopper[2], attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH); mgexio.port4_read_callback().set([this] (offs_t offset) { - uint16_t r = 0; + uint8_t r = 0; r |= (m_mgexio_outputs[6] & 1); // divider sol (l) sensor r |= (m_mgexio_outputs[7] & 1) << 1; //divider sol (r) sensor return r; @@ -1370,7 +1370,7 @@ }); mgexio.porta_read_callback().set([this] (offs_t offset) { - uint16_t r = 0b1111; + uint8_t r = 0b1111; // update coin states auto curtime = machine().time(); @@ -1395,11 +1395,11 @@ return r; }); - mgexio.port4_write_callback().set([this] (uint16_t data) { + mgexio.port4_write_callback().set([this] (uint8_t data) { m_mgexio_outputs[8] = BIT(data, 6); // win lamp }); - mgexio.portb_write_callback().set([this] (uint16_t data) { + mgexio.portb_write_callback().set([this] (uint8_t data) { m_mgexio_hopper[0]->motor_w(BIT(data, 0)); m_mgexio_hopper[1]->motor_w(BIT(data, 1)); m_mgexio_hopper[2]->motor_w(BIT(data, 4)); @@ -3260,18 +3260,18 @@ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("MGEXIO_SENSOR") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Check Sensor(2)") - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Check Sensor(1)") - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Check Sensor(4)") - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Check Sensor(3)") - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Check Sensor(6)") - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Check Sensor(5)") - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Check Sensor(7)") - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Check Sensor(2)") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Check Sensor(1)") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Check Sensor(4)") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Check Sensor(3)") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Check Sensor(6)") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Check Sensor(5)") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Check Sensor(7)") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_TILT ) PORT_START("MGEXIO_COIN") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin Sensor(L)") PORT_CHANGED_MEMBER(DEVICE_SELF, namcos10_state, mgexio_coin_start, 0) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Coin Sensor(R)") PORT_CHANGED_MEMBER(DEVICE_SELF, namcos10_state, mgexio_coin_start, 1) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin Sensor(L)") PORT_CHANGED_MEMBER(DEVICE_SELF, namcos10_state, mgexio_coin_start, 0) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Coin Sensor(R)") PORT_CHANGED_MEMBER(DEVICE_SELF, namcos10_state, mgexio_coin_start, 1) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos10_exio.cpp mame-0.264+dfsg.1/src/mame/namco/namcos10_exio.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcos10_exio.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos10_exio.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -208,13 +208,13 @@ } template -uint16_t namcos10_mgexio_device::port_r() +uint8_t namcos10_mgexio_device::port_r() { return m_port_read[Port](0); } template -void namcos10_mgexio_device::port_w(uint16_t data) +void namcos10_mgexio_device::port_w(uint8_t data) { m_port_write[Port](data); } diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos10_exio.h mame-0.264+dfsg.1/src/mame/namco/namcos10_exio.h --- mame-0.263+dfsg.1/src/mame/namco/namcos10_exio.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos10_exio.h 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,8 @@ private: void map(address_map &map); - template uint16_t port_r(); - template void port_w(uint16_t data); + template uint8_t port_r(); + template void port_w(uint8_t data); TIMER_CALLBACK_MEMBER(cpu_reset_timeout); @@ -125,8 +125,8 @@ required_shared_ptr m_ram; required_device m_nvram; - devcb_read16::array<7> m_port_read; - devcb_write16::array<7> m_port_write; + devcb_read8::array<7> m_port_read; + devcb_write8::array<7> m_port_write; emu_timer *m_cpu_reset_timer; diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos12.cpp mame-0.264+dfsg.1/src/mame/namco/namcos12.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcos12.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos12.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1178,9 +1178,9 @@ uint8_t s12_mcu_portB_r(); void s12_mcu_portB_w(uint8_t data); uint8_t s12_mcu_p6_r(); - uint16_t iob_p4_r(); - uint16_t iob_p6_r(); - void iob_p4_w(uint16_t data); + uint8_t iob_p4_r(); + uint8_t iob_p6_r(); + void iob_p4_w(uint8_t data); required_device m_maincpu; required_device m_ram; @@ -1212,9 +1212,7 @@ uint32_t m_ttt_val[2]; uint8_t m_sub_porta; uint8_t m_sub_portb; - uint8_t m_jvssense; - uint8_t m_tssio_port_4; void sharedram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t sharedram_r(offs_t offset, uint16_t mem_mask = ~0); @@ -1627,8 +1625,6 @@ bankoffset_w(0,0,0xffff); m_jvssense = 1; - m_tssio_port_4 = 0; - m_has_tektagt_dma = 0; } @@ -1877,20 +1873,18 @@ map(0xc000, 0xfb7f).ram(); } -uint16_t namcos12_state::iob_p4_r() +uint8_t namcos12_state::iob_p4_r() { - return m_tssio_port_4; + return 0; } -void namcos12_state::iob_p4_w(uint16_t data) +void namcos12_state::iob_p4_w(uint8_t data) { - m_tssio_port_4 = data; - // bit 2 = SENSE line back to main (0 = asserted, 1 = dropped) m_jvssense = (data & 0x04) ? 0 : 1; } -uint16_t namcos12_state::iob_p6_r() +uint8_t namcos12_state::iob_p6_r() { // d4 is service button uint8_t sb = (m_service_io->read() & 1) << 4; diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos2.cpp mame-0.264+dfsg.1/src/mame/namco/namcos2.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcos2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2426,6 +2426,9 @@ ROM_REGION16_BE( 0x200000, "c140", ROMREGION_ERASE00 ) /* Sound voices */ ROM_LOAD16_BYTE( "co2voi1.bin", 0x000000, 0x080000, CRC(5a301349) SHA1(e333ea5955a66ac8d7c94cd50047efaf6fa95b15) ) ROM_LOAD16_BYTE( "co2voi2.bin", 0x100000, 0x080000, CRC(a27cb45a) SHA1(08ccaaf43369e8358e31b213877829bdfd61479e) ) + + ROM_REGION( 0x2000, "user2", 0 ) /* zoom */ + ROM_LOAD( "04544191.6n", 0, 0x2000, CRC(90db1bf6) SHA1(dbb9e50a8efc3b4012fcf587cc87da9ef42a1b80) ) ROM_END /* COSMO GANG THE VIDEO (JAPAN) */ @@ -2469,6 +2472,9 @@ ROM_REGION16_BE( 0x200000, "c140", ROMREGION_ERASE00 ) /* Sound voices */ ROM_LOAD16_BYTE( "co1voi1.bin", 0x000000, 0x080000, CRC(b5ba8f15) SHA1(9e54b9ba1cd44353782adf337376dff9eec4e937) ) ROM_LOAD16_BYTE( "co1voi2.bin", 0x100000, 0x080000, CRC(b566b105) SHA1(b5530b0f3dea0135f28419044aee923d855f382c) ) + + ROM_REGION( 0x2000, "user2", 0 ) /* zoom */ + ROM_LOAD( "04544191.6n", 0, 0x2000, CRC(90db1bf6) SHA1(dbb9e50a8efc3b4012fcf587cc87da9ef42a1b80) ) ROM_END /* DIRT FOX (JAPAN) */ diff -Nru mame-0.263+dfsg.1/src/mame/namco/namcos23.cpp mame-0.264+dfsg.1/src/mame/namco/namcos23.cpp --- mame-0.263+dfsg.1/src/mame/namco/namcos23.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/namcos23.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1818,7 +1818,6 @@ uint8_t m_sub_port8; uint8_t m_sub_porta; uint8_t m_sub_portb; - uint8_t m_tssio_port_4; output_finder<8> m_lamps; }; @@ -3331,13 +3330,11 @@ uint8_t namcos23_state::iob_p4_r() { - return m_tssio_port_4; + return 0; } void namcos23_state::iob_p4_w(uint8_t data) { - m_tssio_port_4 = data; - // bit 2 = SENSE line back to main (0 = asserted, 1 = dropped) m_jvssense = (data & 0x04) ? 0 : 1; } @@ -3365,7 +3362,7 @@ { map(0x0000, 0x1fff).rom().region("iocpu", 0); map(0x6000, 0x6001).portr("IN01"); - map(0x6002, 0x6003).portr("IN23"); + map(0x6002, 0x6003).portr("IN23").nopw(); map(0x6004, 0x6005).nopw(); map(0x6006, 0x6007).noprw(); map(0xc000, 0xfb7f).ram(); @@ -3759,7 +3756,6 @@ m_sub_port8 = 0x02; m_sub_porta = 0; m_sub_portb = 0x50; - m_tssio_port_4 = 0; m_subcpu_running = false; m_render.count[0] = m_render.count[1] = 0; m_render.cur = 0; @@ -5601,37 +5597,37 @@ /* Games */ -#define GAME_FLAGS (MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS ) -// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MNTR, COMPANY, FULLNAME, FLAGS -GAME( 1997, rapidrvr, 0, gorgon, rapidrvr, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (US, RD3 Ver. C)", GAME_FLAGS ) // 97/11/27, USA -GAME( 1997, rapidrvrv2c, rapidrvr, gorgon, rapidrvr, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (World, RD2 Ver. C)", GAME_FLAGS ) // 97/11/27, Europe -GAME( 1997, rapidrvrp, rapidrvr, gorgon, rapidrvrp, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (prototype)", GAME_FLAGS ) // 97/11/10, USA -GAME( 1997, finfurl, 0, gorgon, finfurl, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong (World, FF2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, downhill, 0, s23, downhill, namcos23_state, init_s23, ROT0, "Namco", "Downhill Bikers (World, DH2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, downhillu, downhill, s23, downhill, namcos23_state, init_s23, ROT0, "Namco", "Downhill Bikers (US, DH3 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, motoxgo, 0, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (US, MG3 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, motoxgov2a, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (World, MG2 Ver. A, set 1)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, motoxgov2a2, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (World, MG2 Ver. A, set 2)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +#define GAME_FLAGS (MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS) +// YEAR, NAME, PARENT, MACHINE, INPUT, CLASS, INIT, MNTR, COMPANY, FULLNAME, FLAGS +GAME( 1997, rapidrvr, 0, gorgon, rapidrvr, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (US, RD3 Ver. C)", GAME_FLAGS ) // 97/11/27, USA +GAME( 1997, rapidrvrv2c, rapidrvr, gorgon, rapidrvr, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (World, RD2 Ver. C)", GAME_FLAGS ) // 97/11/27, Europe +GAME( 1997, rapidrvrp, rapidrvr, gorgon, rapidrvrp, namcos23_state, init_s23, ROT0, "Namco", "Rapid River (prototype)", GAME_FLAGS ) // 97/11/10, USA +GAME( 1997, finfurl, 0, gorgon, finfurl, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong (World, FF2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, downhill, 0, s23, downhill, namcos23_state, init_s23, ROT0, "Namco", "Downhill Bikers (World, DH2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, downhillu, downhill, s23, downhill, namcos23_state, init_s23, ROT0, "Namco", "Downhill Bikers (US, DH3 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, motoxgo, 0, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (US, MG3 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, motoxgov2a, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (World, MG2 Ver. A, set 1)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, motoxgov2a2, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (World, MG2 Ver. A, set 2)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) GAME( 1997, motoxgov1a, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (Japan, MG1 Ver. A, set 1)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) GAME( 1997, motoxgov1a2, motoxgo, motoxgo, s23, namcos23_state, init_s23, ROT0, "Namco", "Motocross Go! (Japan, MG1 Ver. A, set 2)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, timecrs2, 0, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (US, TSS3 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, timecrs2v2b, timecrs2, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (World, TSS2 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, timecrs2v1b, timecrs2, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (Japan, TSS1 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, timecrs2v4a, timecrs2, timecrs2v4a, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (World, TSS4 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, timecrs2v5a, timecrs2, timecrs2v4a, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (US, TSS5 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1997, panicprk, 0, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (World, PNP2 Ver. A)", GAME_FLAGS ) -GAME( 1997, panicprkj, panicprk, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (Japan, PNP1 Ver. B, set 1)", GAME_FLAGS ) -GAME( 1997, panicprkj2, panicprk, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (Japan, PNP1 Ver. B, set 2)", GAME_FLAGS ) -GAME( 1998, gunwars, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Gunmen Wars (Japan, GM1 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1998, gunwarsa, gunwars, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Gunmen Wars (Japan, GM1 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1998, raceon, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Race On! (World, RO2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1998, 500gp, 0, ss23, 500gp, namcos23_state, init_s23, ROT0, "Namco", "500 GP (US, 5GP3 Ver. C)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) -GAME( 1998, aking, 0, ss23, s23, namcos23_state, init_s23, ROT0, "Namco", "Angler King (Japan, AG1 Ver. A)", GAME_FLAGS ) -GAME( 1998, finfurl2, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong 2 (World)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) // 99/02/26 15:08:47 Overseas -GAME( 1998, finfurl2j, finfurl2, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong 2 (Japan, FFS1 Ver.A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) // 99/02/26 15:03:14 Japanese -GAME( 1999, crszone, 0, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO4 Ver. B)", GAME_FLAGS ) -GAME( 1999, crszonev4a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO4 Ver. A)", GAME_FLAGS ) -GAME( 1999, crszonev3b, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. B, set 1)", GAME_FLAGS ) -GAME( 1999, crszonev3b2, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. B, set 2)", GAME_FLAGS ) -GAME( 1999, crszonev3a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. A)", GAME_FLAGS ) -GAME( 1999, crszonev2a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO2 Ver. A)", GAME_FLAGS ) +GAME( 1997, timecrs2, 0, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (US, TSS3 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, timecrs2v2b, timecrs2, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (World, TSS2 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, timecrs2v1b, timecrs2, timecrs2, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (Japan, TSS1 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, timecrs2v4a, timecrs2, timecrs2v4a, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (World, TSS4 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, timecrs2v5a, timecrs2, timecrs2v4a, timecrs2, namcos23_state, init_s23, ROT0, "Namco", "Time Crisis II (US, TSS5 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1997, panicprk, 0, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (World, PNP2 Ver. A)", GAME_FLAGS ) +GAME( 1997, panicprkj, panicprk, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (Japan, PNP1 Ver. B, set 1)", GAME_FLAGS ) +GAME( 1997, panicprkj2, panicprk, s23, s23, namcos23_state, init_s23, ROT0, "Namco", "Panic Park (Japan, PNP1 Ver. B, set 2)", GAME_FLAGS ) +GAME( 1998, gunwars, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Gunmen Wars (Japan, GM1 Ver. B)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1998, gunwarsa, gunwars, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Gunmen Wars (Japan, GM1 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1998, raceon, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Race On! (World, RO2 Ver. A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1998, 500gp, 0, ss23, 500gp, namcos23_state, init_s23, ROT0, "Namco", "500 GP (US, 5GP3 Ver. C)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) +GAME( 1998, aking, 0, ss23, s23, namcos23_state, init_s23, ROT0, "Namco", "Angler King (Japan, AG1 Ver. A)", GAME_FLAGS ) +GAME( 1998, finfurl2, 0, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong 2 (World)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) // 99/02/26 15:08:47 Overseas +GAME( 1998, finfurl2j, finfurl2, gmen, s23, namcos23_state, init_s23, ROT0, "Namco", "Final Furlong 2 (Japan, FFS1 Ver.A)", GAME_FLAGS | MACHINE_NODEVICE_LAN ) // 99/02/26 15:03:14 Japanese +GAME( 1999, crszone, 0, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO4 Ver. B)", GAME_FLAGS ) +GAME( 1999, crszonev4a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO4 Ver. A)", GAME_FLAGS ) +GAME( 1999, crszonev3b, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. B, set 1)", GAME_FLAGS ) +GAME( 1999, crszonev3b2, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. B, set 2)", GAME_FLAGS ) +GAME( 1999, crszonev3a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (US, CSZO3 Ver. A)", GAME_FLAGS ) +GAME( 1999, crszonev2a, crszone, ss23e2, s23, namcos23_state, init_s23, ROT0, "Namco", "Crisis Zone (World, CSZO2 Ver. A)", GAME_FLAGS ) diff -Nru mame-0.263+dfsg.1/src/mame/namco/pacland.cpp mame-0.264+dfsg.1/src/mame/namco/pacland.cpp --- mame-0.263+dfsg.1/src/mame/namco/pacland.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/pacland.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -284,8 +284,6 @@ }; -// video - /*************************************************************************** Sprite/tile priority is quite complex in this game: it is handled both diff -Nru mame-0.263+dfsg.1/src/mame/namco/skykid.cpp mame-0.264+dfsg.1/src/mame/namco/skykid.cpp --- mame-0.263+dfsg.1/src/mame/namco/skykid.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/skykid.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,6 @@ }; -// video - /*************************************************************************** @@ -361,8 +359,6 @@ } -// machine - void skykid_state::inputport_select_w(uint8_t data) { if ((data & 0xe0) == 0x60) diff -Nru mame-0.263+dfsg.1/src/mame/namco/tankbatt.cpp mame-0.264+dfsg.1/src/mame/namco/tankbatt.cpp --- mame-0.263+dfsg.1/src/mame/namco/tankbatt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/namco/tankbatt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -158,8 +158,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -243,8 +241,6 @@ } -// machine - template uint8_t tankbatt_state::in_r(offs_t offset) { diff -Nru mame-0.263+dfsg.1/src/mame/nasco/crgolf.cpp mame-0.264+dfsg.1/src/mame/nasco/crgolf.cpp --- mame-0.263+dfsg.1/src/mame/nasco/crgolf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nasco/crgolf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -216,8 +216,6 @@ void sound_prg_map(address_map &map); }; -// video - /************************************* * @@ -334,8 +332,6 @@ } -// machine - /************************************* * * ROM banking diff -Nru mame-0.263+dfsg.1/src/mame/nasco/himesiki.cpp mame-0.264+dfsg.1/src/mame/nasco/himesiki.cpp --- mame-0.263+dfsg.1/src/mame/nasco/himesiki.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nasco/himesiki.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -164,8 +164,6 @@ }; -// video - TILE_GET_INFO_MEMBER(himesiki_state::get_bg_tile_info) { int code = m_bg_ram[tile_index * 2] + m_bg_ram[tile_index * 2 + 1] * 0x100; @@ -282,8 +280,6 @@ } -// machine - void himesiki_state::rombank_w(uint8_t data) { m_mainbank->set_entry(((data & 0x0c) >> 2)); diff -Nru mame-0.263+dfsg.1/src/mame/nascom/nascom1.cpp mame-0.264+dfsg.1/src/mame/nascom/nascom1.cpp --- mame-0.263+dfsg.1/src/mame/nascom/nascom1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nascom/nascom1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -44,6 +44,8 @@ #include "softlist_dev.h" #include "screen.h" +#include + namespace { @@ -319,15 +321,19 @@ template SNAPSHOT_LOAD_MEMBER(nascom_state::snapshot_cb) { - util::core_file &file = image.image_core_file(); - uint8_t line[29]; - + util::random_read &file = image.image_core_file(); std::error_condition err; - size_t actual; - while (!(err = file.read(&line, sizeof(line), actual)) && actual == sizeof(line)) + + while (true) { - unsigned int addr, b[8], dummy; + size_t actual; + + uint8_t line[29]; + std::tie(err, actual) = read(file, &line, sizeof(line)); + if (err || (sizeof(line) != actual)) + break; + unsigned int addr, b[8]; if (sscanf((char *)line, "%4x %x %x %x %x %x %x %x %x", &addr, &b[0], &b[1], &b[2], &b[3], &b[4], &b[5], &b[6], &b[7]) == 9) { @@ -348,13 +354,14 @@ { return std::make_pair(image_error::INVALIDIMAGE, "Unsupported file format"); } - dummy = 0x00; - while (dummy != 0x0a && dummy != 0x1f) + int dummy = 0x00; + do { - err = file.read(&dummy, 1, actual); - if (err || actual != 1) + std::tie(err, actual) = read(file, &dummy, 1); + if (err || (actual != 1)) return std::make_pair(err, std::string()); } + while (dummy != 0x0a && dummy != 0x1f); } return std::make_pair(err, std::string()); @@ -378,8 +385,7 @@ slot->rom_alloc(slot->length(), GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - size_t actual; - std::error_condition const err = slot->image_core_file().read(slot->get_rom_base(), slot->length(), actual); + auto const [err, actual] = read(slot->image_core_file(), slot->get_rom_base(), slot->length()); if (err || actual != slot->length()) return std::make_pair(err ? err : std::errc::io_error, std::string()); diff -Nru mame-0.263+dfsg.1/src/mame/natsemi/icm3216.cpp mame-0.264+dfsg.1/src/mame/natsemi/icm3216.cpp --- mame-0.263+dfsg.1/src/mame/natsemi/icm3216.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/natsemi/icm3216.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -30,7 +30,7 @@ // various hardware #include "machine/mc68681.h" #include "machine/mm58274c.h" -//#include "machine/ncr5385.h" +#include "machine/ncr5385.h" #include "machine/ns32081.h" #include "machine/ns32082.h" #include "machine/ns32202.h" @@ -60,7 +60,7 @@ , m_duart(*this, "duart%u", 0U) , m_serial(*this, "serial%u", 0U) , m_iop(*this, "iop") - //, m_scsi(*this, "scsi:7:ncr5385") + , m_scsi(*this, "scsi:7:ncr5385") , m_led(*this, "led%u", 1U) , m_boot(*this, "boot") { @@ -106,7 +106,7 @@ required_device_array m_serial; required_device m_iop; - //required_device m_scsi; + required_device m_scsi; output_finder<5> m_led; @@ -126,7 +126,9 @@ enum iop_status_mask : u8 { IOP_IID = 0x07, // subchannel interrupt ID - IOP_IRS = 0x10, // interrupt request set + IOP_IRS = 0x10, // interrupt request + IOP_RST = 0x20, // scsi reset + IOP_ABT = 0x40, // scsi abort interrupt? IOP_BSY = 0x80, // busy }; @@ -254,7 +256,7 @@ // c015 write 0x08 // c017 write 0x00 (after read16?, clear BSY?) - //map(0xc020, 0xc02f).m(m_scsi, FUNC(ncr5385_device::map)); + map(0xc020, 0xc02f).m(m_scsi, FUNC(ncr5385_device::map)); } void icm3216_state::iop_pio_map(address_map &map) @@ -328,9 +330,6 @@ NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr, false); NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr, false); NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr, false); -#if 1 - NSCSI_CONNECTOR(config, "scsi:7", scsi_devices, nullptr, false); -#else NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5385", NCR5385).machine_config( [this](device_t *device) { @@ -341,7 +340,6 @@ ncr5385.irq().set(*this, FUNC(icm3216_state::iop_int<2>)); ncr5385.dreq().set_inputline(m_iop, INPUT_LINE_NMI); }); -#endif } void icm3216_state::parity_select_w(u8 data) @@ -480,15 +478,22 @@ void icm3216_state::iop_w(u8 data) { + /* + * cmd function + * 0x00 write command pointer table (followed by address, lsb first) + * 0x01 acknowledge interrupt + * 0x02 reset i/o controller? + * 0x03 scsi reset + * 0x05 reset i/o controller? + * 0x1n start i/o subchannel n + * 0x2n abort i/o subchannel n + */ LOG("iop_w 0x%02x (%s)\n", data, machine().describe_context()); m_iop_cmd = data; - if (false) - { - m_iop_sts |= IOP_BSY; + m_iop_sts |= IOP_BSY; - iop_int<1>(1); - } + iop_int<1>(1); } // iop interrupt vector bits diff -Nru mame-0.263+dfsg.1/src/mame/nec/pc9801_memsw.cpp mame-0.264+dfsg.1/src/mame/nec/pc9801_memsw.cpp --- mame-0.263+dfsg.1/src/mame/nec/pc9801_memsw.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nec/pc9801_memsw.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -144,14 +144,14 @@ bool pc9801_memsw_device::nvram_read(util::read_stream &file) { - size_t actual_size; - return !file.read(m_bram, m_bram_size, actual_size) && actual_size == m_bram_size; + auto const [err, actual_size] = util::read(file, m_bram, m_bram_size); + return !err && (actual_size == m_bram_size); } bool pc9801_memsw_device::nvram_write(util::write_stream &file) { - size_t actual_size; - return !file.write(m_bram, m_bram_size, actual_size) && actual_size == m_bram_size; + auto const [err, actual_size] = util::write(file, m_bram, m_bram_size); + return !err; } //************************************************************************** diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/armedf.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/armedf.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/armedf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/armedf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1240,7 +1240,7 @@ MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf) /* sound hardware */ - sound_config(config); + sound_config_3812(config); } void armedf_state::armedf(machine_config &config) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/clshroad.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/clshroad.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/clshroad.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/clshroad.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -154,8 +154,6 @@ }; -// video - /*************************************************************************** [ 2 Horizontally Scrolling Layers ] @@ -480,8 +478,6 @@ } -// machine - void clshroad_state::machine_start() { save_item(NAME(m_main_irq_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/cop01.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/cop01.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/cop01.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/cop01.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -163,8 +163,6 @@ }; -// video - void cop01_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -362,8 +360,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/gomoku.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/gomoku.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/gomoku.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/gomoku.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,8 +82,6 @@ }; -// video - /****************************************************************************** palette RAM @@ -279,8 +277,6 @@ } -// machine - uint8_t gomoku_state::input_port_r(offs_t offset) { int res = 0; diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/gomoku_a.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/gomoku_a.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/gomoku_a.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/gomoku_a.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -213,9 +213,9 @@ // oneshot frequency is hand tune... if ((m_soundregs2[0x1d] & 0x0f) < 0x0c) - voice->frequency = 3000 / 16; // ichi, ni, san, yon, go + voice->frequency = (18'432'000 / 96000); // ichi, ni, san, yon, go else - voice->frequency = 8000 / 16; // shoot + voice->frequency = (18'432'000 / 48000); // shoot voice->volume = 8; voice->counter = 0; diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/hrdvd.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/hrdvd.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/hrdvd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/hrdvd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -108,11 +108,11 @@ void mpeg_dreq_w(int state); - uint16_t p6_r(); - void p6_w(uint16_t data); - uint16_t pb_r(); - void pb_w(uint16_t data); - void pa_w(uint16_t data); + uint8_t p6_r(); + void p6_w(uint8_t data); + uint8_t pb_r(); + void pb_w(uint8_t data); + void pa_w(uint8_t data); uint8_t cs0_r(offs_t offset); void cs0_w(offs_t offset, uint8_t data); @@ -141,12 +141,12 @@ m_subcpu->set_input_line(H8_INPUT_LINE_DREQ0, m_mpeg_dreq && !(m_p6 & 0x04)); } -uint16_t hrdvd_state::p6_r() +uint8_t hrdvd_state::p6_r() { return m_p6; } -void hrdvd_state::p6_w(uint16_t data) +void hrdvd_state::p6_w(uint8_t data) { u8 delta = data ^ m_p6; m_p6 = data; @@ -158,12 +158,12 @@ logerror("p6 %02x\n", m_p6); } -uint16_t hrdvd_state::pb_r() +uint8_t hrdvd_state::pb_r() { return m_pb; } -void hrdvd_state::pb_w(uint16_t data) +void hrdvd_state::pb_w(uint8_t data) { u8 delta = data ^ m_pb; m_pb = (m_pb & 0xc0) | (data & 0x3f); @@ -174,7 +174,7 @@ logerror("pb %02x\n", data); } -void hrdvd_state::pa_w(uint16_t data) +void hrdvd_state::pa_w(uint8_t data) { u8 delta = data ^ m_pa; m_pa = data; diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/hyhoo.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/hyhoo.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/hyhoo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/hyhoo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -104,8 +104,6 @@ }; -// video - void hyhoo_state::blitter_w(offs_t offset, uint8_t data) { switch (offset) @@ -332,8 +330,6 @@ } -// machine - void hyhoo_state::program_map(address_map &map) { map(0x0000, 0xefff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/jangou.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/jangou.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/jangou.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/jangou.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1369,7 +1369,7 @@ * *************************************/ -GAME( 1983, jangou, 0, jangou, jangou, jangou_state, empty_init, ROT0, "Nichibutsu", "Jangou [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, jangou, 0, jangou, jangou, jangou_state, empty_init, ROT0, "Nichibutsu", "Jangou (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, macha, 0, jangou, macha, jangou_state, empty_init, ROT0, "Logitec", "Monoshiri Quiz Oshaberi Macha (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, jngolady, 0, jngolady, jngolady, jngolady_state, init_jngolady, ROT0, "Nichibutsu", "Jangou Lady (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, cntrygrl, 0, cntrygrl, cntrygrl, cntrygrl_state, empty_init, ROT0, "Royal Denshi", "Country Girl (Japan set 1)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/magmax.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/magmax.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/magmax.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/magmax.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -123,8 +123,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -334,8 +332,6 @@ } -// machine - void magmax_state::cpu_irq_ack_w(uint16_t data) { m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8688.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8688.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8688.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8688.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3945,46 +3945,46 @@ /* hybrid 12-bit palette */ GAME( 1986, citylove, 0, citylove, citylove, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "City Love (Japan 860908)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, mcitylov, citylove, mcitylov, mcitylov, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "City Love [BET] (Japan 860904)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, mcitylov, citylove, mcitylov, mcitylov, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "City Love (Japan 860904, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, secolove, 0, secolove, secolove, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Second Love (Japan 861201)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, barline, 0, barline, barline, nbmj8688_state, empty_init, ROT180, "Nichibutsu", "Barline (Japan?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) /* hybrid 16-bit palette */ GAME( 1987, seiha, 0, seiha, seiha, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Seiha (Japan 870725)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, seiham, seiha, seiham, seiham, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Seiha [BET] (Japan 870723)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, mjgaiden, 0, mjgaiden, ojousan, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Mahjong Gaiden [BET] (Japan 870803)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, seiham, seiha, seiham, seiham, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Seiha (Japan 870723, medal)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, mjgaiden, 0, mjgaiden, ojousan, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Mahjong Gaiden (Japan 870803)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, iemoto, 0, iemoto, iemoto, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Iemoto (Japan 871020)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, iemotom, iemoto, iemotom, iemotom, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Iemoto [BET] (Japan 871118)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, ryuuha, iemoto, ryuuha, ryuuha, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Ryuuha [BET] (Japan 871027)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, iemotom, iemoto, iemotom, iemotom, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Iemoto (Japan 871118, medal)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, ryuuha, iemoto, ryuuha, ryuuha, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Ryuuha (Japan 871027)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, ojousan, 0, ojousan, ojousan, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Ojousan (Japan 871204)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, ojousanm, ojousan, ojousanm, ojousanm, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Ojousan [BET] (Japan 870108)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, swinggal, 0, swinggal, ryuuha, nbmj8688_state, empty_init, ROT0, "Digital Denshi", "Swing Gal [BET] (Japan 871221)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, ojousanm, ojousan, ojousanm, ojousanm, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Ojousan (Japan 870108, medal)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, swinggal, 0, swinggal, ryuuha, nbmj8688_state, empty_init, ROT0, "Digital Denshi", "Swing Gal (Japan 871221)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, korinai, 0, korinai, korinai, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong-zukino Korinai Menmen (Japan 880425)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, korinaim, korinai, korinaim, korinaim, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong-zukino Korinai Menmen [BET] (Japan 880920)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, korinaim, korinai, korinaim, korinaim, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong-zukino Korinai Menmen (Japan 880920, medal)", MACHINE_SUPPORTS_SAVE ) /* pure 16-bit palette (+ LCD in some) */ GAME( 1987, housemnq, 0, housemnq, housemnq, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "House Mannequin (Japan 870217)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, housemn2, 0, housemn2, housemn2, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "House Mannequin Roppongi Live hen (Japan 870418)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, livegal, 0, livegal, livegal, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Live Gal [BET] (Japan 870530)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, livegal, 0, livegal, livegal, nbmj8688_state, empty_init, ROT0, "Central Denshi", "Live Gal (Japan 870530)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, bijokkoy, 0, bijokkoy, bijokkoy, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Bijokko Yume Monogatari (Japan 870925)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, bijokkog, 0, bijokkog, bijokkog, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Bijokko Gakuen (Japan 880116)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, orangec, 0, orangec, orangec, nbmj8688_state, empty_init, ROT0, "Daiichi Denshi", "Orange Club - Maruhi Kagai Jugyou (Japan 880213)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, orangeci, orangec, orangeci, orangeci, nbmj8688_state, empty_init, ROT0, "Daiichi Denshi", "Orange Club - Maru-hi Ippatsu Kaihou [BET] (Japan 880221)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vipclub, orangec, vipclub, vipclub, nbmj8688_state, empty_init, ROT0, "Daiichi Denshi", "Vip Club - Maru-hi Ippatsu Kaihou [BET] (Japan 880310)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, orangeci, orangec, orangeci, orangeci, nbmj8688_state, empty_init, ROT0, "Daiichi Denshi", "Orange Club - Maru-hi Ippatsu Kaihou (Japan 880221)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vipclub, orangec, vipclub, vipclub, nbmj8688_state, empty_init, ROT0, "Daiichi Denshi", "Vip Club - Maru-hi Ippatsu Kaihou (Japan 880310)", MACHINE_SUPPORTS_SAVE ) /* pure 12-bit palette */ -GAME( 1988, kaguya, 0, kaguya, kaguya, nbmj8688_state, empty_init, ROT0, "Miki Syouji", "Mahjong Kaguyahime [BET] (Japan 880521)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, kaguya2, 0, kaguya2, kaguya, nbmj8688_state, init_kaguya2, ROT0, "Miki Syouji", "Mahjong Kaguyahime Sono2 [BET] (Japan 890829)", MACHINE_SUPPORTS_SAVE ) -GAME( 2001, kaguya2f, kaguya2, kaguya2, kaguya, nbmj8688_state, init_kaguya2, ROT0, "Miki Syouji", "Mahjong Kaguyahime Sono2 Fukkokuban [BET] (Japan 010808)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, kanatuen, 0, kanatuen, kanatuen, nbmj8688_state, init_kanatuen, ROT0, "Panac", "Kanatsuen no Onna [BET] (Japan 880905)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, kyuhito, kanatuen, kyuhito, kyuhito, nbmj8688_state, init_kyuhito, ROT0, "Roller Tron", "Kyukyoku no Hito [BET] (Japan 880824)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, idhimitu, 0, idhimitu, idhimitu, nbmj8688_state, init_idhimitu, ROT0, "Digital Soft", "Idol no Himitsu [BET] (Japan 890304)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, kaguya, 0, kaguya, kaguya, nbmj8688_state, empty_init, ROT0, "Miki Syouji", "Mahjong Kaguyahime (Japan 880521)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, kaguya2, 0, kaguya2, kaguya, nbmj8688_state, init_kaguya2, ROT0, "Miki Syouji", "Mahjong Kaguyahime Sono2 (Japan 890829)", MACHINE_SUPPORTS_SAVE ) +GAME( 2001, kaguya2f, kaguya2, kaguya2, kaguya, nbmj8688_state, init_kaguya2, ROT0, "Miki Syouji", "Mahjong Kaguyahime Sono2 Fukkokuban (Japan 010808)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, kanatuen, 0, kanatuen, kanatuen, nbmj8688_state, init_kanatuen, ROT0, "Panac", "Kanatsuen no Onna (Japan 880905)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, kyuhito, kanatuen, kyuhito, kyuhito, nbmj8688_state, init_kyuhito, ROT0, "Roller Tron", "Kyukyoku no Hito (Japan 880824)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, idhimitu, 0, idhimitu, idhimitu, nbmj8688_state, init_idhimitu, ROT0, "Digital Soft", "Idol no Himitsu (Japan 890304)", MACHINE_SUPPORTS_SAVE ) /* pure 12-bit palette + YM3812 instead of AY-3-8910 */ GAME( 1988, mjsikaku, 0, mjsikaku, mjsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku (Japan 880908)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, mjsikakb, mjsikaku, mjsikaku, mjsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku (Japan 880722)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, mjsikakc, mjsikaku, mjsikaku, mjsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku (Japan 880806)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, mjsikakd, mjsikaku, mjsikaku, mjsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku (Japan 880802)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, mmsikaku, mjsikaku, mmsikaku, mmsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku [BET] (Japan 880929)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, mmsikaku, mjsikaku, mmsikaku, mmsikaku, nbmj8688_state, empty_init, ROT0, "Nichibutsu", "Mahjong Shikaku (Japan 880929, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, otonano, 0, otonano, otonano, nbmj8688_state, empty_init, ROT0, "Apple", "Otona no Mahjong (Japan 880628)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, mjcamera, 0, mjcamera, mjcamera, nbmj8688_state, init_mjcamera, ROT0, "Miki Syouji", "Mahjong Camera Kozou (set 1) (Japan 881109)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8891.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8891.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8891.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8891.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3531,32 +3531,32 @@ GAME( 1988, hanamomb, hanamomo, hanamomo, hanamomo, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong Hana no Momoko gumi (Japan 881125)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, telmahjn, 0, telmahjn, msjiken, nbmj8891_state, init_telmahjn, ROT270, "Nichibutsu", "Telephone Mahjong (Japan 890111)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, gionbana, 0, gionbana, gionbana, nbmj8891_state, init_gionbana, ROT0, "Nichibutsu", "Gionbana (Japan 890120)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, mgion, 0, mgion, mgion, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Gionbana [BET] (Japan 890207)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, mgion, 0, mgion, mgion, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Gionbana (Japan 890207, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, omotesnd, 0, omotesnd, omotesnd, nbmj8891_state, init_omotesnd, ROT0, "Anime Tec", "Omotesandou (Japan 890215)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, abunai, 0, abunai, abunai, nbmj8891_state, empty_init, ROT0, "Green Soft", "Abunai Houkago - Mou Matenai (Japan 890325)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mjfocus, 0, mjfocus, mjfocus, nbmj8891_state, init_mjfocus, ROT0, "Nichibutsu", "Mahjong Focus (Japan 890313)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, mjfocusm, mjfocus, mjfocusm, mjfocusm, nbmj8891_state, init_mjfocusm, ROT0, "Nichibutsu", "Mahjong Focus [BET] (Japan 890510)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, mjfocusm, mjfocus, mjfocusm, mjfocusm, nbmj8891_state, init_mjfocusm, ROT0, "Nichibutsu", "Mahjong Focus (Japan 890510, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, peepshow, mjfocus, mjfocus, mjfocus, nbmj8891_state, init_mjfocus, ROT0, "AC", "Nozokimeguri Mahjong Peep Show (Japan 890404)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mjcamerb, 0, mjcamerb, mjcamerb, nbmj8891_state, empty_init, ROT0, "Miki Syouji", "Mahjong Camera Kozou (set 2) (Japan 881109)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, mmcamera, mjcamerb, mmcamera, mmcamera, nbmj8891_state, empty_init, ROT0, "Miki Syouji", "Mahjong Camera Kozou [BET] (Japan 890509)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, mmcamera, mjcamerb, mmcamera, mmcamera, nbmj8891_state, empty_init, ROT0, "Miki Syouji", "Mahjong Camera Kozou (Japan 890509, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, scandal, 0, scandal, scandal, nbmj8891_state, init_scandal, ROT0, "Nichibutsu", "Scandal Mahjong (Japan 890213)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, scandalm, scandal, scandalm, scandalm, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Scandal Mahjong [BET] (Japan 890217)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, scandalm, scandal, scandalm, scandalm, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Scandal Mahjong (Japan 890217, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mgmen89, 0, mgmen89, mgmen89, nbmj8891_state, init_mgmen89, ROT0, "Nichibutsu", "Mahjong G-MEN'89 (Japan 890425)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mjnanpas, 0, mjnanpas, mjnanpas, nbmj8891_state, init_mjnanpas, ROT0, "Brooks", "Mahjong Nanpa Story (Japan 890713)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mjnanpaa, mjnanpas, mjnanpas, mjnanpaa, nbmj8891_state, init_mjnanpas, ROT0, "Brooks", "Mahjong Nanpa Story (Japan 890712)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mjnanpau, mjnanpas, mjnanpas, mjnanpas, nbmj8891_state, init_mjnanpas, ROT0, "Brooks", "Mahjong Nanpa Story (Ura) (Japan 890805)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, bananadr, 0, bananadr, bananadr, nbmj8891_state, empty_init, ROT0, "Digital Soft", "Mahjong Banana Dream [BET] (Japan 891124)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, bananadr, 0, bananadr, bananadr, nbmj8891_state, empty_init, ROT0, "Digital Soft", "Mahjong Banana Dream (Japan 891124)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, mladyhtr, 0, mladyhtr, mladyhtr, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong The Lady Hunter (Japan 900509)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, chinmoku, 0, chinmoku, chinmoku, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong Chinmoku no Hentai (Japan 900511)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, maiko, 0, maiko, maiko, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Maikobana (Japan 900802)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, mmaiko, 0, mmaiko, mmaiko, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Maikobana [BET] (Japan 900911)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, mmaiko, 0, mmaiko, mmaiko, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Maikobana (Japan 900911, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, hnxmasev, 0, hnxmasev, maiko, nbmj8891_state, empty_init, ROT180, "Nichibutsu / AV Japan", "AV Hanafuda Hana no Christmas Eve (Japan 901204)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1990, hnageman, 0, hnageman, maiko, nbmj8891_state, empty_init, ROT180, "Nichibutsu / AV Japan", "AV Hanafuda Hana no Ageman (Japan 900716)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1990, club90s, 0, club90s, club90s, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong CLUB 90's (set 1) (Japan 900919)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, club90sa, club90s, club90s, club90s, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong CLUB 90's (set 2) (Japan 900919)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, lovehous, club90s, lovehous, lovehous, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong Love House [BET] (Japan 901024)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, hanaoji, 0, hanaoji, hanaoji, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Hana to Ojisan [BET] (ver 1.01, 1991/12/09)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, hanaojia, hanaoji, hanaoji, hanaoji, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Hana to Ojisan [BET] (ver 1.00, 1991/08/23)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, taiwanmb, 0, taiwanmb, taiwanmb, nbmj8891_state, empty_init, ROT0, "Miki Syouji", "Taiwan Mahjong [BET] (Japan 881208)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, lovehous, club90s, lovehous, lovehous, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Mahjong Love House (Japan 901024)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, hanaoji, 0, hanaoji, hanaoji, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Hana to Ojisan (ver 1.01, 1991/12/09)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, hanaojia, hanaoji, hanaoji, hanaoji, nbmj8891_state, empty_init, ROT0, "Nichibutsu", "Hana to Ojisan (ver 1.00, 1991/08/23)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, taiwanmb, 0, taiwanmb, taiwanmb, nbmj8891_state, empty_init, ROT0, "Miki Syouji", "Taiwan Mahjong (Japan 881208)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, pairsnb, 0, pairsnb, pairsnb, nbmj8891_state, init_pairsnb, ROT0, "Nichibutsu", "Pairs (Nichibutsu) (Japan 890822)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, pairsten, pairsnb, pairsten, pairsnb, nbmj8891_state, init_pairsten, ROT0, "System Ten", "Pairs (System Ten) (Japan 890826)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8991.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8991.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj8991.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj8991.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2104,10 +2104,10 @@ GAME( 1989, galkoku, 0, galkoku, galkoku, nbmj8991_state, empty_init, ROT180, "Nichibutsu / T.R.Tec", "Mahjong Gal no Kokuhaku (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, hyouban, galkoku, hyouban, hyouban, nbmj8991_state, empty_init, ROT180, "Nichibutsu / T.R.Tec", "Mahjong Hyouban Musume [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, hyouban, galkoku, hyouban, hyouban, nbmj8991_state, empty_init, ROT180, "Nichibutsu / T.R.Tec", "Mahjong Hyouban Musume (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, galkaika, 0, galkaika, galkaika, nbmj8991_state, init_galkaika, ROT180, "Nichibutsu / T.R.Tec", "Mahjong Gal no Kaika (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, tokyogal, 0, tokyogal, tokyogal, nbmj8991_state, init_tokyogal, ROT180, "Nichibutsu", "Tokyo Gal Zukan (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, tokimbsj, tokyogal, tokimbsj, tokimbsj, nbmj8991_state, init_tokimbsj, ROT180, "Nichibutsu", "Tokimeki Bishoujo [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, tokimbsj, tokyogal, tokimbsj, tokimbsj, nbmj8991_state, init_tokimbsj, ROT180, "Nichibutsu", "Tokimeki Bishoujo (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, mcontest, 0, mcontest, mcontest, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Miss Mahjong Contest (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, uchuuai, 0, uchuuai, uchuuai, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Uchuu yori Ai wo komete (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, triplew1, 0, triplew1, triplew1, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Triple Wars (Japan)", MACHINE_SUPPORTS_SAVE ) @@ -2115,10 +2115,10 @@ GAME( 1990, triplew2, 0, triplew2, triplew1, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Triple Wars 2 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, ntopstar, 0, ntopstar, ntopstar, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Nerae! Top Star (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, mjlstory, 0, mjlstory, mjlstory, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Jikken Love Story (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, ladymakr, mjlstory, mjlstory, finalbny, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Lady Maker [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, ladymakr, mjlstory, mjlstory, finalbny, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Lady Maker (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, vanilla, 0, vanilla, vanilla, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Mahjong Vanilla Syndrome (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, finalbny, vanilla, finalbny, finalbny, nbmj8991_state, init_finalbny, ROT180, "Nichibutsu", "Mahjong Final Bunny [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, finalbny, vanilla, finalbny, finalbny, nbmj8991_state, init_finalbny, ROT180, "Nichibutsu", "Mahjong Final Bunny (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, qmhayaku, 0, qmhayaku, qmhayaku, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Quiz-Mahjong Hayaku Yatteyo! (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, mjgottub, 0, mjgottub, mjgottub, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Medal Mahjong Gottsu ee-kanji [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, mjgottub, 0, mjgottub, mjgottub, nbmj8991_state, empty_init, ROT180, "Nichibutsu", "Medal Mahjong Gottsu ee-kanji (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, av2mj1bb, 0, av2mj1bb, av2mj1bb, nbmj8991_state, empty_init, ROT0, "Miki Syouji / AV Japan", "AV2Mahjong No.1 Bay Bridge no Seijo (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1991, av2mj2rg, 0, av2mj2rg, av2mj2rg, nbmj8991_state, empty_init, ROT0, "Miki Syouji / AV Japan", "AV2Mahjong No.2 Rouge no Kaori (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj9195.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj9195.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/nbmj9195.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/nbmj9195.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2566,21 +2566,21 @@ GAME( 1992, koinomp, 0, koinomp, koinomp, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Koi no Magic Potion (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, patimono, 0, patimono, patimono, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Pachinko Monogatari (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, janbari, 0, janbari, janbari, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yubis / AV Japan", "Mahjong Janjan Baribari (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mjanbari, janbari, janbari, pachiten, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yubis / AV Japan", "Medal Mahjong Janjan Baribari [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mmehyou, 0, mmehyou, mmehyou, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Kawakusu", "Medal Mahjong Circuit no Mehyou [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mjanbari, janbari, janbari, pachiten, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yubis / AV Japan", "Medal Mahjong Janjan Baribari (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mmehyou, 0, mmehyou, mmehyou, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Kawakusu", "Medal Mahjong Circuit no Mehyou (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, ultramhm, 0, ultramhm, ultramhm, nbmj9195_state, empty_init, ROT0, "Apple", "Ultra Maru-hi Mahjong (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, gal10ren, 0, gal10ren, gal10ren, nbmj9195_state, empty_init, ROT0, "Fujic", "Mahjong Gal 10-renpatsu (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, renaiclb, 0, renaiclb, renaiclb, nbmj9195_state, empty_init, ROT0, "Fujic", "Mahjong Ren-ai Club (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, mjlaman, 0, mjlaman, mjlaman, nbmj9195_state, empty_init, ROT0, "Nichibutsu / AV Japan", "Mahjong La Man (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, mkeibaou, 0, mkeibaou, patimono, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Keibaou (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, pachiten, 0, pachiten, pachiten, nbmj9195_state, empty_init, ROT0, "Nichibutsu / AV Japan / Miki Syouji", "Medal Mahjong Pachi-Slot Tengoku [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, pachiten, 0, pachiten, pachiten, nbmj9195_state, empty_init, ROT0, "Nichibutsu / AV Japan / Miki Syouji", "Medal Mahjong Pachi-Slot Tengoku (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, sailorws, 0, sailorws, sailorws, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Sailor Wars (Japan set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, sailorwa, sailorws, sailorws, sailorws, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Sailor Wars (Japan set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1993, sailorwr, sailorws, sailorwr, sailorwr, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Sailor Wars-R [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1993, sailorwr, sailorws, sailorwr, sailorwr, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Sailor Wars-R (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, wcatcher, 0, otatidai, wcatcher, nbmj9195_state, empty_init, ROT0, "Nichibutsu", "Mahjong Wakuwaku Catcher (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1993, jituroku, 0, jituroku, jituroku, nbmj9195_state, empty_init, ROT0, "Windom", "Jitsuroku Maru-chi Mahjong (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, yosimoto, 0, yosimoto, yosimoto, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yoshimoto Kougyou", "Mahjong Yoshimoto Gekijou (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, yosimotm, yosimoto, yosimotm, yosimotm, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yoshimoto Kougyou", "Mahjong Yoshimoto Gekijou [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, yosimotm, yosimoto, yosimotm, yosimotm, nbmj9195_state, empty_init, ROT0, "Nichibutsu / Yoshimoto Kougyou", "Mahjong Yoshimoto Gekijou (Japan, medal)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, psailor1, 0, psailor1, psailor1, nbmj9195_state, empty_init, ROT0, "Sphinx", "Bishoujo Janshi Pretty Sailor 18-kin (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, psailor2, 0, psailor2, psailor2, nbmj9195_state, empty_init, ROT0, "Sphinx", "Bishoujo Janshi Pretty Sailor 2 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1995, otatidai, 0, otatidai, otatidai, nbmj9195_state, empty_init, ROT0, "Sphinx", "Disco Mahjong Otachidai no Okite (Japan)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/nightgal.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/nightgal.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/nightgal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/nightgal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1324,12 +1324,12 @@ /* Type 1 HW */ GAME( 1984, nightgal, 0, royalqn, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Night Gal (Japan 840920 AG 1-00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1984, ngtbunny, 0, royalqn, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Night Bunny (Japan 840601 MRN 2-10)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, royalngt, ngtbunny, royalqn, sexygal, nightgal_state, empty_init, ROT0, "Royal Denshi", "Royal Night [BET] (Japan 840220 RN 2-00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, royalqn, 0, royalqn, sexygal, nightgal_state, init_royalqn, ROT0, "Royal Denshi", "Royal Queen [BET] (Japan 841010 RQ 0-07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, royalngt, ngtbunny, royalqn, sexygal, nightgal_state, empty_init, ROT0, "Royal Denshi", "Royal Night (Japan 840220 RN 2-00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, royalqn, 0, royalqn, sexygal, nightgal_state, init_royalqn, ROT0, "Royal Denshi", "Royal Queen (Japan 841010 RQ 0-07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) /* Type 2 HW */ GAME( 1985, sexygal, 0, sexygal, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Sexy Gal (Japan 850501 SXG 1-00)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1985, sweetgal, sexygal, sweetgal, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Sweet Gal (Japan 850510 SWG 1-02)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) /* Type 3 HW */ -GAME( 1985, ngalsumr, 0, ngalsumr, sexygal, nightgal_state, init_ngalsumr, ROT0, "Nichibutsu", "Night Gal Summer [BET] (Japan 850702 NGS 0-01)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) +GAME( 1985, ngalsumr, 0, ngalsumr, sexygal, nightgal_state, init_ngalsumr, ROT0, "Nichibutsu", "Night Gal Summer (Japan 850702 NGS 0-01)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE ) /* Type 4 HW */ -GAME( 1985, sgaltrop, 0, sgaltrop, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Sexy Gal Tropical [BET] (Japan 850805 SXG T-02)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1985, sgaltrop, 0, sgaltrop, sexygal, nightgal_state, empty_init, ROT0, "Nichibutsu", "Sexy Gal Tropical (Japan 850805 SXG T-02)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/pastelg.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/pastelg.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/pastelg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/pastelg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -155,8 +155,6 @@ }; -// video - // pastelg specific methods uint16_t pastelg_state::blitter_src_addr_r() @@ -441,8 +439,6 @@ } -// machine - void threeds_state::machine_start() { save_item(NAME(m_mux_data)); diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/seicross.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/seicross.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/seicross.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/seicross.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -270,8 +268,6 @@ } -// machine - void seicross_state::nvram_init(nvram_device &nvram, void *data, size_t size) { static const uint8_t init[32] = { diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/terracre.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/terracre.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/terracre.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/terracre.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -200,8 +200,6 @@ }; -// video - TILE_GET_INFO_MEMBER(terracre_state::get_bg_tile_info) { /* xxxx.----.----.---- @@ -377,8 +375,6 @@ } -// machine - void terracre_state::sound_w(uint16_t data) { m_soundlatch->write(((data & 0x7f) << 1) | 1); diff -Nru mame-0.263+dfsg.1/src/mame/nichibutsu/wiping.cpp mame-0.264+dfsg.1/src/mame/nichibutsu/wiping.cpp --- mame-0.263+dfsg.1/src/mame/nichibutsu/wiping.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nichibutsu/wiping.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -110,8 +110,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -292,8 +290,6 @@ } -// machine - void wiping_state::machine_start() { save_item(NAME(m_flipscreen)); diff -Nru mame-0.263+dfsg.1/src/mame/nintendo/nes_clone.cpp mame-0.264+dfsg.1/src/mame/nintendo/nes_clone.cpp --- mame-0.263+dfsg.1/src/mame/nintendo/nes_clone.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nintendo/nes_clone.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1311,6 +1311,11 @@ ROM_LOAD( "dance.bin", 0x00000, 0x40000, CRC(0982bb50) SHA1(bd608159d7e624ea345f2a188de51cb1aa116421) ) ROM_END +ROM_START( croaky ) + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD( "croakykaraoke_16in1.bin", 0x00000, 0x80000, CRC(5f939fd6) SHA1(9dd56b1ee5f27a7d9b42c2638c6a06fac5554c9b) ) +ROM_END + ROM_START( vtvppong ) ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE00 ) // high bit is never set in the first 0x28000 bytes of this ROM, probably 7-bit sound data? code might need opcode bits swapping ROM_LOAD( "vtvpongcpu.bin", 0x00000, 0x40000, CRC(52df95fa) SHA1(3015bcc90eee862b3568f122b402c9defa566aab) ) @@ -1369,6 +1374,8 @@ CONS( 200?, dnce2000, 0, 0, nes_clone_dnce2000, dnce2000, nes_clone_dnce2000_state, init_nes_clone, "Shenzhen Soyin Electric Appliance Ind. Co., Ltd.", "Dance 2000 / Hot 2000 (Jin Bao TV Dancing Carpet, SY-2000-04)", 0 ) +CONS( 2002, croaky, 0, 0, nes_clone_dnce2000, nes_clone, nes_clone_dnce2000_state, init_nes_clone, "", "Croaky Karaoke 16-in-1", MACHINE_NOT_WORKING ) // no inputs + // Black pad marked 'SUDOKU' with tails on the S and U characters looping over the logo. Box says "Plug and Play Sudoku" // Has 2 sets of 4 buttons in circular 'direction pad' layouts (on the left for directions, on the right for functions) and 9 red numbered buttons with red power LED on left of them, and reset button on right // Alt. version was released with 'New York Times' titlescreen diff -Nru mame-0.263+dfsg.1/src/mame/nintendo/spacefb.cpp mame-0.264+dfsg.1/src/mame/nintendo/spacefb.cpp --- mame-0.263+dfsg.1/src/mame/nintendo/spacefb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nintendo/spacefb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -207,8 +207,6 @@ }; -// audio - u8 spacefb_state::audio_p2_r() { return (m_sound_latch & 0x18) << 1; @@ -282,8 +280,6 @@ } -// video - /************************************* * * Port setters @@ -623,8 +619,6 @@ } -// machine - /************************************* * * Interrupt generation diff -Nru mame-0.263+dfsg.1/src/mame/nix/pirates.cpp mame-0.264+dfsg.1/src/mame/nix/pirates.cpp --- mame-0.263+dfsg.1/src/mame/nix/pirates.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nix/pirates.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -181,8 +181,6 @@ }; -// video - // tilemaps TILE_GET_INFO_MEMBER(pirates_state::get_tx_tile_info) @@ -288,8 +286,6 @@ } -// machine - void pirates_state::out_w(uint8_t data) { // bits 0-2 control EEPROM diff -Nru mame-0.263+dfsg.1/src/mame/nl.flt mame-0.264+dfsg.1/src/mame/nl.flt --- mame-0.263+dfsg.1/src/mame/nl.flt 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nl.flt 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,7 @@ jpm/jpmsru.cpp midway/sspeedr.cpp misc/cocoloco.cpp +mr/dribling.cpp nintendo/mario.cpp nintendo/popeye.cpp ramtek/starcrus.cpp diff -Nru mame-0.263+dfsg.1/src/mame/nmk/nmk16.cpp mame-0.264+dfsg.1/src/mame/nmk/nmk16.cpp --- mame-0.263+dfsg.1/src/mame/nmk/nmk16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/nmk16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -4,7 +4,7 @@ /******************************************************************** Task Force Harrier 1989 UPL 68000 Z80 YM2203 2xOKIM6295 -Many Block 1991 Bee-Oh 68000 Z80 YM2203 2xOKIM6295 +Many Block 1991 Bee-Oh 68000 Z80 YM2203 2xOKIM6295 (hack of "Jewels" by UPL) Mustang 1990 UPL 68000 NMK004 YM2203 2xOKIM6295 Bio-ship Paladin 1990 UPL 68000 NMK004 YM2203 2xOKIM6295 Vandyke 1990 UPL 68000 NMK004 YM2203 2xOKIM6295 @@ -23,6 +23,7 @@ S.S. Mission 1992 Comad 68000 Z80 OKIM6295 (hack of Thunder Dragon) Air Attack 1996 Comad 68000 Z80 OKIM6295 (hack of Thunder Dragon) +Acrobat Mission (bootleg) 68000 Z80 YM3812 OKIM6295 Mustang (bootleg) 68000 Z80 YM3812 OKIM6295 Thunder Dragon (bootleg) 68000 Z80 YM3812 OKIM6295 @@ -151,6 +152,8 @@ 'manybloc' : + - This is a bootleg / hack of Jewels by UPL + - The MCU code was patched to use standard IO, it may be running code that is no longer used. - There are writes to 0x080010.w and 0x080012.w (MCU ?) in code between 0x005000 to 0x005690, but I see no call to "main" routine at 0x005504 ! - There are writes to 0x08001c.w and 0x08001e.w but I can't tell what @@ -164,7 +167,7 @@ Sound notes for games with a Z80: -mustangb, strahljb and tdragonb use the Seibu Raiden sound hardware and a modified +acrobatmbl, mustangb, strahljb and tdragonb use the Seibu Raiden sound hardware and a modified Z80 program (but the music is intact and recognizable). See audio/seibu.cpp for more info on this. @@ -208,6 +211,7 @@ #include "sound/ymopn.h" #include "sound/ymopl.h" +#include "multibyte.h" #include "screen.h" #include "speaker.h" @@ -3928,7 +3932,7 @@ void nmk16_state::mustang(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, 10000000); // 10 MHz ? + M68000(config, m_maincpu, XTAL(8'000'000)); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &nmk16_state::mustang_map); set_hacky_interrupt_timing(config); @@ -3966,7 +3970,7 @@ void nmk16_state::mustangb(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, 10000000); // 10 MHz ? + M68000(config, m_maincpu, XTAL(8'000'000)); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &nmk16_state::mustangb_map); set_hacky_interrupt_timing(config); @@ -4003,7 +4007,7 @@ void nmk16_state::mustangb3(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, 10000000); // 10 MHz ? + M68000(config, m_maincpu, XTAL(8'000'000)); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &nmk16_state::mustangb3_map); set_hacky_interrupt_timing(config); @@ -4358,14 +4362,43 @@ void tdragon_prot_state::machine_start() { + nmk16_state::machine_start(); + save_item(NAME(m_bus_status)); } void tdragon_prot_state::machine_reset() { + nmk16_state::machine_reset(); + m_bus_status = 0x04; } +void macross_prot_state::device_post_load() +{ + tdragon_prot_state::device_post_load(); + + if (m_gfx_unscramble_enabled && !m_gfx_decoded) + { + // Loaded a state saved after graphics were decoded before decoding graphics + // Force graphics unscrambling now + decode_nmk214(); + m_gfxdecode->gfx(1)->mark_all_dirty(); // background tiles + m_gfxdecode->gfx(2)->mark_all_dirty(); // sprites + m_bg_tilemap[0]->mark_all_dirty(); + m_gfx_decoded = true; + } +} + +void macross_prot_state::machine_start() +{ + tdragon_prot_state::machine_start(); + + save_item(NAME(m_init_data_nmk214)); + save_item(NAME(m_init_clock_nmk214)); + save_item(NAME(m_gfx_unscramble_enabled)); +} + void tdragon_prot_state::mcu_side_shared_w(offs_t offset, u8 data) { LOG("%s: mcu_side_shared_w offset %08x (data %02x)\n", machine().describe_context(), offset, data); @@ -4585,7 +4618,7 @@ void nmk16_state::macross(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, 10000000); // 10 MHz ? + M68000(config, m_maincpu, XTAL(10'000'000)); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &nmk16_state::macross_map); set_hacky_interrupt_timing(config); @@ -4601,21 +4634,21 @@ // sound hardware SPEAKER(config, "mono").front_center(); - NMK004(config, m_nmk004, 8000000); + NMK004(config, m_nmk004, XTAL(16'000'000)/2); // verified on PCB m_nmk004->reset_cb().set_inputline(m_maincpu, INPUT_LINE_RESET); - ym2203_device &ymsnd(YM2203(config, "ymsnd", 1500000)); + ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(12'000'000)/8)); // verified on PCB ymsnd.irq_handler().set("nmk004", FUNC(nmk004_device::ym2203_irq_handler)); ymsnd.add_route(0, "mono", 0.50); ymsnd.add_route(1, "mono", 0.50); ymsnd.add_route(2, "mono", 0.50); ymsnd.add_route(3, "mono", 1.20); - OKIM6295(config, m_oki[0], 16000000/4, okim6295_device::PIN7_LOW); + OKIM6295(config, m_oki[0], XTAL(16'000'000)/4, okim6295_device::PIN7_LOW); // verified on PCB m_oki[0]->set_addrmap(0, &nmk16_state::oki1_map); m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.10); - OKIM6295(config, m_oki[1], 16000000/4, okim6295_device::PIN7_LOW); + OKIM6295(config, m_oki[1], XTAL(16'000'000)/4, okim6295_device::PIN7_LOW); // verified on PCB m_oki[1]->set_addrmap(0, &nmk16_state::oki2_map); m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.10); } @@ -4899,32 +4932,97 @@ nmk112.set_rom1_tag("oki2"); } -// the 215 writes minimal data here, probably only enables the decryption logic, rather than supplying the decryption table -void tdragon_prot_state::mcu_port3_to_214_w(u8 data) +// The 215 writes minimal data here to select an unscrambling configuration hardwired inside the NMK214 chip. +void macross_prot_state::mcu_port3_to_214_w(u8 data) { - // startup only - logerror("%s: mcu_port3_to_214_w (data %02x)\n", machine().describe_context(), data); + LOG("%s: mcu_port3_to_214_w (data %02x)\n", machine().describe_context(), data); + + // Startup only. Bit 2 on Port 3 of MCU (NMK215) acts as strobe/clock (rising edge) for storing the byte previously set on the Port 7 + // of MCU (NMK215) into the internal registers of both NMK214 devices + if (m_init_clock_nmk214 == 0 && BIT(data, 2) == 1) + { + // Value is sent to both devices at the same time. Internally, each one evaluates if the value should be stored or not based on + // bit 3 of the incoming value matches to the operation mode configured on each device: + m_nmk214[0]->set_init_config(m_init_data_nmk214); + m_nmk214[1]->set_init_config(m_init_data_nmk214); + + // Force decode gfx after setting both nmk214 init config, just for testing purposes. Real devices perform the decoding on the fly + // for each byte/word fetch from GFX ROMs + if (!m_gfx_unscramble_enabled && m_nmk214[0]->is_device_initialized() && m_nmk214[1]->is_device_initialized()) + { + m_gfx_unscramble_enabled = true; + if (!m_gfx_decoded) + { + decode_nmk214(); + m_gfxdecode->gfx(1)->mark_all_dirty(); // background tiles + m_gfxdecode->gfx(2)->mark_all_dirty(); // sprites + m_bg_tilemap[0]->mark_all_dirty(); + m_gfx_decoded = true; + } + } + } + + m_init_clock_nmk214 = BIT(data, 2); } -void tdragon_prot_state::mcu_port7_to_214_w(u8 data) +void macross_prot_state::mcu_port7_to_214_w(u8 data) { - // startup only - logerror("%s: mcu_port7_to_214_w (data %02x)\n", machine().describe_context(), data); + LOG("%s: mcu_port7_to_214_w (data %02x)\n", machine().describe_context(), data); + + // Startup only. Value written here is kept as outputs on Port 7 of MCU (NMK215) in order to be read by the NMK214 devices when the + // clock signal is sent (Bit 2 of Port 3) + m_init_data_nmk214 = data; } -void tdragon_prot_state::saboten_prot(machine_config &config) -{ - bjtwin(config); +// Bitswaps that represent how the address bus of the NMK214s (13 bits) are hooked up related to the address bus of the ROMs. +// Every element represents the bit number in the ROM address bus that should be taken for each NMK214 address bus position, starting by the LSB +static const std::array nmk214_sprites_address_bitswap = {0, 1, 2, 3, 10, 12, 13, 14, 15, 16, 17, 18, 19}; +static const std::array nmk214_bg_address_bitswap = {0, 1, 2, 3, 11, 13, 14, 15, 16, 17, 18, 19, 20}; - TMP90840(config, m_protcpu, 4000000); // Toshiba TMP90840 marked as NMK-215, with 8Kbyte internal ROM, 256bytes internal RAM - m_protcpu->set_addrmap(AS_PROGRAM, &tdragon_prot_state::tdragon_prot_map); - m_protcpu->port_write<6>().set(FUNC(tdragon_prot_state::mcu_port6_w)); - m_protcpu->port_read<5>().set(FUNC(tdragon_prot_state::mcu_port5_r)); - m_protcpu->port_read<6>().set(FUNC(tdragon_prot_state::mcu_port6_r)); +void macross_prot_state::base_nmk214_215(machine_config &config) +{ + TMP90840(config, m_protcpu, XTAL(16'000'000)/4); // Toshiba TMP90840 marked as NMK-215, with 8Kbyte internal ROM, 256bytes internal RAM + m_protcpu->set_addrmap(AS_PROGRAM, ¯oss_prot_state::tdragon_prot_map); + m_protcpu->port_write<6>().set(FUNC(macross_prot_state::mcu_port6_w)); + m_protcpu->port_read<5>().set(FUNC(macross_prot_state::mcu_port5_r)); + m_protcpu->port_read<6>().set(FUNC(macross_prot_state::mcu_port6_r)); // the 215 has these hooked up, going to the 214 - m_protcpu->port_write<3>().set(FUNC(tdragon_prot_state::mcu_port3_to_214_w)); - m_protcpu->port_write<7>().set(FUNC(tdragon_prot_state::mcu_port7_to_214_w)); + m_protcpu->port_write<3>().set(FUNC(macross_prot_state::mcu_port3_to_214_w)); + m_protcpu->port_write<7>().set(FUNC(macross_prot_state::mcu_port7_to_214_w)); + + NMK214(config, m_nmk214[0], 0); // Descrambling device for sprite GFX data + m_nmk214[0]->set_mode(0); + m_nmk214[0]->set_input_address_bitswap(nmk214_sprites_address_bitswap); + + NMK214(config, m_nmk214[1], 0); // Descrambling device for BG GFX data + m_nmk214[1]->set_mode(1); + m_nmk214[1]->set_input_address_bitswap(nmk214_bg_address_bitswap); +} + +void macross_prot_state::macross_prot(machine_config &config) +{ + macross(config); + + base_nmk214_215(config); + + config.set_maximum_quantum(attotime::from_hz(6000)); +} + +void macross_prot_state::gunnail_prot(machine_config &config) +{ + gunnail(config); + + base_nmk214_215(config); + + config.set_maximum_quantum(attotime::from_hz(6000)); +} + +void macross_prot_state::bjtwin_prot(machine_config &config) +{ + bjtwin(config); + + base_nmk214_215(config); config.set_maximum_quantum(attotime::from_hz(6000)); } @@ -5118,6 +5216,32 @@ } } +void macross_prot_state::decode_nmk214() +{ + u8 *rom; + int len; + + // background tiles + rom = memregion("bgtile")->base(); + len = memregion("bgtile")->bytes(); + for (int A = 0; A < len; A++) + { + rom[A] = m_nmk214[1]->decode_byte(A, rom[A]); + } + + // sprites + rom = memregion("sprites")->base(); + len = memregion("sprites")->bytes(); + for (int A = 0; A < (len - 1); A += 2) + { + // sprite ROM is 16-bit big Endian + u16 word = get_u16be(&rom[A]); + + // A is a byte address, divide by 2 to give word address for NMK214 + put_u16be(&rom[A], m_nmk214[0]->decode_word(A/2, word)); + } +} + void nmk16_state::decode_tdragonb() { /* Descrambling Info Again Taken from Raine, Huge Thanks to Antiriad and the Raine Team for @@ -6917,6 +7041,10 @@ ROM_REGION( 0x020000, "fgtile", 0 ) ROM_LOAD( "921a01", 0x000000, 0x020000, CRC(bbd8242d) SHA1(7cf4897be1278e1190f499f00bc78384817a5160) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x200000, "bgtile", 0 ) ROM_LOAD( "921a04", 0x000000, 0x200000, CRC(4002e4bb) SHA1(281433d798ac85c84d4f1f3751a3032e8a3b5cd4) ) // 16x16 tiles @@ -7014,6 +7142,10 @@ ROM_REGION( 0x020000, "fgtile", 0 ) ROM_LOAD( "1.u21", 0x000000, 0x020000, CRC(3d00a9f4) SHA1(91a82e3e74c8774d7f8b2adceb228b97010facfd) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x100000, "bgtile", 0 ) ROM_LOAD( "92077-4.u19", 0x000000, 0x100000, CRC(a9ea2804) SHA1(14dbdb3c7986db5e44dc7c5be6fcf39f3d1e50b0) ) // 16x16 tiles @@ -7042,6 +7174,10 @@ ROM_REGION( 0x020000, "fgtile", 0 ) ROM_LOAD( "1.u21", 0x000000, 0x020000, CRC(bdf427e4) SHA1(e9cd178d1d9e2ed72f0fb013385d935f334b8fe3) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x100000, "bgtile", 0 ) ROM_LOAD( "92077-4.u19", 0x000000, 0x100000, CRC(a9ea2804) SHA1(14dbdb3c7986db5e44dc7c5be6fcf39f3d1e50b0) ) // 16x16 tiles @@ -7476,7 +7612,7 @@ ROM_LOAD( "ic35.sb3", 0x000000, 0x010000, CRC(eb7bc99d) SHA1(b3063afd58025a441d4750c22483e9129da402e7) ) // 8x8 tiles ROM_REGION( 0x02000, "protcpu", 0 ) - // has 'SABOTEN' for the game name string, uploads data to '214' for sprite decryption + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) ROM_REGION( 0x200000, "bgtile", 0 ) @@ -7502,7 +7638,7 @@ ROM_LOAD16_BYTE( "sb2.75", 0x00001, 0x40000, CRC(0d2c1ab8) SHA1(abb43a8c5398195c0ad48d8d772ef47635bf25c2) ) ROM_REGION( 0x02000, "protcpu", 0 ) - // has 'SABOTEN' for the game name string, uploads data to '214' for sprite decryption + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) ROM_REGION( 0x010000, "fgtile", 0 ) @@ -7556,6 +7692,10 @@ ROM_REGION( 0x010000, "fgtile", 0 ) ROM_LOAD( "93087-3.bin", 0x000000, 0x010000, CRC(aa13df7c) SHA1(162d4f12364c68028e86fe97ee75c262daa4c699) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x100000, "bgtile", 0 ) ROM_LOAD( "93087-4.bin", 0x000000, 0x100000, CRC(8a4f26d0) SHA1(be057a2b6d28c623ac1f16cf02ddbe12ca430b4a) ) // 8x8 tiles @@ -7581,6 +7721,10 @@ ROM_REGION( 0x010000, "fgtile", 0 ) ROM_LOAD( "93087-3.bin", 0x000000, 0x010000, CRC(aa13df7c) SHA1(162d4f12364c68028e86fe97ee75c262daa4c699) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x100000, "bgtile", 0 ) ROM_LOAD( "93087-4.bin", 0x000000, 0x100000, CRC(8a4f26d0) SHA1(be057a2b6d28c623ac1f16cf02ddbe12ca430b4a) ) // 8x8 tiles @@ -7634,6 +7778,10 @@ ROM_REGION( 0x010000, "fgtile", 0 ) ROM_LOAD( "ic35.bin", 0x000000, 0x010000, CRC(aa13df7c) SHA1(162d4f12364c68028e86fe97ee75c262daa4c699) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x200000, "bgtile", 0 ) ROM_LOAD( "ic32_1.bin", 0x000000, 0x080000, CRC(e2d2b331) SHA1(d8fdbff497303a00fc866f0ef07ba74b369c0636) ) ROM_LOAD( "ic32_2.bin", 0x080000, 0x080000, CRC(28a3a845) SHA1(4daf71dce5e598ee7ee7e09bb08ec1b2f06f2b01) ) @@ -7660,6 +7808,10 @@ ROM_REGION( 0x010000, "fgtile", 0 ) ROM_LOAD( "ic35.3", 0x000000, 0x010000, CRC(03d0c3b1) SHA1(4d5427c324e2141d0a953cc5133d10b327827e0b) ) // 8x8 tiles + ROM_REGION( 0x02000, "protcpu", 0 ) + // has 'SABOTEN' for the game name string, sends commands to '214' to configure graphics unscrambling + ROM_LOAD( "nmk-215.bin", 0x00000, 0x02000, CRC(d355a06f) SHA1(ebb7b1ff35a97599550f6f3524124246f2d718c5) ) + ROM_REGION( 0x200000, "bgtile", 0 ) ROM_LOAD( "ic32.4", 0x000000, 0x200000, CRC(88d454fd) SHA1(c79c48d9b3602266499a5dd0b15fd2fb032809be) ) // 8x8 tiles @@ -8929,69 +9081,69 @@ ***************************************************************************/ -GAME( 1989, tharrier, 0, tharrier, tharrier, nmk16_state, init_tharrier, ROT270, "UPL", "Task Force Harrier", 0 ) -GAME( 1989, tharrieru, tharrier, tharrier, tharrier, nmk16_state, init_tharrier, ROT270, "UPL (American Sammy license)", "Task Force Harrier (US)", 0 ) // US version but no regional notice +GAME( 1989, tharrier, 0, tharrier, tharrier, nmk16_state, init_tharrier, ROT270, "UPL", "Task Force Harrier", 0 ) +GAME( 1989, tharrieru, tharrier, tharrier, tharrier, nmk16_state, init_tharrier, ROT270, "UPL (American Sammy license)", "Task Force Harrier (US)", 0 ) // US version but no regional notice -GAME( 1990, mustang, 0, mustang, mustang, nmk16_state, empty_init, ROT0, "UPL", "US AAF Mustang (25th May. 1990)", 0 ) -GAME( 1990, mustangs, mustang, mustang, mustang, nmk16_state, empty_init, ROT0, "UPL (Seoul Trading license)", "US AAF Mustang (25th May. 1990 / Seoul Trading)", 0 ) +GAME( 1990, mustang, 0, mustang, mustang, nmk16_state, empty_init, ROT0, "UPL", "US AAF Mustang (25th May. 1990)", 0 ) +GAME( 1990, mustangs, mustang, mustang, mustang, nmk16_state, empty_init, ROT0, "UPL (Seoul Trading license)", "US AAF Mustang (25th May. 1990 / Seoul Trading)", 0 ) -GAME( 1990, bioship, 0, bioship, bioship, nmk16_state, empty_init, ROT0, "UPL (American Sammy license)", "Bio-ship Paladin", 0 ) // US version but no regional notice -GAME( 1990, sbsgomo, bioship, bioship, bioship, nmk16_state, empty_init, ROT0, "UPL", "Space Battle Ship Gomorrah", 0 ) +GAME( 1990, bioship, 0, bioship, bioship, nmk16_state, empty_init, ROT0, "UPL (American Sammy license)", "Bio-ship Paladin", 0 ) // US version but no regional notice +GAME( 1990, sbsgomo, bioship, bioship, bioship, nmk16_state, empty_init, ROT0, "UPL", "Space Battle Ship Gomorrah", 0 ) -GAME( 1990, vandyke, 0, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL", "Vandyke (Japan)", 0 ) -GAME( 1990, vandykejal, vandyke, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL (Jaleco license)", "Vandyke (Jaleco, set 1)", 0 ) -GAME( 1990, vandykejal2,vandyke, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL (Jaleco license)", "Vandyke (Jaleco, set 2)", 0 ) -GAME( 1990, vandykeb, vandyke, vandykeb, vandykeb, nmk16_state, init_vandykeb, ROT270, "bootleg", "Vandyke (bootleg with PIC16c57)", MACHINE_NO_SOUND ) +GAME( 1990, vandyke, 0, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL", "Vandyke (Japan)", 0 ) +GAME( 1990, vandykejal, vandyke, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL (Jaleco license)", "Vandyke (Jaleco, set 1)", 0 ) +GAME( 1990, vandykejal2,vandyke, vandyke, vandyke, nmk16_state, empty_init, ROT270, "UPL (Jaleco license)", "Vandyke (Jaleco, set 2)", 0 ) +GAME( 1990, vandykeb, vandyke, vandykeb, vandykeb, nmk16_state, init_vandykeb, ROT270, "bootleg", "Vandyke (bootleg with PIC16c57)", MACHINE_NO_SOUND ) -GAME( 1991, blkheart, 0, blkheart, blkheart, nmk16_state, empty_init, ROT0, "UPL", "Black Heart", 0 ) -GAME( 1991, blkheartj, blkheart, blkheart, blkheart, nmk16_state, empty_init, ROT0, "UPL", "Black Heart (Japan)", 0 ) +GAME( 1991, blkheart, 0, blkheart, blkheart, nmk16_state, empty_init, ROT0, "UPL", "Black Heart", 0 ) +GAME( 1991, blkheartj, blkheart, blkheart, blkheart, nmk16_state, empty_init, ROT0, "UPL", "Black Heart (Japan)", 0 ) -GAME( 1991, acrobatm, 0, acrobatm, acrobatm, nmk16_state, empty_init, ROT270, "UPL (Taito license)", "Acrobat Mission", 0 ) +GAME( 1991, acrobatm, 0, acrobatm, acrobatm, nmk16_state, empty_init, ROT270, "UPL (Taito license)", "Acrobat Mission", 0 ) -GAME( 1992, strahl, 0, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (World)", 0 ) -GAME( 1992, strahlj, strahl, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (Japan set 1)", 0 ) -GAME( 1992, strahlja, strahl, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (Japan set 2)", 0 ) +GAME( 1992, strahl, 0, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (World)", 0 ) +GAME( 1992, strahlj, strahl, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (Japan set 1)", 0 ) +GAME( 1992, strahlja, strahl, strahl, strahl, nmk16_state, empty_init, ROT0, "UPL", "Koutetsu Yousai Strahl (Japan set 2)", 0 ) -GAME( 1991, tdragon, 0, tdragon, tdragon, nmk16_state, empty_init, ROT270, "NMK (Tecmo license)", "Thunder Dragon (8th Jan. 1992, unprotected)", 0 ) -GAME( 1991, tdragon1, tdragon, tdragon_prot, tdragon_prot, tdragon_prot_state, empty_init, ROT270, "NMK (Tecmo license)", "Thunder Dragon (4th Jun. 1991, protected)", 0 ) +GAME( 1991, tdragon, 0, tdragon, tdragon, nmk16_state, empty_init, ROT270, "NMK (Tecmo license)", "Thunder Dragon (8th Jan. 1992, unprotected)", 0 ) +GAME( 1991, tdragon1, tdragon, tdragon_prot, tdragon_prot, tdragon_prot_state, empty_init, ROT270, "NMK (Tecmo license)", "Thunder Dragon (4th Jun. 1991, protected)", 0 ) -GAME( 1991, hachamf, 0, hachamf_prot, hachamf_prot, tdragon_prot_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 1)", 0 ) -GAME( 1991, hachamfa, hachamf, hachamf_prot, hachamf_prot, tdragon_prot_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 2)", 0 ) -GAME( 1991, hachamfb, hachamf, hachamf, hachamfb, nmk16_state, empty_init, ROT0, "bootleg", "Hacha Mecha Fighter (19th Sep. 1991, unprotected, bootleg Thunder Dragon conversion)", 0 ) // appears to be a Thunder Dragon conversion, could be bootleg? -GAME( 1991, hachamfp, hachamf, hachamf, hachamfp, nmk16_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (Location Test Prototype, 19th Sep. 1991)", 0 ) // Prototype with hand-written labels showing dates of 9/9, 9/13, 9/24, 9/25. The ROM contains the same 19th Sep. 1991 build string as all the prior releases, so that string was likely never updated in later builds. +GAME( 1991, hachamf, 0, hachamf_prot, hachamf_prot, tdragon_prot_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 1)", 0 ) +GAME( 1991, hachamfa, hachamf, hachamf_prot, hachamf_prot, tdragon_prot_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (19th Sep. 1991, protected, set 2)", 0 ) +GAME( 1991, hachamfb, hachamf, hachamf, hachamfb, nmk16_state, empty_init, ROT0, "bootleg", "Hacha Mecha Fighter (19th Sep. 1991, unprotected, bootleg Thunder Dragon conversion)", 0 ) // appears to be a Thunder Dragon conversion, could be bootleg? +GAME( 1991, hachamfp, hachamf, hachamf, hachamfp, nmk16_state, empty_init, ROT0, "NMK", "Hacha Mecha Fighter (Location Test Prototype, 19th Sep. 1991)", 0 ) // Prototype with hand-written labels showing dates of 9/9, 9/13, 9/24, 9/25. The ROM contains the same 19th Sep. 1991 build string as all the prior releases, so that string was likely never updated in later builds. -GAME( 1992, macross, 0, macross, macross, nmk16_state, init_nmk, ROT270, "Banpresto", "Super Spacefortress Macross / Chou-Jikuu Yousai Macross", 0 ) +GAME( 1992, macross, 0, macross_prot, macross, macross_prot_state, empty_init, ROT270, "Banpresto", "Super Spacefortress Macross / Chou-Jikuu Yousai Macross", 0 ) -GAME( 1993, gunnail, 0, gunnail, gunnail, nmk16_state, init_nmk, ROT270, "NMK / Tecmo", "GunNail (28th May. 1992)", 0 ) // Tecmo is displayed only when set to Japan -GAME( 1992, gunnailp, gunnail, gunnail, gunnail, nmk16_state, init_nmk, ROT270, "NMK", "GunNail (location test)", 0 ) // still has the 28th May. 1992 string, so unlikely that was the release date for either version. +GAME( 1993, gunnail, 0, gunnail_prot, gunnail, macross_prot_state, empty_init, ROT270, "NMK / Tecmo", "GunNail (28th May. 1992)", 0 ) // Tecmo is displayed only when set to Japan +GAME( 1992, gunnailp, gunnail, gunnail_prot, gunnail, macross_prot_state, empty_init, ROT270, "NMK", "GunNail (location test)", 0 ) // still has the 28th May. 1992 string, so unlikely that was the release date for either version. // a 1992 version of Gunnail exists, see https://www.youtube.com/watch?v=tf15Wz0zUiA 3:10; is this bootleg version 'gunnailb'? -GAME( 1993, macross2, 0, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Super Spacefortress Macross II / Chou-Jikuu Yousai Macross II", MACHINE_NO_COCKTAIL ) -GAME( 1993, macross2g, macross2, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Super Spacefortress Macross II / Chou-Jikuu Yousai Macross II (Gamest review build)", MACHINE_NO_COCKTAIL ) // Service switch pauses game -GAME( 1993, macross2k, macross2, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Macross II (Korea)", MACHINE_NO_COCKTAIL ) // Title screen only shows Macross II - -GAME( 1993, tdragon2, 0, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Thunder Dragon 2 (9th Nov. 1993)", MACHINE_NO_COCKTAIL ) -GAME( 1993, tdragon2a, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Thunder Dragon 2 (1st Oct. 1993)", MACHINE_NO_COCKTAIL ) -GAME( 1993, bigbang, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Big Bang (9th Nov. 1993, set 1)", MACHINE_NO_COCKTAIL ) -GAME( 1993, bigbanga, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Big Bang (9th Nov. 1993, set 2)", MACHINE_NO_COCKTAIL ) -GAME( 1996, tdragon3h, tdragon2, tdragon3h, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "bootleg (Conny Co Ltd.)", "Thunder Dragon 3 (bootleg of Thunder Dragon 2)", MACHINE_NO_SOUND | MACHINE_NO_COCKTAIL ) // based on 1st Oct. 1993 set, needs emulation of the mechanism used to simulate the missing YM2203' IRQs - -GAME( 1994, arcadian, 0, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Arcadia (NMK)", 0 ) // 23rd July 1993 in test mode, (c)1994 on title screen -GAME( 1994, raphero, arcadian, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Rapid Hero (NMK)", 0 ) // ^^ -GAME( 1994, rapheroa, arcadian, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK (Media Trading license)", "Rapid Hero (Media Trading)", 0 ) // ^^ - note that all ROM sets have Media Trading(aka Media Shoji) in the tile graphics, but this is the only set that shows it on the titlescreen +GAME( 1993, macross2, 0, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Super Spacefortress Macross II / Chou-Jikuu Yousai Macross II", MACHINE_NO_COCKTAIL ) +GAME( 1993, macross2g, macross2, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Super Spacefortress Macross II / Chou-Jikuu Yousai Macross II (Gamest review build)", MACHINE_NO_COCKTAIL ) // Service switch pauses game +GAME( 1993, macross2k, macross2, macross2, macross2, nmk16_state, init_banked_audiocpu, ROT0, "Banpresto", "Macross II (Korea)", MACHINE_NO_COCKTAIL ) // Title screen only shows Macross II + +GAME( 1993, tdragon2, 0, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Thunder Dragon 2 (9th Nov. 1993)", MACHINE_NO_COCKTAIL ) +GAME( 1993, tdragon2a, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Thunder Dragon 2 (1st Oct. 1993)", MACHINE_NO_COCKTAIL ) +GAME( 1993, bigbang, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Big Bang (9th Nov. 1993, set 1)", MACHINE_NO_COCKTAIL ) +GAME( 1993, bigbanga, tdragon2, tdragon2, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Big Bang (9th Nov. 1993, set 2)", MACHINE_NO_COCKTAIL ) +GAME( 1996, tdragon3h, tdragon2, tdragon3h, tdragon2, nmk16_state, init_banked_audiocpu, ROT270, "bootleg (Conny Co Ltd.)", "Thunder Dragon 3 (bootleg of Thunder Dragon 2)", MACHINE_NO_SOUND | MACHINE_NO_COCKTAIL ) // based on 1st Oct. 1993 set, needs emulation of the mechanism used to simulate the missing YM2203' IRQs + +GAME( 1994, arcadian, 0, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Arcadia (NMK)", 0 ) // 23rd July 1993 in test mode, (c)1994 on title screen +GAME( 1994, raphero, arcadian, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK", "Rapid Hero (NMK)", 0 ) // ^^ +GAME( 1994, rapheroa, arcadian, raphero, raphero, nmk16_state, init_banked_audiocpu, ROT270, "NMK (Media Trading license)", "Rapid Hero (Media Trading)", 0 ) // ^^ - note that all ROM sets have Media Trading(aka Media Shoji) in the tile graphics, but this is the only set that shows it on the titlescreen // both sets of both these games show a date of 9th Mar 1992 in the test mode, they look like different revisions so I doubt this is accurate -GAME( 1992, sabotenb, 0, saboten_prot, sabotenb, tdragon_prot_state, init_nmk, ROT0, "NMK / Tecmo", "Saboten Bombers (set 1)", MACHINE_NO_COCKTAIL ) -GAME( 1992, sabotenba, sabotenb, saboten_prot, sabotenb, tdragon_prot_state, init_nmk, ROT0, "NMK / Tecmo", "Saboten Bombers (set 2)", MACHINE_NO_COCKTAIL ) -GAME( 1992, cactus, sabotenb, bjtwin, sabotenb, nmk16_state, init_nmk, ROT0, "bootleg", "Cactus (bootleg of Saboten Bombers)", MACHINE_NO_COCKTAIL ) // PCB marked 'Cactus', no title screen - -GAME( 1993, bjtwin, 0, bjtwin, bjtwin, nmk16_state, init_bjtwin, ROT270, "NMK", "Bombjack Twin (set 1)", MACHINE_NO_COCKTAIL ) -GAME( 1993, bjtwina, bjtwin, bjtwin, bjtwin, nmk16_state, init_bjtwin, ROT270, "NMK", "Bombjack Twin (set 2)", MACHINE_NO_COCKTAIL ) -GAME( 1993, bjtwinp, bjtwin, bjtwin, bjtwin, nmk16_state, empty_init, ROT270, "NMK", "Bombjack Twin (prototype? with adult pictures, set 1)", MACHINE_NO_COCKTAIL ) // Cheap looking PCB, but Genuine NMK PCB, GFX aren't encrypted (maybe Korean version not proto?) -GAME( 1993, bjtwinpa, bjtwin, bjtwin, bjtwin, nmk16_state, init_bjtwin, ROT270, "NMK", "Bombjack Twin (prototype? with adult pictures, set 2)", MACHINE_NO_COCKTAIL ) // same PCB as above, different program revision, GFX are encrypted +GAME( 1992, sabotenb, 0, bjtwin_prot, sabotenb, macross_prot_state, empty_init, ROT0, "NMK / Tecmo", "Saboten Bombers (set 1)", MACHINE_NO_COCKTAIL ) +GAME( 1992, sabotenba, sabotenb, bjtwin_prot, sabotenb, macross_prot_state, empty_init, ROT0, "NMK / Tecmo", "Saboten Bombers (set 2)", MACHINE_NO_COCKTAIL ) +GAME( 1992, cactus, sabotenb, bjtwin, sabotenb, nmk16_state, init_nmk, ROT0, "bootleg", "Cactus (bootleg of Saboten Bombers)", MACHINE_NO_COCKTAIL ) // PCB marked 'Cactus', no title screen + +GAME( 1993, bjtwin, 0, bjtwin_prot, bjtwin, macross_prot_state, empty_init, ROT270, "NMK", "Bombjack Twin (set 1)", MACHINE_NO_COCKTAIL ) +GAME( 1993, bjtwina, bjtwin, bjtwin_prot, bjtwin, macross_prot_state, empty_init, ROT270, "NMK", "Bombjack Twin (set 2)", MACHINE_NO_COCKTAIL ) +GAME( 1993, bjtwinp, bjtwin, bjtwin, bjtwin, nmk16_state, empty_init, ROT270, "NMK", "Bombjack Twin (prototype? with adult pictures, set 1)", MACHINE_NO_COCKTAIL ) // Cheap looking PCB, but Genuine NMK PCB, GFX aren't encrypted (maybe Korean version not proto?) +GAME( 1993, bjtwinpa, bjtwin, bjtwin_prot, bjtwin, macross_prot_state, empty_init, ROT270, "NMK", "Bombjack Twin (prototype? with adult pictures, set 2)", MACHINE_NO_COCKTAIL ) // same PCB as above, different program revision, GFX are encrypted -GAME( 1995, nouryoku, 0, bjtwin, nouryoku, nmk16_state, init_nmk, ROT0, "Tecmo", "Nouryoku Koujou Iinkai", MACHINE_NO_COCKTAIL ) -GAME( 1995, nouryokup, nouryoku, bjtwin, nouryoku, nmk16_state, empty_init, ROT0, "Tecmo", "Nouryoku Koujou Iinkai (prototype)", MACHINE_NO_COCKTAIL ) // GFX aren't encrypted +GAME( 1995, nouryoku, 0, bjtwin_prot, nouryoku, macross_prot_state, empty_init, ROT0, "Tecmo", "Nouryoku Koujou Iinkai", MACHINE_NO_COCKTAIL ) +GAME( 1995, nouryokup, nouryoku, bjtwin, nouryoku, nmk16_state, empty_init, ROT0, "Tecmo", "Nouryoku Koujou Iinkai (prototype)", MACHINE_NO_COCKTAIL ) // GFX aren't encrypted // Non NMK boards diff -Nru mame-0.263+dfsg.1/src/mame/nmk/nmk16.h mame-0.264+dfsg.1/src/mame/nmk/nmk16.h --- mame-0.263+dfsg.1/src/mame/nmk/nmk16.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/nmk16.h 2024-03-25 14:00:46.000000000 +0000 @@ -7,6 +7,7 @@ #pragma once #include "nmk004.h" +#include "nmk214.h" #include "nmk16spr.h" #include "seibusound.h" @@ -241,14 +242,13 @@ tdragon_prot_state(const machine_config &mconfig, device_type type, const char *tag) : nmk16_state(mconfig, type, tag), m_protcpu(*this, "protcpu") - {} + { + } void tdragon_prot(machine_config &config); void hachamf_prot(machine_config &config); - void saboten_prot(machine_config &config); protected: - virtual void machine_start() override; virtual void machine_reset() override; @@ -263,10 +263,44 @@ u8 mcu_port6_r(); u8 mcu_port7_r(); // NMK-113 uses this + u8 m_bus_status; +}; + +class macross_prot_state : public tdragon_prot_state +{ +public: + macross_prot_state(const machine_config &mconfig, device_type type, const char *tag) : + tdragon_prot_state(mconfig, type, tag), + m_nmk214(*this, "nmk214_%u", 0U), + m_init_data_nmk214(0), + m_init_clock_nmk214(0), + m_gfx_unscramble_enabled(false), + m_gfx_decoded(false) + { + } + + void bjtwin_prot(machine_config &config); + void gunnail_prot(machine_config &config); + void macross_prot(machine_config &config); + +protected: + virtual void device_post_load() override; + virtual void machine_start() override; + +private: + void base_nmk214_215(machine_config &config); + + void decode_nmk214(); + void mcu_port3_to_214_w(u8 data); void mcu_port7_to_214_w(u8 data); - u8 m_bus_status; + required_device_array m_nmk214; + + u8 m_init_data_nmk214; + u8 m_init_clock_nmk214; + bool m_gfx_unscramble_enabled; + bool m_gfx_decoded; // excluded from save states }; class afega_state : public nmk16_state diff -Nru mame-0.263+dfsg.1/src/mame/nmk/nmk214.cpp mame-0.264+dfsg.1/src/mame/nmk/nmk214.cpp --- mame-0.263+dfsg.1/src/mame/nmk/nmk214.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/nmk214.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,213 @@ +// license:BSD-3-Clause +// copyright-holders:Sergio Galiano +/* + NMK214 GFX Descrambler emulation + + This device is used for descrambling the GFX data on some game PCBs from NMK (nmk16). + It works in tandem with NMK215, that's a Toshiba MCU which sends initialization data to NMK214 in order to do the + descrambling process. + Every game PCB using it has two NMK214 chips, one for sprites and another for background tiles. + It can work in two different modes: word and byte: + For sprites it always works in word mode; for backgrounds it always works in byte mode. + There are 8 hard-wired internal configurations. The data received from NMK215 selects one of those them at startup. + That init data is stored in the device when bit 3 matches with the operation mode wired directly on the PCB. + The descrambling process is essentially a dynamic bitswap of the incoming word/byte data, doing a different bitswap + based on the address of the data to be descrambled. + The input address bus on the device is used to determine which bitswap do for each word/byte, and it's usually + hooked differently for sprites and background tiles, so an 'input_address_bitswap' is included to get the effective + address the device will use. +*/ + + +#include "emu.h" +#include "nmk214.h" + + +namespace { + +const std::array default_input_address_bitswap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + +// Static byte values for each of the 8 different hardwired configurations. +// One bit will be taken from each byte in the selected config (row), and those +// 3 bits will be used to select the output bitswap down below: +const u8 init_configs[8][3] = +{ + {0xaa, 0xcc, 0xf0}, // Predefined config 0 + {0x55, 0x39, 0x1e}, // Predefined config 1 + {0xc5, 0x69, 0x5c}, // Predefined config 2 + {0x35, 0x5c, 0xc5}, // Predefined config 3 + {0x78, 0x1d, 0x2e}, // Predefined config 4 + {0x55, 0x33, 0x0f}, // Predefined config 5 + {0xa5, 0xb8, 0x36}, // Predefined config 6 + {0x8b, 0x69, 0x2e} // Predefined config 7 +}; + +// 3 values for each configuration to determine which lines from input address +// bus are used to select a bit from hardwired config byte values above: +const u8 selection_address_bits[8][3] = +{ + {0x8, 0x9, 0xa}, // A8, A9 and A10 for predefined config 0 + {0x6, 0x8, 0xb}, // A6, A8 and A11 for predefined config 1 + {0x3, 0x9, 0xc}, // A3, A9 and A12 for predefined config 2 + {0x3, 0x7, 0xa}, // A3, A7 and A10 for predefined config 3 + {0x2, 0x5, 0xb}, // A2, A5 and A11 for predefined config 4 + {0x1, 0x4, 0xa}, // A1, A4 and A10 for predefined config 5 + {0x2, 0x4, 0xa}, // A2, A4 and A10 for predefined config 6 + {0x0, 0x4, 0xc} // A0, A4 and A12 for predefined config 7 +}; + +// Output word data bitswaps hardwired inside the chip. +// Each value in the same column represents which bit from input data word is +// used for current bit position in the output word. +const u8 output_word_bitswaps[8][16] = +{ +// D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 + {0x2, 0x3, 0x7, 0x8, 0xc, 0x4, 0xb, 0x9, 0x1, 0xf, 0xa, 0x5, 0xe, 0x6, 0xd, 0x0}, // word bitswap 0 + {0x0, 0x3, 0x8, 0x7, 0xa, 0xc, 0x4, 0x1, 0xf, 0x9, 0x6, 0xd, 0xe, 0xb, 0x5, 0x2}, // word bitswap 1 + {0x9, 0x8, 0x2, 0x3, 0x6, 0x5, 0xd, 0xf, 0x7, 0x0, 0xc, 0xb, 0xa, 0x4, 0xe, 0x1}, // word bitswap 2 + {0x0, 0x3, 0x9, 0xf, 0xd, 0xc, 0xb, 0x1, 0x2, 0x7, 0xe, 0x6, 0x4, 0xa, 0x5, 0x8}, // word bitswap 3 + {0x1, 0x3, 0xf, 0x7, 0xd, 0xa, 0xe, 0x9, 0x0, 0x8, 0xc, 0x4, 0x6, 0x5, 0xb, 0x2}, // word bitswap 4 + {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}, // word bitswap 5 + {0x0, 0xf, 0x3, 0x2, 0xe, 0x4, 0x6, 0x7, 0x8, 0x9, 0x5, 0xd, 0xc, 0xb, 0xa, 0x1}, // word bitswap 6 + {0xf, 0x2, 0x3, 0x1, 0xb, 0xe, 0xd, 0x8, 0x7, 0x0, 0x4, 0xc, 0x6, 0xa, 0x5, 0x9} // word bitswap 7 +}; + +// Output byte data bitswaps hardwired inside the chip. +// Values on the table are calculated from the above word-bitswaps based on the +// following input data lines correlation (that's how the data lines are hooked +// up in real hardware): +/* + BYTE mode | WORD mode + ----------|---------- + D0 | D13 + D1 | D10 + D2 | D4 + D3 | D12 + D4 | D6 + D5 | D14 + D6 | D11 + D7 | D5 +*/ +const u8 output_byte_bitswaps[8][8] = +{ +// D0 D1 D2 D3 D4 D5 D6 D7 + {0x4, 0x1, 0x3, 0x5, 0x6, 0x0, 0x7, 0x2}, // byte bitswap 0 + {0x6, 0x4, 0x1, 0x5, 0x2, 0x7, 0x0, 0x3}, // byte bitswap 1 + {0x2, 0x3, 0x4, 0x1, 0x0, 0x5, 0x6, 0x7}, // byte bitswap 2 + {0x1, 0x5, 0x0, 0x2, 0x6, 0x7, 0x4, 0x3}, // byte bitswap 3 + {0x7, 0x3, 0x0, 0x4, 0x5, 0x6, 0x2, 0x1}, // byte bitswap 4 + {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7}, // byte bitswap 5 + {0x6, 0x7, 0x5, 0x3, 0x4, 0x1, 0x0, 0x2}, // byte bitswap 6 + {0x1, 0x2, 0x6, 0x4, 0x0, 0x7, 0x3, 0x5} // byte bitswap 7 +}; + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE(NMK214, nmk214_device, "nmk214", "NMK214 Graphics Descrambler") + +nmk214_device::nmk214_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NMK214, tag, owner, clock) + , m_mode(0) + , m_input_address_bitswap(default_input_address_bitswap) + , m_init_config(0) + , m_device_initialized(false) +{ +} + +u8 nmk214_device::get_bitswap_select_value(u32 addr) const noexcept +{ + // as the address lines could be hooked up in different order/positions on + // the game PCB, reorder it and get the effective address to use: + const u32 effective_address = bitswap<13>(addr, + m_input_address_bitswap[12], + m_input_address_bitswap[11], + m_input_address_bitswap[10], + m_input_address_bitswap[9], + m_input_address_bitswap[8], + m_input_address_bitswap[7], + m_input_address_bitswap[6], + m_input_address_bitswap[5], + m_input_address_bitswap[4], + m_input_address_bitswap[3], + m_input_address_bitswap[2], + m_input_address_bitswap[1], + m_input_address_bitswap[0]); + + // get selection address using only 3 bits of the effective address, based + // on the initial config selected while device initialization: + const u8 selection_address = bitswap<3>(effective_address, + selection_address_bits[m_init_config][2], + selection_address_bits[m_init_config][1], + selection_address_bits[m_init_config][0]); + + // get the bitswap selection value, using the previously computed selection + // address and the selected internal config values: + return (BIT(init_configs[m_init_config][0], selection_address) << 0) + | (BIT(init_configs[m_init_config][1], selection_address) << 1) + | (BIT(init_configs[m_init_config][2], selection_address) << 2); +} + +u16 nmk214_device::decode_word(u32 addr, u16 data) const noexcept +{ + // compute the select value to choose which bitswap apply to the input word, + // based on the address where the data is located + const u8 bitswap_select = get_bitswap_select_value(addr); + + return bitswap<16>(data, + output_word_bitswaps[bitswap_select][15], + output_word_bitswaps[bitswap_select][14], + output_word_bitswaps[bitswap_select][13], + output_word_bitswaps[bitswap_select][12], + output_word_bitswaps[bitswap_select][11], + output_word_bitswaps[bitswap_select][10], + output_word_bitswaps[bitswap_select][9], + output_word_bitswaps[bitswap_select][8], + output_word_bitswaps[bitswap_select][7], + output_word_bitswaps[bitswap_select][6], + output_word_bitswaps[bitswap_select][5], + output_word_bitswaps[bitswap_select][4], + output_word_bitswaps[bitswap_select][3], + output_word_bitswaps[bitswap_select][2], + output_word_bitswaps[bitswap_select][1], + output_word_bitswaps[bitswap_select][0]); +} + +u8 nmk214_device::decode_byte(u32 addr, u8 data) const noexcept +{ + // compute the select value to choose which bitswap apply to the input byte, + // based on the address where the data is located + u8 bitswap_select = get_bitswap_select_value(addr); + + return bitswap<8>(data, + output_byte_bitswaps[bitswap_select][7], + output_byte_bitswaps[bitswap_select][6], + output_byte_bitswaps[bitswap_select][5], + output_byte_bitswaps[bitswap_select][4], + output_byte_bitswaps[bitswap_select][3], + output_byte_bitswaps[bitswap_select][2], + output_byte_bitswaps[bitswap_select][1], + output_byte_bitswaps[bitswap_select][0]); +} + +void nmk214_device::set_init_config(u8 init_config) noexcept +{ + // store config data only if Bit 3 matches with the operation mode of the device + if (BIT(init_config, 3) == m_mode) + { + m_init_config = init_config & 0x7; + m_device_initialized = true; + } +} + +void nmk214_device::device_start() +{ + save_item(NAME(m_init_config)); + save_item(NAME(m_device_initialized)); +} + +void nmk214_device::device_reset() +{ + m_init_config = 0; + m_device_initialized = false; +} diff -Nru mame-0.263+dfsg.1/src/mame/nmk/nmk214.h mame-0.264+dfsg.1/src/mame/nmk/nmk214.h --- mame-0.263+dfsg.1/src/mame/nmk/nmk214.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/nmk214.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:Sergio Galiano +#ifndef MAME_NMK_NMK214_H +#define MAME_NMK_NMK214_H + +#pragma once + +#include + + +class nmk214_device : public device_t +{ +public: + nmk214_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void set_mode(const u8 mode) { m_mode = mode; } + void set_input_address_bitswap(const std::array &input_address_bitswap) { m_input_address_bitswap = input_address_bitswap; } + + void set_init_config(u8 init_config) noexcept; + bool is_device_initialized() const noexcept { return m_device_initialized; } + + u16 decode_word(u32 addr, u16 data) const noexcept; + u8 decode_byte(u32 addr, u8 data) const noexcept; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + +private: + // Operation mode - in practice, only LSB is used. + // Allowed values: 0 or 1. + // This is hard-wired on the PCB, with opposite values for the two devices. + u8 m_mode; + + // Input address lines bitswap. + // Represents how the 13 NMK214 address lines are wired to the graphics ROM address bus. + std::array m_input_address_bitswap; + + // Selects between eight internal configurations. + // Bits 0 to 2 select the configuration. + // Bit 3 must be set to match the operation mode for the configuration to take effect. + u8 m_init_config; + + // Indicates that the device has been configured and can perform descrambling. + bool m_device_initialized; + + + // Gets the bitswap index for a given data address. + u8 get_bitswap_select_value(u32 addr) const noexcept; +}; + +DECLARE_DEVICE_TYPE(NMK214, nmk214_device) + +#endif // MAME_NMK_NMK214_H diff -Nru mame-0.263+dfsg.1/src/mame/nmk/quizdna.cpp mame-0.264+dfsg.1/src/mame/nmk/quizdna.cpp --- mame-0.263+dfsg.1/src/mame/nmk/quizdna.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/quizdna.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -90,8 +90,6 @@ }; -// video - TILE_GET_INFO_MEMBER(quizdna_state::get_bg_tile_info) { int code = m_banked_ram[0x2000 + tile_index * 2] + m_banked_ram[0x2000 + tile_index * 2 + 1] * 0x100; @@ -262,8 +260,6 @@ } -// machine - void quizdna_state::rombank_w(uint8_t data) { m_mainbank->set_entry(data & 0x3f); diff -Nru mame-0.263+dfsg.1/src/mame/nmk/quizpani.cpp mame-0.264+dfsg.1/src/mame/nmk/quizpani.cpp --- mame-0.263+dfsg.1/src/mame/nmk/quizpani.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/nmk/quizpani.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -105,8 +105,6 @@ }; -// video - TILEMAP_MAPPER_MEMBER(quizpani_state::bg_scan) { // logical (col,row) -> memory offset @@ -188,8 +186,6 @@ } -// machine - void quizpani_state::program_map(address_map &map) { map(0x000000, 0x07ffff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/novadesitec/novadesitec_fr004.cpp mame-0.264+dfsg.1/src/mame/novadesitec/novadesitec_fr004.cpp --- mame-0.263+dfsg.1/src/mame/novadesitec/novadesitec_fr004.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novadesitec/novadesitec_fr004.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -19,7 +19,7 @@ #include "emu.h" -#include "cpu/h8/h8s2320.h" +#include "cpu/h8/h8s2319.h" #include "sound/okim6376.h" #include "screen.h" @@ -92,7 +92,7 @@ void novadesitec_fr004_state::fr004(machine_config &config) { // basic machine hardware - H8S2328(config, m_maincpu, 50_MHz_XTAL); // actually H8S2318, divisor? + H8S2318(config, m_maincpu, 50_MHz_XTAL); // divisor? m_maincpu->set_addrmap(AS_PROGRAM, &novadesitec_fr004_state::main_map); // video hardware diff -Nru mame-0.263+dfsg.1/src/mame/novadesitec/novadesitec_fr009.cpp mame-0.264+dfsg.1/src/mame/novadesitec/novadesitec_fr009.cpp --- mame-0.263+dfsg.1/src/mame/novadesitec/novadesitec_fr009.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novadesitec/novadesitec_fr009.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -19,7 +19,7 @@ #include "emu.h" -#include "cpu/h8/h8s2320.h" +#include "cpu/h8/h8s2319.h" #include "screen.h" #include "speaker.h" @@ -91,7 +91,7 @@ void novadesitec_fr009_state::fr009(machine_config &config) { // basic machine hardware - H8S2328(config, m_maincpu, 32_MHz_XTAL); // actually H8S2318, divisor? + H8S2318(config, m_maincpu, 32_MHz_XTAL); // divisor? m_maincpu->set_addrmap(AS_PROGRAM, &novadesitec_fr009_state::main_map); // video hardware diff -Nru mame-0.263+dfsg.1/src/mame/novag/accord.cpp mame-0.264+dfsg.1/src/mame/novag/accord.cpp --- mame-0.263+dfsg.1/src/mame/novag/accord.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/accord.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -64,7 +64,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; emu_timer *m_standbytimer; @@ -232,4 +232,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, accord, 0, 0, accord, accord, accord_state, empty_init, "Novag", "Accord", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, accord, 0, 0, accord, accord, accord_state, empty_init, "Novag Industries", "Accord", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/cexpert.cpp mame-0.264+dfsg.1/src/mame/novag/cexpert.cpp --- mame-0.263+dfsg.1/src/mame/novag/cexpert.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/cexpert.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -264,4 +264,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, cexpert, 0, 0, cexpert, cexpert, cexpert_state, empty_init, "Novag", "Constellation Expert", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, cexpert, 0, 0, cexpert, cexpert, cexpert_state, empty_init, "Novag Industries", "Constellation Expert", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/cforte.cpp mame-0.264+dfsg.1/src/mame/novag/cforte.cpp --- mame-0.263+dfsg.1/src/mame/novag/cforte.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/cforte.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -293,5 +293,5 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1986, cfortea, 0, 0, cforte, cforte, cforte_state, empty_init, "Novag", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, cforteb, cfortea, 0, cforte, cforte, cforte_state, empty_init, "Novag", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, cfortea, 0, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, cforteb, cfortea, 0, cforte, cforte, cforte_state, empty_init, "Novag Industries", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/const.cpp mame-0.264+dfsg.1/src/mame/novag/const.cpp --- mame-0.263+dfsg.1/src/mame/novag/const.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/const.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -513,11 +513,11 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, ssensor4, 0, 0, ssensor4, ssensor4, const_state, empty_init, "Novag", "Super Sensor IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, ssensor4, 0, 0, ssensor4, ssensor4, const_state, empty_init, "Novag Industries", "Super Sensor IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1983, const, 0, 0, nconst, nconst, const_state, init_const, "Novag", "Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, const36, const, 0, nconst36, nconst, const_state, init_const, "Novag", "Constellation 3.6MHz (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, const36a, const, 0, nconst36a, nconst, const_state, init_const, "Novag", "Constellation 3.6MHz (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1986, constq, const, 0, nconstq, nconstq, const_state, init_const, "Novag", "Constellation Quattro", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, const, 0, 0, nconst, nconst, const_state, init_const, "Novag Industries", "Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, const36, const, 0, nconst36, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, const36a, const, 0, nconst36a, nconst, const_state, init_const, "Novag Industries", "Constellation 3.6MHz (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1986, constq, const, 0, nconstq, nconstq, const_state, init_const, "Novag Industries", "Constellation Quattro", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1984, supercon, 0, 0, sconst, sconst, const_state, empty_init, "Novag", "Super Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1984, supercon, 0, 0, sconst, sconst, const_state, empty_init, "Novag Industries", "Super Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/constjr.cpp mame-0.264+dfsg.1/src/mame/novag/constjr.cpp --- mame-0.263+dfsg.1/src/mame/novag/constjr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/constjr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -69,7 +69,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; emu_timer *m_standbytimer; @@ -237,4 +237,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1985, constjr, 0, 0, constjr, constjr, constjr_state, empty_init, "Novag", "Constellation Junior", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1985, constjr, 0, 0, constjr, constjr, constjr_state, empty_init, "Novag Industries", "Constellation Junior", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/diablo.cpp mame-0.264+dfsg.1/src/mame/novag/diablo.cpp --- mame-0.263+dfsg.1/src/mame/novag/diablo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/diablo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -375,7 +375,7 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1991, diablo68, 0, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag", "Diablo 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, diablo68a, diablo68, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag", "Diablo 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, diablo68, 0, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, diablo68a, diablo68, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Diablo 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1991, scorpio68, 0, 0, scorpio68k, diablo68k, diablo_state, empty_init, "Novag", "Scorpio 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1991, scorpio68, 0, 0, scorpio68k, diablo68k, diablo_state, empty_init, "Novag Industries", "Scorpio 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/mentor16.cpp mame-0.264+dfsg.1/src/mame/novag/mentor16.cpp --- mame-0.263+dfsg.1/src/mame/novag/mentor16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/mentor16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -179,19 +179,18 @@ void mentor16_state::p2_w(u8 data) { // P20-P27: input mux, led data - m_inp_mux = bitswap<8>(~data,0,1,2,3,4,5,6,7); - m_led_pwm->write_mx(m_inp_mux); + m_inp_mux = ~data; + m_led_pwm->write_mx(~data); } u8 mentor16_state::p5_r() { - // P50-P57: read chessboard u8 data = 0; - // read chessboard + // P50-P57: read chessboard for (int i = 0; i < 8; i++) if (BIT(m_inp_mux, i)) - data |= m_board->read_rank(i); + data |= m_board->read_rank(i ^ 7); return ~data; } @@ -231,24 +230,24 @@ static INPUT_PORTS_START( mentor16 ) PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Autoplay / Pawn") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Depth Search / Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Knight") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Bishop") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Random / Queen") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Player/Player / King") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Player/Player / King") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Random / Queen") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Knight") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Depth Search / Rook") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Autoplay / Pawn") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back") PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint / Show Moves") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move Time") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Acc. Time") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Clear Board") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Set Up / Verify") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Set Up / Verify") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Clear Board") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Acc. Time") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move Time") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint / Show Moves") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go") PORT_START("POWER") // needs to be triggered for nvram to work PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, mentor16_state, power_off, 0) PORT_NAME("Power Off") @@ -313,4 +312,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1989, mentor16, 0, 0, mentor16, mentor16, mentor16_state, empty_init, "Novag", "Mentor 16", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, mentor16, 0, 0, mentor16, mentor16, mentor16_state, empty_init, "Novag Industries", "Mentor 16", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/micro.cpp mame-0.264+dfsg.1/src/mame/novag/micro.cpp --- mame-0.263+dfsg.1/src/mame/novag/micro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/micro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -56,7 +56,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; u8 m_led_data = 0; @@ -242,4 +242,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, nmicro, 0, 0, micro, micro, micro_state, empty_init, "Novag", "Micro Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, nmicro, 0, 0, micro, micro, micro_state, empty_init, "Novag Industries", "Micro Chess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/micro2.cpp mame-0.264+dfsg.1/src/mame/novag/micro2.cpp --- mame-0.263+dfsg.1/src/mame/novag/micro2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/micro2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -85,7 +85,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport m_inputs; bool m_kp_select = false; @@ -237,4 +237,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, nmicro2, 0, 0, micro2, micro2, micro2_state, empty_init, "Novag", "Micro II (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, nmicro2, 0, 0, micro2, micro2, micro2_state, empty_init, "Novag Industries", "Micro II (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/primo.cpp mame-0.264+dfsg.1/src/mame/novag/primo.cpp --- mame-0.263+dfsg.1/src/mame/novag/primo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/primo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -29,7 +29,7 @@ - PCB label: 100059/100060 - Hitachi HD6301Y0P (mode 2) @ 8MHz - 2KB RAM(M5M5118P) -- LCD with 4 digits and custom segments, no LCD chip +- LCD with 4 7segs and custom segments, no LCD chip - buzzer, 16 LEDs, 8*8 chessboard buttons The LCD is the same as the one in VIP / Super VIP. @@ -55,9 +55,9 @@ ---------------------------- Hardware notes: -- Hitachi HD63A03YP @ 16MHz +- Hitachi HD63A03YP (or HD6301Y0P in mode 1) @ 16MHz - 32KB ROM(TC57256AD-12), 8KB RAM(CXK58648P-10L) -- LCD with 4 digits and custom segments, no LCD chip +- LCD with 4 7segs and custom segments, no LCD chip - RJ-12 port for Novag Super System (like the one in nsvip/sexpertc) - buzzer, 16 LEDs, 8*8 chessboard buttons @@ -120,7 +120,7 @@ required_device m_board; required_device m_lcd_pwm; required_device m_led_pwm; - required_device m_dac; + required_device m_dac; optional_device m_rs232; required_ioport_array<2> m_inputs; output_finder<4, 10> m_out_lcd; @@ -385,7 +385,7 @@ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); screen.set_refresh_hz(60); - screen.set_size(1920/4, 606/4); + screen.set_size(1920/5, 606/5); screen.set_visarea_full(); PWM_DISPLAY(config, m_led_pwm).set_size(2, 8); @@ -452,7 +452,7 @@ ROM_END -ROM_START( nsnova ) // ID = N1.05 +ROM_START( nsnova ) // ID = N1.05, serial 326xx/340xx ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD("n_530.u5", 0x8000, 0x8000, CRC(727a0ada) SHA1(129c1edc5c1d2e12ce97ebef81c6d5555464a11d) ) @@ -460,6 +460,14 @@ ROM_LOAD("nvip.svg", 0, 36256, CRC(3373e0d5) SHA1(25bfbf0405017388c30f4529106baccb4723bc6b) ) ROM_END +ROM_START( nsnovaa ) // ID = N1.05, serial 310xx + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("n_319.u5", 0x8000, 0x8000, CRC(7ad4cbde) SHA1(cc92a162d4a63466f2333708a8e07269646188ea) ) // 1 byte different, does not look like bitrot + + ROM_REGION( 36256, "screen", 0 ) + ROM_LOAD("nvip.svg", 0, 36256, CRC(3373e0d5) SHA1(25bfbf0405017388c30f4529106baccb4723bc6b) ) +ROM_END + } // anonymous namespace @@ -469,8 +477,9 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, nprimo, 0, 0, primo, primo, primo_state, empty_init, "Novag", "Primo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, nprimo, 0, 0, primo, primo, primo_state, empty_init, "Novag Industries", "Primo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, supremo, 0, 0, supremo, supremo, primo_state, empty_init, "Novag", "Supremo", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, supremo, 0, 0, supremo, supremo, primo_state, empty_init, "Novag Industries", "Supremo", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, nsnova, 0, 0, snova, snova, primo_state, empty_init, "Novag", "Super Nova (Novag, v1.05)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, nsnova, 0, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, nsnovaa, nsnova, 0, snova, snova, primo_state, empty_init, "Novag Industries", "Super Nova (Novag, v1.05 set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/robotadv.cpp mame-0.264+dfsg.1/src/mame/novag/robotadv.cpp --- mame-0.263+dfsg.1/src/mame/novag/robotadv.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/robotadv.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -555,4 +555,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1982, robotadv, 0, 0, robotadv, robotadv, robotadv_state, empty_init, "Novag", "Chess Robot Adversary", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) +SYST( 1982, robotadv, 0, 0, robotadv, robotadv, robotadv_state, empty_init, "Novag Industries", "Chess Robot Adversary", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL | MACHINE_IMPERFECT_CONTROLS ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/savant.cpp mame-0.264+dfsg.1/src/mame/novag/savant.cpp --- mame-0.263+dfsg.1/src/mame/novag/savant.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/savant.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -78,7 +78,7 @@ required_device m_lcd2; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_shared_ptr m_nvram; required_ioport_array<3> m_inputs; @@ -436,5 +436,5 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag", "Savant", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1982, savant2, savant, 0, savant, savant, savant_state, empty_init, "Novag", "Savant II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1982, savant2, savant, 0, savant, savant, savant_state, empty_init, "Novag Industries", "Savant II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/sdiamond.cpp mame-0.264+dfsg.1/src/mame/novag/sdiamond.cpp --- mame-0.263+dfsg.1/src/mame/novag/sdiamond.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/sdiamond.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,371 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/******************************************************************************* + +Novag (Perfect Technology*) Star Diamond + +*: Novag Industries dissolved in 2000. The Novag brand continued for a few years +under Perfect Technology, Ltd., established by the daughter of Novag's founder. +The main programmer (David Kittinger) also moved to the new company. + +Hardware notes: +- PCB label: TF-05 94V0Δ +- Hitachi H8S/2312 12312VTE25V, 25MHz XTAL +- 512KB Flash ROM (SST 39VF400A), only 192KB used +- 256KB RAM (2*Hynix HY62V8100B) +- LCD with 6 7segs and custom segments +- RJ-12 port for Novag Super System (always 57600 baud) +- piezo, 16 LEDs, button sensors chessboard + +TODO: +- it does a cold boot at every reset, so nvram won't work properly unless MAME + adds some kind of auxillary autosave state feature at power-off + +*******************************************************************************/ + +#include "emu.h" + +#include "bus/rs232/rs232.h" +#include "cpu/h8/h8s2319.h" +#include "machine/nvram.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "novag_sdiamond.lh" + + +namespace { + +class sdiamond_state : public driver_device +{ +public: + sdiamond_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_led_pwm(*this, "led_pwm"), + m_lcd_pwm(*this, "lcd_pwm"), + m_dac(*this, "dac"), + m_rs232(*this, "rs232"), + m_inputs(*this, "IN.%u", 0), + m_out_lcd(*this, "s%u.%u", 0U, 0U) + { } + + void sdiamond(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(power_switch); + +protected: + virtual void machine_reset() override { set_power(true); } + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_led_pwm; + required_device m_lcd_pwm; + required_device m_dac; + required_device m_rs232; + required_ioport_array<4> m_inputs; + output_finder<4, 16> m_out_lcd; + + bool m_power = false; + u8 m_inp_mux = 0; + u8 m_lcd_sclk = 0; + u16 m_lcd_segs = 0; + u8 m_lcd_com = 0; + + void main_map(address_map &map); + + // I/O handlers + void lcd_pwm_w(offs_t offset, u8 data); + void update_lcd(); + void lcd_segs_w(u8 data); + void lcd_com_w(offs_t offset, u8 data, u8 mem_mask); + + void standby(int state); + void set_power(bool power); + + void p1_w(u8 data); + u8 p2_r(); + u8 p4_r(); + u8 pf_r(); + void pg_w(u8 data); +}; + +void sdiamond_state::machine_start() +{ + m_out_lcd.resolve(); + + // register for savestates + save_item(NAME(m_power)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_lcd_sclk)); + save_item(NAME(m_lcd_segs)); + save_item(NAME(m_lcd_com)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// power + +void sdiamond_state::standby(int state) +{ + // clear display + if (state) + { + m_lcd_pwm->clear(); + m_led_pwm->clear(); + } +} + +void sdiamond_state::set_power(bool power) +{ + // power switch is tied to NMI + m_maincpu->set_input_line(INPUT_LINE_NMI, power ? ASSERT_LINE : CLEAR_LINE); + m_power = power; +} + +INPUT_CHANGED_MEMBER(sdiamond_state::power_switch) +{ + if (newval) + set_power(bool(param)); +} + + +// LCD + +void sdiamond_state::lcd_pwm_w(offs_t offset, u8 data) +{ + m_out_lcd[offset & 0x3f][offset >> 6] = data; +} + +void sdiamond_state::update_lcd() +{ + for (int i = 0; i < 4; i++) + { + // LCD common is 0/1/Hi-Z + const u16 data = BIT(m_lcd_com, i + 4) ? (BIT(m_lcd_com, i) ? ~m_lcd_segs : m_lcd_segs) : 0; + m_lcd_pwm->write_row(i, data); + } +} + +void sdiamond_state::lcd_com_w(offs_t offset, u8 data, u8 mem_mask) +{ + // P20-P23: LCD common + m_lcd_com = mem_mask << 4 | (data & 0xf); + update_lcd(); +} + +void sdiamond_state::lcd_segs_w(u8 data) +{ + // P35: 2*14015B C (chained) + if (data & 0x20 && !m_lcd_sclk) + { + // P34: 14015B D, outputs to LCD segments + m_lcd_segs = m_lcd_segs << 1 | BIT(data, 4); + update_lcd(); + } + + m_lcd_sclk = BIT(data, 5); +} + + +// misc + +void sdiamond_state::p1_w(u8 data) +{ + // P10-P17: input mux, led data + m_inp_mux = ~data; + m_led_pwm->write_mx(~data); +} + +u8 sdiamond_state::p2_r() +{ + u8 data = 0; + + // P26: power switch + if (!m_power) + data |= 0x40; + + // P27: battery status + data |= m_inputs[3]->read() << 7; + return data | 0xf; +} + +u8 sdiamond_state::p4_r() +{ + u8 data = 0; + + // P40-P47: read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_rank(i ^ 7); + + return ~data; +} + +u8 sdiamond_state::pf_r() +{ + u8 data = 0; + + // PF0-PF2: read buttons + for (int i = 0; i < 3; i++) + if (m_inp_mux & m_inputs[i]->read()) + data |= 1 << i; + + return ~data; +} + +void sdiamond_state::pg_w(u8 data) +{ + // PG0,PG1: led select + m_led_pwm->write_my(~data & 3); +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void sdiamond_state::main_map(address_map &map) +{ + map(0x000000, 0x07ffff).rom(); + map(0x400000, 0x43ffff).ram().share("nvram"); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( sdiamond ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Next Best / Take Back / Print Board") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Trace Forward / Print Game") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Easy / Replay") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Random / Video") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Restore / Human") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Book Select / Auto/Demo") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound / Auto Clock") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Referee / Print Moves") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Color") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Verify / Setup / Rating") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Pro-op Print / King") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pro-op Priority / Queen") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Pro-op Delete / Rook") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Pro-op Save / Bishop") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Load Game / Knight") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Save Game / Pawn") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Info") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Hint") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Training") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Option 1/2") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Set Level") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Clear / Clear Board") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("New Game") + + PORT_START("IN.3") + PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x01, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) + + PORT_START("POWER") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_POWER_ON) PORT_CHANGED_MEMBER(DEVICE_SELF, sdiamond_state, power_switch, 1) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_POWER_OFF) PORT_CHANGED_MEMBER(DEVICE_SELF, sdiamond_state, power_switch, 0) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void sdiamond_state::sdiamond(machine_config &config) +{ + // basic machine hardware + H8S2312(config, m_maincpu, 25_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &sdiamond_state::main_map); + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(h8s2312_device::nvram_set_battery)); + m_maincpu->standby_cb().append(FUNC(sdiamond_state::standby)); + m_maincpu->write_sci_tx<0>().set(m_rs232, FUNC(rs232_port_device::write_txd)); + m_maincpu->write_port1().set(FUNC(sdiamond_state::p1_w)); + m_maincpu->read_port2().set(FUNC(sdiamond_state::p2_r)); + m_maincpu->write_port2().set(FUNC(sdiamond_state::lcd_com_w)); + m_maincpu->write_port3().set(FUNC(sdiamond_state::lcd_segs_w)); + m_maincpu->read_port4().set(FUNC(sdiamond_state::p4_r)); + m_maincpu->read_portf().set(FUNC(sdiamond_state::pf_r)); + m_maincpu->write_portf().set(m_dac, FUNC(dac_1bit_device::write)).bit(6); + m_maincpu->write_portg().set(FUNC(sdiamond_state::pg_w)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + //m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_lcd_pwm).set_size(4, 16); + m_lcd_pwm->output_x().set(FUNC(sdiamond_state::lcd_pwm_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920/5, 671/5); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_led_pwm).set_size(2, 8); + config.set_default_layout(layout_novag_sdiamond); + + // rs232 (configure after video) + RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); + m_rs232->rxd_handler().set(m_maincpu, FUNC(h8s2312_device::sci_rx_w<0>)); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( sdiamond ) // ID = H8S/SD V1.04 + ROM_REGION16_BE( 0x80000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP("39vf400a.ic3", 0x00000, 0x80000, CRC(ee9a4fee) SHA1(b86e5efa5b7b9ddbe9fe1dabfe8cbc2bc40809b8) ) + + ROM_REGION( 72533, "screen", 0 ) + ROM_LOAD("sdiamond.svg", 0, 72533, CRC(34944b61) SHA1(4a0536ac07790cced9f9bf15522b17ebc375ff8a) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 2003, sdiamond, 0, 0, sdiamond, sdiamond, sdiamond_state, empty_init, "Perfect Technology", "Star Diamond (v1.04)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/sexpert.cpp mame-0.264+dfsg.1/src/mame/novag/sexpert.cpp --- mame-0.263+dfsg.1/src/mame/novag/sexpert.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/sexpert.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -148,6 +148,7 @@ m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000); } + // Super Forte class sforte_state : public sexpert_state @@ -598,17 +599,17 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1988, sexperta, 0, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 886 -SYST( 1987, sexperta1, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 -SYST( 1987, sexperta2, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 -SYST( 1988, sexpertb, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 887 -SYST( 1990, sexpertc, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag", "Super Expert (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 -SYST( 1990, sexpertc1, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag", "Super Expert (version C, v3.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 -SYST( 1990, sexpertc2, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag", "Super Expert (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 - -SYST( 1987, sfortea, 0, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, sfortea1, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1987, sfortea2, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag", "Super Forte (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1988, sforteb, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, sfortec, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag", "Super Forte (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1990, sfortec1, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag", "Super Forte (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, sexperta, 0, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 886 +SYST( 1987, sexperta1, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 +SYST( 1987, sexperta2, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 878 +SYST( 1988, sexpertb, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 887 +SYST( 1990, sexpertc, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 +SYST( 1990, sexpertc1, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v3.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 +SYST( 1990, sexpertc2, sexperta, 0, sexpertb, sexpertb, sexpert_state, init_sexpert, "Novag Industries", "Super Expert (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // 902 + +SYST( 1987, sfortea, 0, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, sfortea1, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, sfortea2, sfortea, 0, sforte, sexpert, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version A, set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1988, sforteb, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, sfortec, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1990, sfortec1, sfortea, 0, sforteb, sexpertb, sforte_state, init_sexpert, "Novag Industries", "Super Forte (version C, v1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novag/vip.cpp mame-0.264+dfsg.1/src/mame/novag/vip.cpp --- mame-0.263+dfsg.1/src/mame/novag/vip.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novag/vip.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,7 +14,7 @@ TODO: - if/when MAME supports an exit callback, hook up power-off switch to that -- add Super System peripherals, each has their own MCU +- add more Super System peripherals, each has their own MCU - unmapped reads from 0x3* range, same as snova driver BTANB: @@ -33,7 +33,7 @@ - PCB label: 100078 - Hitachi HD6301Y0F (mode 2) @ 8MHz - 2KB RAM (NEC D449G-15) -- LCD with 4 digits and custom segments, no LCD chip +- LCD with 4 7segs and custom segments, no LCD chip - 24 buttons, piezo The LCD is the same as the one in Primo / Supremo / Super Nova. @@ -235,8 +235,8 @@ static INPUT_PORTS_START( vip ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("GO") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Restore") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Hint") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Restore") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Hint") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CB") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Color") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Verify/Setup") @@ -277,8 +277,8 @@ PORT_INCLUDE( vip ) PORT_MODIFY("IN.0") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Restore / Replay") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Hint / Human") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Restore / Replay") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Hint / Human") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Color / Video") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_NAME("Random / Autoclock") @@ -420,9 +420,9 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1987, nvip, 0, 0, vip, vip, vip_state, empty_init, "Novag", "VIP (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1987, nvip, 0, 0, vip, vip, vip_state, empty_init, "Novag Industries", "VIP (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvip, 0, 0, svip, svip, vip_state, empty_init, "Novag", "Super VIP (v3.7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipa, nsvip, 0, svip, svip, vip_state, empty_init, "Novag", "Super VIP (v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipb, nsvip, 0, svip, svip, vip_state, empty_init, "Novag", "Super VIP (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -SYST( 1989, nsvipc, nsvip, 0, svip, svip, vip_state, empty_init, "Novag", "Super VIP (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, nsvip, 0, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, nsvipa, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, nsvipb, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1989, nsvipc, nsvip, 0, svip, svip, vip_state, empty_init, "Novag Industries", "Super VIP (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/novation/basssta.cpp mame-0.264+dfsg.1/src/mame/novation/basssta.cpp --- mame-0.263+dfsg.1/src/mame/novation/basssta.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/novation/basssta.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -19,22 +19,52 @@ basssta_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_inputs(*this, "IN%u", 0U) + , m_input_select(0xff) { } void bassstr(machine_config &config); void sbasssta(machine_config &config); +protected: + virtual void machine_start() override; + private: + void input_select_w(u8 data); + u8 input_r(); + void bassstr_prog(address_map &map); void sbasssta_prog(address_map &map); void bassstr_data(address_map &map); void sbasssta_data(address_map &map); required_device m_maincpu; + required_ioport_array<4> m_inputs; + + u8 m_input_select; }; +void basssta_state::machine_start() +{ + save_item(NAME(m_input_select)); +} + +void basssta_state::input_select_w(u8 data) +{ + m_input_select = data; +} + +u8 basssta_state::input_r() +{ + u8 ret = 0xff; + for (int n = 0; n < 4; n++) + if (!BIT(m_input_select, n)) + ret &= m_inputs[n]->read(); + return ret; +} + void basssta_state::bassstr_prog(address_map &map) { map(0x0000, 0x7fff).rom().region("program", 0); @@ -51,8 +81,10 @@ map(0x0003, 0x0003).noprw(); map(0x000f, 0x000f).noprw(); map(0x001f, 0x001f).noprw(); - map(0x0060, 0x03cf).ram(); + map(0x0060, 0x03cf).ram(); // TODO: this plus everything above is probably internal to CPU map(0x8000, 0x87ff).rw("eeprom", FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)); + map(0x8800, 0x8800).r(FUNC(basssta_state::input_r)); + map(0xa800, 0xa800).w(FUNC(basssta_state::input_select_w)); } void basssta_state::sbasssta_data(address_map &map) @@ -70,14 +102,54 @@ map(0x0034, 0x0034).nopw(); map(0x0036, 0x0036).nopw(); map(0x005d, 0x005d).noprw(); - map(0x0060, 0x07ff).ram(); // TODO: probably internal to CPU + map(0x0060, 0x07ff).ram(); // TODO: this plus everything above is probably internal to CPU map(0x6000, 0x7fff).rw("eeprom", FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)); - map(0x8001, 0x8004).nopw(); - map(0xc000, 0xc000).nopr(); + map(0x8001, 0x8001).w(FUNC(basssta_state::input_select_w)); + map(0x8002, 0x8004).nopw(); + map(0xc000, 0xc000).r(FUNC(basssta_state::input_r)); } static INPUT_PORTS_START(basssta) + PORT_START("IN0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("IN1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("IN2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) + + PORT_START("IN3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN) INPUT_PORTS_END void basssta_state::bassstr(machine_config &config) diff -Nru mame-0.263+dfsg.1/src/mame/omori/battlex.cpp mame-0.264+dfsg.1/src/mame/omori/battlex.cpp --- mame-0.263+dfsg.1/src/mame/omori/battlex.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/omori/battlex.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -169,8 +169,6 @@ void io_map(address_map &map); }; -// video - void battlex_state::palette_w(offs_t offset, uint8_t data) { int const palette_num = offset / 8; @@ -283,8 +281,6 @@ } -// machine - INTERRUPT_GEN_MEMBER(battlex_state::interrupt) { m_in0_b4 = 1; diff -Nru mame-0.263+dfsg.1/src/mame/orca/espial.cpp mame-0.264+dfsg.1/src/mame/orca/espial.cpp --- mame-0.263+dfsg.1/src/mame/orca/espial.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/orca/espial.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -135,8 +135,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -346,8 +344,6 @@ } -// machine - void espial_state::machine_reset() { m_flipscreen = 0; diff -Nru mame-0.263+dfsg.1/src/mame/orca/funkybee.cpp mame-0.264+dfsg.1/src/mame/orca/funkybee.cpp --- mame-0.263+dfsg.1/src/mame/orca/funkybee.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/orca/funkybee.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -146,8 +146,6 @@ }; -// video - void funkybee_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -289,8 +287,6 @@ } -// machine - uint8_t funkybee_state::input_port_0_r() { if (!machine().side_effects_disabled()) diff -Nru mame-0.263+dfsg.1/src/mame/orca/marineb.cpp mame-0.264+dfsg.1/src/mame/orca/marineb.cpp --- mame-0.263+dfsg.1/src/mame/orca/marineb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/orca/marineb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -139,8 +139,6 @@ }; -// video - void marineb_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -581,8 +579,6 @@ } -// machine - void marineb_state::machine_reset() { m_palette_bank = 0; diff -Nru mame-0.263+dfsg.1/src/mame/orca/sub.cpp mame-0.264+dfsg.1/src/mame/orca/sub.cpp --- mame-0.263+dfsg.1/src/mame/orca/sub.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/orca/sub.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -183,8 +183,6 @@ }; -// video - void sub_state::sub_palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -293,8 +291,6 @@ } -// machine - void sub_state::machine_start() { save_item(NAME(m_int_en)); diff -Nru mame-0.263+dfsg.1/src/mame/orca/vastar.cpp mame-0.264+dfsg.1/src/mame/orca/vastar.cpp --- mame-0.263+dfsg.1/src/mame/orca/vastar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/orca/vastar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -194,8 +194,6 @@ }; -// machine - void vastar_common_state::machine_start() { save_item(NAME(m_nmi_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/pacific/mrflea.cpp mame-0.264+dfsg.1/src/mame/pacific/mrflea.cpp --- mame-0.263+dfsg.1/src/mame/pacific/mrflea.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pacific/mrflea.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ }; -// video - void mrflea_state::gfx_bank_w(uint8_t data) { @@ -239,8 +237,6 @@ return 0; } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/pacific/thief.cpp mame-0.264+dfsg.1/src/mame/pacific/thief.cpp --- mame-0.263+dfsg.1/src/mame/pacific/thief.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pacific/thief.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -146,8 +146,6 @@ }; -// video - enum { IMAGE_ADDR_LO, //0xe000 IMAGE_ADDR_HI, //0xe001 @@ -448,8 +446,6 @@ } -// machine - void sharkatt_state::slam_w(int state) { // SLAM switch causes an NMI if it's pressed diff -Nru mame-0.263+dfsg.1/src/mame/pacman/pacman.cpp mame-0.264+dfsg.1/src/mame/pacman/pacman.cpp --- mame-0.263+dfsg.1/src/mame/pacman/pacman.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pacman/pacman.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3753,6 +3753,18 @@ } +void pacman_state::woodpek_rbg(machine_config &config) +{ + pacman(config); + + // Basic machine hardware + m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::woodpek_map); + + // Video hardware + m_palette->set_init(FUNC(pacman_state::pacman_rbg_palette)); +} + + void clubpacm_state::clubpacm(machine_config &config) { mspacman(config); @@ -4502,6 +4514,27 @@ ROM_LOAD( "82s129-2.c9", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) // Timing - not used // == 82s126.3m ROM_END +ROM_START( mspacmanbgf ) // Mr Pac-Turbo. Argentine bootleg with turbo speed + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "ic11.bin", 0x0000, 0x4000, CRC(6573a470) SHA1(d66ed9e79d12bd6e61816a974f2500dee69b9ad6) ) + ROM_CONTINUE( 0x8000, 0x4000 ) + + ROM_REGION( 0x8000, "gfx1", 0 ) // first 0x2000 are identical to mspacmanblt + ROM_LOAD( "ic13.bin", 0x0000, 0x800, CRC(8ee4a3b0) SHA1(01e3453c99f7a5d78ab083c49c650e898c0dd2ee) ) + ROM_CONTINUE( 0x1000, 0x800 ) + ROM_CONTINUE( 0x0800, 0x800 ) + ROM_CONTINUE( 0x1800, 0x800 ) + ROM_IGNORE( 0x2000 ) + + ROM_REGION( 0x0120, "proms", 0 ) // not dumped for this set + ROM_LOAD( "82s123.h7", 0x0000, 0x0020, BAD_DUMP CRC(3545e7e9) SHA1(b866b02579438afb11296e5c53a32c6425bd044d) ) + ROM_LOAD( "82s129-3.d1", 0x0020, 0x0100, BAD_DUMP CRC(3eb3a8e4) SHA1(19097b5f60d1030f8b82d9f1d3a241f93e5c75d6) ) + + ROM_REGION( 0x0200, "namco", 0 ) // sound PROMs, not dumped for this set + ROM_LOAD( "82s129-1.a9", 0x0000, 0x0100, BAD_DUMP CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) ) + ROM_LOAD( "82s129-2.c9", 0x0100, 0x0100, BAD_DUMP CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) +ROM_END + ROM_START( mspacmanbhe ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "11.g5", 0x0000, 0x4000, CRC(b256540f) SHA1(2ffdb9a9af98606793e9cb8b151370070be45091) ) @@ -4923,12 +4956,29 @@ in the mainboard, at normal positions. + + ********** Second PCB ********* + + A second PCB was found! + The hardware base is totally different from the first set. + + It's a two PCB system with the original SUSILU Ms PacMan Twin daughterboard replacing the Z80 at location 6B, + plus two daughterboards replacing the original Namco customs NVC284 at location 5S (VRAM addresser), + and NVC285 at location 6D (Z80 sync bus controller). + + Program ROM is way different and need to be anlyzed deeply to find behaviour differences in the game. + Besides, the graphics ROM 3 (@ location 5h) has extra bitmapped strings "Push Start" and "Insert Coins" + that are not present in the parent set. + + + Docs by Roberto Fresca. + *****************************************************************************/ ROM_START( mspactwin ) - ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for encrypted code */ + ROM_REGION( 0x10000, "maincpu", 0 ) // 64k for encrypted code ROM_LOAD( "m27256.bin", 0x0000, 0x4000, CRC(77a99184) SHA1(9dcb1a1b78994aa401d653bec571cb3e6f9d900b) ) ROM_CONTINUE(0x8000,0x4000) @@ -4947,6 +4997,33 @@ ROM_LOAD( "82s129.3k", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) ROM_END +/* Second set... + + m27256.bin [2/4] 6_db.u4 [2/4] 87.792969% + m27256.bin [4/4] 6_db.u4 [4/4] 87.500000% + m27256.bin [3/4] 6_db.u4 [3/4] 67.150879% + m27256.bin [1/4] 6_db.u4 [1/4] 16.503906% +*/ +ROM_START( mspactwina ) + ROM_REGION( 0x10000, "maincpu", 0 ) // 64k for encrypted code + ROM_LOAD( "6_db.u4", 0x0000, 0x4000, CRC(a0fb55ba) SHA1(ad591aa6511600f4687b7c4e70882d87386c9fb9) ) + ROM_CONTINUE(0x8000,0x4000) + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "1.5e", 0x0000, 0x0800, CRC(483c1d1c) SHA1(d3b967c6a71cf02b825d800f56d5268f2e0e60eb) ) + ROM_LOAD( "3.5h", 0x0800, 0x0800, CRC(703912f5) SHA1(03f5d7b30bacabf388fdcfa13fe6a5b0e3027fe7) ) // this ROM has additional tiles + ROM_LOAD( "2.5f", 0x1000, 0x0800, CRC(22b0188a) SHA1(a9ed9ca8b36a60081fd364abc9bc23963932cc0b) ) + ROM_LOAD( "4.5j", 0x1800, 0x0800, CRC(0a8c46a0) SHA1(e38e9e3258ab26fcbc6fdf258844e364f4b165ab) ) + + ROM_REGION( 0x0120, "proms", 0 ) + ROM_LOAD( "mb7051.8h", 0x0000, 0x0020, CRC(ff344446) SHA1(45eb37533da8912645a089b014f3b3384702114a) ) + ROM_LOAD( "82s129.4a", 0x0020, 0x0100, CRC(a8202d0d) SHA1(2a615211c33f3ef75af14e4bbedd2a700100be29) ) + + ROM_REGION( 0x0200, "namco", 0 ) // Sound PROMs + ROM_LOAD( "mb7052.1k", 0x0000, 0x0100, CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) ) + ROM_LOAD( "82s129.3k", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) +ROM_END + ROM_START( hangly ) ROM_REGION( 0x10000, "maincpu", 0 ) @@ -8336,22 +8413,24 @@ // These bootlegs have MADE IN GREECE clearly visible and etched into the PCBs. They were very common in Spain with several operators having their own versions. // Based on the PCBs and copyright dates shown they were produced late 80s / early 90s. Usually they run a version of Ms. Pacman, but were sometimes converted back to regular Pac-Man -GAME( 198?, mspacmanbg, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg", "Ms. Pac-Man ('Made in Greece' bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, mspacmanbg2, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg", "Ms. Pac-Man ('Made in Greece' bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mspacmanbgd, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Datamat)", "Miss Pukman ('Made in Greece' Datamat bootleg)", MACHINE_SUPPORTS_SAVE ) // shows 'Miss Pukman 1991/1992' but confirmed to be the bootleg distributed by Datamat -GAME( 1992, mspacmanblt, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Triunvi)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Triunvi bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mspacmanblt2, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Triunvi)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Triunvi bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, mspacmanbcc, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Tecnausa)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Tecnausa bootleg)", MACHINE_SUPPORTS_SAVE ) // ^ same PCB, also dated 1991, distributed by Tecnausa -GAME( 1991, mspacmanbhe, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Herle SA)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Herle SA bootleg)", MACHINE_SUPPORTS_SAVE ) // ^ same PCB -GAME( 1992, mspacmanbco, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Cocamatic)", "Come-Cocos (Ms. Pac-Man) (Cocamatic bootleg)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // this PCB have swapped Blue and Green color lines (Ms.Pac-Man sprite should be pink), no "MADE IN GREECE" text at PCB -GAME( 1993, mspacmanbi, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Impeuropex)", "Ms. Pac-Man (Impeuropex bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, mspacmanbgc, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Enavi)", "Ms. Pac-Man ('Made in Greece' Enavi bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 198?, pacmansp, puckman, pacman, pacmansp, pacman_state, empty_init, ROT90, "bootleg (Video Game SA)", "Puck Man (Spanish, 'Made in Greece' bootleg)", MACHINE_SUPPORTS_SAVE ) // probably a further conversion of the mspacmanbg bootleg, still has some MS Pacman code + extra features +GAME( 198?, mspacmanbg, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg", "Ms. Pac-Man ('Made in Greece' bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1997, mspacmanbg2, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg", "Ms. Pac-Man ('Made in Greece' bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mspacmanbgd, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Datamat)", "Miss Pukman ('Made in Greece' Datamat bootleg)", MACHINE_SUPPORTS_SAVE ) // shows 'Miss Pukman 1991/1992' but confirmed to be the bootleg distributed by Datamat +GAME( 1988, mspacmanbgf, mspacman, woodpek_rbg, mspacman, pacman_state, empty_init, ROT90, "bootleg (Fermin)", "Mr Pac-Turbo ('Made in Greece' Fermin bootleg)", MACHINE_SUPPORTS_SAVE ) // Argentine bootleg with turbo speed. B-G color lines are intended swapped, showing a Ms PacMan purple/pink. +GAME( 1992, mspacmanblt, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Triunvi)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Triunvi bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mspacmanblt2, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Triunvi)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Triunvi bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, mspacmanbcc, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Tecnausa)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Tecnausa bootleg)", MACHINE_SUPPORTS_SAVE ) // ^ same PCB, also dated 1991, distributed by Tecnausa +GAME( 1991, mspacmanbhe, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Herle SA)", "Come-Cocos (Ms. Pac-Man) ('Made in Greece' Herle SA bootleg)", MACHINE_SUPPORTS_SAVE ) // ^ same PCB +GAME( 1992, mspacmanbco, mspacman, woodpek_rbg, mspacman, pacman_state, empty_init, ROT90, "bootleg (Cocamatic)", "Come-Cocos (Ms. Pac-Man) (Cocamatic bootleg)", MACHINE_SUPPORTS_SAVE ) // this PCB have swapped Blue and Green color lines (Ms.Pac-Man sprite should be pink), no "MADE IN GREECE" text at PCB +GAME( 1993, mspacmanbi, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Impeuropex)", "Ms. Pac-Man (Impeuropex bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mspacmanbgc, mspacman, woodpek, mspacman, pacman_state, empty_init, ROT90, "bootleg (Enavi)", "Ms. Pac-Man ('Made in Greece' Enavi bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 198?, pacmansp, puckman, pacman, pacmansp, pacman_state, empty_init, ROT90, "bootleg (Video Game SA)", "Puck Man (Spanish, 'Made in Greece' bootleg)", MACHINE_SUPPORTS_SAVE ) // probably a further conversion of the mspacmanbg bootleg, still has some MS Pacman code + extra features -GAME( 1992, mspactwin, 0, mspactwin, mspactwin, mspactwin_state, init_mspactwin, ROT90, "hack (Susilu)", "Ms Pac Man Twin (Argentina)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mspactwin, 0, mspactwin, mspactwin, mspactwin_state, init_mspactwin, ROT90, "hack (Susilu)", "Ms Pac Man Twin (Argentina, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, mspactwina, mspactwin, mspactwin, mspactwin, mspactwin_state, init_mspactwin, ROT90, "hack (Susilu)", "Ms Pac Man Twin (Argentina, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, clubpacm, 0, clubpacm, clubpacm, clubpacm_state, empty_init, ROT90, "hack (Miky SRL)", "Pacman Club / Club Lambada (Argentina)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, clubpacma, clubpacm, clubpacm, clubpacma, clubpacm_state, init_clubpacma, ROT90, "hack (Miky SRL)", "Pacman Club (Argentina)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, clubpacm, 0, clubpacm, clubpacm, clubpacm_state, empty_init, ROT90, "hack (Miky SRL)", "Pacman Club / Club Lambada (Argentina)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, clubpacma, clubpacm, clubpacm, clubpacma, clubpacm_state, init_clubpacma, ROT90, "hack (Miky SRL)", "Pacman Club (Argentina)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, jumpshot, 0, pacman, jumpshot, pacman_state, init_jumpshot, ROT90, "Bally Midway", "Jump Shot", MACHINE_SUPPORTS_SAVE ) GAME( 1985, jumpshotp,jumpshot, pacman, jumpshotp,pacman_state, init_jumpshot, ROT90, "Bally Midway", "Jump Shot Engineering Sample", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/pacman/pacman.h mame-0.264+dfsg.1/src/mame/pacman/pacman.h --- mame-0.263+dfsg.1/src/mame/pacman/pacman.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pacman/pacman.h 2024-03-25 14:00:46.000000000 +0000 @@ -192,6 +192,7 @@ TILE_GET_INFO_MEMBER(jrpacman_get_tile_info); DECLARE_VIDEO_START(pacman); void pacman_palette(palette_device &palette) const; + void pacman_rbg_palette(palette_device &palette) const; DECLARE_VIDEO_START(birdiy); DECLARE_VIDEO_START(s2650games); DECLARE_MACHINE_RESET(mschamp); @@ -224,6 +225,7 @@ void vanvan(machine_config &config); void s2650games(machine_config &config); void woodpek(machine_config &config); + void woodpek_rbg(machine_config &config); void crushs(machine_config &config); void superabc(machine_config &config); void numcrash(machine_config &config); diff -Nru mame-0.263+dfsg.1/src/mame/pacman/pacman_v.cpp mame-0.264+dfsg.1/src/mame/pacman/pacman_v.cpp --- mame-0.263+dfsg.1/src/mame/pacman/pacman_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pacman/pacman_v.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,6 +114,59 @@ } } +void pacman_state::pacman_rbg_palette(palette_device &palette) const +{ + const uint8_t *color_prom = memregion("proms")->base(); + static constexpr int resistances[3] = { 1000, 470, 220 }; + + // compute the color output resistor weights + double rweights[3], bweights[3], gweights[2]; + compute_resistor_weights(0, 255, -1.0, + 3, &resistances[0], rweights, 0, 0, + 3, &resistances[0], bweights, 0, 0, + 2, &resistances[1], gweights, 0, 0); + + // create a lookup table for the palette + for (int i = 0; i < 32; i++) + { + int bit0, bit1, bit2; + + // red component + bit0 = BIT(color_prom[i], 0); + bit1 = BIT(color_prom[i], 1); + bit2 = BIT(color_prom[i], 2); + int const r = combine_weights(rweights, bit0, bit1, bit2); + + // blue component + bit0 = BIT(color_prom[i], 3); + bit1 = BIT(color_prom[i], 4); + bit2 = BIT(color_prom[i], 5); + int const b = combine_weights(bweights, bit0, bit1, bit2); + + // green component + bit0 = BIT(color_prom[i], 6); + bit1 = BIT(color_prom[i], 7); + int const g = combine_weights(gweights, bit0, bit1); + + palette.set_indirect_color(i, rgb_t(r, g, b)); + } + + // color_prom now points to the beginning of the lookup table + color_prom += 32; + + // allocate the colortable + for (int i = 0; i < 64*4; i++) + { + uint8_t const ctabentry = color_prom[i] & 0x0f; + + // first palette bank + palette.set_pen_indirect(i, ctabentry); + + // second palette bank + palette.set_pen_indirect(i + 64*4, 0x10 | ctabentry); + } +} + TILEMAP_MAPPER_MEMBER(pacman_state::pacman_scan_rows) { int offs; diff -Nru mame-0.263+dfsg.1/src/mame/pc/at.cpp mame-0.264+dfsg.1/src/mame/pc/at.cpp --- mame-0.263+dfsg.1/src/mame/pc/at.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/at.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3841,6 +3841,15 @@ ROMX_LOAD( "3opm002.bin", 0x10000, 0x10000, CRC(2d9dcbd1) SHA1(d8b0d1411b09767e10e66b455ebc74295bd1b896), ROM_BIOS(3) ) ROM_END +// Tandy 4000 + +ROM_START( t4000 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "v010301", "01.03.01") + ROMX_LOAD( "t4000_even.u32", 0x18000, 0x4000, CRC(f728ae11) SHA1(3bc151b8d704dde7c340a66072c1a418b7eab7db), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "t4000_odd.u25", 0x18001, 0x4000, CRC(6bedcf61) SHA1(df08347f163d6e45bdf9e1b64a811222bffba80a), ROM_SKIP(1) | ROM_BIOS(0)) +ROM_END + // 386sx motherboards using the SARC (or CYCLONE) RC2016A5 chipset @@ -5963,6 +5972,7 @@ COMP( 199?, op82c391, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the OPTi 82C391 chipset", MACHINE_NOT_WORKING ) COMP( 199?, opti495slc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495SLC chipset", MACHINE_NOT_WORKING ) COMP( 199?, opti495xlc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495XLC chipset", MACHINE_NOT_WORKING ) +COMP( 1987, t4000, ibm5170, 0, at386, 0, at_state, init_at, "Tandy Radio Shack", "Tandy 4000", MACHINE_NOT_WORKING ) COMP( 199?, op386wb, ibm5170, 0, at386, 0, at_state, init_at, "OPTi", "OPTi 386WB VER.1.0", MACHINE_NOT_WORKING ) COMP( 199?, p386dx40, ibm5170, 0, at386, 0, at_state, init_at, "Peacock", "P386DX-40", MACHINE_NOT_WORKING ) COMP( 1989, pc2386, ibm5170, 0, at386l, 0, at_state, init_at, "Amstrad plc", "PC2386", MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/pc/calchase.cpp mame-0.264+dfsg.1/src/mame/pc/calchase.cpp --- mame-0.263+dfsg.1/src/mame/pc/calchase.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/calchase.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -154,6 +154,8 @@ virtual void device_add_mconfig(machine_config &config) override; + // TODO: implement me once conversion to PCI kicks in +// virtual void remap(int space_id, offs_t start, offs_t end) override; private: required_ioport_array<5> m_iocard; std::unique_ptr m_nvram_data; diff -Nru mame-0.263+dfsg.1/src/mame/pc/europc_kbd.cpp mame-0.264+dfsg.1/src/mame/pc/europc_kbd.cpp --- mame-0.263+dfsg.1/src/mame/pc/europc_kbd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/europc_kbd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -24,8 +24,6 @@ #include "cpu/m6805/m68705.h" -#include "utf8.h" - //************************************************************************** // LLE KEYBOARD DEVICE //************************************************************************** @@ -232,7 +230,7 @@ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_CODE(KEYCODE_F11) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) PORT_CODE(KEYCODE_PLUS_PAD) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 2 " UTF8_DOWN) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Keypad 2 \u2193") PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD) // ↓ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7 Home") PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('@') PORT_CODE(KEYCODE_QUOTE) @@ -250,7 +248,7 @@ PORT_START("COLUMN9") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 0 Ins") PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CODE(KEYCODE_F10) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6 " UTF8_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Keypad 6 \u2192") PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD) // → PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Scroll Lock Break") PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) PORT_CODE(KEYCODE_SLASH_PAD) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1 End") PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE) @@ -261,8 +259,8 @@ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_RCONTROL) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CODE(KEYCODE_F9) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3 Pg Dn") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8 " UTF8_UP) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4 " UTF8_LEFT) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Keypad 8 \u2191") PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD) // ↑ + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Keypad 4 \u2190") PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD) // ← PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('#') PORT_CHAR('~') PORT_CODE(KEYCODE_BACKSLASH) // to right of quote key diff -Nru mame-0.263+dfsg.1/src/mame/pc/pcat_nit.cpp mame-0.264+dfsg.1/src/mame/pc/pcat_nit.cpp --- mame-0.263+dfsg.1/src/mame/pc/pcat_nit.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/pcat_nit.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -181,7 +181,7 @@ void pcat_nit_state::bonanza_map(address_map &map) { map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(cirrus_gd5428_device::mem_r), FUNC(cirrus_gd5428_device::mem_w)); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(cirrus_gd5428_vga_device::mem_r), FUNC(cirrus_gd5428_vga_device::mem_w)); map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0).nopw(); map(0x000d0000, 0x000d3fff).ram().share("disk_bios"); map(0x000d7000, 0x000d7000).w(FUNC(pcat_nit_state::pcat_nit_rombank_w)); @@ -219,7 +219,7 @@ pcat32_io_common(map); map(0x0278, 0x027f).r(FUNC(pcat_nit_state::pcat_nit_io_r)).nopw(); map(0x0280, 0x0283).nopr(); - map(0x03b0, 0x03df).m("vga", FUNC(cirrus_gd5428_device::io_map)); + map(0x03b0, 0x03df).m("vga", FUNC(cirrus_gd5428_vga_device::io_map)); map(0x03f8, 0x03ff).rw(m_uart, FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w)); } @@ -283,9 +283,9 @@ // TODO: map to ISA bus screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480); - screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update)); + screen.set_screen_update("vga", FUNC(cirrus_gd5428_vga_device::screen_update)); - cirrus_gd5428_device &vga(CIRRUS_GD5428(config, "vga", 0)); + cirrus_gd5428_vga_device &vga(CIRRUS_GD5428_VGA(config, "vga", 0)); vga.set_screen("screen"); vga.set_vram_size(0x200000); diff -Nru mame-0.263+dfsg.1/src/mame/pc/pcipc.cpp mame-0.264+dfsg.1/src/mame/pc/pcipc.cpp --- mame-0.263+dfsg.1/src/mame/pc/pcipc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/pcipc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -39,7 +39,6 @@ #include "machine/pci.h" #include "machine/pci-ide.h" #include "machine/w83977tf.h" -#include "video/clgd546x_laguna.h" // enable ISA verbose messaging at I/O $80 // NOTE: xubuntu 6.10 will ping the port a lot once it gets to GNOME. @@ -588,7 +587,7 @@ ISA16_SLOT(config, "isa4", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); ISA16_SLOT(config, "isa5", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); - rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); // "microsoft_mouse")); + rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); serport0.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd1_w)); serport0.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd1_w)); serport0.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr1_w)); @@ -625,7 +624,7 @@ void pcipc_state::pciagp(machine_config &config) { - // TODO: starts at 233'000'000 + // TODO: starts at 233'000'000, consider adding FSB & AGP clocks here pentium2_device &maincpu(PENTIUM2(config, "maincpu", 90'000'000)); maincpu.set_addrmap(AS_PROGRAM, &pcipc_state::pcipc_map); maincpu.set_addrmap(AS_IO, &pcipc_state::pcipc_map_io); @@ -634,8 +633,7 @@ PCI_ROOT(config, "pci", 0); I82443BX_HOST(config, "pci:00.0", 0, "maincpu", 128*1024*1024); - I82443BX_BRIDGE(config, "pci:01.0", 0 ); //"pci:01.0:00.0"); - //I82443BX_AGP (config, "pci:01.0:00.0"); + I82443BX_BRIDGE(config, "pci:01.0", 0 ); i82371eb_isa_device &isa(I82371EB_ISA(config, "pci:07.0", 0, "maincpu")); isa.boot_state_hook().set(FUNC(pcipc_state::boot_state_award_w)); @@ -656,7 +654,7 @@ ISA16_SLOT(config, "isa3", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); #if 0 - rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); // "microsoft_mouse")); + rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); serport0.rxd_handler().set("board4:w83977tf", FUNC(fdc37c93x_device::rxd1_w)); serport0.dcd_handler().set("board4:w83977tf", FUNC(fdc37c93x_device::ndcd1_w)); serport0.dsr_handler().set("board4:w83977tf", FUNC(fdc37c93x_device::ndsr1_w)); @@ -671,8 +669,13 @@ serport1.cts_handler().set("board4:w83977tf", FUNC(fdc37c93x_device::ncts2_w)); #endif - // TODO: temp link, to be moved to quakeat.cpp - CIRRUS_GD5465_LAGUNA3D(config, "pci:01.0:00.0", 0); + // FIXME: int mapping is unchecked for all slots + PCI_SLOT(config, "pci:01.0:1", agp_cards, 1, 0, 1, 2, 3, "riva128"); + + PCI_SLOT(config, "pci:1", pci_cards, 15, 1, 2, 3, 0, nullptr); + PCI_SLOT(config, "pci:2", pci_cards, 16, 1, 2, 3, 0, nullptr); + PCI_SLOT(config, "pci:3", pci_cards, 17, 2, 3, 0, 1, nullptr); + PCI_SLOT(config, "pci:4", pci_cards, 18, 3, 0, 1, 2, nullptr); } ROM_START(pcipc) @@ -714,4 +717,4 @@ COMP(1998, pcipc, 0, 0, pcipc, pcipc, pcipc_state, empty_init, "Hack Inc.", "Sandbox PCI PC (430HX)", MACHINE_NO_SOUND ) COMP(1998, pcipctx, 0, 0, pcipctx, pcipc, pcipc_state, empty_init, "Hack Inc.", "Sandbox PCI PC (430TX)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // unemulated super I/O -COMP(1999, pciagp, 0, 0, pciagp, pcipc, pcipc_state, empty_init, "Hack Inc.", "Sandbox PCI/AGP PC (440BX)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // errors out with ISA state 0x05 (keyboard), does stuff if bypassed but eventually PnP breaks OS booting +COMP(1999, pciagp, 0, 0, pciagp, pcipc, pcipc_state, empty_init, "Hack Inc.", "Sandbox PCI/AGP PC (440BX)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // errors out with ISA state $05 (keyboard, blame 8042kbdc.cpp) bp e140c,1,{eax&=~1;g}) does stuff if bypassed but eventually PnP breaks OS booting diff -Nru mame-0.263+dfsg.1/src/mame/pc/pcipc_sis.cpp mame-0.264+dfsg.1/src/mame/pc/pcipc_sis.cpp --- mame-0.263+dfsg.1/src/mame/pc/pcipc_sis.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/pcipc_sis.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Angelo Salese /* - * Sandbox for SiS based x86 PCs, targeting the new PCI model + * Sandbox for SiS based 496/497 x86 PCs, targeting the new PCI model * * Notes: * - sis85c471 doesn't belong here, it's a full on ISA PC/AT @@ -16,11 +16,19 @@ #include "emu.h" #include "bus/isa/isa_cards.h" +#include "bus/pci/pci_slot.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/sun_kbd.h" +#include "bus/rs232/terminal.h" #include "cpu/i386/i386.h" #include "machine/pci.h" #include "machine/sis85c496.h" +#include "machine/w83787f.h" #include "video/voodoo_pci.h" + class sis496_state : public driver_device { public: @@ -33,9 +41,12 @@ protected: required_device m_maincpu; + private: void main_io(address_map &map); void main_map(address_map &map); + + static void winbond_superio_config(device_t *device); }; #define PCI_ID_VIDEO "pci:09.0" @@ -66,9 +77,41 @@ map.unmap_value_high(); } +static void isa_com(device_slot_interface &device) +{ + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); +} + +static void isa_internal_devices(device_slot_interface &device) +{ + device.option_add("w83787f", W83787F); +} + +void sis496_state::winbond_superio_config(device_t *device) +{ + w83787f_device &fdc = *downcast(device); +// fdc.set_sysopt_pin(1); +// fdc.gp20_reset().set_inputline(":maincpu", INPUT_LINE_RESET); +// fdc.gp25_gatea20().set_inputline(":maincpu", INPUT_LINE_A20); + fdc.irq1().set(":pci:05.0", FUNC(sis85c496_host_device::pc_irq1_w)); + fdc.irq8().set(":pci:05.0", FUNC(sis85c496_host_device::pc_irq8n_w)); + fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); + fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); + fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); + fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); + fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); + fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); +} + void sis496_state::sis496(machine_config &config) { - // Basic machine hardware I486DX4(config, m_maincpu, 75000000); // I486DX4, 75 or 100 Mhz m_maincpu->set_addrmap(AS_PROGRAM, &sis496_state::main_map); m_maincpu->set_addrmap(AS_IO, &sis496_state::main_io); @@ -77,10 +120,25 @@ PCI_ROOT(config, "pci", 0); SIS85C496_HOST(config, "pci:05.0", 0, "maincpu", 32*1024*1024); - ISA16_SLOT(config, "isa1", 0, "pci:05.0:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "board4", 0, "pci:05.0:isabus", isa_internal_devices, "w83787f", true).set_option_machine_config("w83787f", winbond_superio_config); + ISA16_SLOT(config, "isa1", 0, "pci:05.0:isabus", pc_isa16_cards, "wd90c31_lr", false); ISA16_SLOT(config, "isa2", 0, "pci:05.0:isabus", pc_isa16_cards, nullptr, false); ISA16_SLOT(config, "isa3", 0, "pci:05.0:isabus", pc_isa16_cards, nullptr, false); + rs232_port_device &serport0(RS232_PORT(config, "serport0", isa_com, "logitech_mouse")); + serport0.rxd_handler().set("board4:w83787f", FUNC(w83787f_device::rxd1_w)); + serport0.dcd_handler().set("board4:w83787f", FUNC(w83787f_device::ndcd1_w)); + serport0.dsr_handler().set("board4:w83787f", FUNC(w83787f_device::ndsr1_w)); + serport0.ri_handler().set("board4:w83787f", FUNC(w83787f_device::nri1_w)); + serport0.cts_handler().set("board4:w83787f", FUNC(w83787f_device::ncts1_w)); + + rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); + serport1.rxd_handler().set("board4:w83787f", FUNC(w83787f_device::rxd2_w)); + serport1.dcd_handler().set("board4:w83787f", FUNC(w83787f_device::ndcd2_w)); + serport1.dsr_handler().set("board4:w83787f", FUNC(w83787f_device::ndsr2_w)); + serport1.ri_handler().set("board4:w83787f", FUNC(w83787f_device::nri2_w)); + serport1.cts_handler().set("board4:w83787f", FUNC(w83787f_device::ncts2_w)); + // TODO: 9-10-11-12 for PCI_SLOT (according to BIOS) } @@ -91,6 +149,7 @@ VOODOO_1_PCI(config, m_voodoo, 0, m_maincpu, m_screen); m_voodoo->set_fbmem(2); m_voodoo->set_tmumem(4, 0); + // TODO: games are very annoyed with Direct3D 5 init/teardown fns around this. m_voodoo->set_status_cycles(1000); // TODO: wrong, needs VGA passthru @@ -99,20 +158,32 @@ m_screen->set_size(640, 480); m_screen->set_visarea(0, 640 - 1, 0, 480 - 1); m_screen->set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_1_pci_device::screen_update)); + + PCI_SLOT(config, "pci:1", pci_cards, 10, 0, 1, 2, 3, nullptr); + PCI_SLOT(config, "pci:2", pci_cards, 11, 1, 2, 3, 0, nullptr); } // generic placeholder for unknown BIOS types // Funworld BIOS is temporary until we rewrite funworld/photoply.cpp ROM_START( sis85c496 ) ROM_REGION32_LE(0x20000, "pci:05.0", 0) - ROM_SYSTEM_BIOS(0, "funworld", "Award 486e BIOS with W83787") + ROM_SYSTEM_BIOS(0, "funworld", "Award 486e BIOS with W83787 (photoply)") // Photoplay BIOS + // Lucky Star LS-486EF REV:B ROMX_LOAD("funworld_award_486e_w83787.bin", 0x000000, 0x20000, BAD_DUMP CRC(af7ff1d4) SHA1(72eeecf798a03817ce7ba4d65cd4128ed3ef7e68), ROM_BIOS(0) ) // 486E 96/7/19 W83787 PLUG & PLAY BIOS, AT29C010A + // MegaTouch XL BIOSes + // 09/11/96-SiS-496-SMC665-2A4IBU41C-00 + ROM_SYSTEM_BIOS(1, "merit", "Award 486e BIOS Telco (mtouchxl)") + ROMX_LOAD( "094572516 bios - 486.bin", 0x000000, 0x020000, CRC(1c0b3ba0) SHA1(ff86dd6e476405e716ac7a4de4a216d2d2b49f15), ROM_BIOS(1) ) + // AMI BIOS, Jetway branded MB? + // 40-040B-001276-00101111-040493-OP495SLC-0 + //ROMX_LOAD("prom.mb", 0x10000, 0x10000, BAD_DUMP CRC(e44bfd3c) SHA1(c07ec94e11efa30e001f39560010112f73cc0016) ) + // Chipset: SiS 85C496/85C497 - CPU: Socket 3 - RAM: 2xSIMM72, Cache - Keyboard-BIOS: JETkey V5.0 // ISA16: 3, PCI: 3 - BIOS: SST29EE010 (128k) AMI 486DX ISA BIOS AA2558003 - screen remains blank - ROM_SYSTEM_BIOS(1, "4sim002", "AMI ISA BIOS (unknown)") - ROMX_LOAD( "4sim002.bin", 0x00000, 0x20000, BAD_DUMP CRC(ea898f85) SHA1(7236cd2fc985985f21979e4808cb708be8d0445f), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "4sim002", "AMI ISA unknown BIOS") + ROMX_LOAD( "4sim002.bin", 0x00000, 0x20000, BAD_DUMP CRC(ea898f85) SHA1(7236cd2fc985985f21979e4808cb708be8d0445f), ROM_BIOS(2) ) ROM_END // A-Trend ATC-1425A - Chipset: SiS 85C496, 85C497 - RAM: 4xSIMM72, Cache: 4x32pin + TAG - ISA16: 4, PCI: 3 diff -Nru mame-0.263+dfsg.1/src/mame/pc/przone.cpp mame-0.264+dfsg.1/src/mame/pc/przone.cpp --- mame-0.263+dfsg.1/src/mame/pc/przone.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/przone.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,318 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +Prize Zone (c) 199? Lazer-Tron + +TODO: +- identify proper motherboard/BIOS; +- hookup vibra16 ISA card in place of sblaster_16; +- Printer error B0 keeps popping in attract/game select (disable in service mode as workaround); +- Trackball in place of PS/2 mouse (doesn't seem to use serial); +- CD-ROM reading test is too fast (739% of what is reported as 8X); +- Tri-Scraper / Super Solitaire / Super 11's: timer doesn't count down (goes only up), + it does with mouse click, likely bug for wrong input device? +- Outputs, writes to $301-$305 aren't (comms with a CPU?) + +=================================================================================================== + +Prize Zone Gold Version 2.01 its a CDRDAO dumped cd +The redemption arcade game uses an old Pentium I - 200Mhz 233MMX etc SB16 vibra16, +a S3 virge vga card and a custom ISA IO card. +It has games like gem run, chip away, squirm (a centipede rip off) scud attack (a middle command +rip off) these are games that atari got mad about and were later removed + +This one doesnt have a dongle +but the sound card, s3 virge video card +and isa custom board has to be there +or the disc wont load and gives an error + +**************************************************************************************************/ + +#include "emu.h" + +#include "bus/isa/isa_cards.h" +#include "bus/pci/pci_slot.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/sun_kbd.h" +#include "bus/rs232/terminal.h" +#include "cpu/i386/i386.h" +#include "machine/fdc37c93x.h" +#include "machine/i82371sb.h" +#include "machine/i82439hx.h" +#include "machine/pci.h" + +class isa16_przone_jamma_if : public device_t, public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_przone_jamma_if(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual ioport_constructor device_input_ports() const override; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual void device_add_mconfig(machine_config &config) override; + + virtual void remap(int space_id, offs_t start, offs_t end) override; + +private: + std::unique_ptr m_nvram_data; + //required_ioport_array<5> m_iocard; + required_ioport m_iocard; + + void mem_map(address_map &map); + void io_map(address_map &map); + + uint16_t iocard_r(); + uint8_t nvram_r(offs_t offset); + void nvram_w(offs_t offset, uint8_t data); +}; + +DEFINE_DEVICE_TYPE(ISA16_PRZONE_JAMMA_IF, isa16_przone_jamma_if, "przone_jamma_if", "ISA16 Prize Zone custom JAMMA I/F") + +isa16_przone_jamma_if::isa16_przone_jamma_if(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, ISA16_PRZONE_JAMMA_IF, tag, owner, clock) + , device_isa16_card_interface(mconfig, *this) + , m_iocard(*this, "IOCARD") +{ +} + +void isa16_przone_jamma_if::device_add_mconfig(machine_config &config) +{ + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // unknown NVRAM type +} + +void isa16_przone_jamma_if::device_start() +{ + set_isa_device(); + + // 0x4000 enough to pass initial string check at $d0000-7, + // 0x8000 confirmed later thru NVRAM test in service mode + m_nvram_data = std::make_unique(0x8000); + subdevice("nvram")->set_base(m_nvram_data.get(), 0x8000); +} + +void isa16_przone_jamma_if::device_reset() +{ +} + +void isa16_przone_jamma_if::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_PROGRAM) + { + m_isa->install_memory(0x000d0000, 0x000d7fff, *this, &isa16_przone_jamma_if::mem_map); + } + + if (space_id == AS_IO) + { + m_isa->install_device(0x0300, 0x030f, *this, &isa16_przone_jamma_if::io_map); + } +} + +uint8_t isa16_przone_jamma_if::nvram_r(offs_t offset) +{ + return m_nvram_data[offset]; +} + +void isa16_przone_jamma_if::nvram_w(offs_t offset, uint8_t data) +{ + m_nvram_data[offset] = data; +} + +void isa16_przone_jamma_if::mem_map(address_map &map) +{ + map(0x0000, 0x7fff).rw(FUNC(isa16_przone_jamma_if::nvram_r), FUNC(isa16_przone_jamma_if::nvram_w)); +} + +void isa16_przone_jamma_if::io_map(address_map &map) +{ + map(0x04, 0x05).lr16(NAME([this] () { return m_iocard->read(); })); +} + +static INPUT_PORTS_START( przone_jamma ) + PORT_START("IOCARD") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_COIN5 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_COIN6 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "1-1" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + +ioport_constructor isa16_przone_jamma_if::device_input_ports() const +{ + return INPUT_PORTS_NAME(przone_jamma); +} + +namespace { + +class przone_state : public driver_device +{ +public: + przone_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + { } + + void przone(machine_config &config); + +private: + void main_io(address_map &map); + void main_map(address_map &map); + + static void smc_superio_config(device_t *device); +}; + +void przone_state::main_map(address_map &map) +{ + map.unmap_value_high(); +} + +void przone_state::main_io(address_map &map) +{ + map.unmap_value_high(); +} + +static INPUT_PORTS_START( przone ) +INPUT_PORTS_END + +static void isa_internal_devices(device_slot_interface &device) +{ + device.option_add("fdc37c93x", FDC37C93X); +} + +void przone_isa16_cards(device_slot_interface &device) +{ + device.option_add("przone_jamma_if", ISA16_PRZONE_JAMMA_IF); +} + +static void isa_com(device_slot_interface &device) +{ + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); +} + +void przone_state::smc_superio_config(device_t *device) +{ + fdc37c93x_device &fdc = *downcast(device); + fdc.set_sysopt_pin(1); + fdc.gp20_reset().set_inputline(":maincpu", INPUT_LINE_RESET); + fdc.gp25_gatea20().set_inputline(":maincpu", INPUT_LINE_A20); + fdc.irq1().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq1_w)); + fdc.irq8().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq8n_w)); + fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); + fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); + fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); + fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); + fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); + fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); +} + +void przone_state::przone(machine_config &config) +{ + // unknown CPU, lowered to PCI clock for ViRGE being really the bottleneck here. + pentium_device &maincpu(PENTIUM(config, "maincpu", 33'333'333)); + maincpu.set_addrmap(AS_PROGRAM, &przone_state::main_map); + maincpu.set_addrmap(AS_IO, &przone_state::main_io); + maincpu.set_irq_acknowledge_callback("pci:07.0:pic8259_master", FUNC(pic8259_device::inta_cb)); + maincpu.smiact().set("pci:00.0", FUNC(i82439hx_host_device::smi_act_w)); + + PCI_ROOT(config, "pci", 0); + // TODO: confirm size + I82439HX(config, "pci:00.0", 0, "maincpu", 256*1024*1024); + + i82371sb_isa_device &isa(I82371SB_ISA(config, "pci:07.0", 0, "maincpu")); + isa.boot_state_hook().set([](u8 data) { /* printf("%02x\n", data); */ }); + isa.smi().set_inputline("maincpu", INPUT_LINE_SMI); + + i82371sb_ide_device &ide(I82371SB_IDE(config, "pci:07.1", 0, "maincpu")); + ide.irq_pri().set("pci:07.0", FUNC(i82371sb_isa_device::pc_irq14_w)); + ide.irq_sec().set("pci:07.0", FUNC(i82371sb_isa_device::pc_mirq0_w)); + ide.subdevice("ide1")->slot(0).set_default_option("cdrom"); +// ide.subdevice("ide1")->slot(0).set_option_machine_config("cdrom", cdrom_config); + ide.subdevice("ide2")->slot(0).set_default_option(nullptr); + + PCI_SLOT(config, "pci:1", pci_cards, 15, 0, 1, 2, 3, nullptr); + PCI_SLOT(config, "pci:2", pci_cards, 16, 1, 2, 3, 0, nullptr); + PCI_SLOT(config, "pci:3", pci_cards, 17, 2, 3, 0, 1, nullptr); + PCI_SLOT(config, "pci:4", pci_cards, 18, 3, 0, 1, 2, "virge"); + + ISA16_SLOT(config, "board4", 0, "pci:07.0:isabus", isa_internal_devices, "fdc37c93x", true).set_option_machine_config("fdc37c93x", smc_superio_config); + ISA16_SLOT(config, "isa1", 0, "pci:07.0:isabus", przone_isa16_cards, "przone_jamma_if", true); + // TODO: one slot for vibra16 + ISA16_SLOT(config, "isa2", 0, "pci:07.0:isabus", pc_isa16_cards, "sblaster_16", false); + ISA16_SLOT(config, "isa3", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); + + rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); + serport0.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd1_w)); + serport0.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd1_w)); + serport0.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr1_w)); + serport0.ri_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::nri1_w)); + serport0.cts_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ncts1_w)); + + rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); + serport1.rxd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::rxd2_w)); + serport1.dcd_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndcd2_w)); + serport1.dsr_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ndsr2_w)); + serport1.ri_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::nri2_w)); + serport1.cts_handler().set("board4:fdc37c93x", FUNC(fdc37c93x_device::ncts2_w)); +} + + +ROM_START( przonegd ) + ROM_REGION32_LE(0x40000, "pci:07.0", 0) + // borrowed from pcipc -bios 2 (El Torito), technically a BAD_DUMP + ROM_LOAD("m7s04.rom", 0, 0x40000, CRC(3689f5a9) SHA1(8daacdb0dc6783d2161680564ffe83ac2515f7ef)) + + DISK_REGION( "pci:07.1:ide1:0:cdrom" ) + DISK_IMAGE_READONLY( "prizezonegold_201", 0, SHA1(54eec0d7b8629f8e8a4c9b99184ece0be0e8eb06) ) +ROM_END + +} // anonymous namespace + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + + +GAME( 1997, przonegd, 0, przone, przone, przone_state, empty_init, ROT0, "Lazer-Tron", "Prize Zone Gold (USA, v2.01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Wed Dec 31 11:13:17 1997 diff -Nru mame-0.263+dfsg.1/src/mame/pc/quakeat.cpp mame-0.264+dfsg.1/src/mame/pc/quakeat.cpp --- mame-0.263+dfsg.1/src/mame/pc/quakeat.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/quakeat.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -93,8 +93,10 @@ //#include "bus/rs232/rs232.h" //#include "bus/rs232/sun_kbd.h" //#include "bus/rs232/terminal.h" -#include "video/clgd546x_laguna.h" +#include "video/voodoo_pci.h" +// TODO: change me up to agp_slot +#define PCI_AGP_ID "pci:01.0:00.0" namespace { @@ -104,6 +106,7 @@ quakeat_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_voodoo(*this, PCI_AGP_ID) { } void ga6la7(machine_config &config); @@ -111,6 +114,7 @@ private: required_device m_maincpu; + required_device m_voodoo; void ga6la7_map(address_map &map); void ga6la7_io(address_map &map); @@ -129,13 +133,6 @@ map.unmap_value_high(); } -// temp, to be removed -void quakeat_state::quake_map(address_map &map) -{ - map(0x000e0000, 0x000fffff).rom().region("pc_bios", 0); - map(0xfffe0000, 0xffffffff).rom().region("pc_bios", 0); -} - static INPUT_PORTS_START( quake ) INPUT_PORTS_END @@ -195,17 +192,22 @@ ISA16_SLOT(config, "isa2", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); ISA16_SLOT(config, "isa3", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false); - // TODO: really has a Voodoo Banshee instead - CIRRUS_GD5465_LAGUNA3D(config, "pci:01.0:00.0", 0); + VOODOO_BANSHEE_X86_PCI(config, m_voodoo, 0, m_maincpu, "screen"); // "pci:0d.0" J4D2 + m_voodoo->set_fbmem(8); + m_voodoo->set_status_cycles(1000); +// subdevice(PCI_AGP_ID":voodoo")->vblank_callback().set("pci:07.0", FUNC(i82371eb_isa_device::pc_irq5_w)); + + // TODO: fix legacy raw setup here + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(57); + screen.set_size(640, 480); + screen.set_visarea(0, 640 - 1, 0, 480 - 1); + screen.set_screen_update(PCI_AGP_ID, FUNC(voodoo_banshee_pci_device::screen_update)); } void quakeat_state::quake(machine_config &config) { - PENTIUM2(config, m_maincpu, 233'000'000); /* Pentium II, 233MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &quakeat_state::quake_map); -// m_maincpu->set_disable(); - - PCI_ROOT(config, "pci", 0); + ga6la7(config); // ... } @@ -216,7 +218,7 @@ ROM_START(quake) // 4N4XL0X0.86A.0011.P05 - ROM_REGION32_LE(0x20000, "pc_bios", 0) /* motherboard bios */ + ROM_REGION32_LE(0x20000, "pci:07.0", 0) /* motherboard bios */ // TODO: compressed // ROM_LOAD("p05-0011.bio", 0x000000, 0x10000, NO_DUMP ) // ROM_CONTINUE( 0x1ffff-0xa0, 0xa0 ) diff -Nru mame-0.263+dfsg.1/src/mame/pc/sis630.cpp mame-0.264+dfsg.1/src/mame/pc/sis630.cpp --- mame-0.263+dfsg.1/src/mame/pc/sis630.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/sis630.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3,57 +3,61 @@ // thanks-to: Diego Nappino /************************************************************************************************** - SiS 630 chipset based PC +SiS 630 chipset based PC - TODO (main): - - PS/2 loses IRQs, mouse is unusable, "ibm" BIOS doesn't work at all; - - Super I/O handling of ITE 8705F (I/O $2e / $2f) - \- We currently (wrongly) handle most stuff in PCI LPC instead; - \- Another Super I/O is the HW motherboard monitor, - cfr. I/O $294 reads in shutms11 BIOS fan tests; - - '900 Ethernet (missing ROM dump); - - USB controllers (OpenHCI complaint); - - Floppy drive, unsupported SMC37C673 default; - - ACPI is not fully lpc-acpi complaint; - - EISA slots; - - PnP from LPC; - - SMBus; - - TODO (usability, to be moved in a SW list): - - windows xp sp3: tests HW then does an ACPI devtrap write ($48), will eventually BSoD with - ACPI STOP #a5 error with param $11 - \- To bypass hold F7 while the "to install SCSI drivers [...] press F6" appears. - And by F7 I really mean it :shrug: - - - windows xp sp3: BSoD during install with a STOP #0a IRQL_NOT_LESS_OR_EQUAL; - - - windows neptune: BSoD during ethernet check (after time clock setup) - with a STOP #a0 INTERNAL_POWER_ERROR with param1 0x5 ("reserved"!?) - - - gamecstl Kontron BIOS: - \- hangs at PC=0xf3cf2, again wanting a SMI# from devtrap_en_w; - \- No PS/2 inputs; - - - gamecstl dump (tested from shutms11, also see notes below): - \- Currently black screens before booting normal Windows, reading $5004 from the LPC ACPI - (flip EAX to non-zero to bypass). - NB: it also writes to $5048 once (devtrap_en_w), which should generate a SMI# event; - \- Doesn't accept any PS/2 input, tries to install a "PCI standard CPU Host Bridge" (?), - hangs there; - \- GUI is never recognized no matter what, punts with DirectX not installed; - - - xubuntu 6.10: throws several SCSIDEV unhandled $46 & $51 commands - (get configuration/read disc information), - eventually punts to prompt with a "can't access tty: job control turned off" (on live CD) or - hangs at "Configuring network interfaces" (on actual install); - - - xubuntu 10.10: stalls after '900 ethernet check; - - - Haiku 0.1: hangs throwing an "unhandled READ TOC format 2", - serial COM1 prints a "vm_mark_page_range_inuse: page 0x9f in non-free state 7!" - - - Red Hat 6.2: Triple Faults on x87 exception check - \- prints the type of mounted floating point exception if bypassed. +TODO (main): +- Finalize Super I/O handling of ITE 8705F (I/O $2e / $2f) +\- fan monitor, cfr. I/O $294 reads in shutms11 BIOS fan tests; +\- FDC doesn't work, moans on first boot; +- '900 Ethernet PXE (missing ROM dump); +- USB controllers (OpenHCI complaint); +- ACPI is not fully lpc-acpi complaint; +- EISA slots; +- SMBus; +- PS/2 mouse is unstable, worked around by disabling and using a serial mouse instead. + +TODO (usability, to be moved in a SW list): +- windows xp sp3: tests HW then does an ACPI devtrap write ($48), will eventually BSoD with + ACPI STOP #a5 error with param $11 +\- To bypass hold F7 while the "to install SCSI drivers [...] press F6" appears. + And by F7 I really mean it :shrug: + +- windows xp sp3: BSoD during install with a STOP #0a IRQL_NOT_LESS_OR_EQUAL; + +- windows neptune: BSoD during ethernet check (after time clock setup) + with a STOP #a0 INTERNAL_POWER_ERROR with param1 0x5 ("reserved"!?) + +- gamecstl Kontron BIOS: +\- hangs at PC=0xf3cf2, again wanting a SMI# from devtrap_en_w; +\- No PS/2 inputs; + +- gamecstl dump (tested from shutms11, also see notes below): +\- Currently black screens before booting normal Windows, reading $5004 from the LPC ACPI + (flip EAX to non-zero to bypass). + NB: it also writes to $5048 once (devtrap_en_w), which should generate a SMI# event; +\- Doesn't accept any PS/2 input, tries to install a "PCI standard CPU Host Bridge" (?), + hangs there; +\- GUI is never recognized no matter what, punts with DirectX not installed; + +- xubuntu 6.10: throws several SCSIDEV unhandled $46 & $51 commands + (get configuration/read disc information), + eventually punts to prompt with a "can't access tty: job control turned off" (on live CD) or + hangs at "Configuring network interfaces" (on actual install); + +- xubuntu 10.10: stalls after '900 ethernet check; + +- Haiku 0.1: hangs throwing an "unhandled READ TOC format 2", + serial COM1 prints a "vm_mark_page_range_inuse: page 0x9f in non-free state 7!" + +- Red Hat 6.2: Triple Faults on x87 exception check +\- prints the type of mounted floating point exception if bypassed. + +Notes on possible shutms11 BIOS bugs: +- BeOS 5 hardwires serial mouse checks at $2e8, ignoring BIOS PnP. +- FreeDOS 1.3 ctmouse often fails serial detection (will work if you load it at prompt) +- BIOS in general often throws serial conflicts when changing port setups, + even on perfectly valid combinations (i.e. COM1 assigned while COM2 is *disabled*) +- PCI device listing often forgets to list print ACPI irq. =================================================================================================== @@ -153,7 +157,13 @@ #include "cpu/i386/i386.h" #include "bus/isa/isa_cards.h" #include "bus/pc_kbd/keyboards.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/sun_kbd.h" +#include "bus/rs232/terminal.h" #include "machine/intelfsh.h" +#include "machine/it8705f.h" #include "machine/pci.h" #include "machine/sis5513_ide.h" #include "machine/sis630_host.h" @@ -193,12 +203,44 @@ // void main_io(address_map &map); // void main_map(address_map &map); + static void ite_superio_config(device_t *device); }; static INPUT_PORTS_START(sis630) INPUT_PORTS_END +static void isa_com(device_slot_interface &device) +{ + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); +} + +static void isa_internal_devices(device_slot_interface &device) +{ + device.option_add("it8705f", IT8705F); +} + +void sis630_state::ite_superio_config(device_t *device) +{ + it8705f_device &fdc = *downcast(device); +// fdc.set_sysopt_pin(1); + fdc.irq1().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq1_w)); + fdc.irq8().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq8n_w)); + fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); + fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); + fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); + fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); + fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); + fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); +} + void sis630_state::sis630(machine_config &config) { // Slot 1/Socket 370, Coppermine FC-PGA @ 500~850+/100 MHz or Celeron PPGA 300~600+ MHz @@ -257,6 +299,24 @@ // TODO: 1 parallel + 2 serial ports // TODO: 1 game port ('7018?) + // TODO: move in MB implementations + // (some unsupported variants uses W83697HF, namely Gigabyte GA-6SMZ7) + ISA16_SLOT(config, "superio", 0, "pci:01.0:isabus", isa_internal_devices, "it8705f", true).set_option_machine_config("it8705f", ite_superio_config); + + rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, "microsoft_mouse")); + serport0.rxd_handler().set("superio:it8705f", FUNC(it8705f_device::rxd1_w)); + serport0.dcd_handler().set("superio:it8705f", FUNC(it8705f_device::ndcd1_w)); + serport0.dsr_handler().set("superio:it8705f", FUNC(it8705f_device::ndsr1_w)); + serport0.ri_handler().set("superio:it8705f", FUNC(it8705f_device::nri1_w)); + serport0.cts_handler().set("superio:it8705f", FUNC(it8705f_device::ncts1_w)); + + rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); + serport1.rxd_handler().set("superio:it8705f", FUNC(it8705f_device::rxd2_w)); + serport1.dcd_handler().set("superio:it8705f", FUNC(it8705f_device::ndcd2_w)); + serport1.dsr_handler().set("superio:it8705f", FUNC(it8705f_device::ndsr2_w)); + serport1.ri_handler().set("superio:it8705f", FUNC(it8705f_device::nri2_w)); + serport1.cts_handler().set("superio:it8705f", FUNC(it8705f_device::ncts2_w)); + // TODO: AMR (Audio/modem riser) + UPT (Panel Link-TV out), assume [E]ISA complaint, needs specific slot options // ISA16_SLOT(config, "isa1", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); // ISA16_SLOT(config, "isa2", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); diff -Nru mame-0.263+dfsg.1/src/mame/pc/tosh1000_bram.cpp mame-0.264+dfsg.1/src/mame/pc/tosh1000_bram.cpp --- mame-0.263+dfsg.1/src/mame/pc/tosh1000_bram.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pc/tosh1000_bram.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -56,8 +56,8 @@ bool tosh1000_bram_device::nvram_read(util::read_stream &file) { - size_t actual; - return !file.read(m_bram, BRAM_SIZE, actual) && actual == BRAM_SIZE; + auto const [err, actual] = util::read(file, m_bram, BRAM_SIZE); + return !err && (actual == BRAM_SIZE); } //------------------------------------------------- @@ -67,8 +67,8 @@ bool tosh1000_bram_device::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_bram, BRAM_SIZE, actual) && actual == BRAM_SIZE; + auto const [err, actual] = util::write(file, m_bram, BRAM_SIZE); + return !err; } //------------------------------------------------- diff -Nru mame-0.263+dfsg.1/src/mame/pinball/idsa.cpp mame-0.264+dfsg.1/src/mame/pinball/idsa.cpp --- mame-0.263+dfsg.1/src/mame/pinball/idsa.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pinball/idsa.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Ivan Vangelista, Robbbert +// copyright-holders:Robbbert /*********************************************************************************************************************** PINBALL IDSA pinballs diff -Nru mame-0.263+dfsg.1/src/mame/pinball/s11b.cpp mame-0.264+dfsg.1/src/mame/pinball/s11b.cpp --- mame-0.263+dfsg.1/src/mame/pinball/s11b.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/pinball/s11b.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1563,6 +1563,28 @@ ROM_RELOAD(0x58000,0x8000) ROM_END +ROM_START(tsptr_l1) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("transporter-la1-u26-checksumb412.l1", 0x4000, 0x4000, CRC(3504300f) SHA1(1a8b779b7375e4087e42b31c1aa17a8a32c6d6aa)) + ROM_LOAD("transporter-la1-u27-checksum01cf.l1", 0x8000, 0x8000, CRC(49635399) SHA1(8cdc700c501f0d611152010d5ae28bcd84d06861)) + ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF) + ROM_LOAD("transporter-u21-checksumca54.l1", 0x8000, 0x8000, CRC(2b194ca6) SHA1(20cb956143622409a7f4b918ab1699db1b6e6b07)) + ROM_LOAD("transporter-u22-checksumd84c.l1", 0x0000, 0x8000, CRC(4c7ba6d7) SHA1(0134dce454c29c572c4ee0e0139a8ad5f0249b99)) + ROM_REGION(0x80000, "bg:cpu", ROMREGION_ERASEFF) + ROM_LOAD("transporter-u4-checksum58b0.l1", 0x00000, 0x8000, CRC(63e92f8b) SHA1(57f2841419415fc3560d46a63119c76f98cade9b)) + ROM_RELOAD(0x08000,0x8000) + ROM_RELOAD(0x10000,0x8000) + ROM_RELOAD(0x18000,0x8000) + ROM_LOAD("transporter-u19-checksumc7af.l1", 0x20000, 0x8000, CRC(3cfde8b0) SHA1(7bdc71ba1ba4fd337f052354323c86fd97b2b881)) // only common ROM with L3 + ROM_RELOAD(0x28000,0x8000) + ROM_RELOAD(0x30000,0x8000) + ROM_RELOAD(0x38000,0x8000) + ROM_LOAD("transporter-u20-checksum21ae.l1", 0x40000, 0x8000, CRC(fabddaaf) SHA1(7c014bb5b1ac8da61ffd265ba98bcb8256c5f666)) + ROM_RELOAD(0x48000,0x8000) + ROM_RELOAD(0x50000,0x8000) + ROM_RELOAD(0x58000,0x8000) +ROM_END + /*----------------------- / Whirlwind 4/90 (#574) /-----------------------*/ @@ -1735,6 +1757,7 @@ GAME(1988, taxi_lg1, taxi_l4, s11b, s11b, s11b_state, init_s11bi7, ROT0, "Williams", "Taxi (Marilyn) (L-1) Germany", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1988, taxi_p5, taxi_l4, s11b, s11b, s11b_state, init_s11bi7, ROT0, "Williams", "Taxi (P-5)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1989, tsptr_l3, 0, s11b, s11b, s11b_state, init_s11bin, ROT0, "Bally", "Transporter the Rescue (L-3)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1989, tsptr_l1, tsptr_l3, s11b, s11b, s11b_state, init_s11bin, ROT0, "Bally", "Transporter the Rescue (LA-1)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1990, whirl_l3, 0, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Whirlwind (LA-3)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1990, whirl_l2, whirl_l3, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Whirlwind (LU-2)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1990, whirl_lg3, whirl_l3, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Whirlwind (LG-3)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/playmark/sderby.cpp mame-0.264+dfsg.1/src/mame/playmark/sderby.cpp --- mame-0.263+dfsg.1/src/mame/playmark/sderby.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/playmark/sderby.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,8 +168,6 @@ void spacewin_map(address_map &map); }; -// video - TILE_GET_INFO_MEMBER(sderby_state::get_bg_tile_info) { @@ -289,8 +287,6 @@ } -// machine - /*************************** * R/W Handlers * ***************************/ diff -Nru mame-0.263+dfsg.1/src/mame/ramtek/ramtek.cpp mame-0.264+dfsg.1/src/mame/ramtek/ramtek.cpp --- mame-0.263+dfsg.1/src/mame/ramtek/ramtek.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ramtek/ramtek.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -247,10 +247,10 @@ } // anonymous namespace -GAME( 1973, vollyrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Volly (Ramtek) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1973, hockyrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Hockey (Ramtek) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1973, soccrrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Soccer (Ramtek) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1974, wipeormt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Wipeout (Ramtek) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1974, cleanswp, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Clean Sweep [TTL]", MACHINE_IS_SKELETON ) -GAME( 1974, bballrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Baseball (Ramtek) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1975, trivia, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Trivia (Rev B) [TTL]", MACHINE_IS_SKELETON ) +GAME( 1973, vollyrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Volly (Ramtek)", MACHINE_IS_SKELETON ) +GAME( 1973, hockyrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Hockey (Ramtek)", MACHINE_IS_SKELETON ) +GAME( 1973, soccrrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Soccer (Ramtek)", MACHINE_IS_SKELETON ) +GAME( 1974, wipeormt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Wipeout (Ramtek)", MACHINE_IS_SKELETON ) +GAME( 1974, cleanswp, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Clean Sweep", MACHINE_IS_SKELETON ) +GAME( 1974, bballrmt, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Baseball (Ramtek)", MACHINE_IS_SKELETON ) +GAME( 1975, trivia, 0, ramtek, 0, ramtek_state, empty_init, ROT0, "Ramtek", "Trivia (Rev B)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/rm/rm380z.cpp mame-0.264+dfsg.1/src/mame/rm/rm380z.cpp --- mame-0.263+dfsg.1/src/mame/rm/rm380z.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/rm/rm380z.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,7 +168,6 @@ #include "rm380z.h" #include "speaker.h" -#include "emupal.h" #include "screen.h" @@ -186,19 +185,19 @@ { map.global_mask(0xff); map(0x00, 0xbf).rw(FUNC(rm380z_state::rm380z_portlow_r), FUNC(rm380z_state::rm380z_portlow_w)); - map(0xc0, 0xc3).rw(m_fdc, FUNC(fd1771_device::read), FUNC(fd1771_device::write)); - map(0xc4, 0xc4).w(FUNC(rm380z_state::disk_0_control)); - map(0xc5, 0xff).rw(FUNC(rm380z_state::rm380z_porthi_r), FUNC(rm380z_state::rm380z_porthi_w)); + map(0xc0, 0xc3).mirror(0x20).rw(m_fdc, FUNC(fd1771_device::read), FUNC(fd1771_device::write)); + map(0xc4, 0xc7).mirror(0x20).w(FUNC(rm380z_state::disk_0_control)); + map(0xe8, 0xff).rw(FUNC(rm380z_state::rm380z_porthi_r), FUNC(rm380z_state::rm380z_porthi_w)); } -void rm380z_state::rm480z_mem(address_map &map) +void rm480z_state::rm480z_mem(address_map &map) { map(0x0000, 0xe7ff).ram(); map(0xe800, 0xf7ff).rom().region(RM380Z_MAINCPU_TAG, 0); map(0xf800, 0xffff).ram(); } -void rm380z_state::rm480z_io(address_map &map) +void rm480z_state::rm480z_io(address_map &map) { //map(0x00, 0x17).ram(); // videoram //map(0x18, 0x18).mirror(0xff00); // control port 0 @@ -206,7 +205,7 @@ //map(0x1a, 0x1a).mirror(0xff00); // control port 2 //map(0x1b, 0x1b).mirror(0xff00); // control port 3 (DAC) // option //map(0x1d, 0x1d).mirror(0xff00); // control port 5 (USERIO) // option - //map(0x20, 0x23).mirror(0xff00); // system CTC - 0=SIO4&cassin, 1=SIO2&cassio, 2=keybd int, 3=50hz int for repeat key + //map(0x20, 0x23).mirror(0xff00); // system CTC - 0=SIO4&cassin, 1=SIO2&cassio, 2=keybd int, 3=50Hz int for repeat key //map(0x24, 0x27).mirror(0xff00); // system SIO - 0=chA network data, 1=chB SIO4 data, 2=ChA control, 3=ChB control //map(0x28, 0x29).mirror(0xff02); // am9511/am9512 maths chip // option //map(0x2c, 0x2f).mirror(0xff00); // z80ctc IEEE int, Maths int, RTC, RTC // option @@ -215,8 +214,19 @@ } INPUT_PORTS_START( rm380z ) + // PORT_START("additional_chars") // PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CODE(KEYCODE_ESC) + +INPUT_PORTS_END + +INPUT_PORTS_START( rm380zhrg ) + + PORT_START("display_type") + PORT_CONFNAME( 0x01, 0x00, "Monitor" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rm380z_state_cos40_hrg, monitor_changed, 0) + PORT_CONFSETTING( 0x00, "Colour Monitor" ) + PORT_CONFSETTING( 0x01, "Monochrome b/w Monitor" ) + INPUT_PORTS_END // @@ -225,23 +235,21 @@ static void rm380z_floppies(device_slot_interface &device) { - device.option_add("sssd", FLOPPY_525_SSSD); + device.option_add("mds", FLOPPY_525_SD); + device.option_add("fds", FLOPPY_8_DSSD); } uint32_t rm380z_state::screen_update_rm380z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - if (screen.width() > 240) - { - update_screen_vdu80(bitmap); - } - else - { - update_screen_vdu40(bitmap); - } + // blank screen + bitmap.fill(0); + + update_screen(bitmap); + return 0; } -void rm380z_state::rm380z(machine_config &config) +void rm380z_state::configure(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 16_MHz_XTAL / 4); @@ -249,46 +257,77 @@ m_maincpu->set_addrmap(AS_IO, &rm380z_state::rm380z_io); /* video hardware */ + PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(50); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen->set_size(640, 240); - m_screen->set_visarea_full(); m_screen->set_screen_update(FUNC(rm380z_state::screen_update_rm380z)); - m_screen->set_palette("palette"); - - PALETTE(config, "palette", palette_device::MONOCHROME); + m_screen->set_palette(m_palette); SPEAKER(config, "mono").front_center(); - /* cassette */ - CASSETTE(config, m_cassette); -// m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - /* RAM configurations */ RAM(config, RAM_TAG).set_default_size("56K"); /* floppy disk */ - FD1771(config, m_fdc, 1_MHz_XTAL); + FD1771(config, m_fdc, 16_MHz_XTAL / 16); - FLOPPY_CONNECTOR(config, "wd1771:0", rm380z_floppies, "sssd", floppy_image_device::default_mfm_floppy_formats); - FLOPPY_CONNECTOR(config, "wd1771:1", rm380z_floppies, "sssd", floppy_image_device::default_mfm_floppy_formats); + FLOPPY_CONNECTOR(config, m_floppy0, rm380z_floppies, "mds", floppy_image_device::default_mfm_floppy_formats).set_fixed(true); + FLOPPY_CONNECTOR(config, m_floppy1, rm380z_floppies, "mds", floppy_image_device::default_mfm_floppy_formats).set_fixed(true); /* keyboard */ generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0)); keyboard.set_keyboard_callback(FUNC(rm380z_state::keyboard_put)); } -void rm380z_state::rm480z(machine_config &config) +void rm380z_state_cos34::configure(machine_config &config) +{ + rm380z_state::configure(config); + + /* cassette */ + CASSETTE(config, m_cassette); +// m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); + m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); + m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); + + m_screen->set_raw(8_MHz_XTAL, 512, 0, 320, 312, 0, 240); + + SN74S262(config, m_rocg, 0); + m_rocg->set_palette(m_palette); +} + +void rm380z_state_cos34::configure_fds(machine_config &config) +{ + rm380z_state_cos34::configure(config); + + m_floppy0->set_default_option("fds"); + m_floppy1->set_default_option("fds"); + + // FDS drives require a 2 MHz square wave clock frequency + m_fdc->set_unscaled_clock(16_MHz_XTAL / 8); +} + +void rm380z_state_cos40::configure(machine_config &config) +{ + rm380z_state::configure(config); + + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.80); + + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 240); +} + +void rm380z_state_cos40_hrg::configure(machine_config &config) +{ + rm380z_state_cos40::configure(config); + + m_palette->set_init(FUNC(rm380z_state_cos40_hrg::palette_init)).set_entries(19); +} + +void rm480z_state::configure(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 16_MHz_XTAL / 4); - m_maincpu->set_addrmap(AS_PROGRAM, &rm380z_state::rm480z_mem); - m_maincpu->set_addrmap(AS_IO, &rm380z_state::rm480z_io); + m_maincpu->set_addrmap(AS_PROGRAM, &rm480z_state::rm480z_mem); + m_maincpu->set_addrmap(AS_IO, &rm480z_state::rm480z_io); - MCFG_MACHINE_RESET_OVERRIDE(rm380z_state, rm480z) /* video hardware */ // screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // screen.set_refresh_hz(50); @@ -309,19 +348,13 @@ /* ROM definitions */ ROM_START( rm380z34d ) // COS 3.4D/F - ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) + ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "cos34d-f.bin", 0x0000, 0x1000, CRC(eb128b40) SHA1(c46f358fb76459987e41750d052995563f2f7d53)) - // chargen ROM is undumped, afaik - ROM_REGION( 0x1680, "chargen", 0 ) - ROM_LOAD( "ch3.raw", 0x0000, 0x1680, BAD_DUMP CRC(c223622b) SHA1(185ef24896419d7ff46f71a760ac217de3811684)) ROM_END ROM_START( rm380z34e ) // COS 3.4E/M - ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) + ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "cos34e-m.bin", 0x0000, 0x1000, CRC(20e2ddf4) SHA1(3177b28793d5a348c94fd0ae6393d74e2e9a8662)) - // chargen ROM is undumped, afaik - ROM_REGION( 0x1680, "chargen", 0 ) - ROM_LOAD( "ch3.raw", 0x0000, 0x1680, BAD_DUMP CRC(c223622b) SHA1(185ef24896419d7ff46f71a760ac217de3811684)) ROM_END ROM_START( rm380z ) // COS 4.0B/M @@ -334,6 +367,16 @@ ROM_LOAD( "c-gen-22.bin", 0x0000, 0x0800, CRC(1b67127f) SHA1(289a919871d30c5e832d22244bcac1dcfd544baa) ) ROM_END +ROM_START( rm380zhrg ) // COS 4.0B/M + ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) + // I'm not sure of how those ROMs have been dumped. I don't know if those are good dumps or not. + ROM_LOAD( "cos40b-m.bin", 0x0000, 0x1000, BAD_DUMP CRC(1f0b3a5c) SHA1(0b29cb2a3b7eaa3770b34f08c4fd42844f42700f) ) + ROM_LOAD( "cos40b-m_f600-f9ff.bin", 0x1000, 0x0400, BAD_DUMP CRC(e3397d9d) SHA1(490a0c834b0da392daf782edc7d51ca8f0668b1a) ) + ROM_LOAD( "cos40b-m_1c00-1dff.bin", 0x1400, 0x0200, BAD_DUMP CRC(0f759f44) SHA1(9689c1c1faa62c56def999cbedbbb0c8d928dcff) ) + ROM_REGION( 0x0800, "chargen", 0 ) + ROM_LOAD( "c-gen-22.bin", 0x0000, 0x0800, CRC(1b67127f) SHA1(289a919871d30c5e832d22244bcac1dcfd544baa) ) +ROM_END + // RM480Z is quite different, might be better off in its own driver ROM_START( rm480z ) ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) @@ -358,9 +401,10 @@ /* Driver */ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP(1978, rm380z, 0, 0, rm380z, rm380z, rm380z_state, init_rm380z, "Research Machines", "RM-380Z, COS 4.0B", MACHINE_NO_SOUND_HW) -COMP(1978, rm380z34d, rm380z, 0, rm380z, rm380z, rm380z_state, init_rm380z34d, "Research Machines", "RM-380Z, COS 3.4D", MACHINE_NO_SOUND_HW) -COMP(1978, rm380z34e, rm380z, 0, rm380z, rm380z, rm380z_state, init_rm380z34e, "Research Machines", "RM-380Z, COS 3.4E", MACHINE_NO_SOUND_HW) -COMP(1981, rm480z, rm380z, 0, rm480z, rm380z, rm380z_state, init_rm480z, "Research Machines", "LINK RM-480Z (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) -COMP(1981, rm480za, rm380z, 0, rm480z, rm380z, rm380z_state, init_rm480z, "Research Machines", "LINK RM-480Z (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP(1978, rm380z, 0, 0, configure, rm380z, rm380z_state_cos40, driver_device::empty_init, "Research Machines", "RM-380Z, COS 4.0B", 0) +COMP(1978, rm380zhrg, rm380z, 0, configure, rm380zhrg, rm380z_state_cos40_hrg, driver_device::empty_init, "Research Machines", "RM-380Z, COS 4.0B with HRG", 0) +COMP(1978, rm380z34d, rm380z, 0, configure_fds, rm380z, rm380z_state_cos34, driver_device::empty_init, "Research Machines", "RM-380Z, COS 3.4D", MACHINE_NO_SOUND_HW) +COMP(1978, rm380z34e, rm380z, 0, configure, rm380z, rm380z_state_cos34, driver_device::empty_init, "Research Machines", "RM-380Z, COS 3.4E", MACHINE_NO_SOUND_HW) +COMP(1981, rm480z, rm380z, 0, configure, rm380z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK RM-480Z (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP(1981, rm480za, rm380z, 0, configure, rm380z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK RM-480Z (set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) diff -Nru mame-0.263+dfsg.1/src/mame/rm/rm380z.h mame-0.264+dfsg.1/src/mame/rm/rm380z.h --- mame-0.263+dfsg.1/src/mame/rm/rm380z.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/rm/rm380z.h 2024-03-25 14:00:46.000000000 +0000 @@ -18,6 +18,10 @@ #include "machine/keyboard.h" #include "machine/ram.h" #include "machine/wd_fdc.h" +#include "sound/spkrdev.h" +#include "video/sn74s262.h" + +#include "emupal.h" // // @@ -29,16 +33,15 @@ // // - +// abstract base class class rm380z_state : public driver_device { -public: +protected: rm380z_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_chargen(*this, "chargen"), m_maincpu(*this, RM380Z_MAINCPU_TAG), m_screen(*this, "screen"), - m_cassette(*this, "cassette"), + m_palette(*this, "palette"), m_messram(*this, RAM_TAG), m_fdc(*this, "wd1771"), m_floppy0(*this, "wd1771:0"), @@ -46,23 +49,119 @@ { } - void rm480z(machine_config &config); - void rm380z(machine_config &config); + static inline constexpr int RM380Z_SCREENROWS = 24; + static inline constexpr int RM380Z_SCREENCOLS = 40; + + void configure(machine_config &config); + + void machine_reset() override; + + bool ports_enabled_high() const { return bool(m_port0 & 0x80); } + bool ports_enabled_low() const { return !(m_port0 & 0x80); } - void init_rm380z(); - void init_rm380z34d(); - void init_rm380z34e(); - void init_rm480z(); + virtual bool get_rowcol_from_offset(int &row, int &col, offs_t offset) const; + + virtual void port_write(offs_t offset, uint8_t data); + virtual uint8_t port_read(offs_t offset); + void port_write_1b00(offs_t offset, uint8_t data); + uint8_t port_read_1b00(offs_t offset); + + virtual uint8_t videoram_read(offs_t offset) = 0; + virtual void videoram_write(offs_t offset, uint8_t data) = 0; + + uint8_t rm380z_portlow_r(); + void rm380z_portlow_w(offs_t offset, uint8_t data); + uint8_t rm380z_porthi_r(); + void rm380z_porthi_w(offs_t offset, uint8_t data); + + void disk_0_control(uint8_t data); + + void keyboard_put(u8 data); + + void config_memory_map(); + virtual void update_screen(bitmap_ind16 &bitmap) const = 0; + uint32_t screen_update_rm380z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void rm380z_io(address_map &map); + void rm380z_mem(address_map &map); + + uint8_t m_port0 = 0; + uint8_t m_port0_kbd = 0; + uint8_t m_port1 = 0; + uint8_t m_fbfe = 0; + + required_device m_maincpu; + optional_device m_screen; + optional_device m_palette; + optional_device m_messram; + optional_device m_fdc; + optional_device m_floppy0; + optional_device m_floppy1; +}; + +// COS 3.4 machine with cassette and VDU-40 display +class rm380z_state_cos34 : public rm380z_state +{ +public: + rm380z_state_cos34(const machine_config &mconfig, device_type type, const char *tag) : + rm380z_state(mconfig, type, tag), + m_rocg(*this, "sn74s262"), + m_cassette(*this, "cassette") + { + } + + void configure(machine_config &config); + void configure_fds(machine_config &config); protected: - virtual void machine_reset() override; - virtual void machine_start() override; + void machine_reset() override; + + void port_write(offs_t offset, uint8_t data) override; + uint8_t port_read(offs_t offset) override; + void update_screen(bitmap_ind16 &bitmap) const override; + uint8_t videoram_read(offs_t offset) override; + void videoram_write(offs_t offset, uint8_t data) override; private: template class rm380z_vram { public: + void set_char(int row, int col, uint8_t data) { m_chars[row][col] = data; } + void reset() { memset(m_chars, 0x80, sizeof(m_chars)); } + + uint8_t get_char(int row, int col) const { return m_chars[row][col]; } + + private: + uint8_t m_chars[ROWS][COLS]; + }; + + void putChar_vdu40(int charnum, int x, int y, bitmap_ind16 &bitmap) const; + + rm380z_vram m_vram; + + required_device m_rocg; + required_device m_cassette; +}; + +// COS 4.0 machine with VDU-80 display +class rm380z_state_cos40 : public rm380z_state +{ +public: + rm380z_state_cos40(const machine_config &mconfig, device_type type, const char *tag) : + rm380z_state(mconfig, type, tag), + m_chargen(*this, "chargen"), + m_speaker(*this, "speaker") + { + } + + void configure(machine_config &config); + +protected: + template + class rm380z_vram + { + public: void set_char(int row, int col, uint8_t data) { m_chars[get_row(row)][col] = data; } void set_attrib(int row, int col, uint8_t data) { m_attribs[get_row(row)][col] = data; } void set_scroll_register(uint8_t value) { m_scroll_reg = value; } @@ -79,89 +178,108 @@ uint8_t m_scroll_reg = 0; }; + static inline constexpr int RM380Z_SCREENCOLS = 80; static inline constexpr int RM380Z_VIDEOMODE_40COL = 0x01; static inline constexpr int RM380Z_VIDEOMODE_80COL = 0x02; - static inline constexpr int RM380Z_CHDIMX = 5; - static inline constexpr int RM380Z_CHDIMY = 9; - static inline constexpr int RM380Z_NCX = 8; - static inline constexpr int RM380Z_NCY = 16; - static inline constexpr int RM380Z_SCREENCOLS = 80; - static inline constexpr int RM380Z_SCREENROWS = 24; + void machine_reset() override; - bool ports_enabled_high() const { return ( m_port0 & 0x80 ); } - bool ports_enabled_low() const { return !( m_port0 & 0x80 ); } + void port_write(offs_t offset, uint8_t data) override; + uint8_t port_read(offs_t offset) override; + void update_screen(bitmap_ind16 &bitmap) const override; + uint8_t videoram_read(offs_t offset) override; + void videoram_write(offs_t offset, uint8_t data) override; - bool get_rowcol_from_offset(int &row, int &col, offs_t offset) const; - void put_point(int charnum, int x, int y, int col); - void init_graphic_chars(); - - void putChar_vdu80(int charnum, int attribs, int x, int y, bitmap_ind16 &bitmap); - void putChar_vdu40(int charnum, int x, int y, bitmap_ind16 &bitmap); - void decode_videoram_char(int row, int col, uint8_t &chr, uint8_t &attrib); + int m_videomode = RM380Z_VIDEOMODE_80COL; + rm380z_vram m_vram; + + uint8_t m_fbfd = 0; + + required_region_ptr m_chargen; + optional_device m_speaker; + +private: void config_videomode(); + void putChar_vdu80(int charnum, int attribs, int x, int y, bitmap_ind16 &bitmap) const; + bool get_rowcol_from_offset(int &row, int &col, offs_t offset) const override; - void port_write(offs_t offset, uint8_t data); - uint8_t port_read(offs_t offset); - void port_write_1b00(offs_t offset, uint8_t data); - uint8_t port_read_1b00(offs_t offset); + uint8_t m_character_row = 0; + uint8_t m_character = 0; - uint8_t videoram_read(offs_t offset); - void videoram_write(offs_t offset, uint8_t data); + uint8_t m_user_defined_chars[2048]; +}; - uint8_t rm380z_portlow_r(); - void rm380z_portlow_w(offs_t offset, uint8_t data); - uint8_t rm380z_porthi_r(); - void rm380z_porthi_w(offs_t offset, uint8_t data); +// COS 4.0 machine with VDU-80 display, HRG and colour +class rm380z_state_cos40_hrg : public rm380z_state_cos40 +{ +public: + rm380z_state_cos40_hrg(const machine_config &mconfig, device_type type, const char *tag) : + rm380z_state_cos40(mconfig, type, tag), + m_io_display_type(*this, "display_type") + { + } - void disk_0_control(uint8_t data); + void configure(machine_config &config); - void keyboard_put(u8 data); + DECLARE_INPUT_CHANGED_MEMBER(monitor_changed); - DECLARE_MACHINE_RESET(rm480z); +protected: + void machine_reset() override; - void config_memory_map(); - void update_screen_vdu80(bitmap_ind16 &bitmap); - void update_screen_vdu40(bitmap_ind16 &bitmap); - uint32_t screen_update_rm380z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_rm480z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(static_vblank_timer); + void port_write(offs_t offset, uint8_t data) override; + uint8_t port_read(offs_t offset) override; + void update_screen(bitmap_ind16 &bitmap) const override; + uint8_t videoram_read(offs_t offset) override; + void videoram_write(offs_t offset, uint8_t data) override; - void rm380z_io(address_map &map); - void rm380z_mem(address_map &map); - void rm480z_io(address_map &map); - void rm480z_mem(address_map &map); +private: + enum class hrg_display_mode : uint8_t + { + none = 0, + high = 1, + medium_0 = 2, + medium_1 = 3 + }; - uint8_t m_port0 = 0; - uint8_t m_port0_mask = 0; - uint8_t m_port0_kbd = 0; - uint8_t m_port1 = 0; - uint8_t m_fbfd_mask = 0; - uint8_t m_fbfe = 0; + static inline constexpr int RM380Z_HRG_RAM_SIZE = 16384; // 16k + static inline constexpr int RM380Z_HRG_SCRATCHPAD_SIZE = 16; - uint8_t m_character_row = 0; - uint8_t m_character = 0; + void palette_init(palette_device &palette); + void change_hrg_scratchpad(int index, uint8_t value, uint8_t mask); + void change_palette(int index, uint8_t value); + int calculate_hrg_vram_index(offs_t offset) const; + void draw_high_res_graphics(bitmap_ind16 &bitmap) const; + void draw_medium_res_graphics(bitmap_ind16 &bitmap) const; + + uint8_t m_hrg_ram[RM380Z_HRG_RAM_SIZE]; + uint8_t m_hrg_scratchpad[RM380Z_HRG_SCRATCHPAD_SIZE]; + + uint8_t m_hrg_port0 = 0; + uint8_t m_hrg_port1 = 0; + hrg_display_mode m_hrg_display_mode = hrg_display_mode::none; - uint8_t m_graphic_chars[0x80][(RM380Z_CHDIMX+1)*(RM380Z_CHDIMY+1)]; - uint8_t m_user_defined_chars[2048]; + required_ioport m_io_display_type; +}; - rm380z_vram m_vram; +// partially implemented non working RM480z +class rm480z_state : public rm380z_state_cos40 +{ +public: + rm480z_state(const machine_config &mconfig, device_type type, const char *tag) : + rm380z_state_cos40(mconfig, type, tag) + { + } - int m_rasterlineCtr = 0; - emu_timer* m_vblankTimer = nullptr; + void configure(machine_config &config); - int m_videomode = 0; +protected: + void machine_reset() override; - emu_timer *m_static_vblank_timer = nullptr; + void update_screen(bitmap_ind16 &bitmap) const override; - required_region_ptr m_chargen; - required_device m_maincpu; - optional_device m_screen; - optional_device m_cassette; - optional_device m_messram; - optional_device m_fdc; - optional_device m_floppy0; - optional_device m_floppy1; +private: + void rm480z_io(address_map &map); + void rm480z_mem(address_map &map); }; #endif // MAME_RM_RM380Z_H diff -Nru mame-0.263+dfsg.1/src/mame/rm/rm380z_m.cpp mame-0.264+dfsg.1/src/mame/rm/rm380z_m.cpp --- mame-0.263+dfsg.1/src/mame/rm/rm380z_m.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/rm/rm380z_m.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -31,25 +31,41 @@ switch (offset) { case 0xfc: // PORT0 - //printf("%s FBFCw[%2.2x] FBFD [%2.2x] FBFE [%2.2x] writenum [%4.4x]\n", machine().describe_context().c_str(), data, m_fbfd, m_fbfe,writenum); - m_port0 = data; - - m_cassette->output((m_port0 & 0xef) ? +1.0 : -1.0); // set 2400hz, bit 4 - - if (data & 0x01) + if ((data & 0x01) && !(m_port0 & 0x01)) { - //printf("WARNING: bit0 of port0 reset\n"); + // only clear keyboard latch if bit has changed value m_port0_kbd = 0; + m_port1 &= ~0x01; } - m_port1 &= ~0x01; //? - config_videomode(); + m_port0 = data; + config_memory_map(); break; - case 0xfd: // screen line counter (?) - //printf("%s FBFC [%2.2x] FBFDw[%2.2x] FBFE [%2.2x] writenum [%4.4x]\n",machine().describe_context().c_str(),m_port0,data,m_fbfe,writenum); + case 0xff: // user I/O port + break; + + default: + logerror("unknown port [%2.2x] write of [%2.2x]\n", offset, data); + } +} + +void rm380z_state_cos34::port_write(offs_t offset, uint8_t data) +{ + if (offset == 0xfc) + { + m_cassette->output((data & 0xef) ? +1.0 : -1.0); // set 2400hz, bit 4 + } + + rm380z_state::port_write(offset, data); +} +void rm380z_state_cos40::port_write(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0xfd: if (m_port0 & 0x08) { // update user defined character data @@ -58,20 +74,22 @@ m_user_defined_chars[(m_character % 128) * 16 + m_character_row] = data; } } - // ignore updates while bit 4 of port 0 is set - // (counter is not used to set the scroll register in this case, maybe used for smooth scrolling?) - else if (!(m_port0 & 0x10)) + else { - // set scroll register (used to verticaly scroll the screen and effect vram addressing) - m_vram.set_scroll_register(data & m_fbfd_mask); + // ignore scroll updates while bit 4 (CGMUX) of port 0 is set + // (counter is then used for smooth scrolling which is not currently implemented) + if (!(m_port0 & 0x10)) + { + // set scroll register (used to verticaly scroll the screen and effect vram addressing) + m_vram.set_scroll_register(data & 0x1f); + } + // bit 6 drives the speaker + m_speaker->level_w(BIT(data, 6)); + m_fbfd = data; } - break; - // port 1 - case 0xfe: // line on screen to write to divided by 2 - //printf("%s FBFC [%2.2x] FBFD [%2.2x] FBFEw[%2.2x] writenum [%4.4x]\n",machine().describe_context().c_str(),m_port0,m_fbfd,data,writenum); - + case 0xfe: if (!(m_port0 & 0x04)) { m_character_row = data; @@ -84,13 +102,57 @@ m_fbfe = data; break; - case 0xff: // user I/O port - //printf("write of [%x] to FBFF\n",data); - //logerror("%s: Write %02X to user I/O port\n", machine().describe_context(), data); + case 0xfc: + rm380z_state::port_write(offset, data); + config_videomode(); break; default: - printf("unknown port [%2.2x] write of [%2.2x]\n", offset, data); + rm380z_state::port_write(offset, data); + break; + } +} + +void rm380z_state_cos40_hrg::port_write(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0x00: + if ((m_hrg_port0 & 0x01) && !(data & 0x01)) + { + // set low nibble of scratchpad (palette data) when bit 0 toggled + change_hrg_scratchpad(m_hrg_port1 >> 4, m_hrg_port1 & 0x0f, 0xf0); + } + else if ((m_hrg_port0 & 0x02) && !(data & 0x02)) + { + // set high nibble of scratchpad (palette data) when bit 1 toggled + change_hrg_scratchpad(m_hrg_port1 >> 4, m_hrg_port1 << 4, 0x0f); + } + + switch (data) + { + case 0x03: + m_hrg_display_mode = hrg_display_mode::high; + break; + case 0xa3: + m_hrg_display_mode = hrg_display_mode::medium_0; + break; + case 0xc3: + m_hrg_display_mode = hrg_display_mode::medium_1; + break; + } + + m_hrg_port0 = data; + break; + + case 0x01: + // video ram page number (for subsequent read/write) or scratchpad data + m_hrg_port1 = data; + break; + + default: + rm380z_state_cos40::port_write(offset, data); + break; } } @@ -101,15 +163,55 @@ switch (offset) { case 0xfc: // PORT0 - //m_port0_kbd=getKeyboard(); data = m_port0_kbd; - //if (m_port0_kbd!=0) m_port0_kbd = 0; - //m_port0_kbd=0; - //printf("%s read of port0 (kbd)\n",machine().describe_context().c_str()); break; - case 0xfd: // "counter" (?) - //printf("%s: Read from counter FBFD\n", machine().describe_context().c_str()); + case 0xfe: // PORT1 + data = m_port1; + if (m_screen->vblank()) + { + data |= 0x40; + } + if (m_screen->hblank()) + { + data |= 0x80; + } + break; + + case 0xff: // user port + break; + + default: + logerror("read from unknown port [%2.2x]\n", offset); + } + + return data; +} + +uint8_t rm380z_state_cos34::port_read(offs_t offset) +{ + if (offset == 0xfe) + { + if (m_cassette->input() < +0.0) + { + m_port1 &= 0xdf; // bit 5 off + } + else + { + m_port1 |= 0x20; // bit 5 on + } + } + + return rm380z_state::port_read(offset); +} + +uint8_t rm380z_state_cos40::port_read(offs_t offset) +{ + uint8_t data; + + switch (offset) + { + case 0xfd: if (m_port0 & 0x08) { // return character data for requested character and row @@ -128,22 +230,36 @@ } break; - case 0xfe: // PORT1 - if (m_cassette->input() < +0.0) - m_port1 &= 0xdf; // bit 5 off - else - m_port1 |= 0x20; // bit 5 on - - data = m_port1; - //printf("%s read of port1\n", machine().describe_context().c_str()); + default: + data = rm380z_state::port_read(offset); break; + } - case 0xff: // user port - //printf("%s: Read from user port\n", machine().describe_context().c_str()); + return data; +} + +uint8_t rm380z_state_cos40_hrg::port_read(offs_t offset) +{ + uint8_t data = 0xff; + + switch (offset) + { + case 0x00: + // bit 0 is low during HRG frame blanking + // bit 1 is low duing HRG line blanking + if (m_screen->vblank()) + { + data ^= 0x01; + } + if (m_screen->hblank()) + { + data ^= 0x02; + } break; default: - printf("read from unknown port [%2.2x]\n", offset); + data = rm380z_state_cos40::port_read(offset); + break; } return data; @@ -166,7 +282,7 @@ void rm380z_state::rm380z_portlow_w(offs_t offset, uint8_t data) { - //printf("%s port write [%x] [%x]\n",machine().describe_context().c_str(),offset,data); + //logerror("%s port write [%x] [%x]\n",machine().describe_context().c_str(),offset,data); } uint8_t rm380z_state::rm380z_porthi_r() @@ -176,47 +292,7 @@ void rm380z_state::rm380z_porthi_w(offs_t offset, uint8_t data) { - //printf("port write [%x] [%x]\n",offset+0xc5,data); -} - - -#define LINE_SUBDIVISION 82 -#define HORZ_LINES 100 -#define TIMER_SPEED 50*HORZ_LINES*LINE_SUBDIVISION - -// -// this simulates line+frame blanking -// according to the System manual, "frame blanking bit (bit 6) of port1 becomes high -// for about 4.5 milliseconds every 20 milliseconds" -// - -TIMER_CALLBACK_MEMBER(rm380z_state::static_vblank_timer) -{ - //printf("timer callback called at [%f]\n",machine().time().as_double()); - - - m_rasterlineCtr++; - m_rasterlineCtr %= HORZ_LINES * LINE_SUBDIVISION; - - // frame blanking - if (m_rasterlineCtr >= ((HORZ_LINES - 22) * LINE_SUBDIVISION)) - { - m_port1 |= 0x40; - } - else - { - m_port1 &= ~0x40; - } - - // line blanking - if ((m_rasterlineCtr % LINE_SUBDIVISION) > 80) - { - m_port1 |= 0x80; - } - else - { - m_port1 &= ~0x80; - } + //logerror("port write [%x] [%x]\n",offset+0xc5,data); } void rm380z_state::keyboard_put(u8 data) @@ -251,60 +327,52 @@ { // don't know how motor on is connected floppy->mon_w(0); - floppy->ss_w(BIT(data, 5)); + floppy->ss_w(BIT(data, 4)); } } -void rm380z_state::machine_start() +void rm380z_state::machine_reset() { - m_static_vblank_timer = timer_alloc(FUNC(rm380z_state::static_vblank_timer), this); - m_static_vblank_timer->adjust(attotime::from_hz(TIMER_SPEED), 0, attotime::from_hz(TIMER_SPEED)); -} + m_port0 = 0x00; + m_port0_kbd = 0x00; + m_port1 = 0x00; + m_fbfe = 0x00; -void rm380z_state::init_rm380z() -{ - m_videomode = RM380Z_VIDEOMODE_80COL; - m_port0_mask = 0xff; - m_fbfd_mask = 0x1f; // enable hw scrolling (uses lower 5 bits of counter) + config_memory_map(); + m_fdc->reset(); } -void rm380z_state::init_rm380z34d() +void rm380z_state_cos34::machine_reset() { - m_videomode = RM380Z_VIDEOMODE_40COL; - m_port0_mask = 0xdf; // disable 80 column mode - m_screen->set_size(240, 240); - m_screen->set_visarea_full(); -} + rm380z_state::machine_reset(); -void rm380z_state::init_rm380z34e() -{ - m_videomode = RM380Z_VIDEOMODE_40COL; - m_port0_mask = 0xdf; // disable 80 column mode - m_screen->set_size(240, 240); - m_screen->set_visarea_full(); + m_vram.reset(); } -void rm380z_state::init_rm480z() +void rm380z_state_cos40::machine_reset() { - // machine not working so do nothing + rm380z_state::machine_reset(); + + m_fbfd = 0x00; + + m_vram.reset(); + memset(m_user_defined_chars, 0, sizeof(m_user_defined_chars)); } -void rm380z_state::machine_reset() +void rm380z_state_cos40_hrg::machine_reset() { - m_port0 = 0x00; - m_port0_kbd = 0x00; - m_port1 = 0x00; - m_fbfe = 0x00; + rm380z_state_cos40::machine_reset(); - m_rasterlineCtr = 0; + m_hrg_port0 = 0x00; + m_hrg_port1 = 0x00; + m_hrg_display_mode = hrg_display_mode::none; - // note: from COS 4.0 videos, screen seems to show garbage at the beginning - m_vram.reset(); - - config_memory_map(); - m_fdc->reset(); + memset(m_hrg_ram, 0, sizeof(m_hrg_ram)); + memset(m_hrg_scratchpad, 0, sizeof(m_hrg_scratchpad)); +} - init_graphic_chars(); +void rm480z_state::machine_reset() +{ } void rm380z_state::config_memory_map() @@ -325,7 +393,3 @@ program.install_ram(0x4000, 0xdfff, m_ram_p); } } - -MACHINE_RESET_MEMBER( rm380z_state, rm480z ) -{ -} diff -Nru mame-0.263+dfsg.1/src/mame/rm/rm380z_v.cpp mame-0.264+dfsg.1/src/mame/rm/rm380z_v.cpp --- mame-0.263+dfsg.1/src/mame/rm/rm380z_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/rm/rm380z_v.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,65 +10,112 @@ #include "emu.h" #include "rm380z.h" -bool rm380z_state::get_rowcol_from_offset(int& row, int& col, offs_t offset) const +INPUT_CHANGED_MEMBER(rm380z_state_cos40_hrg::monitor_changed) { - if (m_videomode == RM380Z_VIDEOMODE_40COL) + // re-calculate HRG palette values from scratchpad + for (int c=0; c < RM380Z_HRG_SCRATCHPAD_SIZE; c++) { - col = offset & 0x3f; // the 6 least significant bits give the column (0-39) - row = offset >> 6; // next 5 bits give the row (0-23) + change_palette(c, m_hrg_scratchpad[c]); + } +} + +void rm380z_state_cos40_hrg::change_palette(int index, uint8_t value) +{ + rgb_t new_colour; + + if (m_io_display_type->read() & 0x01) + { + // value is intensity for a b/w monochrome display + new_colour = rgb_t(value, value, value); } else { - col = offset & 0x7f; // the 7 least significant bits give the column (0-79) - row = offset >> 7; // next bit gives bit 0 of row - row |= (m_fbfe & 0x0f) << 1; // the remaining 4 row bits come from the lower half of PORT 1 + // for colour displays value is in the format GRGBRGBR + uint8_t red = (BIT(value, 6) << 7) | (BIT(value, 3) << 6) | (BIT(value, 0) << 5); + uint8_t green = (BIT(value, 7) << 4) | (BIT(value, 5) << 3) | (BIT(value, 2) << 2); + uint8_t blue = (BIT(value, 4) << 1) | BIT(value, 1); + new_colour = raw_to_rgb_converter::standard_rgb_decoder<3, 3, 2, 5, 2, 0>(red | green | blue); } - return ((row < RM380Z_SCREENROWS) && (col < RM380Z_SCREENCOLS)); + m_palette->set_pen_color(index + 3, new_colour); } -void rm380z_state::put_point(int charnum, int x, int y, int col) +void rm380z_state_cos40_hrg::palette_init(palette_device &palette) { - const int mx = (y == 6) ? 4 : 3; + // text display palette (black, grey (dim), and white) + palette.set_pen_color(0, rgb_t::black()); + palette.set_pen_color(1, rgb_t(0xc0, 0xc0, 0xc0)); + palette.set_pen_color(2, rgb_t::white()); - for (unsigned int r = y; r< (y + mx); r++) + // HRG palette (initialise to all black) + for (int c = 3; c < 19; c++) { - for (unsigned int c = x; c < (x + 3); c++) - { - m_graphic_chars[charnum][c + (r * (RM380Z_CHDIMX + 1))] = col; - } + palette.set_pen_color(c, rgb_t::black()); } } -void rm380z_state::init_graphic_chars() +void rm380z_state_cos40_hrg::change_hrg_scratchpad(int index, uint8_t value, uint8_t mask) { - for (int c=0;c<0x3f;c++) + if (index < RM380Z_HRG_SCRATCHPAD_SIZE) { - if (c&0x01) put_point(c,0,0,1); - else put_point(c,0,0,0); + m_hrg_scratchpad[index] &= mask; + m_hrg_scratchpad[index] |= value; + + change_palette(index, m_hrg_scratchpad[index]); + } +} - if (c&0x02) put_point(c,3,0,1); - else put_point(c,3,0,0); +int rm380z_state_cos40_hrg::calculate_hrg_vram_index(offs_t offset) const +{ + int index; + int page = m_hrg_port1 & 0x0f; + + if (page < 12) + { + // the first 15k is addressed using twelve 1280 byte pages + // this is used to store pixel data + index = (page * 1280) + (offset % 1280); + } + else + { + // the remaining 1k is addressed using four 256 byte pages + // this is used to store 128 user defined HRG characters + page &= 0x03; + index = 15360 + (page * 256) + (offset & 0xff); + } - if (c&0x04) put_point(c,0,3,1); - else put_point(c,0,3,0); + return index; +} - if (c&0x08) put_point(c,3,3,1); - else put_point(c,3,3,0); +bool rm380z_state::get_rowcol_from_offset(int& row, int& col, offs_t offset) const +{ + col = offset & 0x3f; // the 6 least significant bits give the column (0-39) + row = offset >> 6; // next 5 bits give the row (0-23) - if (c&0x10) put_point(c,0,6,1); - else put_point(c,0,6,0); + return ((row < RM380Z_SCREENROWS) && (col < RM380Z_SCREENCOLS)); +} - if (c&0x20) put_point(c,3,6,1); - else put_point(c,3,6,0); +bool rm380z_state_cos40::get_rowcol_from_offset(int& row, int& col, offs_t offset) const +{ + if (m_videomode == RM380Z_VIDEOMODE_80COL) + { + col = offset & 0x7f; // the 7 least significant bits give the column (0-79) + row = offset >> 7; // next bit gives bit 0 of row + row |= (m_fbfe & 0x0f) << 1; // the remaining 4 row bits come from the lower half of PORT 1 + } + else + { + (void)rm380z_state::get_rowcol_from_offset(row, col, offset); } + + return ((row < RM380Z_SCREENROWS) && (col < RM380Z_SCREENCOLS)); } -void rm380z_state::config_videomode() +void rm380z_state_cos40::config_videomode() { int old_mode = m_videomode; - if (m_port0 & 0x20 & m_port0_mask) + if (BIT(m_port0, 5)) { // 80 cols m_videomode = RM380Z_VIDEOMODE_80COL; @@ -83,64 +130,12 @@ { if (m_videomode == RM380Z_VIDEOMODE_80COL) { - m_screen->set_size(640, 240); + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 240); } else { - m_screen->set_size(320, 240); + m_screen->set_raw(8_MHz_XTAL, 512, 0, 320, 312, 0, 240); } - m_screen->set_visarea_full(); - } -} - -// char attribute bits in COS 4.0 - -// 0=alternate charset -// 1=underline -// 2=dim -// 3=reverse - - -void rm380z_state::decode_videoram_char(int row, int col, uint8_t& chr, uint8_t &attrib) -{ - uint8_t ch1 = m_vram.get_char(row, col); - uint8_t ch2 = m_vram.get_attrib(row, col); - - // "special" (unknown) cases first - if ((ch1 == 0x80) && (ch2 == 0x04)) - { - // blank out - chr = 0x20; - attrib = 0; - return; - } - else if ((ch1 == 0) && (ch2 == 8)) - { - // cursor - chr = 0x20; - attrib = 8; - return; - } - else if ((ch1 == 4) && (ch2 == 4)) - { - // reversed cursor? - chr = 0x20; - attrib = 0; - return; - } - else if ((ch1 == 4) && (ch2 == 8)) - { - // normal cursor - chr = 0x20; - attrib = 8; - return; - } - else - { - chr = ch1; - attrib = ch2; - - //printf("unhandled character combination [%x][%x]\n", ch1, ch2); } } @@ -152,7 +147,17 @@ // 20e2: prints "Ready:" // 0195: prints "\n" -void rm380z_state::videoram_write(offs_t offset, uint8_t data) +void rm380z_state_cos34::videoram_write(offs_t offset, uint8_t data) +{ + int row, col; + if (get_rowcol_from_offset(row, col, offset)) + { + m_vram.set_char(row, col, data); + } + // else out of bounds write had no effect (see VTOUT description in firmware guide) +} + +void rm380z_state_cos40::videoram_write(offs_t offset, uint8_t data) { int row, col; if (get_rowcol_from_offset(row, col, offset)) @@ -166,37 +171,85 @@ else { m_vram.set_char(row, col, data); + // when a character is written, the corresponding attributes are cleared + m_vram.set_attrib(row, col, 0); } } // else out of bounds write had no effect (see VTOUT description in firmware guide) } -uint8_t rm380z_state::videoram_read(offs_t offset) +void rm380z_state_cos40_hrg::videoram_write(offs_t offset, uint8_t data) +{ + if (BIT(m_hrg_port0, 2)) + { + // write to HRG memory + m_hrg_ram[calculate_hrg_vram_index(offset)] = data; + } + else + { + rm380z_state_cos40::videoram_write(offset, data); + } +} + +uint8_t rm380z_state_cos34::videoram_read(offs_t offset) +{ + uint8_t data = 0; // return 0 if out of bounds (see VTIN description in firmware guide) + + int row, col; + if (get_rowcol_from_offset(row, col, offset)) + { + data = m_vram.get_char(row, col); + } + + return data; +} + +uint8_t rm380z_state_cos40::videoram_read(offs_t offset) { + uint8_t data = 0; // return 0 if out of bounds (see VTIN description in firmware guide) + int row, col; if (get_rowcol_from_offset(row, col, offset)) { if (m_port0 & 0x40) { - return m_vram.get_attrib(row, col); + data = m_vram.get_attrib(row, col); } else { - return m_vram.get_char(row, col); + data = m_vram.get_char(row, col); } } - return 0; // return 0 if out of bounds (see VTIN description in firmware guide) + return data; +} + +uint8_t rm380z_state_cos40_hrg::videoram_read(offs_t offset) +{ + uint8_t data; + + if (BIT(m_hrg_port0, 2)) + { + // read from HRG memory + data = m_hrg_ram[calculate_hrg_vram_index(offset)]; + } + else + { + data = rm380z_state_cos40::videoram_read(offset); + } + + return data; } -void rm380z_state::putChar_vdu80(int charnum, int attribs, int x, int y, bitmap_ind16 &bitmap) +void rm380z_state_cos40::putChar_vdu80(int charnum, int attribs, int x, int y, bitmap_ind16 &bitmap) const { const bool attrUnder = attribs & 0x02; + const bool attrDim = attribs & 0x04; const bool attrRev = attribs & 0x08; int data_pos = (charnum % 128) * 16; - for (int r=0; r < 10; r++, data_pos++) + for (int r = 0; r < 10; r++, data_pos++) { uint8_t data; @@ -215,93 +268,169 @@ data = m_user_defined_chars[data_pos]; } - for (int c=0; c < 8; c++, data <<= 1) + for (int c = 0; c < 8; c++, data <<= 1) { - uint8_t pixel_value = (data & 0x80) ? 1 : 0; + uint8_t pixel_value = BIT(data, 7) ? 2 : 0; if (attrRev) { pixel_value = !pixel_value; } - bitmap.pix(y * 10 + r, x * 8 + c) = pixel_value; + if (attrDim && pixel_value) + { + pixel_value = 1; + } + if (pixel_value) + { + bitmap.pix(y * 10 + r, x * 8 + c) = pixel_value; + } } } } -void rm380z_state::putChar_vdu40(int charnum, int x, int y, bitmap_ind16 &bitmap) +void rm380z_state_cos34::putChar_vdu40(int charnum, int x, int y, bitmap_ind16 &bitmap) const { - if ((charnum > 0) && (charnum <= 0x7f)) + if (charnum <= 0x7f) { - // normal chars (base set) - int basex=RM380Z_CHDIMX*(charnum/RM380Z_NCY); - int basey=RM380Z_CHDIMY*(charnum%RM380Z_NCY); - - for (int r=0;rread(charnum, r); + + for (int c = 1; c < 6; c++, data <<= 1) { - uint8_t chval = (m_chargen[((basey + r) * RM380Z_CHDIMX * RM380Z_NCX) + basex + c] == 0xff) ? 0 : 1; - bitmap.pix(y * (RM380Z_CHDIMY+1) + r, x * (RM380Z_CHDIMX+1) + c) = chval; + if (BIT(data, 6)) + { + bitmap.pix(y * 10 + r, x * 8 + c) = 2; + } } } } else { - // graphic chars - for (int r=0;r= 0xc0) ? 2 : 1; + + // discrete logic gates were used to produce a full 8x10 grid of pixels + // the top block is 4 pixels high, and the two lower two blocks are 3 pixels high + if (BIT(charnum, 0)) + { + bitmap.plot_box(x * 8, y * 10, 4, 4, colour); + } + if (BIT(charnum, 1)) + { + bitmap.plot_box(x * 8 + 4, y * 10, 4, 4, colour); + } + if (BIT(charnum, 2)) + { + bitmap.plot_box(x * 8, y * 10 + 4, 4, 3, colour); + } + if (BIT(charnum, 3)) + { + bitmap.plot_box(x * 8 + 4, y * 10 + 4, 4, 3, colour); + } + if (BIT(charnum, 4)) + { + bitmap.plot_box(x * 8, y * 10 + 7, 4, 3, colour); + } + if (BIT(charnum, 5)) + { + bitmap.plot_box(x * 8 + 4, y * 10 + 7, 4, 3, colour); + } + } +} + +void rm380z_state_cos40_hrg::draw_high_res_graphics(bitmap_ind16 &bitmap) const +{ + const int pw = (m_videomode == RM380Z_VIDEOMODE_40COL) ? 1 : 2; + const int ph = 1; + + // see section C.3 of HRG reference manual for ram layout + // (2-bits per pixel, 4 pixels per byte) + for (int y = 0; y < 192; y++) + { + for (int x = 0; x < 320; x+= 4) { - for (int c=0;c>= 2) { - bitmap.pix(y * (RM380Z_CHDIMY+1) + r, x * (RM380Z_CHDIMX+1) +c) = m_graphic_chars[charnum&0x3f][c + r * (RM380Z_CHDIMX+1)]; + bitmap.plot_box((x + c)*pw, y*ph, pw, ph, (data & 0x03) + 3); } } } } -void rm380z_state::update_screen_vdu80(bitmap_ind16 &bitmap) +void rm380z_state_cos40_hrg::draw_medium_res_graphics(bitmap_ind16 &bitmap) const { - const int ncols = (m_videomode == RM380Z_VIDEOMODE_40COL) ? 40 : 80; + const int page = (m_hrg_display_mode == hrg_display_mode::medium_0) ? 0 : 1; + const int pw = (m_videomode == RM380Z_VIDEOMODE_40COL) ? 2 : 4; + const int ph = 2; + + // see section C.5 of HRG reference manual for ram layout + // (4-bits per pixel, 2 pixels per byte) + for (int y = 0; y < 96; y++) + { + for (int x = 0; x < 160; x+= 2) + { + int index = ((y / 8) * 1280) + ((x / 2) << 4) + ((y % 8) << 1) + page; + uint8_t data = m_hrg_ram[index]; + bitmap.plot_box(x*pw, y*ph, pw, ph, ((data & 0x03) | ((data >> 2) & 0x0c)) + 3); + bitmap.plot_box((x+1)*pw, y*ph, pw, ph, (((data >> 2) & 0x03) | ((data >> 4) & 0x0c)) + 3); + } + } +} - // blank screen - bitmap.fill(0); +void rm380z_state_cos40_hrg::update_screen(bitmap_ind16 &bitmap) const +{ + if (m_hrg_display_mode == hrg_display_mode::high) + { + draw_high_res_graphics(bitmap); + } + else if ((m_hrg_display_mode == hrg_display_mode::medium_0) || (m_hrg_display_mode == hrg_display_mode::medium_1)) + { + draw_medium_res_graphics(bitmap); + } + + if (!BIT(m_fbfd, 7)) + { + // display text on top of graphics unless prevented by bit 7 of fbfd (VID INHIB) + rm380z_state_cos40::update_screen(bitmap); + } +} + +void rm380z_state_cos40::update_screen(bitmap_ind16 &bitmap) const +{ + const int ncols = (m_videomode == RM380Z_VIDEOMODE_40COL) ? 40 : 80; for (int row = 0; row < RM380Z_SCREENROWS; row++) { for (int col = 0; col < ncols; col++) { uint8_t curch,attribs; - decode_videoram_char(row, col, curch, attribs); + curch = m_vram.get_char(row, col); + attribs = m_vram.get_attrib(row, col); putChar_vdu80(curch, attribs, col, row, bitmap); } } } -void rm380z_state::update_screen_vdu40(bitmap_ind16 &bitmap) +void rm380z_state_cos34::update_screen(bitmap_ind16 &bitmap) const { const int ncols = 40; - // blank screen - bitmap.fill(0); - for (int row = 0; row < RM380Z_SCREENROWS; row++) { for (int col = 0; col < ncols; col++) { uint8_t curch = m_vram.get_char(row, col); - if (curch == 0) - { - // NUL character looked like 'O' when displayed and could be used instead of 'O' - // In fact the front panel writes 0x49, 0x00 to display "IO", and in COS 3.4 - // displaying or typing 'O' actually writes 0x00 to vram. - // This hack is only necessary because we don't have the real 74LS262 charset ROM - curch = 'O'; - } putChar_vdu40(curch, col, row, bitmap); } } } -// This needs the attributes etc from above to be added -uint32_t rm380z_state::screen_update_rm480z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +// only partially implemented and non working +void rm480z_state::update_screen(bitmap_ind16 &bitmap) const { uint16_t sy = 0, ma = 0; @@ -332,5 +461,4 @@ } ma += 64; } - return 0; } diff -Nru mame-0.263+dfsg.1/src/mame/roland/roland_d70.cpp mame-0.264+dfsg.1/src/mame/roland/roland_d70.cpp --- mame-0.263+dfsg.1/src/mame/roland/roland_d70.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/roland/roland_d70.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,533 @@ +// license:BSD-3-Clause +// copyright-holders:giulioz, ValleyBell +/**************************************************************************** + + Driver for Roland D-70 synthesizer. + Derived by the CM32P driver by ValleyBell + +****************************************************************************/ + +#include "emu.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "bus/midi/midiinport.h" +#include "bus/midi/midioutport.h" +#include "cpu/mcs96/i8x9x.h" +#include "cpu/mcs96/i8xc196.h" +#include "machine/timer.h" +#include "sound/rolandpcm.h" +#include "video/t6963c.h" + +#include "emupal.h" +#include "screen.h" +#include "softlist_dev.h" +#include "speaker.h" + +#include "multibyte.h" + +#include + + +namespace { + +// unscramble address: ROM dump offset -> proper (descrambled) offset +#define UNSCRAMBLE_ADDR_INT(_offset) \ + bitswap<19>(_offset, 18, 17, 15, 14, 16, 12, 11, 7, 9, 13, 10, 8, 3, 2, 1, 6, 4, 5, 0) +// scramble address: proper offset -> ROM dump offset +#define SCRAMBLE_ADDR_INT(_offset) \ + bitswap<19>(_offset, 18, 17, 14, 16, 15, 9, 13, 12, 8, 10, 7, 11, 3, 1, 2, 6, 5, 4, 0) + +#define UNSCRAMBLE_DATA(_data) bitswap<8>(_data, 1, 2, 7, 3, 5, 0, 4, 6) + +// Bitmasks for the display board interface via PORT1 +static constexpr u8 CONT_MASK = 0b10000000; +static constexpr u8 RW_MASK = 0b01000000; +static constexpr u8 AD_MASK = 0b00100000; +static constexpr u8 SCK_MASK = 0b00010000; +static constexpr u8 SI_MASK = 0b00001000; +static constexpr u8 SO_MASK = 0b00000100; +static constexpr u8 ACK_MASK = 0b00000010; +static constexpr u8 ENCO_MASK = 0b00000001; + +static INPUT_PORTS_START(d70) + PORT_START("KEY0") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Performance") PORT_CODE(KEYCODE_K) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Patch") PORT_CODE(KEYCODE_L) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Tone") PORT_CODE(KEYCODE_COLON) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A/B") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Int/Card") PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Command") PORT_CODE(KEYCODE_E) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Write") PORT_CODE(KEYCODE_R) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_T) + + PORT_START("KEY1") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 1") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 2") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 3") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 4") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 5") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 6") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bank 8") + + PORT_START("KEY2") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 1") PORT_CODE(KEYCODE_1) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 2") PORT_CODE(KEYCODE_2) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 3") PORT_CODE(KEYCODE_3) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 4") PORT_CODE(KEYCODE_4) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 5") PORT_CODE(KEYCODE_5) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 6") PORT_CODE(KEYCODE_6) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 7") PORT_CODE(KEYCODE_7) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Number 8") PORT_CODE(KEYCODE_8) + + PORT_START("KEY3") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Inc/Ins") PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Dec/Del") PORT_CODE(KEYCODE_J) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("S") PORT_CODE(KEYCODE_DOWN) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A") PORT_CODE(KEYCODE_LEFT) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("W") PORT_CODE(KEYCODE_UP) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Midi Out") PORT_CODE(KEYCODE_N) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Tone Display") PORT_CODE(KEYCODE_B) + + PORT_START("KEY4") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Exit") PORT_CODE(KEYCODE_SLASH) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F5") PORT_CODE(KEYCODE_G) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F4") PORT_CODE(KEYCODE_F) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F3") PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F2") PORT_CODE(KEYCODE_S) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F1") PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("User") PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Part") PORT_CODE(KEYCODE_COMMA) + + PORT_START("KEY5") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Edit") PORT_CODE(KEYCODE_X) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Portamento") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Resonance") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Pan") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Tuning") PORT_CODE(KEYCODE_V) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Attack") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Release") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Pcm Card") PORT_CODE(KEYCODE_C) + + PORT_START("KEY6") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Play") PORT_CODE(KEYCODE_Z) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Solo") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Cutoff") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Level") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Upper 4") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Upper 3") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Lower 2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Lower 1") + + PORT_START("KEY7") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Effect/Ctrl") PORT_CODE(KEYCODE_M) +INPUT_PORTS_END + +class roland_d70_state : public driver_device { +public: + roland_d70_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_bank_view(*this, "bank"), + m_ram(*this, "ram", 128 * 1024, ENDIANNESS_LITTLE), + m_dsp_ram(*this, "dsp_ram", 8 * 1024, ENDIANNESS_LITTLE), + m_rom_bank(*this, "rom_bank"), + m_ram_bank(*this, "ram_bank"), + m_pcm_rom(*this, "pcm"), + m_cpu(*this, "maincpu"), + m_pcm(*this, "pcm"), + m_lcd(*this, "lcd"), + m_midi_timer(*this, "midi_timer"), + m_keys(*this, "KEY%u", 0), + m_sw_scan_index(0), + m_sw_scan_bank(-1), + m_sw_scan_state(0xff), + m_sw_scan_mode(0), + m_sw_scan_current_out(0xff), + m_midi_rx(0), + m_midi_pos(0) + { + } + + void d70(machine_config &config); + void init_d70(); + +protected: + virtual void machine_start() override; + +private: + void lcd_map(address_map &map); + void lcd_palette(palette_device &palette) const; + + void bank_w(u8 data); + u8 ksga_io_r(offs_t offset); + void ksga_io_w(offs_t offset, u8 data); + u16 port0_r(); + u8 port1_r(); + void port1_w(u8 data); + u8 dsp_io_r(offs_t offset); + void dsp_io_w(offs_t offset, u8 data); + u8 tvf_io_r(offs_t offset); + void tvf_io_w(offs_t offset, u8 data); + u8 snd_io_r(offs_t offset); + void snd_io_w(offs_t offset, u8 data); + + u8 ach0_r(); + u8 ach1_r(); + u8 ach2_r(); + u8 ach3_r(); + u8 ach4_r(); + + TIMER_DEVICE_CALLBACK_MEMBER(midi_timer_cb); + TIMER_DEVICE_CALLBACK_MEMBER(samples_timer_cb); + + void midi_in_w(int state); + + void d70_map(address_map &map); + + void descramble_rom_internal(u8 *dst, const u8 *src); + void descramble_rom_external(u8 *dst, const u8 *src); + + memory_view m_bank_view; + memory_share_creator m_ram; + memory_share_creator m_dsp_ram; + required_memory_bank m_rom_bank; + required_memory_bank m_ram_bank; + required_region_ptr m_pcm_rom; + required_device m_cpu; + required_device m_pcm; + required_device m_lcd; + required_device m_midi_timer; + required_ioport_array<8> m_keys; + + u8 m_sound_io_buffer[0x100]; + u8 m_dsp_io_buffer[0x80]; + int m_sw_scan_index; + int m_sw_scan_bank; + u8 m_sw_scan_state; + u8 m_sw_scan_mode; + u8 m_sw_scan_current_out; + u8 m_midi_rx; + int m_midi_pos; + std::queue midi_queue; +}; + +void roland_d70_state::machine_start() { + m_bank_view.select(0); + m_rom_bank->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000); + m_ram_bank->configure_entries(0, 2, &m_ram[0], 0x4000); + m_cpu->space(AS_PROGRAM).install_ram(0xc000, 0xffff, &m_ram[0]); +} + +void roland_d70_state::bank_w(u8 data) { + m_bank_view.select(BIT(data, 5)); + m_rom_bank->set_entry(data & 0x07); + m_ram_bank->set_entry(data & 0x01); +} + +u8 roland_d70_state::ksga_io_r(offs_t offset) { + return 0; +} + +void roland_d70_state::ksga_io_w(offs_t offset, u8 data) { +} + +void roland_d70_state::lcd_map(address_map &map) { + map(0x0000, 0x7fff).ram(); +} + +void roland_d70_state::midi_in_w(int state) { + if (m_midi_pos == 0 || m_midi_pos == 9) { + m_midi_pos += 1; + } else if (m_midi_pos == 10) { + midi_queue.push(m_midi_rx); + // logerror("midi enqueued %x\n", m_midi_rx); + m_midi_rx = 0; + m_midi_pos = 0; + } else { + m_midi_rx |= state << (m_midi_pos - 1); + m_midi_pos += 1; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(roland_d70_state::midi_timer_cb) { + // CPU doesn't have a proper serial interface so we are forced + // to simulate it this way for now + if (midi_queue.empty()) + return; + + u8 midi = midi_queue.front(); + if (midi == 0x90) + midi = 0x9a; + if (midi == 0x80) + midi = 0x8a; + midi_queue.pop(); + logerror("midi_in %02x\n", midi); + m_cpu->serial_w(midi); +} + +u16 roland_d70_state::port0_r() { + return 0x00; +} + +u8 roland_d70_state::port1_r() { + m_sw_scan_current_out = m_ram[0x0f / 2] >> 8; + // logerror("p1r %02x\n", m_sw_scan_current_out); + return m_sw_scan_current_out; +} + +void roland_d70_state::port1_w(u8 data) { + // logerror("p1w %02x\n", data); + // m_sw_scan_current_out = data & ~(SO_MASK); + + if (data & RW_MASK) { + if ((data & CONT_MASK) && !(m_sw_scan_state & CONT_MASK)) { + m_sw_scan_index = 0; + m_sw_scan_bank += 1; + } + + // Clock cycle + if ((data & SCK_MASK) && !(m_sw_scan_state & SCK_MASK)) { + if ((data & AD_MASK)) { + if (m_sw_scan_mode == 0) { + m_sw_scan_current_out &= ~(SO_MASK); + } else if (m_sw_scan_mode == 1) { + u8 buttonState = m_sw_scan_bank != -1 ? BIT(m_keys[m_sw_scan_bank]->read(), m_sw_scan_index) : 1; + + if (buttonState) { + m_sw_scan_current_out |= SO_MASK; + } else { + m_sw_scan_current_out &= ~(SO_MASK); + } + m_sw_scan_index += 1; + } + } else { + m_sw_scan_mode += 1; + } + } + } else { + m_sw_scan_mode = 0; + m_sw_scan_index = 0; + m_sw_scan_bank = -1; + } + + m_sw_scan_state = data; + + m_ram[0x0f / 2] = (m_ram[0x0f / 2] & 0x00ff) | (u16(m_sw_scan_current_out) << 8); +} + +u8 roland_d70_state::dsp_io_r(offs_t offset) { + return m_dsp_io_buffer[offset]; +} + +void roland_d70_state::dsp_io_w(offs_t offset, u8 data) { + m_dsp_io_buffer[offset] = data; + // do read/write to some external memory, makes the RCC-CPU check pass. + // (routine at 0x4679) + switch (offset) { + case 0x04: + // write to partials?? (written in loop at 0x4375) + break; + + case 0x06: + m_dsp_ram[0x000 | data] = m_dsp_io_buffer[0x00] & 0x03; + m_dsp_ram[0x100 | data] = m_dsp_io_buffer[0x01]; + m_dsp_ram[0x200 | data] = m_dsp_io_buffer[0x02]; + break; + + case 0x0a: + m_dsp_io_buffer[0x00] = m_dsp_ram[0x000 | data]; + m_dsp_io_buffer[0x01] = m_dsp_ram[0x100 | data]; + m_dsp_io_buffer[0x02] = m_dsp_ram[0x200 | data]; + break; + } +} + +u8 roland_d70_state::tvf_io_r(offs_t offset) { + logerror("tvf read %x\n", offset); + return 0; +} + +void roland_d70_state::tvf_io_w(offs_t offset, u8 data) { + logerror("twf write $x= %x\n", offset, data); +} + +u8 roland_d70_state::snd_io_r(offs_t offset) { + // logerror("lp read %x\n", offset); + // lots of offset modification magic to achieve the following: + // - offsets 00..1F are "sound chip read" + // - offsets 20..3F are a readback of what was written to registers 00..1F + // - This behaviour is reversed for offset 01/21, which is used for reading + // the PCM sample tables. + // All this is just for making debugging easier, as it allows one to check the + // register state using the Memory Viewer. + if (offset == 0x01 || offset == 0x21) + offset ^= 0x20; // remove when PCM data readback via sound chip is confirmed to work + if (offset < 0x20) + return m_pcm->read(offset); + if (offset < 0x40) + offset -= 0x20; + + if (offset == 0x01) { + // code for reading from the PCM sample table is at 0xb027 + // The code at 0xb0ac writes to 1411/1F (??), then 1403/02 (bank), then + // 1409/08/0b/0a (address). It waits a few cycles and at 0xb0f7 it reads the + // resulting data from 1401. + offs_t bank = m_sound_io_buffer[0x03]; + offs_t addr = get_u24le(&m_sound_io_buffer[0x09]); + addr = ((addr >> 6) + 2) & 0x3ffff; + addr |= (bank << 16); + // write actual ROM address to 1440..1443 for debugging + put_u32be(&m_sound_io_buffer[40], addr); + return m_pcm_rom[addr]; + } + return m_sound_io_buffer[offset]; +} + +void roland_d70_state::snd_io_w(offs_t offset, u8 data) { + // register map + // ------------ + // Note: 16-bit words are Little Endian, the firmware writes the odd byte is + // first + // 00/01 - ?? + // 02/03 - ROM bank (only bits 11-13 are used, bit 11 = PCM card, bits 12-13 + // select between IC18/19/20) 04/05 - frequency (2.14 fixed point, 0x4000 = + // 32000 Hz) 06/07 - volume 08/09 - sample start address, fraction (2.14 + // fixed point, i.e. 1 byte = 0x4000) 0A/0B - sample start address (high + // word, i.e. address bits 2..17) 0C/0D - sample end address (high word) + // 0E/0F - sample loop address (high word) + // 11/13/15/17 - voice enable mask (11 = least significant 8 bits, 17 = most + // significant 8 bits) 1A - ?? 1F - voice select + if (offset < 0x20) { + m_pcm->write(offset, data); + } + m_sound_io_buffer[offset] = data; +} + +u8 roland_d70_state::ach0_r() { return 128; } +u8 roland_d70_state::ach1_r() { return 128; } +u8 roland_d70_state::ach2_r() { return 128; } +u8 roland_d70_state::ach3_r() { return 128; } +u8 roland_d70_state::ach4_r() { return 128; } + +TIMER_DEVICE_CALLBACK_MEMBER(roland_d70_state::samples_timer_cb) { +} + +void roland_d70_state::lcd_palette(palette_device &palette) const { + palette.set_pen_color(0, rgb_t(138, 146, 148)); + palette.set_pen_color(1, rgb_t(69, 62, 66)); +} + +void roland_d70_state::d70_map(address_map &map) { + map(0x0100, 0x0100).w(FUNC(roland_d70_state::bank_w)); + map(0x0400, 0x07ff).rw(FUNC(roland_d70_state::ksga_io_r), FUNC(roland_d70_state::ksga_io_w)); + map(0x0800, 0x0802).rw(m_lcd, FUNC(t6963c_device::read), FUNC(t6963c_device::write)).umask16(0x00ff); + map(0x0900, 0x09ff).rw(FUNC(roland_d70_state::snd_io_r), FUNC(roland_d70_state::snd_io_w)); + map(0x0a00, 0x0aff).rw(FUNC(roland_d70_state::dsp_io_r), FUNC(roland_d70_state::dsp_io_w)); + map(0x0c00, 0x0cff).rw(FUNC(roland_d70_state::tvf_io_r), FUNC(roland_d70_state::tvf_io_w)); + map(0x1000, 0x7fff).rom().region("maincpu", 0x1000); + map(0x8000, 0xbfff).view(m_bank_view); + m_bank_view[0](0x8000, 0xbfff).bankr(m_rom_bank); + m_bank_view[1](0x8000, 0xbfff).bankrw(m_ram_bank); + //map(0xc000, 0xffff) fixed RAM - will install on start +} + +void roland_d70_state::d70(machine_config &config) { + i8x9x_device &maincpu(N8097BH(config, m_cpu, 12_MHz_XTAL)); + maincpu.set_addrmap(AS_PROGRAM, &roland_d70_state::d70_map); + maincpu.serial_tx_cb().set("mdout", FUNC(midi_port_device::write_txd)); + maincpu.in_p0_cb().set(FUNC(roland_d70_state::port0_r)); + maincpu.in_p1_cb().set(FUNC(roland_d70_state::port1_r)); + maincpu.out_p1_cb().set(FUNC(roland_d70_state::port1_w)); + maincpu.ach0_cb().set(FUNC(roland_d70_state::ach0_r)); + maincpu.ach1_cb().set(FUNC(roland_d70_state::ach1_r)); + maincpu.ach2_cb().set(FUNC(roland_d70_state::ach2_r)); + maincpu.ach3_cb().set(FUNC(roland_d70_state::ach3_r)); + maincpu.ach4_cb().set(FUNC(roland_d70_state::ach4_r)); + + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + + MB87419_MB87420(config, m_pcm, 32.768_MHz_XTAL); + m_pcm->int_callback().set_inputline(m_cpu, i8x9x_device::EXTINT_LINE); + m_pcm->add_route(0, "lspeaker", 1.0); + m_pcm->add_route(1, "rspeaker", 1.0); + + T6963C(config, m_lcd, 0); + m_lcd->set_addrmap(0, &roland_d70_state::lcd_map); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_size(240, 64); + screen.set_visarea_full(); + screen.set_screen_update("lcd", FUNC(t6963c_device::screen_update)); + screen.set_palette("palette"); + + PALETTE(config, "palette", FUNC(roland_d70_state::lcd_palette), 2); + + TIMER(config, m_midi_timer).configure_periodic(FUNC(roland_d70_state::midi_timer_cb), attotime::from_hz(1250)); + + TIMER(config, "samples_timer").configure_periodic(FUNC(roland_d70_state::samples_timer_cb), attotime::from_hz(32000 * 2)); + + midi_port_device &mdin(MIDI_PORT(config, "mdin", midiin_slot, "midiin")); + mdin.rxd_handler().set(FUNC(roland_d70_state::midi_in_w)); + mdin.rxd_handler().append("mdthru", FUNC(midi_port_device::write_txd)); + + MIDI_PORT(config, "mdout", midiout_slot, "midiout"); + MIDI_PORT(config, "mdthru", midiout_slot, "midiout"); +} + +void roland_d70_state::init_d70() { + // Roland did a fair amount of scrambling on the address and data lines. + // Only the first 0x80 bytes of the ROMs are readable text in a raw dump. + // The U-110 actually checks some of these header bytes, but it uses + // post-scrambling variants of offsets/values. + u8 *src = reinterpret_cast(memregion("pcmorg")->base()); + u8 *dst = reinterpret_cast(memregion("pcm")->base()); + // descramble internal ROMs + descramble_rom_internal(&dst[0x000000], &src[0x000000]); + descramble_rom_internal(&dst[0x100000], &src[0x100000]); + descramble_rom_internal(&dst[0x200000], &src[0x200000]); + descramble_rom_internal(&dst[0x300000], &src[0x300000]); + descramble_rom_internal(&dst[0x400000], &src[0x400000]); + descramble_rom_internal(&dst[0x500000], &src[0x500000]); +} + +void roland_d70_state::descramble_rom_internal(u8 *dst, const u8 *src) { + for (offs_t srcpos = 0x00; srcpos < 0x80000; srcpos++) { + const offs_t dstpos = UNSCRAMBLE_ADDR_INT(srcpos); + dst[dstpos] = UNSCRAMBLE_DATA(src[srcpos]); + } +} + +ROM_START(d70) + ROM_REGION(0x20000, "maincpu", 0) + ROM_SYSTEM_BIOS(0, "v203", "Version 2.03") + ROMX_LOAD("roland_d70_v110_combined.bin", 0x00000, 0x20000, CRC(52deab1e) SHA1(87d7196888edec65c9feddd16d4c715f6992abc7), ROM_BIOS(0)) + + ROM_REGION(0x600000, "pcmorg", 0) // ROMs before descrambling + ROM_LOAD("roland_d70_waverom-a.bin", 0x000000, 0x80000, CRC(8e53b2a3) SHA1(4872530870d5079776e80e477febe425dc0ec1df)) + ROM_LOAD("roland_d70_waverom-b.bin", 0x100000, 0x80000, CRC(c8220761) SHA1(49e55fa672020f95fd9c858ceaae94d6db93df7d)) + ROM_LOAD("roland_d70_waverom-c.bin", 0x200000, 0x80000, CRC(733c4054) SHA1(9b6b59ab74e5bf838702abb087c408aaa85b7b1f)) + ROM_LOAD("roland_d70_waverom-d.bin", 0x300000, 0x80000, CRC(b6c662d2) SHA1(3fcbcfd0d8d0fa419c710304c12482e2f79a907f)) + ROM_LOAD("roland_d70_waverom-e.bin", 0x400000, 0x80000, CRC(d46cc7a4) SHA1(d378ac89a5963e37f7c157b3c8e71892c334fd7b)) + ROM_LOAD("roland_d70_waverom-f.bin", 0x500000, 0x80000, CRC(d4b01f5e) SHA1(acd867d68e49e5f59f1006ed14a7ca197b6dc4af)) + ROM_REGION(0x600000, "pcm", ROMREGION_ERASEFF) // ROMs after descrambling + + ROM_REGION(0x400, "lcd:cgrom", 0) + ROM_LOAD("t6963c_0101.bin", 0x000, 0x400, CRC(547d118b) SHA1(0dd3e3acd3d47e6ece644c98c390fc86587373e9)) + // This t6963c_0101 internal CG ROM is similar to lm24014w_0101.bin which may be + // used as a replacement +ROM_END + +} // anonymous namespace + +SYST(1991, d70, 0, 0, d70, d70, roland_d70_state, init_d70, "Roland", "D-70 Super LA Synthesizer", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) diff -Nru mame-0.263+dfsg.1/src/mame/roland/roland_sc55mk2.cpp mame-0.264+dfsg.1/src/mame/roland/roland_sc55mk2.cpp --- mame-0.263+dfsg.1/src/mame/roland/roland_sc55mk2.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/roland/roland_sc55mk2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,96 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +/************************************************************************************************* + + Roland Sound Canvas SC-55mkII + + Skeleton by R. Belmont + + The Roland SC-55mkII is an expander (synthesizer without the keyboard) + from 1994. It has 28 voice polyphony, is 16 part multitimbral, and + outputs 18-bit stereo samples at 32 kHz. The synthesis engine uses a + combination of Roland's LA and straight PCM playback. + + The front panel includes the power switch, a headphone jack with volume knob, + a second MIDI IN port, a large LCD, ALL and MUTE buttons, and a group of up/down + buttons for Part, Level, Reverb, Key Shift, Instrument, Pan, Chorus, and MIDI Channel. + + Main PCB: + + 20.0 MHz crystal + Roland R15199848 HD6475328F Hitachi H8/532 MCU with internal ROM (main CPU) + Roland R15199849 M37409M2-FP Mitsubishi M740 series microcontroller (sub CPU) + Roland R15209463 4M MASK ROM Main program, version 1.00 + Roland R15209359 16M WAVE ROM + Roland R15279813 8M WAVE ROM + Roland R15279543 SRM20256SLM10 SRAM (32K x 8-bit non-volatile work RAM) + Roland R15179463 TC51832FL-85 PSRAM (32Kword x 8-bit PCM custom chip's work RAM) + Roland R15219714 uPD63200GS-E2 D/A converter + PCM custom is IC26, part number is not currently known + + TODO: + - H8/500 series CPU core + - M37409M2 MCU support + - LCD + - Sound synthesis +*/ + +#include "emu.h" + +#include "cpu/h8500/h8532.h" + + +namespace { + +static INPUT_PORTS_START( sc55mk2 ) +INPUT_PORTS_END + +class sc55mk2_state : public driver_device +{ +public: + sc55mk2_state(const machine_config &mconfig, device_type type, const char *tag); + + void sc55mk2(machine_config &config); + +private: + required_device m_maincpu; + + void sc55mk2_map(address_map &map); +}; + +sc55mk2_state::sc55mk2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") +{ +} + +void sc55mk2_state::sc55mk2_map(address_map &map) +{ + map(0x40000, 0x7ffff).rom().region("progrom", 0); +} + +void sc55mk2_state::sc55mk2(machine_config &config) +{ + HD6435328(config, m_maincpu, 20_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &sc55mk2_state::sc55mk2_map); +} + +ROM_START( sc55mk2 ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASE00 ) // H8/532 main code + ROM_LOAD("r15199858_main_mcu.bin", 0x000000, 0x008000, CRC(9b66631f) SHA1(b91bb1d9dccffe831b7cfde7800a3fe32b2fbda6)) + + ROM_REGION( 0x1000, "subcpu", 0 ) // M37409M2 sub-CPU with 3 UARTs, clocked at 10 MHz + ROM_LOAD("r15199880_secondary_mcu.bin", 0x000000, 0x001000, CRC(702c0a82) SHA1(4d48578d811a762a8e7bfaf18989bcac70ae1ba4)) + + ROM_REGION( 0x80000, "progrom", 0 ) // additional H8/532 code and patch data + ROM_LOAD("r00233567_control.bin", 0x000000, 0x080000, CRC(fcee1e8e) SHA1(078cb5feea05e80bb9a1bb857a2163ee434fd053)) + + ROM_REGION( 0x300000, "waverom", 0 ) + ROM_LOAD("r15209359_pcm_1.bin", 0x000000, 0x200000, CRC(1519d3b3) SHA1(96708cb21381c2fd03de4babbf7aea301c7594a6)) + ROM_LOAD("r15279813_pcm_2.bin", 0x200000, 0x100000, CRC(0f826c7f) SHA1(4d91cdeaed048d653dbf846a221003c3a3f08279)) +ROM_END + +} // anonymous namespace + + +SYST( 1994, sc55mk2, 0, 0, sc55mk2, sc55mk2, sc55mk2_state, empty_init, "Roland", "Sound Canvas SC-55mkii", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/chessac.cpp mame-0.264+dfsg.1/src/mame/saitek/chessac.cpp --- mame-0.263+dfsg.1/src/mame/saitek/chessac.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/chessac.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,395 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Saitek Kasparov Chess Academy / Mephisto Schachakademie (both were later rebranded +to Mephisto Talking Chess Academy) + +The chess engine is by Frans Morsch, similar to the one in GK 2000. Other features, +such as the speech and tutorial lessons, were supposedly added by Craig Barnes. + +Hardware notes: +- PCB label: SCH RT33-PE-041 Rev 3.0 +- Hitachi H8/3214 MCU, 16MHz XTAL +- same LCD as GK 2000 +- OKI MSM6588 ADPCM Recorder @ 4MHz, small daughterboard with 4MB ROM under epoxy +- 8*8 LEDs, button sensors chessboard + +TODO: +- it does a cold boot at every reset, so nvram won't work properly unless MAME + adds some kind of auxillary autosave state feature at power-off +- dump/add German speech ROM (Mephisto Schachakademie, MCU is same) +- does a French speech version exist? + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/h8/h83217.h" +#include "machine/sensorboard.h" +#include "sound/okim6588.h" +#include "video/pwm.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "saitek_chessac.lh" + + +namespace { + +class chessac_state : public driver_device +{ +public: + chessac_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_adpcm_rom(*this, "adpcm"), + m_led_pwm(*this, "led_pwm"), + m_lcd_pwm(*this, "lcd_pwm"), + m_okim6588(*this, "okim6588"), + m_inputs(*this, "IN.%u", 0), + m_out_lcd(*this, "s%u.%u", 0U, 0U) + { } + + void chessac(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(go_button); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_region_ptr m_adpcm_rom; + required_device m_led_pwm; + required_device m_lcd_pwm; + required_device m_okim6588; + required_ioport_array<3> m_inputs; + output_finder<2, 24> m_out_lcd; + + u16 m_inp_mux = 0; + u32 m_lcd_segs = 0; + u8 m_lcd_com = 0; + u8 m_led_select = 0; + u8 m_led_data = 0; + u32 m_adpdm_address = 0; + + u8 m_port3 = 0; + u8 m_port5 = 0; + u8 m_port7 = 0; + + // I/O handlers + void lcd_pwm_w(offs_t offset, u8 data); + void update_lcd(); + template void lcd_segs_w(u8 data); + + void standby(int state); + + void update_leds(); + void update_adpcm_address(); + + void p3_w(u8 data); + u8 p4_r(); + void p5_w(u8 data); + void p6_w(u8 data); + u8 p7_r(); + void p7_w(u8 data); +}; + +void chessac_state::machine_start() +{ + m_out_lcd.resolve(); + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_lcd_segs)); + save_item(NAME(m_lcd_com)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_data)); + save_item(NAME(m_adpdm_address)); + save_item(NAME(m_port3)); + save_item(NAME(m_port5)); + save_item(NAME(m_port7)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +// power + +void chessac_state::standby(int state) +{ + // clear display + if (state) + { + m_lcd_pwm->clear(); + m_led_pwm->clear(); + } +} + +INPUT_CHANGED_MEMBER(chessac_state::go_button) +{ + m_maincpu->set_input_line(INPUT_LINE_IRQ0, newval ? ASSERT_LINE : CLEAR_LINE); +} + + +// LCD + +void chessac_state::lcd_pwm_w(offs_t offset, u8 data) +{ + m_out_lcd[offset & 0x3f][offset >> 6] = data; +} + +void chessac_state::update_lcd() +{ + // LCD latch from P1x + if (m_port5 & 1) + m_lcd_segs = (m_lcd_segs << 8 & 0xff0000) | (m_lcd_segs & 0xffff); + + u32 lcd_segs = bitswap<24>(m_lcd_segs,11,18,19,20,21,12,13,14,15,22,23,0,1,2,3,4,5,6,7,16,17,8,9,10); + + for (int i = 0; i < 2; i++) + { + // LCD common is analog (voltage level) + const u8 com = population_count_32(m_lcd_com >> (i * 2) & 3); + const u32 data = (com == 0) ? lcd_segs : (com == 2) ? ~lcd_segs : 0; + m_lcd_pwm->write_row(i, data); + } +} + +template +void chessac_state::lcd_segs_w(u8 data) +{ + // P1x, P2x: LCD segments + const u8 shift = 8 * N; + m_lcd_segs = (m_lcd_segs & ~(0xff << shift)) | (data << shift); + update_lcd(); +} + + +// misc + +void chessac_state::update_leds() +{ + if (m_port5 & 0x10) + m_led_select = ~m_port7; + if (m_port5 & 0x20) + m_led_data = m_port7; + + m_led_pwm->matrix(m_led_select, m_led_data); +} + +void chessac_state::update_adpcm_address() +{ + for (int i = 0; i < 3; i++) + if (BIT(m_port3, i)) + { + const u8 shift = 8 * i; + m_adpdm_address = (m_adpdm_address & ~(0xff << shift)) | (m_port7 << shift); + } +} + +void chessac_state::p3_w(u8 data) +{ + // P37: MSM6588 RESET + if (m_port3 & 0x80 && ~data & 0x80) + m_okim6588->reset(); + + // P34: MSM6588 RD + // P35: MSM6588 WR + // P36: MSM6588 CE + if ((data & 0xc0) == 0x80 && m_port3 & 0x20 && ~data & 0x20) + m_okim6588->data_w(m_port7); + + // P33: ADPCM ROM CE + // P30-P33: enable ADPCM ROM address latches + m_port3 = data; + update_adpcm_address(); +} + +u8 chessac_state::p4_r() +{ + // P40-P47: multiplexed inputs + u8 data = 0; + + // read buttons + for (int i = 0; i < 2; i++) + if (BIT(m_inp_mux, i + 8)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i, true); + + return ~data; +} + +void chessac_state::p5_w(u8 data) +{ + // P50: enable LCD latch + m_port5 = data; + update_lcd(); + + // P51: ext power (no need to emulate it) + // P52,P53: N/C + + // P54,P55: enable LED latches + update_leds(); +} + +void chessac_state::p6_w(u8 data) +{ + // P60-P63: LCD common + m_lcd_com = data & 0xf; + update_lcd(); + + // P65,P66: input mux (buttons) + m_inp_mux = (m_inp_mux & 0xff) | (~data << 3 & 0x300); +} + +u8 chessac_state::p7_r() +{ + u8 data = 0xff; + + // P70-P77: read ADPCM ROM + if (~m_port3 & 8) + data &= m_adpcm_rom[m_adpdm_address & (m_adpcm_rom.bytes() - 1)]; + + // P70-P73: read MSM6588 status + if ((m_port3 & 0xf0) == 0xa0) + data &= (m_okim6588->data_r() | 0xf0); + + return data; +} + +void chessac_state::p7_w(u8 data) +{ + // P70-P77: input mux (chessboard) + m_inp_mux = (m_inp_mux & 0x300) | (data ^ 0xff); + + // also data for LED latches, ADPCM address latches, and MSM6588 + m_port7 = data; + update_leds(); + update_adpcm_address(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( chessac ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_F1) PORT_NAME("Yes") // combine for NEW GAME + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_F1) PORT_NAME("No") // " + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Position") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hint / Info") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_B) PORT_NAME("Fwd / Black") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Pawn") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Rook") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("King") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Tutorial") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Say Again") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_W) PORT_NAME("Back / White") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Knight") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Queen") + + PORT_START("IN.2") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CHANGED_MEMBER(DEVICE_SELF, chessac_state, go_button, 0) PORT_NAME("Go / Stop") + PORT_BIT(0xef, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("CLICKABLE") // helper for clickable artwork + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void chessac_state::chessac(machine_config &config) +{ + // basic machine hardware + H83214(config, m_maincpu, 16_MHz_XTAL); + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(h83214_device::nvram_set_battery)); + m_maincpu->standby_cb().append(FUNC(chessac_state::standby)); + m_maincpu->write_port1().set(FUNC(chessac_state::lcd_segs_w<1>)); + m_maincpu->write_port2().set(FUNC(chessac_state::lcd_segs_w<0>)); + m_maincpu->write_port3().set(FUNC(chessac_state::p3_w)); + m_maincpu->read_port4().set(FUNC(chessac_state::p4_r)); + m_maincpu->write_port5().set(FUNC(chessac_state::p5_w)); + m_maincpu->read_port6().set_ioport("IN.2").invert(); + m_maincpu->write_port6().set(FUNC(chessac_state::p6_w)); + m_maincpu->read_port7().set(FUNC(chessac_state::p7_r)); + m_maincpu->write_port7().set(FUNC(chessac_state::p7_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + //m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_lcd_pwm).set_size(2, 24); + m_lcd_pwm->output_x().set(FUNC(chessac_state::lcd_pwm_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920/5, 804/5); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_led_pwm).set_size(8, 8); + config.set_default_layout(layout_saitek_chessac); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + + OKIM6588(config, m_okim6588, 4_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.5); + m_okim6588->write_mon().set_inputline(m_maincpu, INPUT_LINE_NMI).invert(); + m_okim6588->set_mcum_pin(1); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( chessac ) + ROM_REGION16_BE( 0x8000, "maincpu", 0 ) + ROM_LOAD("97_saitek_86165400831_hd6433214a08f.u1", 0x0000, 0x8000, CRC(29d06d6a) SHA1(08b6f4093b240b0a34d9da67c9acffc576ba1d2d) ) + + ROM_REGION( 0x400000, "adpcm", 0 ) + ROM_LOAD("adpcm.u10", 0x000000, 0x400000, CRC(73d9650c) SHA1(ecf3bd72fc954528fa72f64eac91e225d11150c6) ) // no label + + ROM_REGION( 68501, "screen", 0 ) + ROM_LOAD("gk2000.svg", 0, 68501, CRC(80554c49) SHA1(88f06ec8f403eaaf7cbce4cc84807b5742ce7108) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1997, chessac, 0, 0, chessac, chessac, chessac_state, empty_init, "Saitek", "Kasparov Chess Academy", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/chesstrv.cpp mame-0.264+dfsg.1/src/mame/saitek/chesstrv.cpp --- mame-0.263+dfsg.1/src/mame/saitek/chesstrv.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/chesstrv.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -212,8 +212,8 @@ PORT_START("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV / CS") // level/clear square - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("FP") // find position - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("EP") // enter position + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("FP") // find position + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("EP") // enter position PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("CB") // clear board PORT_START("IN.3") @@ -233,8 +233,8 @@ PORT_MODIFY("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level / CS") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Find Position") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Enter Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Find Position") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Enter Position") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") PORT_MODIFY("IN.3") @@ -313,5 +313,5 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys / Novag Industries", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1982, chesstrvi, 0, 0, chesstrvi, chesstrvi, chesstrv_state, empty_init, "SciSys", "Chess Intercontinental Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/companion.cpp mame-0.264+dfsg.1/src/mame/saitek/companion.cpp --- mame-0.263+dfsg.1/src/mame/saitek/companion.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/companion.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -58,7 +58,7 @@ required_device m_pia; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/companion2.cpp mame-0.264+dfsg.1/src/mame/saitek/companion2.cpp --- mame-0.263+dfsg.1/src/mame/saitek/companion2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/companion2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -301,7 +301,7 @@ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level / Sound") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play / PVP") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play / PVP") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Knight") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Pawn") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Queen") @@ -319,7 +319,7 @@ PORT_MODIFY("IN.1") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Enter Position") PORT_MODIFY("IN.2") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/corona.cpp mame-0.264+dfsg.1/src/mame/saitek/corona.cpp --- mame-0.263+dfsg.1/src/mame/saitek/corona.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/corona.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,7 +53,7 @@ // devices/pointers memory_view m_rombank; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<8+1> m_inputs; u8 m_control1 = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/cp2000.cpp mame-0.264+dfsg.1/src/mame/saitek/cp2000.cpp --- mame-0.263+dfsg.1/src/mame/saitek/cp2000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/cp2000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -64,7 +64,7 @@ required_device m_maincpu; required_device m_display; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_inputs; u16 m_inp_mux = 0; @@ -258,4 +258,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, cp2000, 0, 0, cp2000, cp2000, cp2000_state, empty_init, "SciSys / Novag Industries", "Chess Partner 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/delta1.cpp mame-0.264+dfsg.1/src/mame/saitek/delta1.cpp --- mame-0.263+dfsg.1/src/mame/saitek/delta1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/delta1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -253,4 +253,4 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1980, ccdelta1, 0, 0, delta1, delta1, delta1_state, empty_init, "SciSys / Novag", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1980, ccdelta1, 0, 0, delta1, delta1, delta1_state, empty_init, "SciSys / Novag Industries", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/ecbackg.cpp mame-0.264+dfsg.1/src/mame/saitek/ecbackg.cpp --- mame-0.263+dfsg.1/src/mame/saitek/ecbackg.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/ecbackg.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -73,7 +73,7 @@ required_device m_board; required_device m_led_pwm; required_device m_lcd_pwm; - required_device m_dac; + required_device m_dac; required_ioport_array<6> m_inputs; output_finder<2, 24> m_out_lcd; @@ -446,7 +446,7 @@ PORT_START("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_A) PORT_NAME("Double / Accept") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Reject") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Game Option") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/edames.cpp mame-0.264+dfsg.1/src/mame/saitek/edames.cpp --- mame-0.263+dfsg.1/src/mame/saitek/edames.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/edames.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -71,7 +71,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_inputs; u16 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/gk2000.cpp mame-0.264+dfsg.1/src/mame/saitek/gk2000.cpp --- mame-0.263+dfsg.1/src/mame/saitek/gk2000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/gk2000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -10,8 +10,8 @@ Hardware notes: - Hitachi H8/323 MCU, 20MHz XTAL -- LCD with custom segments -- piezo, 16 leds, button sensors chessboard +- LCD with 5 7segs and custom segments +- piezo, 16 LEDs, button sensors chessboard A13 MCU is used in: - Saitek GK 2000 (86071220X12) @@ -23,7 +23,7 @@ TODO: - it does a cold boot at every reset, so nvram won't work properly unless MAME - has some kind of auxillary autosave state feature at power-off + adds some kind of auxillary autosave state feature at power-off *******************************************************************************/ @@ -71,7 +71,7 @@ required_device m_board; required_device m_led_pwm; required_device m_lcd_pwm; - required_device m_dac; + required_device m_dac; required_ioport_array<4> m_inputs; output_finder<2, 24> m_out_lcd; @@ -79,17 +79,17 @@ u32 m_lcd_segs = 0; u8 m_lcd_com = 0; - void main_map(address_map &map); - // I/O handlers void lcd_pwm_w(offs_t offset, u8 data); void update_lcd(); template void lcd_segs_w(u8 data); void lcd_com_w(u8 data); + void standby(int state); + void p2_w(u8 data); u8 p4_r(); - void p5_w(offs_t offset, u8 data, u8 mem_mask); + void p5_w(u8 data); }; void gk2000_state::machine_start() @@ -104,8 +104,8 @@ INPUT_CHANGED_MEMBER(gk2000_state::change_cpu_freq) { - // only 20MHz and 14MHz versions are known to exist, but the software supports others (-1 is invalid) - static const int xm[9] = { 8, 20, 24, 28, 32, -1, -1, -1, 14 }; // XTAL in MHz + // only 20MHz and 14MHz versions are known to exist, but the software supports others + static const int xm[9] = { 8, 20, 24, 28, 32, -1, -1, -1, 14 }; // XTAL in MHz (-1 is invalid) int mhz = xm[(count_leading_zeros_32(bitswap<8>(newval,0,1,2,3,4,5,6,7)) - 24) % 9]; if (mhz > 0) @@ -118,6 +118,24 @@ I/O *******************************************************************************/ +// power + +void gk2000_state::standby(int state) +{ + // clear display + if (state) + { + m_lcd_pwm->clear(); + m_led_pwm->clear(); + } +} + +INPUT_CHANGED_MEMBER(gk2000_state::go_button) +{ + m_maincpu->set_input_line(INPUT_LINE_IRQ0, newval ? ASSERT_LINE : CLEAR_LINE); +} + + // LCD void gk2000_state::lcd_pwm_w(offs_t offset, u8 data) @@ -155,11 +173,6 @@ // misc -INPUT_CHANGED_MEMBER(gk2000_state::go_button) -{ - m_maincpu->set_input_line(INPUT_LINE_IRQ0, newval ? ASSERT_LINE : CLEAR_LINE); -} - void gk2000_state::p2_w(u8 data) { // P20-P27: input mux (chessboard), led data @@ -185,10 +198,8 @@ return ~data; } -void gk2000_state::p5_w(offs_t offset, u8 data, u8 mem_mask) +void gk2000_state::p5_w(u8 data) { - data |= ~mem_mask; - // P50: speaker out m_dac->write(data & 1); @@ -202,24 +213,13 @@ /******************************************************************************* - Address Maps -*******************************************************************************/ - -void gk2000_state::main_map(address_map &map) -{ - map(0x0000, 0x3fff).rom(); -} - - - -/******************************************************************************* Input Ports *******************************************************************************/ static INPUT_PORTS_START( gk2000 ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Position") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Info") @@ -257,13 +257,14 @@ { // basic machine hardware H8323(config, m_maincpu, 20_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &gk2000_state::main_map); m_maincpu->nvram_enable_backup(true); m_maincpu->standby_cb().set(m_maincpu, FUNC(h8325_device::nvram_set_battery)); + m_maincpu->standby_cb().append(FUNC(gk2000_state::standby)); m_maincpu->write_port1().set(FUNC(gk2000_state::lcd_segs_w<0>)); m_maincpu->write_port2().set(FUNC(gk2000_state::p2_w)); m_maincpu->write_port3().set(FUNC(gk2000_state::lcd_segs_w<1>)); m_maincpu->read_port4().set(FUNC(gk2000_state::p4_r)); + m_maincpu->read_port5().set_constant(0xff); m_maincpu->write_port5().set(FUNC(gk2000_state::p5_w)); m_maincpu->read_port6().set_ioport("IN.3").invert(); m_maincpu->write_port6().set(FUNC(gk2000_state::lcd_com_w)); diff -Nru mame-0.263+dfsg.1/src/mame/saitek/intchess.cpp mame-0.264+dfsg.1/src/mame/saitek/intchess.cpp --- mame-0.263+dfsg.1/src/mame/saitek/intchess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/intchess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -74,7 +74,7 @@ required_device m_via; required_device m_encoder; required_device m_display; - required_device m_dac; + required_device m_dac; required_shared_ptr m_vram; required_device m_gfxdecode; required_device m_screen; @@ -253,7 +253,7 @@ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4 / Rook") PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black") PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Record") // Speichern - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Place") // Setzen + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Place") // Setzen PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Step") // Vor PORT_START("RESET") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/mark5.cpp mame-0.264+dfsg.1/src/mame/saitek/mark5.cpp --- mame-0.263+dfsg.1/src/mame/saitek/mark5.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/mark5.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -96,7 +96,7 @@ optional_region_ptr m_cb_rom; optional_device_array m_display; required_device_array m_lcd; - required_device m_dac; + required_device m_dac; required_shared_ptr m_nvram; required_ioport_array<7+2> m_inputs; output_finder<3, 8, 34> m_out_x; @@ -318,11 +318,11 @@ static INPUT_PORTS_START( mark5 ) PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Enter Position") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Enter Position") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Draw") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Peripheral") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Next Simult") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Next Simult") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Swap") PORT_START("IN.1") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/minichess.cpp mame-0.264+dfsg.1/src/mame/saitek/minichess.cpp --- mame-0.263+dfsg.1/src/mame/saitek/minichess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/minichess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -161,7 +161,7 @@ PORT_START("IN.2") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7 / White") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("FP") // find position + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("FP") // find position PORT_START("IN.3") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/prisma.cpp mame-0.264+dfsg.1/src/mame/saitek/prisma.cpp --- mame-0.263+dfsg.1/src/mame/saitek/prisma.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/prisma.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -16,7 +16,7 @@ - PCB label: ST9A-PE-001 - Hitachi H8/325 MCU, 20MHz XTAL - Epson SED1502F, LCD screen (same as simultano) -- piezo, 16+3 leds, button sensors chessboard +- piezo, 16+3 LEDs, button sensors chessboard In 1992, it was also sold by Tandy as Chess Champion 2150L, still manufactured by Saitek. Overall, the hardware is the same, but with a slower CPU (16MHz XTAL). @@ -76,13 +76,11 @@ u8 m_lcd_data = 0; u8 m_lcd_address = 0; - u8 m_lcd_write = 0; + u8 m_lcd_control = 0; u8 m_inp_mux = 0; u8 m_led_select = 0; u8 m_led_direct = 0; - void main_map(address_map &map); - // I/O handlers void lcd_pwm_w(offs_t offset, u8 data); void lcd_output_w(offs_t offset, u64 data); @@ -92,6 +90,7 @@ void p1_w(u8 data); void p2_w(u8 data); + u8 p3_r(); void p3_w(u8 data); void p4_w(u8 data); u8 p5_r(); @@ -107,7 +106,7 @@ // register for savestates save_item(NAME(m_lcd_data)); save_item(NAME(m_lcd_address)); - save_item(NAME(m_lcd_write)); + save_item(NAME(m_lcd_control)); save_item(NAME(m_inp_mux)); save_item(NAME(m_led_select)); save_item(NAME(m_led_direct)); @@ -117,7 +116,7 @@ { // 12MHz and 24MHz versions don't exist, but the software supports it static const XTAL freq[4] = { 16_MHz_XTAL, 20_MHz_XTAL, 24_MHz_XTAL, 12_MHz_XTAL }; - m_maincpu->set_unscaled_clock(freq[bitswap<2>(newval,7,0)] / 2); + m_maincpu->set_unscaled_clock(freq[bitswap<2>(newval,7,0)]); } @@ -179,8 +178,7 @@ // P14: speaker out m_dac->level_w(BIT(data, 4)); - // P16: ext power - // (no need to emulate it) + // P16: ext power (no need to emulate it) } void prisma_state::p2_w(u8 data) @@ -190,6 +188,13 @@ update_leds(); } +u8 prisma_state::p3_r() +{ + // P30-P37: LCD data (never reads here) + logerror("read from LCD\n"); + return 0xff; +} + void prisma_state::p3_w(u8 data) { // P30-P37: LCD data @@ -201,16 +206,16 @@ // P40: LCD CS // P41: LCD RD // P42: LCD WR - if (~data & m_lcd_write && ~data & 1) + if (~data & m_lcd_control & 4 && ~data & 1) m_lcd->write(m_lcd_address, m_lcd_data); - m_lcd_write = data & 4; + m_lcd_control = data; } u8 prisma_state::p5_r() { u8 data = 0; - // P50,P52: read buttons + // P50-P52: read buttons for (int i = 0; i < 3; i++) if (m_inp_mux & m_inputs[i]->read()) data |= 1 << i; @@ -249,17 +254,6 @@ /******************************************************************************* - Address Maps -*******************************************************************************/ - -void prisma_state::main_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); -} - - - -/******************************************************************************* Input Ports *******************************************************************************/ @@ -314,14 +308,15 @@ { // basic machine hardware H8325(config, m_maincpu, 20_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &prisma_state::main_map); m_maincpu->nvram_enable_backup(true); m_maincpu->nvram_set_default_value(~0); m_maincpu->standby_cb().set(m_maincpu, FUNC(h8325_device::nvram_set_battery)); m_maincpu->standby_cb().append(FUNC(prisma_state::standby)); m_maincpu->write_port1().set(FUNC(prisma_state::p1_w)); m_maincpu->write_port2().set(FUNC(prisma_state::p2_w)); + m_maincpu->read_port3().set(FUNC(prisma_state::p3_r)); m_maincpu->write_port3().set(FUNC(prisma_state::p3_w)); + m_maincpu->read_port4().set_constant(0xff); m_maincpu->write_port4().set(FUNC(prisma_state::p4_w)); m_maincpu->read_port5().set(FUNC(prisma_state::p5_r)); m_maincpu->write_port5().set(FUNC(prisma_state::p5_w)); @@ -359,7 +354,7 @@ *******************************************************************************/ ROM_START( prisma ) - ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_REGION16_BE( 0x8000, "maincpu", 0 ) ROM_LOAD("90_saitek_86051150st9_3258l02p.u1", 0x0000, 0x8000, CRC(b6f8384f) SHA1(a4e8a4a45009c15bda1778512a87dea756aae6d8) ) ROM_REGION( 795951, "screen", 0 ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/prschess.cpp mame-0.264+dfsg.1/src/mame/saitek/prschess.cpp --- mame-0.263+dfsg.1/src/mame/saitek/prschess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/prschess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -59,7 +59,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<3> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/risc2500.cpp mame-0.264+dfsg.1/src/mame/saitek/risc2500.cpp --- mame-0.263+dfsg.1/src/mame/saitek/risc2500.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/risc2500.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,20 +65,20 @@ class risc2500_state : public driver_device { public: - risc2500_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_rom(*this, "maincpu") - , m_ram(*this, "ram") - , m_nvram(*this, "nvram") - , m_disable_bootrom(*this, "disable_bootrom") - , m_speaker(*this, "speaker") - , m_lcdc(*this, "lcdc") - , m_board(*this, "board") - , m_inputs(*this, "IN.%u", 0) - , m_digits(*this, "digit%u", 0U) - , m_syms(*this, "sym%u", 0U) - , m_leds(*this, "led%u", 0U) + risc2500_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_ram(*this, "ram"), + m_nvram(*this, "nvram"), + m_disable_bootrom(*this, "disable_bootrom"), + m_speaker(*this, "speaker"), + m_lcdc(*this, "lcdc"), + m_board(*this, "board"), + m_inputs(*this, "IN.%u", 0), + m_digits(*this, "digit%u", 0U), + m_syms(*this, "sym%u", 0U), + m_leds(*this, "led%u", 0U) { } DECLARE_INPUT_CHANGED_MEMBER(on_button); @@ -386,10 +386,10 @@ PORT_START("IN.5") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("King") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Play") PORT_CODE(KEYCODE_L) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Play") PORT_CODE(KEYCODE_P) PORT_START("IN.6") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("New Game") PORT_CODE(KEYCODE_N) PORT_START("IN.7") diff -Nru mame-0.263+dfsg.1/src/mame/saitek/schess.cpp mame-0.264+dfsg.1/src/mame/saitek/schess.cpp --- mame-0.263+dfsg.1/src/mame/saitek/schess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/schess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -73,7 +73,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<3> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/simultano.cpp mame-0.264+dfsg.1/src/mame/saitek/simultano.cpp --- mame-0.263+dfsg.1/src/mame/saitek/simultano.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/simultano.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,7 +82,7 @@ required_device m_led_pwm; required_device m_lcd_pwm; required_device m_lcd; - required_device m_dac; + required_device m_dac; required_ioport_array<8+1> m_inputs; output_finder<16, 34> m_out_lcd; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/ssystem3.cpp mame-0.264+dfsg.1/src/mame/saitek/ssystem3.cpp --- mame-0.263+dfsg.1/src/mame/saitek/ssystem3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/ssystem3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -123,7 +123,7 @@ required_device m_lcd1; optional_device_array m_lcd2; optional_device_array m_display; - required_device m_dac; + required_device m_dac; optional_shared_ptr m_nvram; optional_ioport_array<4+3> m_inputs; output_finder<8, 48> m_out_lcd2; @@ -568,5 +568,5 @@ *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1979, ssystem3, 0, 0, ssystem3, ssystem3, ssystem3_state, init_ssystem3, "SciSys / Novag", "Chess Champion: Super System III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1979, ssystem3, 0, 0, ssystem3, ssystem3, ssystem3_state, init_ssystem3, "SciSys / Novag Industries", "Chess Champion: Super System III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) SYST( 1980, ssystem4, 0, 0, ssystem4, ssystem4, ssystem3_state, empty_init, "SciSys", "Chess Champion: Super System IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/saitek/stratos.cpp mame-0.264+dfsg.1/src/mame/saitek/stratos.cpp --- mame-0.263+dfsg.1/src/mame/saitek/stratos.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/stratos.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -101,7 +101,7 @@ required_memory_bank m_rombank; required_device m_extrom; required_device m_board; - required_device m_dac; + required_device m_dac; required_ioport_array<8+2> m_inputs; u8 m_select = 0; @@ -122,6 +122,7 @@ u8 extrom_r(offs_t offset); }; + // saitek_stratos_state void saitek_stratos_state::machine_start() @@ -154,6 +155,7 @@ m_maincpu->set_unscaled_clock(xtal[newval % 3]); } + // stratos_state void stratos_state::machine_start() diff -Nru mame-0.263+dfsg.1/src/mame/saitek/superstar.cpp mame-0.264+dfsg.1/src/mame/saitek/superstar.cpp --- mame-0.263+dfsg.1/src/mame/saitek/superstar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/superstar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -91,7 +91,7 @@ required_device m_nmi_clock; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<2> m_inputs; u8 m_inp_mux = 0; diff -Nru mame-0.263+dfsg.1/src/mame/saitek/turbo16k.cpp mame-0.264+dfsg.1/src/mame/saitek/turbo16k.cpp --- mame-0.263+dfsg.1/src/mame/saitek/turbo16k.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/saitek/turbo16k.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -13,7 +13,6 @@ TODO: - dump/add other MCU revisions, SX8 for tmate/conquist is known to exist -- verify if QFP SX5A has the same ROM contents as DIP SX5A - what is t1850's official title? "1850 Deluxe Table Chess" is from the back of the computer. The manual can't make up its mind and says "1850 Chess Computer", "1850 Chess: 16 Level Program", or "1850 Sensory Chess Game". The box disagrees @@ -47,6 +46,8 @@ - Tandy (Radio Shack) 1850 60-2201A (8MHz, ST5A-PE-002 PCB) - Mephisto Monaco (H+G brand Express 16K) +SX5A 6301Y0A97F (QFP) has the same ROM contents as 6301Y0A96P. + SX8(A) program is used in: - Saitek Team-Mate aka Team-Mate Advanced Trainer (8MHz, ST8B-PE-017 PCB) - Saitek Cavalier aka Portable Advanced Trainer (suspected, 8MHz, ? PCB) @@ -149,6 +150,7 @@ m_maincpu->set_unscaled_clock(freq[bitswap<2>(newval,4,0)]); } + // Conquistador class conquist_state : public turbo16k_state @@ -328,7 +330,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Set Up") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Queen") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Multi Move") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") @@ -366,7 +368,7 @@ PORT_MODIFY("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Non Auto") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Play") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("King") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Pawn") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") diff -Nru mame-0.263+dfsg.1/src/mame/sanritsu/drmicro.cpp mame-0.264+dfsg.1/src/mame/sanritsu/drmicro.cpp --- mame-0.263+dfsg.1/src/mame/sanritsu/drmicro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sanritsu/drmicro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -78,8 +78,6 @@ }; -// video - /****************************************************************************/ template @@ -207,8 +205,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/sanritsu/mjkjidai.cpp mame-0.264+dfsg.1/src/mame/sanritsu/mjkjidai.cpp --- mame-0.263+dfsg.1/src/mame/sanritsu/mjkjidai.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sanritsu/mjkjidai.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -235,8 +233,6 @@ } -// machine - void mjkjidai_state::adpcm_w(uint8_t data) { m_adpcm_pos = (data & 0x07) * 0x1000 * 2; diff -Nru mame-0.263+dfsg.1/src/mame/sega/angelkds.cpp mame-0.264+dfsg.1/src/mame/sega/angelkds.cpp --- mame-0.263+dfsg.1/src/mame/sega/angelkds.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/angelkds.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -210,8 +210,6 @@ }; -// video - // Text Layer Tilemap @@ -391,8 +389,6 @@ return 0; } -// machine - // CPU Banking void angelkds_state::cpu_bank_w(uint8_t data) diff -Nru mame-0.263+dfsg.1/src/mame/sega/deniam.cpp mame-0.264+dfsg.1/src/mame/sega/deniam.cpp --- mame-0.263+dfsg.1/src/mame/sega/deniam.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/deniam.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -167,8 +167,6 @@ }; -// video - void deniamc_state::common_init() { m_bg_scrollx_reg = 0x00a4/2; @@ -536,8 +534,6 @@ } -// machine - void deniamb_state::oki_rom_bank_w(u8 data) { m_oki->set_rom_bank((data >> 6) & 1); diff -Nru mame-0.263+dfsg.1/src/mame/sega/flashbeats.cpp mame-0.264+dfsg.1/src/mame/sega/flashbeats.cpp --- mame-0.263+dfsg.1/src/mame/sega/flashbeats.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/flashbeats.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -56,8 +56,8 @@ virtual void machine_reset() override; void scsp_irq(offs_t offset, uint8_t data); - uint16_t p6_r(); - void p6_w(uint16_t data); + uint8_t p6_r(); + void p6_w(uint8_t data); required_device m_maincpu; required_device m_scspcpu; @@ -82,12 +82,12 @@ return 0; } -uint16_t flashbeats_state::p6_r() +uint8_t flashbeats_state::p6_r() { return (m_eeprom->do_read() << 3); } -void flashbeats_state::p6_w(uint16_t data) +void flashbeats_state::p6_w(uint8_t data) { m_eeprom->clk_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE); m_eeprom->di_write((data >> 2) & 1); diff -Nru mame-0.263+dfsg.1/src/mame/sega/kopunch.cpp mame-0.264+dfsg.1/src/mame/sega/kopunch.cpp --- mame-0.263+dfsg.1/src/mame/sega/kopunch.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/kopunch.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,6 @@ }; -// video - void kopunch_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); @@ -221,8 +219,6 @@ } -// machine - /******************************************************** Interrupts diff -Nru mame-0.263+dfsg.1/src/mame/sega/lindbergh.cpp mame-0.264+dfsg.1/src/mame/sega/lindbergh.cpp --- mame-0.263+dfsg.1/src/mame/sega/lindbergh.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/lindbergh.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -591,7 +591,7 @@ ROM_LOAD("317-0550-jpn.bin", 0, 0x2000, CRC(7e247f13) SHA1(d416b0e7742b32eb31443967e84ef93fc9e56dfb)) DISK_REGION("dvd") - DISK_IMAGE_READONLY("hotdex", 0, NO_DUMP) + DISK_IMAGE_READONLY("dvp-0063", 0, NO_DUMP) ROM_END ROM_START(primevah) @@ -619,6 +619,9 @@ ROM_REGION(0x2000, ":pic", 0) // PIC security id unknown ROM_LOAD("hummerextreme.bin", 0, 0x2000, CRC(524bc69a) SHA1(c79b6bd384196c169e40e623f4c80c8b9eb11f81)) + + DISK_REGION("dvd") + DISK_IMAGE_READONLY("dvp-0079", 0, NO_DUMP) ROM_END ROM_START(lbvbiosu) @@ -631,7 +634,7 @@ } // anonymous namespace -GAME(1999, lindbios, 0, lindbergh, 0, lindbergh_state, empty_init, ROT0, "Sega", "Sega Lindbergh BIOS", MACHINE_IS_BIOS_ROOT) +GAME(2005, lindbios, 0, lindbergh, 0, lindbergh_state, empty_init, ROT0, "Sega", "Sega Lindbergh BIOS", MACHINE_IS_BIOS_ROOT) GAME(2005, hotd4, lindbios, lindbergh, 0, lindbergh_state, empty_init, ROT0, "Sega", "The House of the Dead 4 (Export) (Rev B)", MACHINE_NOT_WORKING|MACHINE_UNEMULATED_PROTECTION|MACHINE_NO_SOUND) GAME(2005, hotd4a, hotd4, lindbergh, 0, lindbergh_state, empty_init, ROT0, "Sega", "The House of the Dead 4 (Export) (Rev A)", MACHINE_NOT_WORKING|MACHINE_UNEMULATED_PROTECTION|MACHINE_NO_SOUND) GAME(2005, vf5, lindbios, lindbergh, 0, lindbergh_state, empty_init, ROT0, "Sega", "Virtua Fighter 5 (Export)", MACHINE_NOT_WORKING|MACHINE_UNEMULATED_PROTECTION|MACHINE_NO_SOUND) diff -Nru mame-0.263+dfsg.1/src/mame/sega/megatech.cpp mame-0.264+dfsg.1/src/mame/sega/megatech.cpp --- mame-0.263+dfsg.1/src/mame/sega/megatech.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/megatech.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -48,8 +48,8 @@ Great Soccer 610-0239-05 Out Run 171-5783 837-6963-06 610-0239-06 MPR-11078 (Mask) EPR-12368-06 (27256) n/a Alien Syndrome 171-5783 837-6963-07 610-0239-07 MPR-11194 (232011) EPR-12368-07 (27256) n/a -Shinobi 610-0239-08 -Fantasy Zone 610-0239-09 +Shinobi 171-5783 837-6963-08 610-0239-08 MPR-11706F (832011) EPR-12368-08 (27C256) n/a +Fantasy Zone 171-5783 837-6963-09 610-0239-09 MPR-10118 (831001) EPR-12368-09 (27C256) n/a After Burner 171-5784 837-6963-10 610-0239-10 315-5235 (custom) MPR-11271-T (834000) EPR-12368-10 (27256) Great Football 171-5783 837-6963-19 610-0239-19 MPR-10576F (831000) EPR-12368-19 (27256) n/a World Championship Soccer 171-5782 837-6963-21 610-0239-21 MPR-12607B (uPD23C4000) EPR-12368-21 (27256) n/a @@ -58,6 +58,7 @@ Super Hang On 171-5782 837-6963-24 610-0239-24 MPR-12640 (234000) EPR-12368-24 (27256) n/a Forgotten Worlds 171-5782 837-6963-26 610-0239-26 MPR-12672-H (Mask) EPR-12368-26 (27256) n/a The Revenge Of Shinobi 171-5782 837-6963-28 610-0239-28 MPR-12675 S44 (uPD23C4000) EPR-12368-28 (27C256) n/a +Parlour Games 171-5783 837-6963-29 610-0239-29 MPR-11404F (831001) EPR-12368-29 (27256) n/a Arnold Palmer Tour Golf 171-5782 837-6963-31 610-0239-31 MPR-12645F (834200A) EPR-12368-31 (27256) n/a Super Real Basketball 171-5782 837-6963-32 610-0239-32 MPR-12904F (838200A) EPR-12368-32 (27256) n/a Tommy Lasorda Baseball 171-5782 837-6963-35 610-0239-35 MPR-12706F (834200A) EPR-12368-35 (27256) n/a diff -Nru mame-0.263+dfsg.1/src/mame/sega/monacogp.cpp mame-0.264+dfsg.1/src/mame/sega/monacogp.cpp --- mame-0.263+dfsg.1/src/mame/sega/monacogp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/monacogp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -272,5 +272,5 @@ } // anonymous namespace -GAME( 1980, monacogp, 0, monacogp, 0, monacogp_state, empty_init, ROT0, "Sega", "Monaco GP (set 1) [TTL]", MACHINE_IS_SKELETON ) -GAME( 1980, monacogpa, monacogp, monacogp, 0, monacogp_state, empty_init, ROT0, "Sega", "Monaco GP (set 2) [TTL]", MACHINE_IS_SKELETON ) +GAME( 1980, monacogp, 0, monacogp, 0, monacogp_state, empty_init, ROT0, "Sega", "Monaco GP (set 1)", MACHINE_IS_SKELETON ) +GAME( 1980, monacogpa, monacogp, monacogp, 0, monacogp_state, empty_init, ROT0, "Sega", "Monaco GP (set 2)", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/sega/segattl.cpp mame-0.264+dfsg.1/src/mame/sega/segattl.cpp --- mame-0.263+dfsg.1/src/mame/sega/segattl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/segattl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -178,4 +178,4 @@ } // anonymous namespace -GAME( 1976, fonz, 0, segattl, 0, segattl_state, empty_init, ROT0, "Sega", "Fonz [TTL]", MACHINE_IS_SKELETON ) +GAME( 1976, fonz, 0, segattl, 0, segattl_state, empty_init, ROT0, "Sega", "Fonz", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/sega/segaybd.cpp mame-0.264+dfsg.1/src/mame/sega/segaybd.cpp --- mame-0.263+dfsg.1/src/mame/sega/segaybd.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/segaybd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2744,6 +2744,62 @@ ROM_LOAD( "mpr-13994.105", 0x100000, 0x80000, CRC(76095538) SHA1(aab830e3675116c475fe69e0e991118c045b131b) ) ROM_END +ROM_START( rchasejb ) // only the "suby" CPU ROMs were updated (?) + ROM_REGION( 0x080000, "maincpu", 0 ) // M + ROM_LOAD16_BYTE( "epr-13986.25", 0x000000, 0x20000, CRC(388b2365) SHA1(0f006f9120b96b8d8be968878ce1d6dd853cd977) ) + ROM_LOAD16_BYTE( "epr-13985.24", 0x000001, 0x20000, CRC(14dba5d4) SHA1(ad09c55273ab1105630f2f76019aedc234fb9292) ) + ROM_LOAD16_BYTE( "epr-13988.27", 0x040000, 0x20000, CRC(dc1cd5a4) SHA1(3b2b6afbeb7daa7c0cc75279bc495221c2508e25) ) + ROM_LOAD16_BYTE( "epr-13987.26", 0x040001, 0x20000, CRC(43be9e60) SHA1(107a9c126c2bff9030fe621f6b4ab8f29c994ef2) ) + + ROM_REGION( 0x040000, "subx", 0 ) // X + ROM_LOAD16_BYTE( "epr-13992a.81", 0x000000, 0x20000, CRC(c5d525b6) SHA1(1fab7f761be67b67ee346a1af1f1fe12aef87dc5) ) + ROM_LOAD16_BYTE( "epr-13991a.80", 0x000001, 0x20000, CRC(299e3c7c) SHA1(e4903816ec364e9352abd1180e8a609fed75e1a7) ) + + ROM_REGION( 0x040000, "suby", 0 ) // Y + ROM_LOAD16_BYTE( "epr-13990b.54", 0x000000, 0x20000, CRC(eeffbeeb) SHA1(5f2f808cd37158d14dd2e4a0a68a41514d3954fb) ) + ROM_LOAD16_BYTE( "epr-13989b.53", 0x000001, 0x20000, CRC(fea9f1e9) SHA1(54daad8bf25b17c494615fd4ec619d9693d85ba0) ) + + ROM_REGION16_BE( 0x080000, "bsprites", 0 ) + ROM_LOAD16_BYTE( "mpr-13999.16", 0x000000, 0x40000, CRC(9a1dd53c) SHA1(cb01f2c64554914ea693879dfcb498181a1e7a9a) ) + ROM_LOAD16_BYTE( "mpr-13997.14", 0x000001, 0x40000, CRC(1fdf1b87) SHA1(ed46af0f72081d545015b73a8d12240664f29506) ) + + ROM_REGION64_BE( 0xc00000, "ysprites", 0) + ROM_LOAD64_BYTE( "mpr-14021.67", 0x000000, 0x80000, CRC(9fa88781) SHA1(a035fd0fe1d37a589adf3a5029c20d237d5cc827) ) + ROM_LOAD64_BYTE( "mpr-14022.75", 0x000001, 0x80000, CRC(49e824bb) SHA1(c1330719b5718aa664b5788244d8cb7b7103a57c) ) + ROM_LOAD64_BYTE( "mpr-14009.63", 0x000002, 0x80000, CRC(35b5187e) SHA1(6f0f6471c4135d07a2c852cdc50322b99176712e) ) + ROM_LOAD64_BYTE( "mpr-14010.71", 0x000003, 0x80000, CRC(9a538b9b) SHA1(cd84a39bd3858fa6c1d8eb4a349d939261cea6b6) ) + ROM_LOAD64_BYTE( "mpr-14023.86", 0x000004, 0x80000, CRC(e11c6c67) SHA1(839e71690e75e47d11b758f5b525452bcc75b823) ) + ROM_LOAD64_BYTE( "mpr-14024.114", 0x000005, 0x80000, CRC(16344535) SHA1(a9bd101ae93c24a2e8002ad6a111cf0d0d3b1a64) ) + ROM_LOAD64_BYTE( "mpr-14011.82", 0x000006, 0x80000, CRC(78e9983b) SHA1(c0f6577b55acda2cc8cdf0884d5c0517f79de4e9) ) + ROM_LOAD64_BYTE( "mpr-14012.110", 0x000007, 0x80000, CRC(e9daa1a4) SHA1(24ad782e88a586fbb31f7ad86be4cdeb38823102) ) + + ROM_LOAD64_BYTE( "mpr-14017.66", 0x400000, 0x80000, CRC(b83df159) SHA1(f0cf99e6ddae1d26fd68240a731f3e28e9c6073b) ) + ROM_LOAD64_BYTE( "mpr-14018.74", 0x400001, 0x80000, CRC(76dbe9ce) SHA1(2f5af8d015cf8fb90a0862bc37235bc20d4dac0d) ) + ROM_LOAD64_BYTE( "mpr-14005.62", 0x400002, 0x80000, CRC(9e998209) SHA1(c0d39d11d554fd6a43db77ccf96ac04dd634edff) ) + ROM_LOAD64_BYTE( "mpr-14006.70", 0x400003, 0x80000, CRC(2caddf1a) SHA1(a2e891e65c7cd156a3131a084ff51ae9b1663bc0) ) + ROM_LOAD64_BYTE( "mpr-14019.85", 0x400004, 0x80000, CRC(b15e19ff) SHA1(947c35301875b4842835f2ba6aca216f087a3fc7) ) + ROM_LOAD64_BYTE( "mpr-14020.113", 0x400005, 0x80000, CRC(84c7008f) SHA1(b92f3c636c5d91c5b1c6090a48be7bb1be6b927e) ) + ROM_LOAD64_BYTE( "mpr-14007.81", 0x400006, 0x80000, CRC(c3cf5faa) SHA1(02bca1b248fcb6313cd529ca2aa0f7516177166b) ) + ROM_LOAD64_BYTE( "mpr-14008.109", 0x400007, 0x80000, CRC(7e91beb2) SHA1(bc1a7ce68d6b825daf93ca437dda803857cee0a2) ) + + ROM_LOAD64_BYTE( "mpr-14013.65", 0x800000, 0x80000, CRC(31dbb2c3) SHA1(3efeff785d78056e2615dc2267f7bb80a6d4c663) ) + ROM_LOAD64_BYTE( "mpr-14014.73", 0x800001, 0x80000, CRC(7e68257d) SHA1(600d1066cfa83f5df46e240a473a8f04179e70f8) ) + ROM_LOAD64_BYTE( "mpr-14001.61", 0x800002, 0x80000, CRC(71031ad0) SHA1(02b6240461d66907199f846310e72d37faa5fb50) ) + ROM_LOAD64_BYTE( "mpr-14002.69", 0x800003, 0x80000, CRC(27e70a5e) SHA1(fa767f6cc8e46c0e804c37666a8499376c09b025) ) + ROM_LOAD64_BYTE( "mpr-14015.84", 0x800004, 0x80000, CRC(7540bf85) SHA1(e8f9208aea6ecedb6ae810a362476cdf1d424319) ) + ROM_LOAD64_BYTE( "mpr-14016.112", 0x800005, 0x80000, CRC(7d87b94d) SHA1(4ef5b7b114c25b9e274e3f3dd7e3d7bd29d2d8b9) ) + ROM_LOAD64_BYTE( "mpr-14003.80", 0x800006, 0x80000, CRC(87725d74) SHA1(d284512ad15362a886072aaa1a3af98f7a0bddf9) ) + ROM_LOAD64_BYTE( "mpr-14004.108", 0x800007, 0x80000, CRC(73477291) SHA1(1fe9d7666d89ee55a0178dceb7cfea7ce94b9e18) ) + + ROM_REGION( 0x10000, "soundcpu", 0 ) // Z80 sound CPU + ROM_LOAD( "epr-13993.102", 0x000000, 0x10000, CRC(7cc3b543) SHA1(c5e6a2dca891d0b6528e6d66ccd18b24ed4a9464) ) + + ROM_REGION( 0x200000, "pcm", ROMREGION_ERASEFF ) // SegaPCM samples + ROM_LOAD( "mpr-13996.107", 0x000000, 0x80000, CRC(345f5a41) SHA1(d414c3485ba31863c2b36282756709e06a41d262) ) + ROM_LOAD( "mpr-13995.106", 0x080000, 0x80000, CRC(f604c270) SHA1(02023786fec2f2702c2f19f51aff5b7e4928ae91) ) + ROM_LOAD( "mpr-13994.105", 0x100000, 0x80000, CRC(76095538) SHA1(aab830e3675116c475fe69e0e991118c045b131b) ) +ROM_END + //************************************************************************************************************************* //************************************************************************************************************************* @@ -2983,6 +3039,7 @@ GAME( 1991, rchase, 0, yboard, rchase, segaybd_state, init_rchase, ROT0, "Sega", "Rail Chase (World)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, rchasej, rchase, yboard, rchase, segaybd_state, init_rchase, ROT0, "Sega", "Rail Chase (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, rchasejb, rchase, yboard, rchase, segaybd_state, init_rchase, ROT0, "Sega", "Rail Chase (Japan, Rev B)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, strkfgtr, 0, yboard, strkfgtr, segaybd_state, init_gloc, ROT0, "Sega", "Strike Fighter (World)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, strkfgtrj, strkfgtr, yboard, strkfgtr, segaybd_state, init_gloc, ROT0, "Sega", "Strike Fighter (Japan)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/sega/stactics.cpp mame-0.264+dfsg.1/src/mame/sega/stactics.cpp --- mame-0.263+dfsg.1/src/mame/sega/stactics.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/stactics.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -167,8 +167,6 @@ }; -// video - /**************************************************************************** The Video system used in Space Tactics is unusual. @@ -568,8 +566,6 @@ } -// machine - /************************************* * * Mirror motor handling diff -Nru mame-0.263+dfsg.1/src/mame/sega/stvdev.cpp mame-0.264+dfsg.1/src/mame/sega/stvdev.cpp --- mame-0.263+dfsg.1/src/mame/sega/stvdev.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/stvdev.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders: +/************************************************************************************************** + +Sega ST-V dev-box unit "837-12764 486 BD FOR ST-V" + +Presumably for stvbios "hold F2 at boot -> System Configuration" cart dev mode. + +ALi/ACER FINALi 486 PCI motherboard +M1489 A1 (northbridge) + M1487 B1 (southbridge) +M5113 (super i/o, sorta compatible with FDC37C665 as per PSC-586VGA single board) +DP8432V-33 +CAK0003UA +2x Altera EPM7032LC44-10 near northbridge +Two empty sockets, u0621 (BIOS extension?) and u0629 (user space?) + +**************************************************************************************************/ + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "machine/pci.h" + + +namespace { + +class stvdev_state : public driver_device +{ +public: + stvdev_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + + void stvdev(machine_config &config); + +private: + required_device m_maincpu; + void stvdev_io(address_map &map); + void stvdev_map(address_map &map); +}; + + +void stvdev_state::stvdev_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000e0000, 0x000fffff).rom().region("bios", 0); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0); +} + +void stvdev_state::stvdev_io(address_map &map) +{ +} + +static INPUT_PORTS_START(stvdev) +INPUT_PORTS_END + +void stvdev_state::stvdev(machine_config &config) +{ + // TODO: two other clocks, one at 36 MHz near CAK chip and another at 14.318 MHz near 486 socket + I486(config, m_maincpu, 33'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, &stvdev_state::stvdev_map); + m_maincpu->set_addrmap(AS_IO, &stvdev_state::stvdev_io); + + PCI_ROOT(config, "pci", 0); + // ... +} + + +ROM_START( stvdev ) + ROM_REGION32_LE( 0x20000, "bios", ROMREGION_ERASEFF ) + ROM_LOAD( "epr-19159.u0628", 0, 0x20000, CRC(70735b87) SHA1(825954978a6b09d307ec33ef46128a45a76ff63b) ) +ROM_END + +} // anonymous namespace + + +// NOTE: stvbios mentions HP and SUN archs being supported, "PC" suffix comes from there +COMP(1998, stvdev, 0, 0, stvdev, stvdev, stvdev_state, empty_init, "Sega / ALi", "ST-V 486 dev box PC", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/sega/suprloco.cpp mame-0.264+dfsg.1/src/mame/sega/suprloco.cpp --- mame-0.263+dfsg.1/src/mame/sega/suprloco.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/suprloco.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -113,8 +113,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -335,8 +333,6 @@ } -// machine - void suprloco_state::main_map(address_map &map) { map(0x0000, 0xbfff).rom(); diff -Nru mame-0.263+dfsg.1/src/mame/sega/system1.cpp mame-0.264+dfsg.1/src/mame/sega/system1.cpp --- mame-0.263+dfsg.1/src/mame/sega/system1.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sega/system1.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1119,6 +1119,17 @@ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) INPUT_PORTS_END +static INPUT_PORTS_START( flickyb ) + PORT_INCLUDE( flicky ) + + PORT_MODIFY("SWB") + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:3,4") + PORT_DIPSETTING( 0x0c, "1" ) + PORT_DIPSETTING( 0x08, "2" ) + PORT_DIPSETTING( 0x04, "3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Infinite ) ) +INPUT_PORTS_END + static INPUT_PORTS_START( flickys1 ) PORT_INCLUDE( flicky ) @@ -2962,6 +2973,27 @@ ROM_LOAD( "pr-5317.76", 0x0000, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) ) ROM_END +ROM_START( flickyb ) /* Sega game ID# 834-5411-11 FLICKY, only the two program ROMs differ from flickya. Legit or hack? */ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "e-2_0.116", 0x0000, 0x4000, CRC(ec94fdbb) SHA1(a3289dd59a4cede1aeed8898cc38cfb82da3b778) ) // white, non original, handwritten label + ROM_LOAD( "109", 0x4000, 0x4000, CRC(aa11b394) SHA1(538b28b194162c04ed7a46e3a4fa97760201405d) ) // blue, non original, blank label + + ROM_REGION( 0x10000, "soundcpu", 0 ) + ROM_LOAD( "epr-5869.120", 0x0000, 0x2000, CRC(6d220d4e) SHA1(fe02a7a94a1ad046fc775a7f67f460c8d0f6dca6) ) + + ROM_REGION( 0xc000, "tiles", 0 ) + ROM_LOAD( "epr-6001.62", 0x0000, 0x4000, CRC(f1a75200) SHA1(47e57b5dbd687d0fa91de91f35f199e88d5a5d99) ) + ROM_LOAD( "epr-6000.64", 0x4000, 0x4000, CRC(299aefb7) SHA1(d0301f0bf706807891845f090e4e1f1c38dbbd54) ) + ROM_LOAD( "epr-5999.66", 0x8000, 0x4000, CRC(1ca53157) SHA1(46b4b9dac3f0506edc3957cee768e41c4754b0f4) ) + + ROM_REGION( 0x8000, "sprites", 0 ) + ROM_LOAD( "epr-5855.117", 0x0000, 0x4000, CRC(b5f894a1) SHA1(2c72dc16739dad155fcd572e1add067a7647f5bd) ) + ROM_LOAD( "epr-5856.110", 0x4000, 0x4000, CRC(266af78f) SHA1(dcbfce550d10a1f2b3ce3e7e081fc008cb575708) ) + + ROM_REGION( 0x0100, "lookup_proms", 0 ) + ROM_LOAD( "pr-5317.76", 0x0000, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) ) +ROM_END + ROM_START( flickys2 ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "epr-6621.bin", 0x0000, 0x4000, CRC(b21ff546) SHA1(e1d5438eaf0efeaeb4687dcfc12bf325e804182f) ) @@ -5689,10 +5721,10 @@ GAME( 1984, mrviking, 0, sys1ppisx_315_5041,mrviking, system1_state, empty_init, ROT270, "Sega", "Mister Viking (315-5041)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, mrvikingj, mrviking, sys1ppisx_315_5041,mrvikingj, system1_state, empty_init, ROT270, "Sega", "Mister Viking (315-5041, Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, swat, 0, sys1ppix_315_5048, swat, system1_state, empty_init, ROT270, "Coreland / Sega", "SWAT (315-5048)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, flickyo, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, flickys1, flicky, sys1ppix_315_5051, flickys1, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, flickyup, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, on Up'n Down boardset, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, flickyupa, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "bootleg", "Flicky (64k Version, on Up'n Down boardset, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, flickyo, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 1)", MACHINE_SUPPORTS_SAVE ) // 84/5/24 +GAME( 1984, flickys1, flicky, sys1ppix_315_5051, flickys1, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, 315-5051, set 2)", MACHINE_SUPPORTS_SAVE ) // 84/11/26 +GAME( 1984, flickyup, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (64k Version, on Up'n Down boardset, set 1)", MACHINE_SUPPORTS_SAVE ) // 84/5/17 +GAME( 1984, flickyupa, flicky, sys1ppix_315_5051, flicky, system1_state, empty_init, ROT0, "bootleg", "Flicky (64k Version, on Up'n Down boardset, set 2)", MACHINE_SUPPORTS_SAVE ) // 84/7/05 GAME( 1984, wmatch, 0, sys1ppisx_315_5064,wmatch, system1_state, empty_init, ROT270, "Sega", "Water Match (315-5064)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, bullfgt, 0, sys1ppix_315_5065, bullfgt, system1_state, empty_init, ROT0, "Coreland / Sega", "Bullfight (315-5065)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, nprinces, seganinj, sys1ppix_315_5051, seganinj, system1_state, empty_init, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", MACHINE_SUPPORTS_SAVE ) @@ -5706,8 +5738,9 @@ GAME( 1986, raflesiau, raflesia, sys1ppi, raflesia, system1_state, empty_init, ROT270, "Coreland / Sega", "Rafflesia (not encrypted)", MACHINE_SUPPORTS_SAVE ) /* PIO-based System 1 */ -GAME( 1984, flicky, 0, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, flickya, flicky, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051, larger roms)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, flicky, 0, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051)", MACHINE_SUPPORTS_SAVE ) // 1984/05/24 +GAME( 1984, flickya, flicky, sys1piox_315_5051, flicky, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051, larger ROMs)", MACHINE_SUPPORTS_SAVE ) // 1984/05/24 +GAME( 1984, flickyb, flicky, sys1piox_315_5051, flickyb, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, 315-5051, larger ROMs, newer)", MACHINE_SUPPORTS_SAVE ) // 1984/10/07 GAME( 1984, flickys2, flicky, sys1pio, flickys2, system1_state, empty_init, ROT0, "Sega", "Flicky (128k Version, not encrypted)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, thetogyu, bullfgt, sys1piox_315_5065, bullfgt, system1_state, empty_init, ROT0, "Coreland / Sega", "The Togyu (315-5065, Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, spatter, 0, sys1piosx_315_5096,spatter, system1_state, empty_init, ROT0, "Sega", "Spatter (315-5096)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/bloodbro.cpp mame-0.264+dfsg.1/src/mame/seibu/bloodbro.cpp --- mame-0.263+dfsg.1/src/mame/seibu/bloodbro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/bloodbro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano +// copyright-holders: Carlos A. Lozano + /************************************************************************** Blood Bros, West Story & Sky Smasher @@ -8,11 +9,6 @@ driver by Carlos A. Lozano Baides -TODO: -West Story: -- sound (still has IRQ problems) - seems way too fast but using actual - measurements from a real PCB - Blood Bros (c) 1990 Nihon System [Seibu hardware] ----------- The manual states: @@ -37,7 +33,7 @@ however.(which is why we have MACHINE_NO_COCKTAIL despite the games being upright) -If the word at 0x488 in the maincpu ROM is set to any value other than 1, the +If the word at 0x488 in the main CPU ROM is set to any value other than 1, the attract mode will include the "Winners Don't Use Drugs" screen. The only other change this effects is reducing the first "NIHON SYSTEM INC." on the title screen to the initials NSI. The string "US LICENSEE FABTEC INC" appears twice @@ -110,7 +106,7 @@ Also note that when "Starting Coin" Dip Switch is set to "x2", SERVICE1 adds 2 credits instead of 1. - - Bit 6 of DSW was previouly used as a "Cabinet" Dip Switch (OFF = Upright + - Bit 6 of DSW was previously used as a "Cabinet" Dip Switch (OFF = Upright and ON = Cocktail), but it isn't tested outside of the "test mode". Check code from 0x021abe to 0x021afc (and the "rts" instruction at 0x021adc) - Bit 7 of DSW is only tested at 0x02035e and writes a value to 0x0c0100. @@ -138,27 +134,343 @@ **************************************************************************/ #include "emu.h" -#include "bloodbro.h" + +#include "sei021x_sei0220_spr.h" +#include "seibu_crtc.h" +#include "seibusound.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "sound/okim6295.h" -#include "seibu_crtc.h" +#include "sound/ymopl.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class bloodbro_state : public driver_device, public seibu_sound_common +{ +public: + bloodbro_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_spritegen(*this, "spritegen"), + m_seibu_sound(*this, "seibu_sound"), + m_ymsnd(*this, "ymsnd"), + m_spriteram(*this, "spriteram"), + m_bgvideoram(*this, "bgvideoram"), + m_fgvideoram(*this, "fgvideoram"), + m_txvideoram(*this, "txvideoram") + { } + + void bloodbro(machine_config &config); + void skysmash(machine_config &config); + +protected: + virtual void video_start() override; + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + optional_device m_spritegen; + required_device m_seibu_sound; + required_device m_ymsnd; + + required_shared_ptr m_spriteram; + required_shared_ptr m_bgvideoram; + required_shared_ptr m_fgvideoram; + required_shared_ptr m_txvideoram; + + uint16_t m_scrollram[6]{}; + uint16_t m_layer_en = 0U; + + tilemap_t *m_bg_tilemap = nullptr; + tilemap_t *m_fg_tilemap = nullptr; + tilemap_t *m_tx_tilemap = nullptr; + + void bgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void fgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void layer_en_w(uint16_t data); + void layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + TILE_GET_INFO_MEMBER(get_tx_tile_info); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t pri_cb(uint8_t pri, uint8_t ext); + + void bloodbro_map(address_map &map); + void common_map(address_map &map); + void skysmash_map(address_map &map); +}; + +class weststry_state : public bloodbro_state +{ +public: + weststry_state(const machine_config &mconfig, device_type type, const char *tag) : + bloodbro_state(mconfig, type, tag) + { } + + void init_weststry(); + + void weststry(machine_config &config); + +private: + bool m_opl_irq = false; + bool m_soundnmi_mask = false; + + void layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void soundlatch_w(offs_t offset, u8 data); + void opl_irq_w(int state); + void opl_w(offs_t offset, uint8_t data); + void soundnmi_ack_w(uint8_t data); + void soundnmi_update(); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +/*************************************************************************** + + Video Hardware for Blood Brothers + + Note: + - An extra layer is currently disabled via the layer enable register + in Seibu CRTC device (bit 2). Is it even tied to any RAM portion? + +***************************************************************************/ + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +TILE_GET_INFO_MEMBER(bloodbro_state::get_bg_tile_info) +{ + int const code = m_bgvideoram[tile_index]; + tileinfo.set(1, code & 0xfff, (code >> 12), 0); +} + +TILE_GET_INFO_MEMBER(bloodbro_state::get_fg_tile_info) +{ + int const code = m_fgvideoram[tile_index]; + tileinfo.set(2, (code & 0xfff) + 0x1000, (code >> 12), 0); +} + +TILE_GET_INFO_MEMBER(bloodbro_state::get_tx_tile_info) +{ + int const code = m_txvideoram[tile_index]; + tileinfo.set(0, code & 0xfff, code >> 12, 0); +} + + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +void bloodbro_state::video_start() +{ + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 16); + m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 16); + m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_fg_tilemap->set_transparent_pen(15); + m_tx_tilemap->set_transparent_pen(15); + + save_item(NAME(m_scrollram)); + save_item(NAME(m_layer_en)); +} + + + +/*************************************************************************** + Memory handlers -/* Memory Maps */ +***************************************************************************/ + +void bloodbro_state::bgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_bgvideoram[offset]); + m_bg_tilemap->mark_tile_dirty(offset); +} + +void bloodbro_state::fgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_fgvideoram[offset]); + m_fg_tilemap->mark_tile_dirty(offset); +} + +void bloodbro_state::txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_txvideoram[offset]); + m_tx_tilemap->mark_tile_dirty(offset); +} + + + +/*************************************************************************** + + Display refresh + + + Blood Bros / Skysmash Spriteram + ------------------------------- + + Slightly more sophisticated successor to the Toki sprite chip. + + It has "big sprites" created by setting width or height >0. Tile + numbers are read consecutively. + + +0 x....... ........ sprite disabled if set + +0 .x...... ........ Flip y (no evidence for this!!) + +0 ..x..... ........ Flip x + +0 ....x... ........ Priority (1=high) + +0 ......xx x....... Width: do this many tiles horizontally + +0 ........ .xxx.... Height: do this many tiles vertically + +0 ........ ....xxxx Color bank + + +1 ...xxxxx xxxxxxxx Tile number + +2 .......x xxxxxxxx X coordinate + +3 .......x xxxxxxxx Y coordinate + + + Weststry Bootleg Spriteram + -------------------------- + + Lacks the "big sprite" feature of the original. Needs some + tile number remapping for some reason. + + +0 .......x xxxxxxxx Sprite Y coordinate + +1 ...xxxxx xxxxxxxx Sprite tile number + +2 xxxx.... ........ Sprite color bank + +2 ......x. ........ Sprite flip x + +2 ........ x....... Priority ?? + +3 .......x xxxxxxxx Sprite X coordinate + +***************************************************************************/ + +/* SPRITE INFO (8 bytes) + + D-F?P?SS SSSSCCCC + ---TTTTT TTTTTTTT + -------X XXXXXXXX + -------- YYYYYYYY */ + +uint32_t bloodbro_state::pri_cb(uint8_t pri, uint8_t ext) +{ + return pri ? 0x02 : 0; +} + +/* SPRITE INFO (8 bytes) + + D------- YYYYYYYY + ---TTTTT TTTTTTTT + CCCC--F? -?--???? Priority?? + -------X XXXXXXXX +*/ + +void weststry_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) + { + int const data = m_spriteram[offs + 2]; + int const data0 = m_spriteram[offs + 0]; + int code = m_spriteram[offs + 1] & 0x1fff; + int sx = m_spriteram[offs + 3] & 0x1ff; + int const sy = 0xf0 - (data0 & 0xff); + int const flipx = data & 0x200; + int const flipy = data & 0x400; // ??? + int const color = (data & 0xf000) >> 12; + int const pri_mask = (data & 0x0080) ? 0x02 : 0; + + if (sx >= 256) sx -= 512; + + if (data0 & 0x8000) continue; // disabled + + // Remap code 0x800 <-> 0x1000 + code = (code & 0x7ff) | ((code & 0x800) << 1) | ((code & 0x1000) >> 1); + + m_gfxdecode->gfx(3)->prio_transpen(bitmap, cliprect, + code, + color, + flipx, flipy, + sx, sy, + screen.priority(), + pri_mask, 15); + } +} + + + +uint32_t bloodbro_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_bg_tilemap->set_scrollx(0, m_scrollram[0]); + m_bg_tilemap->set_scrolly(0, m_scrollram[1]); + m_fg_tilemap->set_scrollx(0, m_scrollram[2]); + m_fg_tilemap->set_scrolly(0, m_scrollram[3]); + + screen.priority().fill(0, cliprect); + + if(BIT(~m_layer_en, 0)) + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + if(BIT(~m_layer_en, 1)) + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 1); + if(BIT(~m_layer_en, 4)) + m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); + if(BIT(~m_layer_en, 3)) + m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); + + return 0; +} + +uint32_t weststry_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // The bootleg video hardware probably also allows BG scrolling, but weststry doesn't use it + m_fg_tilemap->set_scrollx(0, (int8_t)m_scrollram[1] - 13); + m_fg_tilemap->set_scrolly(0, (int8_t)m_scrollram[0] + 1); + + screen.priority().fill(0, cliprect); + + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 1); + draw_sprites(screen, bitmap, cliprect); + m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + + +// Memory Maps void bloodbro_state::common_map(address_map &map) { map(0x000000, 0x07ffff).rom(); map(0x080000, 0x08afff).ram(); - map(0x08b000, 0x08bfff).ram().share("spriteram"); - map(0x08c000, 0x08c3ff).ram().w(FUNC(bloodbro_state::bgvideoram_w)).share("bgvideoram"); + map(0x08b000, 0x08bfff).ram().share(m_spriteram); + map(0x08c000, 0x08c3ff).ram().w(FUNC(bloodbro_state::bgvideoram_w)).share(m_bgvideoram); map(0x08c400, 0x08cfff).ram(); - map(0x08d000, 0x08d3ff).ram().w(FUNC(bloodbro_state::fgvideoram_w)).share("fgvideoram"); + map(0x08d000, 0x08d3ff).ram().w(FUNC(bloodbro_state::fgvideoram_w)).share(m_fgvideoram); map(0x08d400, 0x08d7ff).ram(); - map(0x08d800, 0x08dfff).ram().w(FUNC(bloodbro_state::txvideoram_w)).share("txvideoram"); + map(0x08d800, 0x08dfff).ram().w(FUNC(bloodbro_state::txvideoram_w)).share(m_txvideoram); map(0x08e000, 0x08e7ff).ram(); map(0x08e800, 0x08f7ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x08f800, 0x08ffff).ram(); @@ -184,7 +496,7 @@ map(0xc0000, 0xc004f).rw("crtc", FUNC(seibu_crtc_device::read_alt), FUNC(seibu_crtc_device::write_alt)); } -void weststry_state::weststry_soundlatch_w(offs_t offset, u8 data) +void weststry_state::soundlatch_w(offs_t offset, u8 data) { m_seibu_sound->main_w(offset, data); @@ -192,59 +504,59 @@ m_audiocpu->set_input_line(0, ASSERT_LINE); } -void weststry_state::weststry_map(address_map &map) +void weststry_state::main_map(address_map &map) { map(0x000000, 0x07ffff).rom(); map(0x080000, 0x08ffff).ram(); // old VRAM areas still used, but bootleg code copies them to higher addresses map(0x0c1000, 0x0c1001).portr("DSW"); map(0x0c1002, 0x0c1003).portr("IN0"); map(0x0c1004, 0x0c1005).portr("IN1"); - map(0x0c1000, 0x0c1003).w(FUNC(weststry_state::weststry_soundlatch_w)).umask16(0xff00); - map(0x0c1004, 0x0c100b).w(FUNC(weststry_state::weststry_layer_scroll_w)); + map(0x0c1000, 0x0c1003).w(FUNC(weststry_state::soundlatch_w)).umask16(0xff00); + map(0x0c1004, 0x0c100b).w(FUNC(weststry_state::layer_scroll_w)); map(0x0e0002, 0x0e0003).nopr(); // remnant of old code map(0x122800, 0x122bff).ram(); // cleared at startup - map(0x122c00, 0x122fff).ram().w(FUNC(weststry_state::fgvideoram_w)).share("fgvideoram"); - map(0x123000, 0x1233ff).ram().w(FUNC(weststry_state::bgvideoram_w)).share("bgvideoram"); + map(0x122c00, 0x122fff).ram().w(FUNC(weststry_state::fgvideoram_w)).share(m_fgvideoram); + map(0x123000, 0x1233ff).ram().w(FUNC(weststry_state::bgvideoram_w)).share(m_bgvideoram); map(0x123400, 0x1237ff).ram(); // cleared at startup - map(0x123800, 0x123fff).ram().w(FUNC(weststry_state::txvideoram_w)).share("txvideoram"); + map(0x123800, 0x123fff).ram().w(FUNC(weststry_state::txvideoram_w)).share(m_txvideoram); map(0x124000, 0x124005).ram(); - map(0x124006, 0x1247fd).ram().share("spriteram"); + map(0x124006, 0x1247fd).ram().share(m_spriteram); map(0x128000, 0x1287ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } -void weststry_state::weststry_opl_irq_w(int state) +void weststry_state::opl_irq_w(int state) { - m_weststry_opl_irq = state; - weststry_soundnmi_update(); + m_opl_irq = state; + soundnmi_update(); } -void weststry_state::weststry_opl_w(offs_t offset, uint8_t data) +void weststry_state::opl_w(offs_t offset, uint8_t data) { // NMI cannot be accepted between address and data writes, or else registers get corrupted - m_weststry_soundnmi_mask = BIT(offset, 0); + m_soundnmi_mask = BIT(offset, 0); m_ymsnd->write(offset, data); - weststry_soundnmi_update(); + soundnmi_update(); } -void weststry_state::weststry_soundnmi_ack_w(uint8_t data) +void weststry_state::soundnmi_ack_w(uint8_t data) { m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - weststry_soundnmi_update(); + soundnmi_update(); } -void weststry_state::weststry_soundnmi_update() +void weststry_state::soundnmi_update() { - if (m_weststry_opl_irq && m_weststry_soundnmi_mask) + if (m_opl_irq && m_soundnmi_mask) m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } -void weststry_state::weststry_sound_map(address_map &map) +void weststry_state::sound_map(address_map &map) { seibu_sound_map(map); - map(0x4002, 0x4002).w(FUNC(weststry_state::weststry_soundnmi_ack_w)); + map(0x4002, 0x4002).w(FUNC(weststry_state::soundnmi_ack_w)); } -/* Input Ports */ +// Input Ports #define BLOODBRO_COINAGE \ PORT_DIPNAME( 0x0001, 0x0001, "Coin Mode" ) PORT_DIPLOCATION("SW1:1") \ @@ -336,7 +648,7 @@ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // "Fire" PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // "Roll" PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) // "Dynamite" - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* tested when "continue" - check code at 0x000598 */ + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // tested when "continue" - check code at 0x000598 PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) @@ -344,7 +656,7 @@ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) // "Fire" PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // "Roll" PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) // "Dynamite" - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* tested - check code at 0x0005fe - VBLANK ? (probably not) */ + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // tested - check code at 0x0005fe - VBLANK ? (probably not) PORT_START("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -360,7 +672,7 @@ static INPUT_PORTS_START( weststry ) PORT_INCLUDE( bloodbro_base ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU INPUT_PORTS_END @@ -372,19 +684,19 @@ PORT_BIT( 0x000e, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x00e0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* tested - check code at 0x000800 */ + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) // tested - check code at 0x000800 PORT_BIT( 0x0e00, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0xe000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU INPUT_PORTS_END static INPUT_PORTS_START( skysmash ) PORT_START("DSW") BLOODBRO_COINAGE - PORT_DIPUNUSED_DIPLOC( 0x0040, IP_ACTIVE_LOW, "SW1:7" ) /* see notes */ - PORT_DIPUNUSED_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW1:8" ) /* see notes */ + PORT_DIPUNUSED_DIPLOC( 0x0040, IP_ACTIVE_LOW, "SW1:7" ) // see notes + PORT_DIPUNUSED_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW1:8" ) // see notes PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x0200, "2" ) PORT_DIPSETTING( 0x0300, "3" ) @@ -435,70 +747,70 @@ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0xe000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU INPUT_PORTS_END -/* Graphics Layouts */ +// Graphics Layouts static const gfx_layout textlayout = { - 8,8, /* 8*8 characters */ - RGN_FRAC(1,2), /* 4096 characters */ - 4, /* 4 bits per pixel */ + 8,8, // 8*8 characters + RGN_FRAC(1,2), // 4096 characters + 4, // 4 bits per pixel { 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 }, { 3, 2, 1, 0, 8+3, 8+2, 8+1, 8+0}, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, - 16*8 /* every char takes 16 consecutive bytes */ + 16*8 // every char takes 16 consecutive bytes }; static const gfx_layout spritelayout = { - 16,16, /* 16*16 sprites */ + 16,16, // 16*16 sprites RGN_FRAC(1,1), - 4, /* 4 bits per pixel */ + 4, // 4 bits per pixel { 8, 12, 0, 4 }, { 3, 2, 1, 0, 16+3, 16+2, 16+1, 16+0, 3+32*16, 2+32*16, 1+32*16, 0+32*16, 16+3+32*16, 16+2+32*16, 16+1+32*16, 16+0+32*16 }, { 0*16, 2*16, 4*16, 6*16, 8*16, 10*16, 12*16, 14*16, 16*16, 18*16, 20*16, 22*16, 24*16, 26*16, 28*16, 30*16 }, - 128*8 /* every sprite takes 128 consecutive bytes */ + 128*8 // every sprite takes 128 consecutive bytes }; static const gfx_layout weststry_textlayout = { - 8,8, /* 8*8 sprites */ - RGN_FRAC(1,4), /* 4096 sprites */ - 4, /* 4 bits per pixel */ + 8,8, // 8*8 sprites + RGN_FRAC(1,4), // 4096 sprites + 4, // 4 bits per pixel { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 /* every sprite takes 8 consecutive bytes */ + 8*8 // every sprite takes 8 consecutive bytes }; static const gfx_layout weststry_spritelayout = { - 16,16, /* 16*16 sprites */ - RGN_FRAC(1,4), /* 8192 sprites */ - 4, /* 4 bits per pixel */ + 16,16, // 16*16 sprites + RGN_FRAC(1,4), // 8192 sprites + 4, // 4 bits per pixel { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, { 0, 1, 2, 3, 4, 5, 6, 7, 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, - 32*8 /* every sprite takes 32 consecutive bytes */ + 32*8 // every sprite takes 32 consecutive bytes }; -/* Graphics Decode Info */ +// Graphics Decode Info static GFXDECODE_START( gfx_bloodbro ) - GFXDECODE_ENTRY( "txtiles", 0x00000, textlayout, 0x70*16, 0x10 ) /* Text */ - GFXDECODE_ENTRY( "bgtiles", 0x00000, spritelayout, 0x40*16, 0x10 ) /* Background */ - GFXDECODE_ENTRY( "bgtiles", 0x00000, spritelayout, 0x50*16, 0x10 ) /* Foreground */ + GFXDECODE_ENTRY( "txtiles", 0x00000, textlayout, 0x70*16, 0x10 ) + GFXDECODE_ENTRY( "bgtiles", 0x00000, spritelayout, 0x40*16, 0x10 ) + GFXDECODE_ENTRY( "bgtiles", 0x00000, spritelayout, 0x50*16, 0x10 ) GFXDECODE_END static GFXDECODE_START( gfx_bloodbro_spr ) - GFXDECODE_ENTRY( "sprites", 0x00000, spritelayout, 0x00*16, 0x10 ) /* Sprites */ + GFXDECODE_ENTRY( "sprites", 0x00000, spritelayout, 0x00*16, 0x10 ) GFXDECODE_END static GFXDECODE_START( gfx_weststry ) @@ -518,31 +830,31 @@ COMBINE_DATA(&m_scrollram[offset]); } -void weststry_state::weststry_layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void weststry_state::layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_scrollram[offset]); } -/* Machine Drivers */ +// Machine Drivers void bloodbro_state::bloodbro(machine_config &config) { // basic machine hardware - M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */ + M68000(config, m_maincpu, XTAL(20'000'000) / 2); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &bloodbro_state::bloodbro_map); m_maincpu->set_vblank_int("screen", FUNC(bloodbro_state::irq4_line_hold)); - Z80(config, m_audiocpu, XTAL(7'159'090)/2); /* verified on pcb */ + Z80(config, m_audiocpu, XTAL(7'159'090) / 2); // verified on PCB m_audiocpu->set_addrmap(AS_PROGRAM, &bloodbro_state::seibu_sound_map); m_audiocpu->set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(59.39); /* verified on pcb */ - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_refresh_hz(59.39); // verified on PCB + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate m_screen->set_size(32*8, 32*8); m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); - m_screen->set_screen_update(FUNC(bloodbro_state::screen_update_bloodbro)); + m_screen->set_screen_update(FUNC(bloodbro_state::screen_update)); m_screen->set_palette(m_palette); seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); @@ -559,11 +871,11 @@ // sound hardware SPEAKER(config, "mono").front_center(); - YM3812(config, m_ymsnd, XTAL(7'159'090)/2); + YM3812(config, m_ymsnd, XTAL(7'159'090) / 2); m_ymsnd->irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler)); m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0); - okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH)); + okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH)); oki.add_route(ALL_OUTPUTS, "mono", 1.0); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -578,32 +890,32 @@ { bloodbro(config); - m_maincpu->set_addrmap(AS_PROGRAM, &weststry_state::weststry_map); + m_maincpu->set_addrmap(AS_PROGRAM, &weststry_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(weststry_state::irq6_line_hold)); - m_audiocpu->set_clock(XTAL(20'000'000)/4); /* 5MHz - verified on PCB */ - m_audiocpu->set_addrmap(AS_PROGRAM, &weststry_state::weststry_sound_map); + m_audiocpu->set_clock(XTAL(20'000'000) / 4); // 5MHz - verified on PCB + m_audiocpu->set_addrmap(AS_PROGRAM, &weststry_state::sound_map); m_audiocpu->remove_irq_acknowledge_callback(); m_gfxdecode->set_info(gfx_weststry); m_palette->set_format(palette_device::xBGR_444, 1024); // Bootleg video hardware is non-Seibu - m_screen->set_refresh_hz(59); /* verified on PCB */ - m_screen->set_screen_update(FUNC(weststry_state::screen_update_weststry)); + m_screen->set_refresh_hz(59); // verified on PCB + m_screen->set_screen_update(FUNC(weststry_state::screen_update)); config.device_remove("spritegen"); config.device_remove("crtc"); // Bootleg sound hardware is close copy of Seibu, but uses different interrupts - okim6295_device &oki(OKIM6295(config.replace(), "oki", XTAL(20'000'000)/16, okim6295_device::PIN7_HIGH)); /* 1.25MHz - verified on PCB */ + okim6295_device &oki(OKIM6295(config.replace(), "oki", XTAL(20'000'000) / 16, okim6295_device::PIN7_HIGH)); // 1.25MHz - verified on PCB oki.add_route(ALL_OUTPUTS, "mono", 1.0); - YM3812(config.replace(), m_ymsnd, XTAL(20'000'000)/4); /* ~4.9MHz - see notes at top */ - m_ymsnd->irq_handler().set(FUNC(weststry_state::weststry_opl_irq_w)); + YM3812(config.replace(), m_ymsnd, XTAL(20'000'000)/4); // ~4.9MHz + m_ymsnd->irq_handler().set(FUNC(weststry_state::opl_irq_w)); m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0); - m_seibu_sound->ym_write_callback().set(FUNC(weststry_state::weststry_opl_w)); + m_seibu_sound->ym_write_callback().set(FUNC(weststry_state::opl_w)); } void bloodbro_state::skysmash(machine_config &config) @@ -615,7 +927,7 @@ } -/* ROMs */ +// ROMs ROM_START( bloodbro ) ROM_REGION( 0x80000, "maincpu", 0 ) @@ -630,16 +942,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) /* characters */ + ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) ROM_LOAD( "bb_06.u063.6d", 0x10000, 0x10000, CRC(7092e35b) SHA1(659d30b2e2fd9ffa34a47e98193c8f0a87ac1315) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) /* Background+Foreground */ + ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) ROM_REGION( 0x100000, "sprites", 0 ) - ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) /* sprites */ + ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "bb_08.u095.5a", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -659,16 +971,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) /* characters */ + ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) ROM_LOAD( "bb_06.u063.6d", 0x10000, 0x10000, CRC(7092e35b) SHA1(659d30b2e2fd9ffa34a47e98193c8f0a87ac1315) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) /* Background+Foreground */ + ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) ROM_REGION( 0x100000, "sprites", 0 ) - ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) /* sprites */ + ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "bb_08.u095.5a", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -688,16 +1000,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) /* characters */ + ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) ROM_LOAD( "bb_06.u063.6d", 0x10000, 0x10000, CRC(7092e35b) SHA1(659d30b2e2fd9ffa34a47e98193c8f0a87ac1315) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) /* Background+Foreground */ + ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) ROM_REGION( 0x100000, "sprites", 0 ) - ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) /* sprites */ + ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "bb_08.u095.5a", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -717,16 +1029,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) /* characters */ + ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) ROM_LOAD( "bb_06.u063.6d", 0x10000, 0x10000, CRC(7092e35b) SHA1(659d30b2e2fd9ffa34a47e98193c8f0a87ac1315) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) /* Background+Foreground */ + ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) ROM_REGION( 0x100000, "sprites", 0 ) - ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) /* sprites */ + ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "bb_08.u095.5a", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -746,16 +1058,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) /* characters */ + ROM_LOAD( "bb_05.u061.6f", 0x00000, 0x10000, CRC(04ba6d19) SHA1(7333075c3323756d51917418b5234d785a9bee00) ) ROM_LOAD( "bb_06.u063.6d", 0x10000, 0x10000, CRC(7092e35b) SHA1(659d30b2e2fd9ffa34a47e98193c8f0a87ac1315) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) /* Background+Foreground */ + ROM_LOAD( "blood_bros_bk__=c=1990_tad_corp.u064.4d", 0x00000, 0x100000, CRC(1aa87ee6) SHA1(e7843c1e8a0f3a685f0b5d6e3a2eb3176c410847) ) ROM_REGION( 0x100000, "sprites", 0 ) - ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) /* sprites */ + ROM_LOAD( "blood_bros_obj__=c=1990_tad_corp.u078.2n", 0x00000, 0x100000, CRC(d27c3952) SHA1(de7306432b682f238b911507ad7aa2fa8acbee80) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "bb_08.u095.5a", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -763,19 +1075,19 @@ ROM_END ROM_START( weststry ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code; based on bloodbrob */ + ROM_REGION( 0x80000, "maincpu", 0 ) // based on bloodbrob ROM_LOAD16_BYTE( "ws13.bin", 0x00001, 0x20000, CRC(158e302a) SHA1(52cc1bf526424ff025a6b79f3fc7bba4b9bbfcbb) ) ROM_LOAD16_BYTE( "ws15.bin", 0x00000, 0x20000, CRC(672e9027) SHA1(71cb9fcef04edb972ba88de45d605dcff539ea2d) ) ROM_LOAD16_BYTE( "ws14.bin", 0x40001, 0x20000, CRC(fd951c2c) SHA1(f4031bf303c67c82f2f78f7456f78382d8c1ac85) ) ROM_LOAD16_BYTE( "ws16.bin", 0x40000, 0x20000, CRC(18d3c460) SHA1(93b86af1199f0fedeaf1fe64d27ffede4b819e42) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for sound cpu code; based on different revision of original Seibu code */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // based on different revision of original Seibu code ROM_LOAD( "ws17.bin", 0x000000, 0x08000, CRC(e00a8f09) SHA1(e7247ce0ab99d0726f31dee5de5ba33f4ebd183e) ) ROM_CONTINUE( 0x010000, 0x08000 ) - ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) + ROM_COPY( "audiocpu", 0x000000, 0x18000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) // first half of these is blank - ROM_LOAD( "ws09.bin", 0x00000, 0x08000, CRC(f05b2b3e) SHA1(6570d795d68655ace9668f32dc0bf5c2d2372411) ) /* characters */ + ROM_LOAD( "ws09.bin", 0x00000, 0x08000, CRC(f05b2b3e) SHA1(6570d795d68655ace9668f32dc0bf5c2d2372411) ) ROM_CONTINUE( 0x00000, 0x08000 ) ROM_LOAD( "ws11.bin", 0x08000, 0x08000, CRC(2b10e3d2) SHA1(0f5045615b44e2300745fd3afac7f1441352cca5) ) ROM_CONTINUE( 0x08000, 0x08000 ) @@ -785,43 +1097,43 @@ ROM_CONTINUE( 0x18000, 0x08000 ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "ws01.bin", 0x20000, 0x20000, CRC(32bda4bc) SHA1(ed0c0740c7af513b341b2b7ff3e0bf6045e930e9) ) /* Foreground */ + ROM_LOAD( "ws01.bin", 0x20000, 0x20000, CRC(32bda4bc) SHA1(ed0c0740c7af513b341b2b7ff3e0bf6045e930e9) ) // Foreground ROM_LOAD( "ws03.bin", 0x60000, 0x20000, CRC(046b51f8) SHA1(25af752caebdec762582fc0130cf14546110bb54) ) ROM_LOAD( "ws02.bin", 0xa0000, 0x20000, CRC(ed9d682e) SHA1(0f79ea09a7af367d175081f72f2bc94f6caad463) ) ROM_LOAD( "ws04.bin", 0xe0000, 0x20000, CRC(75f082e5) SHA1(b29f09a3cc9a0ac3f982be3981f5e895050c49e8) ) - ROM_LOAD( "ws05.bin", 0x00000, 0x20000, CRC(007c8dc0) SHA1(f44576da3b89d6a889fdb564825ac6ce3bb4cffe) ) /* Background */ + ROM_LOAD( "ws05.bin", 0x00000, 0x20000, CRC(007c8dc0) SHA1(f44576da3b89d6a889fdb564825ac6ce3bb4cffe) ) // Background ROM_LOAD( "ws07.bin", 0x40000, 0x20000, CRC(0f0c8d9a) SHA1(f5fe9b5ee4c8ffd7caf5313d13fb5f6e181ed9b6) ) ROM_LOAD( "ws06.bin", 0x80000, 0x20000, CRC(459d075e) SHA1(24cd0bffe7c5bbccf653ced0b73579059603d187) ) ROM_LOAD( "ws08.bin", 0xc0000, 0x20000, CRC(4d6783b3) SHA1(9870fe9570afeff179b6080581fd6bb187898ff0) ) ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) - ROM_LOAD( "ws25.bin", 0x00000, 0x20000, CRC(8092e8e9) SHA1(eabe58ac0f88234b0dddf361f56aad509a83012e) ) /* sprites */ + ROM_LOAD( "ws25.bin", 0x00000, 0x20000, CRC(8092e8e9) SHA1(eabe58ac0f88234b0dddf361f56aad509a83012e) ) ROM_LOAD( "ws26.bin", 0x20000, 0x20000, CRC(f6a1f42c) SHA1(6d5503e1a9b00104970292d22301ed28893c5223) ) ROM_LOAD( "ws23.bin", 0x40000, 0x20000, CRC(43d58e24) SHA1(99e255faa9716d9102a1223419084fc209ab4024) ) - ROM_LOAD( "ws24.bin", 0x60000, 0x20000, CRC(20a867ea) SHA1(d3985002931fd4180fc541d61a94371871f3709d) ) /* if the original MASK rom is converted then offset 1ECFE = 06 not 02, confirmed on 2 bootlegs, maybe original mask dump is bad? */ + ROM_LOAD( "ws24.bin", 0x60000, 0x20000, CRC(20a867ea) SHA1(d3985002931fd4180fc541d61a94371871f3709d) ) // if the original mask ROM is converted then offset 1ECFE = 06 not 02, confirmed on 2 bootlegs, maybe original mask dump is bad? ROM_LOAD( "ws21.bin", 0x80000, 0x20000, CRC(5ef55779) SHA1(8ca786ef56173305a01452defc2be6e775bef374) ) ROM_LOAD( "ws22.bin", 0xa0000, 0x20000, CRC(7150a060) SHA1(73bdd7d6752f7fe9e23073d835dbc468d57865fa) ) ROM_LOAD( "ws19.bin", 0xc0000, 0x20000, CRC(c5dd0a96) SHA1(4696ab1b02d40c54a7dacf0bdf90b624b7d6812e) ) ROM_LOAD( "ws20.bin", 0xe0000, 0x20000, CRC(f1245c16) SHA1(f3941bf5830995f65a5378326fdb72687fbbddcf) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "ws18.bin", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_END ROM_START( weststrya ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code; based on bloodbrob */ + ROM_REGION( 0x80000, "maincpu", 0 ) // based on bloodbrob ROM_LOAD16_BYTE( "13.bin", 0x00001, 0x20000, CRC(d50e1dfd) SHA1(b0ed90a602ae079c897de6d4cbed61f389f4b220) ) ROM_LOAD16_BYTE( "15.bin", 0x00000, 0x20000, CRC(fd419c7b) SHA1(f3b23a3f1d550b1739059aeb0fa92076d2b86f69) ) ROM_LOAD16_BYTE( "ws14.bin", 0x40001, 0x20000, CRC(fd951c2c) SHA1(f4031bf303c67c82f2f78f7456f78382d8c1ac85) ) ROM_LOAD16_BYTE( "ws16.bin", 0x40000, 0x20000, CRC(18d3c460) SHA1(93b86af1199f0fedeaf1fe64d27ffede4b819e42) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for sound cpu code; based on different revision of original Seibu code */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // based on different revision of original Seibu code ROM_LOAD( "ws17.bin", 0x000000, 0x08000, CRC(e00a8f09) SHA1(e7247ce0ab99d0726f31dee5de5ba33f4ebd183e) ) ROM_CONTINUE( 0x010000, 0x08000 ) - ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) + ROM_COPY( "audiocpu", 0x000000, 0x18000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) // first half of these is blank - ROM_LOAD( "ws09.bin", 0x00000, 0x08000, CRC(f05b2b3e) SHA1(6570d795d68655ace9668f32dc0bf5c2d2372411) ) /* characters */ + ROM_LOAD( "ws09.bin", 0x00000, 0x08000, CRC(f05b2b3e) SHA1(6570d795d68655ace9668f32dc0bf5c2d2372411) ) ROM_CONTINUE( 0x00000, 0x08000 ) ROM_LOAD( "ws11.bin", 0x08000, 0x08000, CRC(2b10e3d2) SHA1(0f5045615b44e2300745fd3afac7f1441352cca5) ) ROM_CONTINUE( 0x08000, 0x08000 ) @@ -831,26 +1143,26 @@ ROM_CONTINUE( 0x18000, 0x08000 ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "ws01.bin", 0x20000, 0x20000, CRC(32bda4bc) SHA1(ed0c0740c7af513b341b2b7ff3e0bf6045e930e9) ) /* Foreground */ + ROM_LOAD( "ws01.bin", 0x20000, 0x20000, CRC(32bda4bc) SHA1(ed0c0740c7af513b341b2b7ff3e0bf6045e930e9) ) // Foreground ROM_LOAD( "ws03.bin", 0x60000, 0x20000, CRC(046b51f8) SHA1(25af752caebdec762582fc0130cf14546110bb54) ) ROM_LOAD( "ws02.bin", 0xa0000, 0x20000, CRC(ed9d682e) SHA1(0f79ea09a7af367d175081f72f2bc94f6caad463) ) ROM_LOAD( "ws04.bin", 0xe0000, 0x20000, CRC(75f082e5) SHA1(b29f09a3cc9a0ac3f982be3981f5e895050c49e8) ) - ROM_LOAD( "ws05.bin", 0x00000, 0x20000, CRC(007c8dc0) SHA1(f44576da3b89d6a889fdb564825ac6ce3bb4cffe) ) /* Background */ + ROM_LOAD( "ws05.bin", 0x00000, 0x20000, CRC(007c8dc0) SHA1(f44576da3b89d6a889fdb564825ac6ce3bb4cffe) ) // Background ROM_LOAD( "ws07.bin", 0x40000, 0x20000, CRC(0f0c8d9a) SHA1(f5fe9b5ee4c8ffd7caf5313d13fb5f6e181ed9b6) ) ROM_LOAD( "ws06.bin", 0x80000, 0x20000, CRC(459d075e) SHA1(24cd0bffe7c5bbccf653ced0b73579059603d187) ) ROM_LOAD( "ws08.bin", 0xc0000, 0x20000, CRC(4d6783b3) SHA1(9870fe9570afeff179b6080581fd6bb187898ff0) ) ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) - ROM_LOAD( "ws25.bin", 0x00000, 0x20000, CRC(8092e8e9) SHA1(eabe58ac0f88234b0dddf361f56aad509a83012e) ) /* sprites */ + ROM_LOAD( "ws25.bin", 0x00000, 0x20000, CRC(8092e8e9) SHA1(eabe58ac0f88234b0dddf361f56aad509a83012e) ) ROM_LOAD( "ws26.bin", 0x20000, 0x20000, CRC(f6a1f42c) SHA1(6d5503e1a9b00104970292d22301ed28893c5223) ) ROM_LOAD( "ws23.bin", 0x40000, 0x20000, CRC(43d58e24) SHA1(99e255faa9716d9102a1223419084fc209ab4024) ) - ROM_LOAD( "ws24.bin", 0x60000, 0x20000, CRC(20a867ea) SHA1(d3985002931fd4180fc541d61a94371871f3709d) ) /* if the original MASK rom is converted then offset 1ECFE = 06 not 02, confirmed on 2 bootlegs, maybe original mask dump is bad? */ + ROM_LOAD( "ws24.bin", 0x60000, 0x20000, CRC(20a867ea) SHA1(d3985002931fd4180fc541d61a94371871f3709d) ) // if the original mask ROM is converted then offset 1ECFE = 06 not 02, confirmed on 2 bootlegs, maybe original mask dump is bad? ROM_LOAD( "ws21.bin", 0x80000, 0x20000, CRC(5ef55779) SHA1(8ca786ef56173305a01452defc2be6e775bef374) ) ROM_LOAD( "ws22.bin", 0xa0000, 0x20000, CRC(7150a060) SHA1(73bdd7d6752f7fe9e23073d835dbc468d57865fa) ) ROM_LOAD( "ws19.bin", 0xc0000, 0x20000, CRC(c5dd0a96) SHA1(4696ab1b02d40c54a7dacf0bdf90b624b7d6812e) ) ROM_LOAD( "ws20.bin", 0xe0000, 0x20000, CRC(f1245c16) SHA1(f3941bf5830995f65a5378326fdb72687fbbddcf) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "ws18.bin", 0x00000, 0x20000, CRC(deb1b975) SHA1(08f2e9a0a23171201b71d381d091edcd3787c287) ) ROM_END @@ -867,16 +1179,16 @@ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) ROM_REGION( 0x20000, "txtiles", 0 ) - ROM_LOAD( "rom3", 0x00000, 0x10000, CRC(fbb241be) SHA1(cd94c328891538bbd8c062d90a47ddf3d7d05bb0) ) /* characters */ + ROM_LOAD( "rom3", 0x00000, 0x10000, CRC(fbb241be) SHA1(cd94c328891538bbd8c062d90a47ddf3d7d05bb0) ) ROM_LOAD( "rom4", 0x10000, 0x10000, CRC(ad3cde81) SHA1(2bd0c707e5b67d3699a743d989cb5384cbe37ff7) ) ROM_REGION( 0x100000, "bgtiles", 0 ) - ROM_LOAD( "rom9", 0x00000, 0x100000, CRC(b0a5eecf) SHA1(9e8191c7ae4a32dc16aebc37fa942afc531eddd4) ) /* Background + Foreground */ + ROM_LOAD( "rom9", 0x00000, 0x100000, CRC(b0a5eecf) SHA1(9e8191c7ae4a32dc16aebc37fa942afc531eddd4) ) ROM_REGION( 0x80000, "sprites", 0 ) - ROM_LOAD( "rom10", 0x00000, 0x080000, CRC(1bbcda5d) SHA1(63915221f70a7dfda6a4d8ac7f5c663c9316610a) ) /* sprites */ + ROM_LOAD( "rom10", 0x00000, 0x080000, CRC(1bbcda5d) SHA1(63915221f70a7dfda6a4d8ac7f5c663c9316610a) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "rom1", 0x00000, 0x20000, CRC(e69986f6) SHA1(de38bf2d5638cb40740882e1abccf7928e43a5a6) ) ROM_REGION( 0x0100, "proms", 0 ) @@ -894,18 +1206,20 @@ uint8_t *sprites = memregion("sprites")->base(); for (int i = 0; i < 0x40000; i++) { - /* sprite roms ws25 and ws26 have 2 bits swapped + /* sprite ROMs ws25 and ws26 have 2 bits swapped there is also an address swap but that is currently handled in the video implementation */ - sprites[i] = bitswap<8>(sprites[i],7,6,4,5,3,2,1,0); + sprites[i] = bitswap<8>(sprites[i], 7, 6, 4, 5, 3, 2, 1, 0); } - m_weststry_opl_irq = false; - m_weststry_soundnmi_mask = true; + m_opl_irq = false; + m_soundnmi_mask = true; - save_item(NAME(m_weststry_opl_irq)); - save_item(NAME(m_weststry_soundnmi_mask)); + save_item(NAME(m_opl_irq)); + save_item(NAME(m_soundnmi_mask)); } +} // anonymous namespace + /* Game Drivers */ diff -Nru mame-0.263+dfsg.1/src/mame/seibu/bloodbro.h mame-0.264+dfsg.1/src/mame/seibu/bloodbro.h --- mame-0.263+dfsg.1/src/mame/seibu/bloodbro.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/bloodbro.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano -#ifndef MAME_SEIBU_BLOODBRO_H -#define MAME_SEIBU_BLOODBRO_H - -#pragma once - -#include "sei021x_sei0220_spr.h" - -#include "seibusound.h" - -#include "sound/ymopl.h" - -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class bloodbro_state : public driver_device, public seibu_sound_common -{ -public: - bloodbro_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_spritegen(*this, "spritegen"), - m_seibu_sound(*this, "seibu_sound"), - m_ymsnd(*this, "ymsnd"), - m_spriteram(*this, "spriteram"), - m_bgvideoram(*this, "bgvideoram"), - m_fgvideoram(*this, "fgvideoram"), - m_txvideoram(*this, "txvideoram") - { } - - void bloodbro(machine_config &config); - void skysmash(machine_config &config); - -protected: - virtual void video_start() override; - - required_device m_maincpu; - required_device m_audiocpu; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - optional_device m_spritegen; - required_device m_seibu_sound; - required_device m_ymsnd; - - required_shared_ptr m_spriteram; - required_shared_ptr m_bgvideoram; - required_shared_ptr m_fgvideoram; - required_shared_ptr m_txvideoram; - - uint16_t m_scrollram[6]{}; - uint16_t m_layer_en = 0U; - - tilemap_t *m_bg_tilemap = nullptr; - tilemap_t *m_fg_tilemap = nullptr; - tilemap_t *m_tx_tilemap = nullptr; - - void bgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void fgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void layer_en_w(uint16_t data); - void layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - TILE_GET_INFO_MEMBER(get_bg_tile_info); - TILE_GET_INFO_MEMBER(get_fg_tile_info); - TILE_GET_INFO_MEMBER(get_tx_tile_info); - - uint32_t screen_update_bloodbro(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void bloodbro_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t pri_cb(uint8_t pri, uint8_t ext); - - void bloodbro_map(address_map &map); - void common_map(address_map &map); - void skysmash_map(address_map &map); -}; - -class weststry_state : public bloodbro_state -{ -public: - weststry_state(const machine_config &mconfig, device_type type, const char *tag) : - bloodbro_state(mconfig, type, tag) - { } - - void init_weststry(); - - void weststry(machine_config &config); - -private: - bool m_weststry_opl_irq = false; - bool m_weststry_soundnmi_mask = false; - - void weststry_layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void weststry_soundlatch_w(offs_t offset, u8 data); - void weststry_opl_irq_w(int state); - void weststry_opl_w(offs_t offset, uint8_t data); - void weststry_soundnmi_ack_w(uint8_t data); - void weststry_soundnmi_update(); - - uint32_t screen_update_weststry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void weststry_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void weststry_map(address_map &map); - void weststry_sound_map(address_map &map); -}; - -#endif // MAME_SEIBU_BLOODBRO_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/bloodbro_v.cpp mame-0.264+dfsg.1/src/mame/seibu/bloodbro_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/bloodbro_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/bloodbro_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano -/*************************************************************************** - - Video Hardware for Blood Brothers - - Note: - - An extra layer is currently disabled via the layer enable register - in Seibu CRTC device (bit 2). Is it even tied to any RAM portion? - -***************************************************************************/ - -#include "emu.h" -#include "bloodbro.h" -#include "screen.h" - - -/*************************************************************************** - - Callbacks for the TileMap code - -***************************************************************************/ - -TILE_GET_INFO_MEMBER(bloodbro_state::get_bg_tile_info) -{ - int code = m_bgvideoram[tile_index]; - tileinfo.set(1, - code & 0xfff, - (code >> 12), - 0); -} - -TILE_GET_INFO_MEMBER(bloodbro_state::get_fg_tile_info) -{ - int code = m_fgvideoram[tile_index]; - tileinfo.set(2, - (code & 0xfff)+0x1000, - (code >> 12), - 0); -} - -TILE_GET_INFO_MEMBER(bloodbro_state::get_tx_tile_info) -{ - int code = m_txvideoram[tile_index]; - tileinfo.set(0, - code & 0xfff, - code >> 12, - 0); -} - - - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -void bloodbro_state::video_start() -{ - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 16); - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 16); - m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(bloodbro_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_fg_tilemap->set_transparent_pen(15); - m_tx_tilemap->set_transparent_pen(15); - - save_item(NAME(m_scrollram)); - save_item(NAME(m_layer_en)); -} - - - -/*************************************************************************** - - Memory handlers - -***************************************************************************/ - -void bloodbro_state::bgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_bgvideoram[offset]); - m_bg_tilemap->mark_tile_dirty(offset); -} - -void bloodbro_state::fgvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_fgvideoram[offset]); - m_fg_tilemap->mark_tile_dirty(offset); -} - -void bloodbro_state::txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_txvideoram[offset]); - m_tx_tilemap->mark_tile_dirty(offset); -} - - - -/*************************************************************************** - - Display refresh - - - Blood Bros / Skysmash Spriteram - ------------------------------- - - Slightly more sophisticated successor to the Toki sprite chip. - - It has "big sprites" created by setting width or height >0. Tile - numbers are read consecutively. - - +0 x....... ........ sprite disabled if set - +0 .x...... ........ Flip y (no evidence for this!!) - +0 ..x..... ........ Flip x - +0 ....x... ........ Priority (1=high) - +0 ......xx x....... Width: do this many tiles horizontally - +0 ........ .xxx.... Height: do this many tiles vertically - +0 ........ ....xxxx Color bank - - +1 ...xxxxx xxxxxxxx Tile number - +2 .......x xxxxxxxx X coordinate - +3 .......x xxxxxxxx Y coordinate - - - Weststry Bootleg Spriteram - -------------------------- - - Lacks the "big sprite" feature of the original. Needs some - tile number remapping for some reason. - - +0 .......x xxxxxxxx Sprite Y coordinate - +1 ...xxxxx xxxxxxxx Sprite tile number - +2 xxxx.... ........ Sprite color bank - +2 ......x. ........ Sprite flip x - +2 ........ x....... Priority ?? - +3 .......x xxxxxxxx Sprite X coordinate - -***************************************************************************/ - -/* SPRITE INFO (8 bytes) - - D-F?P?SS SSSSCCCC - ---TTTTT TTTTTTTT - -------X XXXXXXXX - -------- YYYYYYYY */ - -uint32_t bloodbro_state::pri_cb(uint8_t pri, uint8_t ext) -{ - return pri ? 0x02 : 0; -} - -/* SPRITE INFO (8 bytes) - - D------- YYYYYYYY - ---TTTTT TTTTTTTT - CCCC--F? -?--???? Priority?? - -------X XXXXXXXX -*/ - -void weststry_state::weststry_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - uint16_t *spriteram16 = m_spriteram; - int offs; - - for (offs = m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4) - { - int data = spriteram16[offs+2]; - int data0 = spriteram16[offs+0]; - int code = spriteram16[offs+1]&0x1fff; - int sx = spriteram16[offs+3]&0x1ff; - int sy = 0xf0-(data0&0xff); - int flipx = data & 0x200; - int flipy = data & 0x400; /* ??? */ - int color = (data&0xf000)>>12; - int pri_mask = (data & 0x0080) ? 0x02 : 0; - - if (sx >= 256) sx -= 512; - - if (data0 & 0x8000) continue; /* disabled */ - - /* Remap code 0x800 <-> 0x1000 */ - code = (code&0x7ff) | ((code&0x800)<<1) | ((code&0x1000)>>1); - - m_gfxdecode->gfx(3)->prio_transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - sx,sy, - screen.priority(), - pri_mask,15); - } -} - - - -uint32_t bloodbro_state::screen_update_bloodbro(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_bg_tilemap->set_scrollx(0,m_scrollram[0]); - m_bg_tilemap->set_scrolly(0,m_scrollram[1]); - m_fg_tilemap->set_scrollx(0,m_scrollram[2]); - m_fg_tilemap->set_scrolly(0,m_scrollram[3]); - - screen.priority().fill(0, cliprect); - - if(BIT(~m_layer_en, 0)) - m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0); - if(BIT(~m_layer_en, 1)) - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,1); - if(BIT(~m_layer_en, 4)) - m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); - if(BIT(~m_layer_en, 3)) - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - - return 0; -} - -uint32_t weststry_state::screen_update_weststry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - // The bootleg video hardware probably also allows BG scrolling, but weststry doesn't use it - m_fg_tilemap->set_scrollx(0, (int8_t)m_scrollram[1] - 13); - m_fg_tilemap->set_scrolly(0, (int8_t)m_scrollram[0] + 1); - - screen.priority().fill(0, cliprect); - - m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,1); - weststry_draw_sprites(screen, bitmap,cliprect); - m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/cabal.cpp mame-0.264+dfsg.1/src/mame/seibu/cabal.cpp --- mame-0.263+dfsg.1/src/mame/seibu/cabal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/cabal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano +// copyright-holders: Carlos A. Lozano + /****************************************************************** Cabal (c)1988/1989 Tad @@ -163,15 +164,248 @@ ******************************************************************/ #include "emu.h" -#include "cabal.h" + +#include "seibusound.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/gen_latch.h" #include "machine/upd4701.h" +#include "sound/msm5205.h" #include "sound/ymopm.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class cabal_base_state : public driver_device +{ +public: + cabal_base_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_msm(*this, "msm%u", 1U), + m_spriteram(*this, "spriteram"), + m_colorram(*this, "colorram"), + m_videoram(*this, "videoram") + { } + +protected: + virtual void video_start() override; + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_gfxdecode; + required_device m_palette; + required_device_array m_msm; + + required_shared_ptr m_spriteram; + required_shared_ptr m_colorram; + required_shared_ptr m_videoram; + + void flipscreen_w(uint8_t data); + void background_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void text_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +private: + tilemap_t *m_background_layer = nullptr; + tilemap_t *m_text_layer = nullptr; + + TILE_GET_INFO_MEMBER(get_back_tile_info); + TILE_GET_INFO_MEMBER(get_text_tile_info); + + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); +}; + +class cabal_state : public cabal_base_state +{ +public: + cabal_state(const machine_config &mconfig, device_type type, const char *tag) : + cabal_base_state(mconfig, type, tag), + m_seibu_sound(*this, "seibu_sound"), + m_adpcm(*this, "adpcm%u", 1U) + { } + + void cabal(machine_config &config); + void cabalbl2(machine_config &config); + void cabalt(machine_config &config); + + void init_cabal(); + +private: + required_device m_seibu_sound; + required_device_array m_adpcm; + + void sound_irq_trigger_word_w(offs_t offset, uint16_t data, uint16_t mem_mask); + + void main_map(address_map &map); + void sound_decrypted_opcodes_map(address_map &map); + void sound_map(address_map &map); + void trackball_main_map(address_map &map); + void cabalbl2_predecrypted_opcodes_map(address_map &map); + void cabalbl2_sound_map(address_map &map); +}; + +class cabalbl_state : public cabal_base_state +{ +public: + cabalbl_state(const machine_config &mconfig, device_type type, const char *tag) : + cabal_base_state(mconfig, type, tag) + { } + + void cabalbl(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + int m_sound_command[2]{}; + + void sndcmd_w(offs_t offset, uint16_t data); + void sound_irq_trigger_word_w(uint16_t data); + template uint8_t snd_r(); + void coin_w(uint8_t data); + template void adpcm_w(uint8_t data); + + void main_map(address_map &map); + void sound_map(address_map &map); + void talk1_map(address_map &map); + void talk1_portmap(address_map &map); + void talk2_map(address_map &map); + void talk2_portmap(address_map &map); +}; + + +TILE_GET_INFO_MEMBER(cabal_base_state::get_back_tile_info) +{ + int tile = m_videoram[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(1, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(cabal_base_state::get_text_tile_info) +{ + int tile = m_colorram[tile_index]; + int const color = (tile >> 10); + + tile &= 0x3ff; + + tileinfo.set(0, tile, color, 0); +} + + +void cabal_base_state::video_start() +{ + m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(cabal_base_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 16, 16); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(cabal_base_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_text_layer->set_transparent_pen(3); + m_background_layer->set_transparent_pen(15); +} + + +/**************************************************************************/ + +void cabal_base_state::flipscreen_w(uint8_t data) +{ + int const flip = (data & 0x20) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; + m_background_layer->set_flip(flip); + m_text_layer->set_flip(flip); + + flip_screen_set(data & 0x20); +} + +void cabal_base_state::background_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[offset]); + m_background_layer->mark_tile_dirty(offset); +} + +void cabal_base_state::text_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_colorram[offset]); + m_text_layer->mark_tile_dirty(offset); +} + + +/******************************************************************** + + Cabal Spriteram + --------------- + + +0 .......x ........ Sprite enable bit + +0 ........ xxxxxxxx Sprite Y coordinate + +1 ..??.... ........ ??? unknown ??? + +1 ....xxxx xxxxxxxx Sprite tile number + +2 .xxxx... ........ Sprite color bank + +2 .....x.. ........ Sprite flip x + +2 .......x xxxxxxxx Sprite X coordinate + +3 (unused) + + -------E YYYYYYYY + ----BBTT TTTTTTTT + -CCCCF-X XXXXXXXX + -------- -------- + +********************************************************************/ + +void cabal_base_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) + { + int const data0 = m_spriteram[offs]; + int const data1 = m_spriteram[offs + 1]; + int const data2 = m_spriteram[offs + 2]; + + if (data0 & 0x100) + { + int const tile_number = data1 & 0xfff; + int const color = (data2 & 0x7800) >> 11; + int sy = (data0 & 0xff); + int sx = (data2 & 0x1ff); + int flipx = (data2 & 0x0400); + int flipy = 0; + + if (sx > 256) sx -= 512; + + if (flip_screen()) + { + sx = 240 - sx; + sy = 240 - sy; + flipx = !flipx; + flipy = !flipy; + } + + m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, + tile_number, + color, + flipx, flipy, + sx, sy, 0xf); + } + } +} + + +uint32_t cabal_base_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(bitmap, cliprect); + m_text_layer->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} void cabalbl_state::machine_start() @@ -203,12 +437,12 @@ -void cabal_state::sound_irq_trigger_word_w(offs_t, u16 data, u16 mem_mask) +void cabal_state::sound_irq_trigger_word_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (ACCESSING_BITS_0_7) m_seibu_sound->main_w(4, data & 0x00ff); - /* spin for a while to let the Z80 read the command, otherwise coins "stick" */ + // spin for a while to let the Z80 read the command, otherwise coins "stick" m_maincpu->spin_until_time(attotime::from_usec(50)); } @@ -223,15 +457,15 @@ { map(0x00000, 0x3ffff).rom(); map(0x40000, 0x437ff).ram(); - map(0x43800, 0x43fff).ram().share("spriteram"); + map(0x43800, 0x43fff).ram().share(m_spriteram); map(0x44000, 0x4ffff).ram(); - map(0x60000, 0x607ff).ram().w(FUNC(cabal_state::text_videoram_w)).share("colorram"); - map(0x80000, 0x801ff).ram().w(FUNC(cabal_state::background_videoram_w)).share("videoram"); + map(0x60000, 0x607ff).ram().w(FUNC(cabal_state::text_videoram_w)).share(m_colorram); + map(0x80000, 0x801ff).ram().w(FUNC(cabal_state::background_videoram_w)).share(m_videoram); map(0x80200, 0x803ff).ram(); map(0xa0000, 0xa0001).portr("DSW"); map(0xa0008, 0xa0009).portr("IN2"); map(0xa0010, 0xa0011).portr("INPUTS"); - map(0xc0040, 0xc0041).nopw(); /* ??? */ + map(0xc0040, 0xc0041).nopw(); // ??? map(0xc0081, 0xc0081).w(FUNC(cabal_state::flipscreen_w)); map(0xe0000, 0xe07ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0xe8000, 0xe800d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); @@ -255,15 +489,15 @@ { map(0x00000, 0x3ffff).rom(); map(0x40000, 0x437ff).ram(); - map(0x43800, 0x43fff).ram().share("spriteram"); + map(0x43800, 0x43fff).ram().share(m_spriteram); map(0x44000, 0x4ffff).ram(); - map(0x60000, 0x607ff).ram().w(FUNC(cabalbl_state::text_videoram_w)).share("colorram"); - map(0x80000, 0x801ff).ram().w(FUNC(cabalbl_state::background_videoram_w)).share("videoram"); + map(0x60000, 0x607ff).ram().w(FUNC(cabalbl_state::text_videoram_w)).share(m_colorram); + map(0x80000, 0x801ff).ram().w(FUNC(cabalbl_state::background_videoram_w)).share(m_videoram); map(0x80200, 0x803ff).ram(); map(0xa0000, 0xa0001).portr("DSW"); map(0xa0008, 0xa0009).portr("JOY"); map(0xa0010, 0xa0011).portr("INPUTS"); - map(0xc0040, 0xc0041).nopw(); /* ??? */ + map(0xc0040, 0xc0041).nopw(); // ??? map(0xc0081, 0xc0081).w(FUNC(cabalbl_state::flipscreen_w)); map(0xe0000, 0xe07ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0xe8000, 0xe8003).w(FUNC(cabalbl_state::sndcmd_w)); @@ -276,7 +510,7 @@ template uint8_t cabalbl_state::snd_r() { - return bitswap<8>(m_sound_command[Which], 7,2,4,5,3,6,1,0); + return bitswap<8>(m_sound_command[Which], 7, 2, 4, 5, 3, 6, 1, 0); } void cabalbl_state::coin_w(uint8_t data) @@ -325,7 +559,7 @@ map(0x400a, 0x400a).r(FUNC(cabalbl_state::snd_r<0>)); map(0x400c, 0x400c).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x400e, 0x400f).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); - map(0x6000, 0x6000).nopw(); /* ??? */ + map(0x6000, 0x6000).nopw(); // ??? map(0x8000, 0xffff).rom(); } @@ -355,13 +589,13 @@ map(0x8000, 0xffff).rom().region("audiocpu", 0x8000); } -/* the bootleg has 2x z80 sample players */ +// the bootleg has 2x z80 sample players template void cabalbl_state::adpcm_w(uint8_t data) { m_msm[Which]->reset_w(BIT(data, 7)); - /* ?? bit 6?? */ + // ?? bit 6?? m_msm[Which]->data_w(data); m_msm[Which]->vclk_w(1); m_msm[Which]->vclk_w(0); @@ -449,14 +683,14 @@ PORT_DIPSETTING( 0x2000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) ) - PORT_DIPUNKNOWN_DIPLOC( 0x4000, 0x4000, "SW2:7" ) /* Left blank in the manual */ + PORT_DIPUNKNOWN_DIPLOC( 0x4000, 0x4000, "SW2:7" ) // Left blank in the manual PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x8000, DEF_STR( On ) ) PORT_START("COIN") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(4) /* read through sound cpu */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(4) /* read through sound cpu */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(4) // read through sound CPU + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(4) // read through sound CPU INPUT_PORTS_END static INPUT_PORTS_START( cabalt ) @@ -496,7 +730,7 @@ /* Since the Trackball version was produced first, and it doesn't use the third button, Pin 24 of the JAMMA connector ('JAMMA button 3') - has no trace on the pcb. To work around this design issue the + has no trace on the PCB. To work around this design issue the manufacturer had to use pin 15 which is usually the test / service button */ @@ -506,7 +740,7 @@ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x0ff0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* the 3rd button connects to the service switch */ + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) // the 3rd button connects to the service switch PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 ) @@ -601,30 +835,30 @@ static GFXDECODE_START( gfx_cabal ) - GFXDECODE_ENTRY( "gfx1", 0x000000, text_layout, 0, 1024/4 ) - GFXDECODE_ENTRY( "gfx2", 0x000000, tile_layout, 32*16, 16 ) - GFXDECODE_ENTRY( "gfx3", 0x000000, sprite_layout, 16*16, 16 ) + GFXDECODE_ENTRY( "chars", 0x000000, text_layout, 0, 1024/4 ) + GFXDECODE_ENTRY( "tiles", 0x000000, tile_layout, 32*16, 16 ) + GFXDECODE_ENTRY( "sprites", 0x000000, sprite_layout, 16*16, 16 ) GFXDECODE_END void cabal_state::cabal(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */ + // basic machine hardware + M68000(config, m_maincpu, XTAL(20'000'000) / 2); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &cabal_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(cabal_state::irq1_line_hold)); - Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */ + Z80(config, m_audiocpu, XTAL(3'579'545)); // verified on PCB m_audiocpu->set_addrmap(AS_PROGRAM, &cabal_state::sound_map); m_audiocpu->set_addrmap(AS_OPCODES, &cabal_state::sound_decrypted_opcodes_map); m_audiocpu->set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); SEI80BU(config, "sei80bu", 0).set_device_rom_tag("audiocpu"); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(59.60); /* verified on pcb */ - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_refresh_hz(59.60); // verified on PCB + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(256, 256); screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); screen.set_screen_update(FUNC(cabal_state::screen_update)); @@ -633,7 +867,7 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cabal); PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024); - /* sound hardware */ + // sound hardware SEIBU_SOUND(config, m_seibu_sound, 0); m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0); m_seibu_sound->set_rom_tag("audiocpu"); @@ -642,19 +876,19 @@ SPEAKER(config, "mono").front_center(); - ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); /* verified on pcb */ + ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); // verified on PCB ymsnd.irq_handler().set(m_seibu_sound, FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.80); - SEIBU_ADPCM(config, m_adpcm[0], XTAL(12'000'000)/32/48, m_msm[0]); - SEIBU_ADPCM(config, m_adpcm[1], XTAL(12'000'000)/32/48, m_msm[1]); + SEIBU_ADPCM(config, m_adpcm[0], XTAL(12'000'000) /32 / 48, m_msm[0]); + SEIBU_ADPCM(config, m_adpcm[1], XTAL(12'000'000) /32 / 48, m_msm[1]); - MSM5205(config, m_msm[0], XTAL(12'000'000)/32); /* verified on pcb */ + MSM5205(config, m_msm[0], XTAL(12'000'000) / 32); // verified on PCB m_msm[0]->vck_callback().set(m_adpcm[0], FUNC(seibu_adpcm_device::msm_int)); m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125 kHz */ m_msm[0]->add_route(ALL_OUTPUTS, "mono", 0.40); - MSM5205(config, m_msm[1], XTAL(12'000'000)/32); /* verified on pcb */ + MSM5205(config, m_msm[1], XTAL(12'000'000) / 32); // verified on PCB m_msm[1]->vck_callback().set(m_adpcm[1], FUNC(seibu_adpcm_device::msm_int)); m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125 kHz */ m_msm[1]->add_route(ALL_OUTPUTS, "mono", 0.40); @@ -684,34 +918,34 @@ } -/* the bootleg has different sound hardware (2 extra Z80s for ADPCM playback) */ +// the bootleg has different sound hardware (2 extra Z80s for ADPCM playback) void cabalbl_state::cabalbl(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */ + // basic machine hardware + M68000(config, m_maincpu, XTAL(20'000'000) / 2); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &cabalbl_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(cabalbl_state::irq1_line_hold)); - Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */ + Z80(config, m_audiocpu, XTAL(3'579'545)); // verified on PCB m_audiocpu->set_addrmap(AS_PROGRAM, &cabalbl_state::sound_map); - /* there are 2x z80s for the ADPCM */ - z80_device &adpcm_1(Z80(config, "adpcm_1", XTAL(3'579'545))); /* verified on pcb */ + // there are 2x z80s for the ADPCM + z80_device &adpcm_1(Z80(config, "adpcm_1", XTAL(3'579'545))); // verified on PCB adpcm_1.set_addrmap(AS_PROGRAM, &cabalbl_state::talk1_map); adpcm_1.set_addrmap(AS_IO, &cabalbl_state::talk1_portmap); adpcm_1.set_periodic_int(FUNC(cabalbl_state::irq0_line_hold), attotime::from_hz(8000)); - z80_device &adpcm_2(Z80(config, "adpcm_2", XTAL(3'579'545))); /* verified on pcb */ + z80_device &adpcm_2(Z80(config, "adpcm_2", XTAL(3'579'545))); // verified on PCB adpcm_2.set_addrmap(AS_PROGRAM, &cabalbl_state::talk2_map); adpcm_2.set_addrmap(AS_IO, &cabalbl_state::talk2_portmap); adpcm_2.set_periodic_int(FUNC(cabalbl_state::irq0_line_hold), attotime::from_hz(8000)); config.set_maximum_quantum(attotime::from_hz(600)); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(256, 256); screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); screen.set_screen_update(FUNC(cabalbl_state::screen_update)); @@ -720,43 +954,43 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cabal); PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, "soundlatch"); GENERIC_LATCH_8(config, "soundlatch2"); GENERIC_LATCH_8(config, "soundlatch3"); - ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); /* verified on pcb */ + ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(3'579'545))); // verified on PCB ymsnd.irq_handler().set_inputline(m_audiocpu, 0); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.80); - MSM5205(config, m_msm[0], XTAL(12'000'000)/32); /* verified on pcb (no resonator) */ + MSM5205(config, m_msm[0], XTAL(12'000'000) / 32); // verified on PCB (no resonator) m_msm[0]->set_prescaler_selector(msm5205_device::SEX_4B); m_msm[0]->add_route(ALL_OUTPUTS, "mono", 0.60); - MSM5205(config, m_msm[1], XTAL(12'000'000)/32); /* verified on pcb (no resonator)*/ + MSM5205(config, m_msm[1], XTAL(12'000'000) / 32); // verified on PCB (no resonator) m_msm[1]->set_prescaler_selector(msm5205_device::SEX_4B); m_msm[1]->add_route(ALL_OUTPUTS, "mono", 0.60); } ROM_START( cabal ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "13.7h", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "11.6h", 0x00001, 0x10000, CRC(44736281) SHA1(1d6da95ef96d9c02aea70791e1cb87b70097d5ed) ) ROM_LOAD16_BYTE( "12.7j", 0x20000, 0x10000, CRC(d763a47c) SHA1(146d8082a404b6eddaf2dc9ba41a997949c17f8a) ) ROM_LOAD16_BYTE( "10.6j", 0x20001, 0x10000, CRC(96d5e8af) SHA1(ed7d854f08e87db5ae6cf526eafa029dfd2bfb9f) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "4-3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "3-3p", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) - /* The Joystick versions use a sub-board instead of the mask roms - the content is the same as the mask roms */ - ROM_REGION( 0x80000, "gfx2", 0 ) + /* The Joystick versions use a sub-board instead of the mask ROMs + the content is the same as the mask ROMs */ + ROM_REGION( 0x80000, "tiles", 0 ) ROM_LOAD16_BYTE( "bg_rom1.bin", 0x00000, 0x10000, CRC(1023319b) SHA1(38fcc8159776b82779b3163329b07c61be939fae) ) ROM_LOAD16_BYTE( "bg_rom2.bin", 0x00001, 0x10000, CRC(3b6d2b09) SHA1(4cdcd22836dce4ee6348c4e6df7c6360d12ef912) ) ROM_LOAD16_BYTE( "bg_rom3.bin", 0x20000, 0x10000, CRC(420b0801) SHA1(175be6e3ca3cb98672e4cdbc9b5f5b007bc531c9) ) @@ -766,7 +1000,7 @@ ROM_LOAD16_BYTE( "bg_rom7.bin", 0x60000, 0x10000, CRC(d28d921e) SHA1(e133de5129a33ca9ff449948a959621bbfc58c11) ) ROM_LOAD16_BYTE( "bg_rom8.bin", 0x60001, 0x10000, CRC(67e4fe47) SHA1(15620fc5e985a249677da333b77331e40d2b24ab) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD16_BYTE( "sp_rom1.bin", 0x00000, 0x10000, CRC(34d3cac8) SHA1(a6a2304fb576267db2c72cfbf0a3f66740ebe60e) ) ROM_LOAD16_BYTE( "sp_rom2.bin", 0x00001, 0x10000, CRC(4e49c28e) SHA1(ea74443a9423b14611a1f97e44692badfedd0ead) ) ROM_LOAD16_BYTE( "sp_rom3.bin", 0x20000, 0x10000, CRC(7065e840) SHA1(baa8cd28be60c678d782ecfabde6cd5e36480415) ) @@ -776,19 +1010,19 @@ ROM_LOAD16_BYTE( "sp_rom7.bin", 0x60000, 0x10000, CRC(55c44764) SHA1(7fad1f2084664b5b4d1384c8081371b0c79c4f5e) ) ROM_LOAD16_BYTE( "sp_rom8.bin", 0x60001, 0x10000, CRC(702735c9) SHA1(e4ac799dc85ff5b7c8e578611605989c78f9e8b3) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "2-1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "1-1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END ROM_START( cabala ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "epr-a-9.7h", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "epr-a-7.6h", 0x00001, 0x10000, CRC(c89608db) SHA1(a56e77526227af5b693eea9ef74da0d9d57cc55c) ) ROM_LOAD16_BYTE( "epr-a-8.7k", 0x20000, 0x08000, CRC(fe84788a) SHA1(29c49ebbe62357c27befcdcc4c19841a8bf32b2d) ) @@ -796,26 +1030,26 @@ ROM_LOAD16_BYTE( "epr-a-6.6k", 0x20001, 0x08000, CRC(81eb1355) SHA1(bbf926d40164d78319e982da0e8fb8ec4d4f8b87) ) ROM_RELOAD(0x30001,0x08000) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "epr-a-4.3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "epr-a-3.3p", 0x8000, 0x4000, CRC(c0097c55) SHA1(874f813c1b466dab2d15a707e340b9bdb200246c) ) - ROM_REGION( 0x8000, "gfx1", 0 ) - ROM_LOAD( "epr-a-5.6s", 0x00000, 0x08000, CRC(189033fd) SHA1(814f0cbc5f72345c04922d6d7c986f99d57335fa) ) /* characters */ + ROM_REGION( 0x8000, "chars", 0 ) + ROM_LOAD( "epr-a-5.6s", 0x00000, 0x08000, CRC(189033fd) SHA1(814f0cbc5f72345c04922d6d7c986f99d57335fa) ) - ROM_REGION( 0x80000, "gfx2", 0 ) - ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) /* tiles */ + ROM_REGION( 0x80000, "tiles", 0 ) + ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) - ROM_REGION( 0x80000, "gfx3", 0 ) - ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) /* sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) + ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "epr-a-2.1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "epr-a-1.1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END @@ -823,54 +1057,54 @@ ROM_START( cabaluk ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "9-7h.bin", 0x00000, 0x10000, CRC(f66378e5) SHA1(b3802f24863f857506ae1aeddc4e5c2908810695) ) ROM_LOAD16_BYTE( "7-6h.bin", 0x00001, 0x10000, CRC(960991ac) SHA1(7e3ab0673585424206d791e8b0ed6af38e2ae8a9) ) ROM_LOAD16_BYTE( "8-7k.bin", 0x20000, 0x10000, CRC(82160ab0) SHA1(a486f30ec3068025b690da4c1ae7295e79e7cd74) ) ROM_LOAD16_BYTE( "6-6k.bin", 0x20001, 0x10000, CRC(7ef2ecc7) SHA1(43d621e2e7cfea8d906a968047817e23a3e4d047) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "4-3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "3-3p", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) - ROM_REGION( 0x80000, "gfx2", 0 ) - ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) /* tiles */ + ROM_REGION( 0x80000, "tiles", 0 ) + ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) - ROM_REGION( 0x80000, "gfx3", 0 ) - ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) /* sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) + ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "2-1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "1-1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END ROM_START( cabalukj ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "13.7h", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "14.6h", 0x00001, 0x10000, CRC(5b04b101) SHA1(fc58b3a3854dbbf65251486a009035060349a66c) ) ROM_LOAD16_BYTE( "12.7j", 0x20000, 0x10000, CRC(d763a47c) SHA1(146d8082a404b6eddaf2dc9ba41a997949c17f8a) ) ROM_LOAD16_BYTE( "10.6j", 0x20001, 0x10000, CRC(96d5e8af) SHA1(ed7d854f08e87db5ae6cf526eafa029dfd2bfb9f) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "4-3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "3-3p", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) - /* The Joystick versions use a sub-board instead of the mask roms - the content is the same as the mask roms */ - ROM_REGION( 0x80000, "gfx2", 0 ) + /* The Joystick versions use a sub-board instead of the mask ROMs + the content is the same as the mask ROMs */ + ROM_REGION( 0x80000, "tiles", 0 ) ROM_LOAD16_BYTE( "bg_rom1.bin", 0x00000, 0x10000, CRC(1023319b) SHA1(38fcc8159776b82779b3163329b07c61be939fae) ) ROM_LOAD16_BYTE( "bg_rom2.bin", 0x00001, 0x10000, CRC(3b6d2b09) SHA1(4cdcd22836dce4ee6348c4e6df7c6360d12ef912) ) ROM_LOAD16_BYTE( "bg_rom3.bin", 0x20000, 0x10000, CRC(420b0801) SHA1(175be6e3ca3cb98672e4cdbc9b5f5b007bc531c9) ) @@ -880,7 +1114,7 @@ ROM_LOAD16_BYTE( "bg_rom7.bin", 0x60000, 0x10000, CRC(d28d921e) SHA1(e133de5129a33ca9ff449948a959621bbfc58c11) ) ROM_LOAD16_BYTE( "bg_rom8.bin", 0x60001, 0x10000, CRC(67e4fe47) SHA1(15620fc5e985a249677da333b77331e40d2b24ab) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD16_BYTE( "sp_rom1.bin", 0x00000, 0x10000, CRC(34d3cac8) SHA1(a6a2304fb576267db2c72cfbf0a3f66740ebe60e) ) ROM_LOAD16_BYTE( "sp_rom2.bin", 0x00001, 0x10000, CRC(4e49c28e) SHA1(ea74443a9423b14611a1f97e44692badfedd0ead) ) ROM_LOAD16_BYTE( "sp_rom3.bin", 0x20000, 0x10000, CRC(7065e840) SHA1(baa8cd28be60c678d782ecfabde6cd5e36480415) ) @@ -890,75 +1124,75 @@ ROM_LOAD16_BYTE( "sp_rom7.bin", 0x60000, 0x10000, CRC(55c44764) SHA1(7fad1f2084664b5b4d1384c8081371b0c79c4f5e) ) ROM_LOAD16_BYTE( "sp_rom8.bin", 0x60001, 0x10000, CRC(702735c9) SHA1(e4ac799dc85ff5b7c8e578611605989c78f9e8b3) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "2-1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "1-1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END ROM_START( cabalus ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "h7_512.bin", 0x00000, 0x10000, CRC(8fe16fb4) SHA1(fedb2d0c6c21516f68cfa99093772fe8fa862389) ) ROM_LOAD16_BYTE( "h6_512.bin", 0x00001, 0x10000, CRC(6968101c) SHA1(d65005ac235dae5c32bbcd182cb365e8fa067fe7) ) ROM_LOAD16_BYTE( "k7_512.bin", 0x20000, 0x10000, CRC(562031a2) SHA1(ed5ef50a66c7797a7f345e479162cf83d6777f7c) ) ROM_LOAD16_BYTE( "k6_512.bin", 0x20001, 0x10000, CRC(4fda2856) SHA1(a213cb7443cdccbad3f2610e8d42b2e149cbedb9) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "4-3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "3-3p", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "t6_128.bin", 0x00000, 0x04000, CRC(1ccee214) SHA1(7c842bc1c6002ec90693160fd5407345092420bb) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "t6_128.bin", 0x00000, 0x04000, CRC(1ccee214) SHA1(7c842bc1c6002ec90693160fd5407345092420bb) ) - ROM_REGION( 0x80000, "gfx2", 0 ) - ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) /* tiles */ + ROM_REGION( 0x80000, "tiles", 0 ) + ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) - ROM_REGION( 0x80000, "gfx3", 0 ) - ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) /* sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) + ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples? */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "2-1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "1-1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END ROM_START( cabalus2 ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "9-7h", 0x00000, 0x10000, CRC(ebbb9484) SHA1(2c77d5b4acdc37720dc7ccab526862981bf8da51) ) ROM_LOAD16_BYTE( "7-6h", 0x00001, 0x10000, CRC(51aeb49e) SHA1(df38dc58d8c6fa3d35904bf34e29111e7bd523ad) ) ROM_LOAD16_BYTE( "8-7k", 0x20000, 0x10000, CRC(4c24ed9a) SHA1(f0fc25c3e7dc8ac71fdad3e91ab618cd7a037123) ) ROM_LOAD16_BYTE( "6-6k", 0x20001, 0x10000, CRC(681620e8) SHA1(c9eacfb55059986dbecc2fae1339069a852f917b) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "4-3n", 0x0000, 0x2000, CRC(4038eff2) SHA1(0bcafc1b78c3bef9a0e9b822c482ea4a942fd180) ) ROM_LOAD( "3-3p", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "5-6s", 0x00000, 0x04000, CRC(6a76955a) SHA1(733cb4b862b5dac97c2641b58f2362471e62fcf2) ) - ROM_REGION( 0x80000, "gfx2", 0 ) - ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) /* tiles */ + ROM_REGION( 0x80000, "tiles", 0 ) + ROM_LOAD( "tad-2.7s", 0x00000, 0x80000, CRC(13ca7ae1) SHA1(b26bb4876a6518e3809e0fa4d442616508b3e7e8) ) - ROM_REGION( 0x80000, "gfx3", 0 ) - ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) /* sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) + ROM_LOAD( "tad-1.5e", 0x00000, 0x80000, CRC(8324a7fe) SHA1(aed4470df35ec18e65e35bddc9c217a5019fdcbf) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "2-1s", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "1-1u", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) - ROM_REGION( 0x0200, "proms", 0 ) /* unknown */ + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "prom05.8e", 0x0000, 0x0100, CRC(a94b18c2) SHA1(e7db4c1efc9e313e36eef3f53ae5b2e573a38920) ) ROM_LOAD( "prom10.4j", 0x0100, 0x0100, CRC(261c93bc) SHA1(942470198143d584d3766f28587d1879abd912c1) ) ROM_END @@ -1000,21 +1234,21 @@ */ ROM_START( cabalbl ) - ROM_REGION( 0x50000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x50000, "maincpu", 0 ) ROM_LOAD16_BYTE( "cabal_24.bin", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "cabal_22.bin", 0x00001, 0x10000, CRC(78c4af27) SHA1(31049d1ec76d76284682de7a0592f63d97019240) ) ROM_LOAD16_BYTE( "cabal_23.bin", 0x20000, 0x10000, CRC(d763a47c) SHA1(146d8082a404b6eddaf2dc9ba41a997949c17f8a) ) ROM_LOAD16_BYTE( "cabal_21.bin", 0x20001, 0x10000, CRC(96d5e8af) SHA1(ed7d854f08e87db5ae6cf526eafa029dfd2bfb9f) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "cabal_11.bin", 0x0000, 0x10000, CRC(d308a543) SHA1(4f45db42512f83266001daee55d06f49e7908e35) ) - ROM_REGION( 0x8000, "gfx1", 0 ) - ROM_LOAD( "cabal_20.bin", 0x00000, 0x08000, CRC(189033fd) SHA1(814f0cbc5f72345c04922d6d7c986f99d57335fa) ) /* characters */ + ROM_REGION( 0x8000, "chars", 0 ) + ROM_LOAD( "cabal_20.bin", 0x00000, 0x08000, CRC(189033fd) SHA1(814f0cbc5f72345c04922d6d7c986f99d57335fa) ) - /* The bootleg versions use a sub-board instead of the mask roms - the content is the same as the mask roms */ - ROM_REGION( 0x80000, "gfx2", 0 ) + /* The bootleg versions use a sub-board instead of the mask ROMs + the content is the same as the mask ROMs */ + ROM_REGION( 0x80000, "tiles", 0 ) ROM_LOAD16_BYTE( "cabal_15.bin", 0x00000, 0x10000, CRC(1023319b) SHA1(38fcc8159776b82779b3163329b07c61be939fae) ) ROM_LOAD16_BYTE( "cabal_17.bin", 0x00001, 0x10000, CRC(3b6d2b09) SHA1(4cdcd22836dce4ee6348c4e6df7c6360d12ef912) ) ROM_LOAD16_BYTE( "cabal_14.bin", 0x20000, 0x10000, CRC(420b0801) SHA1(175be6e3ca3cb98672e4cdbc9b5f5b007bc531c9) ) @@ -1024,7 +1258,7 @@ ROM_LOAD16_BYTE( "cabal_13.bin", 0x60000, 0x10000, CRC(d28d921e) SHA1(e133de5129a33ca9ff449948a959621bbfc58c11) ) ROM_LOAD16_BYTE( "cabal_19.bin", 0x60001, 0x10000, CRC(67e4fe47) SHA1(15620fc5e985a249677da333b77331e40d2b24ab) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD16_BYTE( "cabal_04.bin", 0x00000, 0x10000, CRC(34d3cac8) SHA1(a6a2304fb576267db2c72cfbf0a3f66740ebe60e) ) ROM_LOAD16_BYTE( "cabal_05.bin", 0x00001, 0x10000, CRC(4e49c28e) SHA1(ea74443a9423b14611a1f97e44692badfedd0ead) ) ROM_LOAD16_BYTE( "cabal_03.bin", 0x20000, 0x10000, CRC(7065e840) SHA1(baa8cd28be60c678d782ecfabde6cd5e36480415) ) @@ -1035,36 +1269,36 @@ ROM_LOAD16_BYTE( "cabal_08.bin", 0x60001, 0x10000, CRC(702735c9) SHA1(e4ac799dc85ff5b7c8e578611605989c78f9e8b3) ) ROM_REGION( 0x10000, "adpcm_1", 0 ) - ROM_LOAD( "cabal_09.bin", 0x00000, 0x10000, CRC(4ffa7fe3) SHA1(381d8e765a7b94678fb3308965c748bbe9f8e247) ) /* Z80 code/adpcm data */ + ROM_LOAD( "cabal_09.bin", 0x00000, 0x10000, CRC(4ffa7fe3) SHA1(381d8e765a7b94678fb3308965c748bbe9f8e247) ) // Z80 code/ADPCM data ROM_REGION( 0x10000, "adpcm_2", 0 ) - ROM_LOAD( "cabal_10.bin", 0x00000, 0x10000, CRC(958789b6) SHA1(344c3ee8a1e272b56499e5c0415bb714aec0ddcf) ) /* Z80 code/adpcm data */ + ROM_LOAD( "cabal_10.bin", 0x00000, 0x10000, CRC(958789b6) SHA1(344c3ee8a1e272b56499e5c0415bb714aec0ddcf) ) // Z80 code/ADPCM data ROM_END // alternate bootleg -// this is much closer to the original, the only real difference is the soundcpu has been pre-decrypted, -// with the encrypted/decrypted data split across the rom +// this is much closer to the original, the only real difference is the sound CPU has been pre-decrypted, +// with the encrypted/decrypted data split across the ROM // based on stickers present on the board it appears to have been manufactured by 'TAB-Austria' and is marked 'CA02' ROM_START( cabalbl2 ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for cpu code */ + ROM_REGION( 0x40000, "maincpu", 0 ) ROM_LOAD16_BYTE( "c9.bin", 0x00000, 0x10000, CRC(00abbe0c) SHA1(bacf17444abfb4f56248ff56e37b0aa2b1a3800d) ) ROM_LOAD16_BYTE( "c7.bin", 0x00001, 0x10000, CRC(44736281) SHA1(1d6da95ef96d9c02aea70791e1cb87b70097d5ed) ) ROM_LOAD16_BYTE( "c8.bin", 0x20000, 0x10000, CRC(d763a47c) SHA1(146d8082a404b6eddaf2dc9ba41a997949c17f8a) ) ROM_LOAD16_BYTE( "c6.bin", 0x20001, 0x10000, CRC(96d5e8af) SHA1(ed7d854f08e87db5ae6cf526eafa029dfd2bfb9f) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for sound cpu code */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "c4.bin", 0x2000, 0x2000, CRC(82f9f296) SHA1(2769ffdc28f003684e77d4806be07b87d50be31c) ) ROM_CONTINUE(0x0000,0x2000) ROM_IGNORE(0x4000) ROM_LOAD( "c3.bin", 0x8000, 0x8000, CRC(d9defcbf) SHA1(f26b10b1dbe5aa6446f70fd18e5f1379455578ec) ) - ROM_REGION( 0x4000, "gfx1", 0 ) - ROM_LOAD( "c5.bin", 0x00000, 0x04000, CRC(183e4834) SHA1(05ab0c388be8701930a9de437978206cda6fed68) ) /* characters */ + ROM_REGION( 0x4000, "chars", 0 ) + ROM_LOAD( "c5.bin", 0x00000, 0x04000, CRC(183e4834) SHA1(05ab0c388be8701930a9de437978206cda6fed68) ) ROM_CONTINUE(0x0000,0x4000) - ROM_REGION( 0x80000, "gfx2", 0 ) + ROM_REGION( 0x80000, "tiles", 0 ) ROM_LOAD16_BYTE( "c14.bin", 0x00000, 0x10000, CRC(1023319b) SHA1(38fcc8159776b82779b3163329b07c61be939fae) ) ROM_LOAD16_BYTE( "c10.bin", 0x00001, 0x10000, CRC(3b6d2b09) SHA1(4cdcd22836dce4ee6348c4e6df7c6360d12ef912) ) ROM_LOAD16_BYTE( "c15.bin", 0x20000, 0x10000, CRC(420b0801) SHA1(175be6e3ca3cb98672e4cdbc9b5f5b007bc531c9) ) @@ -1074,7 +1308,7 @@ ROM_LOAD16_BYTE( "c17.bin", 0x60000, 0x10000, CRC(d28d921e) SHA1(e133de5129a33ca9ff449948a959621bbfc58c11) ) ROM_LOAD16_BYTE( "c13.bin", 0x60001, 0x10000, CRC(67e4fe47) SHA1(15620fc5e985a249677da333b77331e40d2b24ab) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD16_BYTE( "c18.bin", 0x00000, 0x10000, CRC(34d3cac8) SHA1(a6a2304fb576267db2c72cfbf0a3f66740ebe60e) ) ROM_LOAD16_BYTE( "c22.bin", 0x00001, 0x10000, CRC(4e49c28e) SHA1(ea74443a9423b14611a1f97e44692badfedd0ead) ) ROM_LOAD16_BYTE( "c19.bin", 0x20000, 0x10000, CRC(7065e840) SHA1(baa8cd28be60c678d782ecfabde6cd5e36480415) ) @@ -1084,10 +1318,10 @@ ROM_LOAD16_BYTE( "c21.bin", 0x60000, 0x10000, CRC(55c44764) SHA1(7fad1f2084664b5b4d1384c8081371b0c79c4f5e) ) ROM_LOAD16_BYTE( "c25.bin", 0x60001, 0x10000, CRC(702735c9) SHA1(e4ac799dc85ff5b7c8e578611605989c78f9e8b3) ) - ROM_REGION( 0x10000, "adpcm1", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm1", 0 ) ROM_LOAD( "c2.bin", 0x00000, 0x10000, CRC(850406b4) SHA1(23ac1650c6d6f35607a5264b3aa89868401a645a) ) - ROM_REGION( 0x10000, "adpcm2", 0 ) /* Samples */ + ROM_REGION( 0x10000, "adpcm2", 0 ) ROM_LOAD( "c1.bin", 0x00000, 0x10000, CRC(8b3e0789) SHA1(b1450db1b1bada237c90930623e4def321099f13) ) ROM_END @@ -1098,13 +1332,15 @@ m_adpcm[1]->decrypt(); } +} // anonymous namespace + -GAME( 1988, cabal, 0, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation", "Cabal (World, Joystick)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, cabala, cabal, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation (Alpha Trading license)", "Cabal (Korea?, Joystick)", MACHINE_SUPPORTS_SAVE ) // Korea? -GAME( 1989, cabalukj, cabal, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation (Electrocoin license)", "Cabal (UK, Joystick)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, cabal, 0, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation", "Cabal (World, Joystick)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, cabala, cabal, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation (Alpha Trading license)", "Cabal (Korea?, Joystick)", MACHINE_SUPPORTS_SAVE ) // Korea? +GAME( 1989, cabalukj, cabal, cabal, cabalj, cabal_state, init_cabal, ROT0, "TAD Corporation (Electrocoin license)", "Cabal (UK, Joystick)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, cabalbl, cabal, cabalbl, cabalbl, cabalbl_state, empty_init, ROT0, "bootleg (Red Corporation)", "Cabal (bootleg of Joystick version, set 1, alternate sound hardware)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, cabalbl2, cabal, cabalbl2, cabalj, cabal_state, init_cabal, ROT0, "bootleg", "Cabal (bootleg of Joystick version, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, cabalbl2, cabal, cabalbl2, cabalj, cabal_state, init_cabal, ROT0, "bootleg", "Cabal (bootleg of Joystick version, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, cabalus, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 1, Trackball)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, cabalus2, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 2, Trackball)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, cabaluk, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Electrocoin license)", "Cabal (UK, Trackball)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, cabalus, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 1, Trackball)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, cabalus2, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Fabtek license)", "Cabal (US set 2, Trackball)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, cabaluk, cabal, cabalt, cabalt, cabal_state, init_cabal, ROT0, "TAD Corporation (Electrocoin license)", "Cabal (UK, Trackball)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/cabal.h mame-0.264+dfsg.1/src/mame/seibu/cabal.h --- mame-0.263+dfsg.1/src/mame/seibu/cabal.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/cabal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano -#ifndef MAME_SEIBU_CABAL_H -#define MAME_SEIBU_CABAL_H - -#pragma once - -#include "seibusound.h" - -#include "sound/msm5205.h" - -#include "emupal.h" -#include "tilemap.h" - -class cabal_base_state : public driver_device -{ -public: - cabal_base_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_msm(*this, "msm%u", 1U), - m_spriteram(*this, "spriteram"), - m_colorram(*this, "colorram"), - m_videoram(*this, "videoram") - { } - -protected: - virtual void video_start() override; - - required_device m_maincpu; - required_device m_audiocpu; - required_device m_gfxdecode; - required_device m_palette; - required_device_array m_msm; - - void flipscreen_w(uint8_t data); - void background_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void text_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - -private: - required_shared_ptr m_spriteram; - required_shared_ptr m_colorram; - required_shared_ptr m_videoram; - - tilemap_t *m_background_layer = nullptr; - tilemap_t *m_text_layer = nullptr; - - TILE_GET_INFO_MEMBER(get_back_tile_info); - TILE_GET_INFO_MEMBER(get_text_tile_info); - - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); -}; - -class cabal_state : public cabal_base_state -{ -public: - cabal_state(const machine_config &mconfig, device_type type, const char *tag) : - cabal_base_state(mconfig, type, tag), - m_seibu_sound(*this, "seibu_sound"), - m_adpcm(*this, "adpcm%u", 1U) - { } - - void cabal(machine_config &config); - void cabalbl2(machine_config &config); - void cabalt(machine_config &config); - - void init_cabal(); - -private: - required_device m_seibu_sound; - required_device_array m_adpcm; - - void sound_irq_trigger_word_w(offs_t, u16 data, u16 mem_mask); - - void main_map(address_map &map); - void sound_decrypted_opcodes_map(address_map &map); - void sound_map(address_map &map); - void trackball_main_map(address_map &map); - void cabalbl2_predecrypted_opcodes_map(address_map &map); - void cabalbl2_sound_map(address_map &map); -}; - -class cabalbl_state : public cabal_base_state -{ -public: - cabalbl_state(const machine_config &mconfig, device_type type, const char *tag) : - cabal_base_state(mconfig, type, tag) - { } - - void cabalbl(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - int m_sound_command[2]{}; - - void sndcmd_w(offs_t offset, uint16_t data); - void sound_irq_trigger_word_w(uint16_t data); - template uint8_t snd_r(); - void coin_w(uint8_t data); - template void adpcm_w(uint8_t data); - - void main_map(address_map &map); - void sound_map(address_map &map); - void talk1_map(address_map &map); - void talk1_portmap(address_map &map); - void talk2_map(address_map &map); - void talk2_portmap(address_map &map); -}; - -#endif // MAME_SEIBU_CABAL_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/cabal_v.cpp mame-0.264+dfsg.1/src/mame/seibu/cabal_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/cabal_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/cabal_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,139 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Carlos A. Lozano -/*************************************************************************** - - cabal.cpp - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" -#include "cabal.h" - -TILE_GET_INFO_MEMBER(cabal_base_state::get_back_tile_info) -{ - int tile = m_videoram[tile_index]; - int color = (tile>>12)&0xf; - - tile &= 0xfff; - - tileinfo.set(1, - tile, - color, - 0); -} - -TILE_GET_INFO_MEMBER(cabal_base_state::get_text_tile_info) -{ - int tile = m_colorram[tile_index]; - int color = (tile>>10); - - tile &= 0x3ff; - - tileinfo.set(0, - tile, - color, - 0); -} - - -void cabal_base_state::video_start() -{ - m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(cabal_base_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 16, 16); - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(cabal_base_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_text_layer->set_transparent_pen(3); - m_background_layer->set_transparent_pen(15); -} - - -/**************************************************************************/ - -void cabal_base_state::flipscreen_w(uint8_t data) -{ - int flip = (data & 0x20) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - m_background_layer->set_flip(flip); - m_text_layer->set_flip(flip); - - flip_screen_set(data & 0x20); -} - -void cabal_base_state::background_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_videoram[offset]); - m_background_layer->mark_tile_dirty(offset); -} - -void cabal_base_state::text_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_colorram[offset]); - m_text_layer->mark_tile_dirty(offset); -} - - -/******************************************************************** - - Cabal Spriteram - --------------- - - +0 .......x ........ Sprite enable bit - +0 ........ xxxxxxxx Sprite Y coordinate - +1 ..??.... ........ ??? unknown ??? - +1 ....xxxx xxxxxxxx Sprite tile number - +2 .xxxx... ........ Sprite color bank - +2 .....x.. ........ Sprite flip x - +2 .......x xxxxxxxx Sprite X coordinate - +3 (unused) - - -------E YYYYYYYY - ----BBTT TTTTTTTT - -CCCCF-X XXXXXXXX - -------- -------- - -********************************************************************/ - -void cabal_base_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - for( int offs = m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4 ) - { - int data0 = m_spriteram[offs]; - int data1 = m_spriteram[offs+1]; - int data2 = m_spriteram[offs+2]; - - if( data0 & 0x100 ) - { - int tile_number = data1 & 0xfff; - int color = ( data2 & 0x7800 ) >> 11; - int sy = ( data0 & 0xff ); - int sx = ( data2 & 0x1ff ); - int flipx = ( data2 & 0x0400 ); - int flipy = 0; - - if ( sx>256 ) sx -= 512; - - if (flip_screen()) - { - sx = 240 - sx; - sy = 240 - sy; - flipx = !flipx; - flipy = !flipy; - } - - m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, - tile_number, - color, - flipx,flipy, - sx,sy,0xf ); - } - } -} - - -uint32_t cabal_base_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - draw_sprites(bitmap,cliprect); - m_text_layer->draw(screen, bitmap, cliprect, 0,0); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/darkmist.cpp mame-0.264+dfsg.1/src/mame/seibu/darkmist.cpp --- mame-0.263+dfsg.1/src/mame/seibu/darkmist.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/darkmist.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:David Haywood, Nicola Salmoria, Tomasz Slanina +// copyright-holders: David Haywood, Nicola Salmoria, Tomasz Slanina + /* *********************************************************************************** Dark Mist (c)1986 Taito / Seibu @@ -11,7 +12,7 @@ Tomasz Slanina Main CPU : z80 (with encryption, external to z80) -Sound CPU: custom T5182 cpu (like seibu sound system but with internal code) +Sound CPU: custom T5182 CPU (like Seibu sound system but with internal code) The SEI8608B sound board, which features the T5182 "CPU CUSTOM" and YM2151, also has unpopulated locations for a 76489AN, 2x MSM5205, 2x 27512 EPROM (presumably @@ -21,58 +22,324 @@ $e2b7 - player 1 energy TODO: - - when player soaks in water, color pen used is wrong (entry 1 at 0xf500 should be 0x0c and instead is 0x14), might be btanb? + - when player soaks in water, color pen used is wrong (entry 1 at 0xf500 should be 0x0c and instead is 0x14), might be BTANB? - cocktail mode - unknown bit in sprite attr (there's code used for OR-ing sprite attrib with some - value (taken from ram) when one of coords is greater than 256-16 ) + value (taken from RAM) when one of coords is greater than 256-16 ) *********************************************************************************** */ #include "emu.h" -#include "darkmist.h" + +#include "t5182.h" + #include "cpu/z80/z80.h" +#include "machine/timer.h" + +#include "emupal.h" +#include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class darkmist_state : public driver_device +{ +public: + darkmist_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_t5182(*this, "t5182"), + m_screen(*this, "screen"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_spritebank(*this, "spritebank"), + m_scroll(*this, "scroll"), + m_videoram(*this, "videoram"), + m_spriteram(*this, "spriteram"), + m_bg_clut(*this, "bg_clut"), + m_fg_clut(*this, "fg_clut"), + m_spr_clut(*this, "spr_clut"), + m_tx_clut(*this, "tx_clut"), + m_decrypted_opcodes(*this, "decrypted_opcodes"), + m_rombank(*this, "rombank") + { } + + void darkmist(machine_config &config); + + void init_darkmist(); + +protected: + virtual void machine_start() override; + virtual void video_start() override; + +private: + required_device m_maincpu; + required_device m_t5182; + required_device m_screen; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_spritebank; + required_shared_ptr m_scroll; + required_shared_ptr m_videoram; + required_shared_ptr m_spriteram; + required_region_ptr m_bg_clut; + required_region_ptr m_fg_clut; + required_region_ptr m_spr_clut; + required_region_ptr m_tx_clut; + required_shared_ptr m_decrypted_opcodes; + required_memory_bank m_rombank; + + uint8_t m_hw = 0; + tilemap_t *m_bgtilemap = nullptr; + tilemap_t *m_fgtilemap = nullptr; + tilemap_t *m_txtilemap = nullptr; + + void hw_w(uint8_t data); + void tx_vram_w(offs_t offset, uint8_t data); + + TILE_GET_INFO_MEMBER(get_bgtile_info); + TILE_GET_INFO_MEMBER(get_fgtile_info); + TILE_GET_INFO_MEMBER(get_txttile_info); + + void palette(palette_device &palette) const; + + bitmap_ind16 m_temp_bitmap; + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *clut); + void decrypt_fgbgtiles(uint8_t *rgn, int size); + void decrypt_gfx(); + void decrypt_snd(); + + TIMER_DEVICE_CALLBACK_MEMBER(scanline); + void decrypted_opcodes_map(address_map &map); + void memmap(address_map &map); +}; + + +TILE_GET_INFO_MEMBER(darkmist_state::get_bgtile_info) +{ + int code = memregion("bg_map")->base()[tile_index * 2]; // TTTTTTTT + int const attr = memregion("bg_map")->base()[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx) + + code += (attr & 3) << 8; + int const pal = (attr >> 4) & 0xf; + + tileinfo.set(1, code, pal, 0); +} + +TILE_GET_INFO_MEMBER(darkmist_state::get_fgtile_info) +{ + int code = memregion("fg_map")->base()[tile_index * 2]; // TTTTTTTT + int const attr = memregion("fg_map")->base()[(tile_index * 2) + 1]; // -PPP--TT - FIXED BITS (0xxx00xx) + + code += (attr & 3) << 8; + int const pal = (attr >> 4) & 0xf; + + tileinfo.set(2, code, pal, 0); +} + +TILE_GET_INFO_MEMBER(darkmist_state::get_txttile_info) +{ + int code = m_videoram[tile_index]; + int const attr = m_videoram[tile_index + 0x400]; + int const pal = (attr >> 1); + + code += (attr & 1) << 8; + + tileinfo.set(0, code, pal & 0xf, 0); +} + +void darkmist_state::palette(palette_device &palette) const +{ + //palette.set_indirect_color(0x100, rgb_t::black()); + + std::pair const planes[4]{ + { &m_bg_clut[0], 0x80 }, + { &m_fg_clut[0], 0x00 }, + { &m_spr_clut[0], 0x40 }, + { &m_tx_clut[0], 0xc0 } }; + + for (unsigned plane = 0; std::size(planes) > plane; ++plane) + { + for (unsigned i = 0; 0x100 > i; ++i) + { + uint8_t const clut = planes[plane].first[i]; +// if (clut & 0x40) // 0x40 indicates transparent pen +// ctabentry = 0x100; +// else + int const ctabentry = (clut & 0x3f) | planes[plane].second; + palette.set_pen_indirect((plane << 8) | i, ctabentry); + } + } +} + + +void darkmist_state::video_start() +{ + m_bgtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_bgtile_info)), TILEMAP_SCAN_ROWS, 16, 16, 512, 64); + m_fgtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_fgtile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 256); + m_txtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_txttile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); +// m_fgtilemap->set_transparent_pen(0); +// m_txtilemap->set_transparent_pen(0); + + save_item(NAME(m_hw)); + m_screen->register_screen_bitmap(m_temp_bitmap); +} + +// TODO: move this code into framework or substitute with a valid alternative +void darkmist_state::mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *clut) +{ + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + { + uint16_t *const dest = &bitmap.pix(y); + uint16_t const *const src = &m_temp_bitmap.pix(y); + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + uint16_t const pix = (src[x] & 0xff); + uint16_t const real = clut[pix]; + + if (!(real & 0x40)) + dest[x] = src[x]; + } + } +} + +/* + Sprites + + 76543210 +0 - TTTT TTTT - tile +1 - xyBP PPP? - palette (P), flips (x,y), B - use spritebank, + ? - unknown, according to gamecode top bit of one of coords(y/x) +2 - YYYY YYYY - y coord +3 - XXXX XXXX - x coord + +*/ +void darkmist_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // fetch from top to bottom + for (int i = m_spriteram.bytes() - 32; i >= 0; i -= 32) + { + int const fy = m_spriteram[i + 1] & 0x40; + int const fx = m_spriteram[i + 1] & 0x80; + + int tile = m_spriteram[i + 0]; + + if (m_spriteram[i + 1] & 0x20) + tile += (*m_spritebank << 8); + + int palette = ((m_spriteram[i + 1]) >> 1) & 0xf; + + if (m_spriteram[i + 1] & 0x1) + palette = machine().rand() & 15; + + m_gfxdecode->gfx(3)->transpen( + bitmap, cliprect, + tile, + palette, + fx, fy, + m_spriteram[i + 3], m_spriteram[i + 2], 0); + } +} + +uint32_t darkmist_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // vis. flags + + constexpr int DISPLAY_SPR = 1; + constexpr int DISPLAY_FG = 2; // 2 or 8 + constexpr int DISPLAY_BG = 4; + constexpr int DISPLAY_TXT = 16; + +#define DM_GETSCROLL(n) (((m_scroll[(n)] << 1) & 0xff) + ((m_scroll[(n)] & 0x80) ? 1 : 0) +( ((m_scroll[(n) - 1] << 4) | (m_scroll[(n) - 1] << 12)) & 0xff00)) + + m_bgtilemap->set_scrollx(0, DM_GETSCROLL(0x2)); + m_bgtilemap->set_scrolly(0, DM_GETSCROLL(0x6)); + m_fgtilemap->set_scrollx(0, DM_GETSCROLL(0xa)); + m_fgtilemap->set_scrolly(0, DM_GETSCROLL(0xe)); + + m_temp_bitmap.fill(0, cliprect); + bitmap.fill(m_palette->black_pen(), cliprect); + + if (m_hw & DISPLAY_BG) + { + m_bgtilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0); + mix_layer(screen, bitmap, cliprect, m_bg_clut); + } + + if (m_hw & DISPLAY_FG) + { + m_fgtilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0); + mix_layer(screen, bitmap, cliprect, m_fg_clut); + } + + if (m_hw & DISPLAY_SPR) + { + draw_sprites(m_temp_bitmap, cliprect); + mix_layer(screen, bitmap, cliprect, m_spr_clut); + } + + if (m_hw & DISPLAY_TXT) + { + m_txtilemap->draw(screen, m_temp_bitmap, cliprect, 0, 0); + mix_layer(screen, bitmap, cliprect, m_tx_clut); + } + + return 0; +} + +void darkmist_state::tx_vram_w(offs_t offset, uint8_t data) +{ + m_videoram[offset] = data; + m_txtilemap->mark_tile_dirty(offset & 0x3ff); +} + void darkmist_state::machine_start() { - membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); + m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); } void darkmist_state::hw_w(uint8_t data) { - m_hw=data; - membank("bank1")->set_entry((data&0x80)?1:0); + m_hw = data; + + m_rombank->set_entry(BIT(data, 7)); } void darkmist_state::memmap(address_map &map) { map(0x0000, 0x7fff).rom(); - map(0x8000, 0xbfff).bankr("bank1"); + map(0x8000, 0xbfff).bankr(m_rombank); map(0xc801, 0xc801).portr("P1"); map(0xc802, 0xc802).portr("P2"); map(0xc803, 0xc803).portr("START"); map(0xc804, 0xc804).w(FUNC(darkmist_state::hw_w)); - map(0xc805, 0xc805).writeonly().share("spritebank"); + map(0xc805, 0xc805).writeonly().share(m_spritebank); map(0xc806, 0xc806).portr("DSW1"); map(0xc807, 0xc807).portr("DSW2"); map(0xc808, 0xc808).portr("UNK"); map(0xd000, 0xd0ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette"); map(0xd200, 0xd2ff).ram().w(m_palette, FUNC(palette_device::write_indirect_ext)).share("palette_ext"); - map(0xd400, 0xd41f).ram().share("scroll"); + map(0xd400, 0xd41f).ram().share(m_scroll); map(0xd600, 0xd67f).rw(m_t5182, FUNC(t5182_device::sharedram_r), FUNC(t5182_device::sharedram_w)); map(0xd680, 0xd680).w(m_t5182, FUNC(t5182_device::sound_irq_w)); map(0xd681, 0xd681).r(m_t5182, FUNC(t5182_device::sharedram_semaphore_snd_r)); map(0xd682, 0xd682).w(m_t5182, FUNC(t5182_device::sharedram_semaphore_main_acquire_w)); map(0xd683, 0xd683).w(m_t5182, FUNC(t5182_device::sharedram_semaphore_main_release_w)); - map(0xd800, 0xdfff).ram().w(FUNC(darkmist_state::tx_vram_w)).share("videoram"); + map(0xd800, 0xdfff).ram().w(FUNC(darkmist_state::tx_vram_w)).share(m_videoram); map(0xe000, 0xefff).ram().share("workram"); - map(0xf000, 0xffff).ram().share("spriteram"); + map(0xf000, 0xffff).ram().share(m_spriteram); } void darkmist_state::decrypted_opcodes_map(address_map &map) { - map(0x0000, 0x7fff).rom().share("decrypted_opcodes"); - map(0x8000, 0xbfff).bankr("bank1"); + map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes); + map(0x8000, 0xbfff).bankr(m_rombank); } static INPUT_PORTS_START( darkmist ) @@ -132,7 +399,7 @@ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) PORT_SERVICE_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW1:6" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") /* Listed as "ALWAYS ON" */ + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") // Listed as "ALWAYS ON" PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:8") @@ -228,28 +495,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(darkmist_state::scanline) { - int scanline = param; + int const scanline = param; - if(scanline == 240) // vblank-out irq - m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xd7); /* Z80 - RST 10h */ + if (scanline == 240) // vblank-out irq + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h - if(scanline == 0) // vblank-in irq - m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xcf); /* Z80 - RST 08h */ + if (scanline == 0) // vblank-in irq + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h } void darkmist_state::darkmist(machine_config &config) { - /* basic machine hardware */ - Z80(config, m_maincpu, 4000000); /* ? MHz */ + // basic machine hardware + Z80(config, m_maincpu, 4'000'000); // ? MHz m_maincpu->set_addrmap(AS_PROGRAM, &darkmist_state::memmap); m_maincpu->set_addrmap(AS_OPCODES, &darkmist_state::decrypted_opcodes_map); TIMER(config, "scantimer").configure_scanline(FUNC(darkmist_state::scanline), "screen", 0, 1); T5182(config, m_t5182, 0); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -259,14 +526,14 @@ m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_darkmist); - PALETTE(config, m_palette, FUNC(darkmist_state::darkmist_palette)); + PALETTE(config, m_palette, FUNC(darkmist_state::palette)); m_palette->set_format(palette_device::xRGB_444, 0x100*4); m_palette->set_indirect_entries(256+1); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - ym2151_device &ymsnd(YM2151(config, "ymsnd", 14318180/4)); /* 3.579545 MHz */ + ym2151_device &ymsnd(YM2151(config, "ymsnd", 14'318'180 / 4)); // 3.579545 MHz ymsnd.irq_handler().set(m_t5182, FUNC(t5182_device::ym2151_irq_handler)); ymsnd.add_route(0, "mono", 1.0); ymsnd.add_route(1, "mono", 1.0); @@ -278,7 +545,7 @@ ROM_LOAD( "dm_16.rom", 0x10000, 0x08000, CRC(094579d9) SHA1(2449bc9ba38396912ee9b72dd870ea9fcff95776) ) - ROM_REGION( 0x8000, "t5182_z80", 0 ) /* Toshiba T5182 external ROM */ + ROM_REGION( 0x8000, "t5182_z80", 0 ) // Toshiba T5182 external ROM ROM_LOAD( "dm_17.rom", 0x0000, 0x8000, CRC(7723dcae) SHA1(a0c69e7a7b6fd74f7ed6b9c6419aed94aabcd4b0) ) ROM_REGION( 0x4000, "tx_gfx", 0 ) @@ -299,13 +566,11 @@ ROM_LOAD( "dm_10.rom", 0x20000, 0x10000, CRC(34fd52b5) SHA1(c4ee464ed79ec91f993b0f894572c0288f0ad1d4) ) ROM_LOAD( "dm_12.rom", 0x30000, 0x08000, CRC(cc4b9839) SHA1(b7e95513d2e06929fed5005caf3bf8c3fba0b597) ) - ROM_REGION( 0x10000, "bg_map", 0 ) - /* BG layer map ( 512x64 )*/ + ROM_REGION( 0x10000, "bg_map", 0 ) // 512x64 ROM_LOAD16_BYTE( "dm_03.rom", 0x00000, 0x08000, CRC(60b40c2a) SHA1(c046273b15dab95ea4851c26ce941e580fa1b6ec) ) ROM_LOAD16_BYTE( "dm_04.rom", 0x00001, 0x08000, CRC(d47b8cd9) SHA1(86eb7a5d8ea63c0c91f455b1b8322cc7b9c4a968) ) - ROM_REGION( 0x08000, "fg_map", 0 ) - /* FG layer map ( 64x256 ) */ + ROM_REGION( 0x08000, "fg_map", 0 ) // 64x256 ROM_LOAD16_BYTE( "dm_07.rom", 0x00000, 0x04000, CRC(889b1277) SHA1(78405110b9cf1ab988c0cbfdb668498dadb41229) ) ROM_LOAD16_BYTE( "dm_08.rom", 0x00001, 0x04000, CRC(f76f6f46) SHA1(ce1c67dc8976106b24fee8d3a0b9e5deb016a327) ) @@ -318,8 +583,7 @@ ROM_REGION( 0x0100, "tx_clut", 0 ) ROM_LOAD( "63s281n.j15", 0x0000, 0x0100, CRC(2ea780a4) SHA1(0f8d6791114705e9982f9035f291d2a305b47f0a) ) - - ROM_REGION( 0x0200, "proms", 0 ) // unknown PROMs + ROM_REGION( 0x0200, "proms", 0 ) // unknown ROM_LOAD( "63s281n.l1", 0x0000, 0x0100, CRC(208d17ca) SHA1(a77d56337bcac8d9a7bc3411239dfb3045e069ec) ) ROM_LOAD( "82s129.d11", 0x0100, 0x0100, CRC(866eab0e) SHA1(398ffe2b82b6e2235746fd987d5f5995d7dc8687) ) ROM_END @@ -327,26 +591,24 @@ -void darkmist_state::decrypt_fgbgtiles(uint8_t* rom, int size) +void darkmist_state::decrypt_fgbgtiles(uint8_t *rom, int size) { std::vector buf(0x40000); - /* data lines */ - for (int i = 0;i < size/2;i++) + // data lines + for (int i = 0; i < size / 2; i++) { - int w1; - - w1 = (rom[i + 0*size/2] << 8) + rom[i + 1*size/2]; + int w1 = (rom[i + 0 * size / 2] << 8) + rom[i + 1 * size / 2]; - w1 = bitswap<16>(w1, 9,14,7,2, 6,8,3,15, 10,13,5,12, 0,11,4,1); + w1 = bitswap<16>(w1, 9, 14, 7, 2, 6, 8, 3, 15, 10, 13, 5, 12, 0, 11, 4, 1); - buf[i + 0*size/2] = w1 >> 8; - buf[i + 1*size/2] = w1 & 0xff; + buf[i + 0 * size / 2] = w1 >> 8; + buf[i + 1 * size / 2] = w1 & 0xff; } - /* address lines */ - for (int i = 0;i < size;i++) + // address lines + for (int i = 0; i < size; i++) { - rom[i] = buf[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13, 5,4,3,2, 12,11,10,9,8, 1,0, 7,6)]; + rom[i] = buf[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 5, 4, 3, 2, 12, 11, 10, 9, 8, 1, 0, 7, 6)]; } } @@ -355,30 +617,24 @@ void darkmist_state::decrypt_gfx() { std::vector buf(0x40000); - uint8_t *rom; - int size; - int i; + uint8_t *rom = memregion("tx_gfx")->base(); + int size = memregion("tx_gfx")->bytes(); - rom = memregion("tx_gfx")->base(); - size = memregion("tx_gfx")->bytes(); - - /* data lines */ - for (i = 0;i < size/2;i++) + // data lines + for (int i = 0; i < size / 2; i++) { - int w1; - - w1 = (rom[i + 0*size/2] << 8) + rom[i + 1*size/2]; + int w1 = (rom[i + 0 * size / 2] << 8) + rom[i + 1 * size / 2]; - w1 = bitswap<16>(w1, 9,14,7,2, 6,8,3,15, 10,13,5,12, 0,11,4,1); + w1 = bitswap<16>(w1, 9, 14, 7, 2, 6, 8, 3, 15, 10, 13, 5, 12, 0, 11, 4, 1); - buf[i + 0*size/2] = w1 >> 8; - buf[i + 1*size/2] = w1 & 0xff; + buf[i + 0 * size / 2] = w1 >> 8; + buf[i + 1 * size / 2] = w1 & 0xff; } - /* address lines */ - for (i = 0;i < size;i++) + // address lines + for (int i = 0; i < size; i++) { - rom[i] = buf[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12, 3,2,1, 11,10,9,8, 0, 7,6,5,4)]; + rom[i] = buf[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 3, 2, 1, 11, 10, 9, 8, 0, 7, 6, 5, 4)]; } decrypt_fgbgtiles(memregion("bg_gfx")->base(), memregion("bg_gfx")->bytes()); @@ -388,37 +644,35 @@ rom = memregion("spr_gfx")->base(); size = memregion("spr_gfx")->bytes(); - /* data lines */ - for (i = 0;i < size/2;i++) + // data lines + for (int i = 0; i < size / 2; i++) { - int w1; - - w1 = (rom[i + 0*size/2] << 8) + rom[i + 1*size/2]; + int w1 = (rom[i + 0 * size / 2] << 8) + rom[i + 1 * size / 2]; - w1 = bitswap<16>(w1, 9,14,7,2, 6,8,3,15, 10,13,5,12, 0,11,4,1); + w1 = bitswap<16>(w1, 9, 14, 7, 2, 6, 8, 3, 15, 10, 13, 5, 12, 0, 11, 4, 1); - buf[i + 0*size/2] = w1 >> 8; - buf[i + 1*size/2] = w1 & 0xff; + buf[i + 0 * size / 2] = w1 >> 8; + buf[i + 1 * size / 2] = w1 & 0xff; } - /* address lines */ - for (i = 0;i < size;i++) + // address lines + for (int i = 0; i < size; i++) { - rom[i] = buf[bitswap<24>(i, 23,22,21,20,19,18,17,16,15,14, 12,11,10,9,8, 5,4,3, 13, 7,6, 1,0, 2)]; + rom[i] = buf[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 12, 11, 10, 9, 8, 5, 4, 3, 13, 7, 6, 1, 0, 2)]; } } void darkmist_state::decrypt_snd() { - uint8_t *ROM = memregion("t5182_z80")->base(); + uint8_t *rom = memregion("t5182_z80")->base(); for (int i = 0x0000; i < 0x8000; i++) - ROM[i] = bitswap<8>(ROM[i], 7, 1, 2, 3, 4, 5, 6, 0); + rom[i] = bitswap<8>(rom[i], 7, 1, 2, 3, 4, 5, 6, 0); } void darkmist_state::init_darkmist() { - uint8_t *ROM = memregion("maincpu")->base(); + uint8_t *rom = memregion("maincpu")->base(); std::vector buffer(0x10000); decrypt_gfx(); @@ -427,49 +681,52 @@ for (int i = 0; i < 0x8000; i++) { - uint8_t p = ROM[i]; + uint8_t p = rom[i]; uint8_t d = p; - if(((i & 0x20) == 0x00) && ((i & 0x8) != 0)) + if (((i & 0x20) == 0x00) && ((i & 0x8) != 0)) p ^= 0x20; - if(((i & 0x20) == 0x00) && ((i & 0xa) != 0)) + if (((i & 0x20) == 0x00) && ((i & 0xa) != 0)) d ^= 0x20; - if(((i & 0x200) == 0x200) && ((i & 0x408) != 0)) + if (((i & 0x200) == 0x200) && ((i & 0x408) != 0)) p ^= 0x10; - if((i & 0x220) != 0x200) + if ((i & 0x220) != 0x200) { - p = bitswap<8>(p, 7,6,5,2,3,4,1,0); - d = bitswap<8>(d, 7,6,5,2,3,4,1,0); + p = bitswap<8>(p, 7, 6, 5, 2, 3, 4, 1, 0); + d = bitswap<8>(d, 7, 6, 5, 2, 3, 4, 1, 0); } - ROM[i] = d; + rom[i] = d; m_decrypted_opcodes[i] = p; } - membank("bank1")->set_base(&ROM[0x010000]); + m_rombank->set_base(&rom[0x10000]); - /* adr line swaps */ - ROM = memregion("bg_map")->base(); + // adr line swaps + rom = memregion("bg_map")->base(); int len = memregion("bg_map")->bytes(); - memcpy( &buffer[0], ROM, len ); + memcpy(&buffer[0], rom, len); for (int i = 0; i < len; i++) { - ROM[i]=buffer[bitswap<24>(i,23,22,21,20,19,18,17,16,7,6,5,4,3,15,14,13,12,9,8,2,1,11,10, 0)]; + rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 7, 6, 5, 4, 3, 15, 14, 13, 12, 9, 8, 2, 1, 11, 10, 0)]; } - ROM = memregion("fg_map")->base(); + rom = memregion("fg_map")->base(); len = memregion("fg_map")->bytes(); - memcpy( &buffer[0], ROM, len ); + memcpy(&buffer[0], rom, len); for (int i = 0; i < len; i++) { - ROM[i]=buffer[bitswap<24>(i,23,22,21,20,19,18,17,16,15 ,6,5,4,3,12,11,10,9,14,13,2,1,8,7 ,0 )]; + rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15 , 6, 5, 4, 3, 12, 11, 10, 9, 14, 13, 2, 1, 8, 7, 0)]; } } +} // anonymous namespace + + GAME( 1986, darkmist, 0, darkmist, darkmist, darkmist_state, init_darkmist, ROT270, "Seibu Kaihatsu (Taito license)", "The Lost Castle In Darkmist", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/darkmist.h mame-0.264+dfsg.1/src/mame/seibu/darkmist.h --- mame-0.263+dfsg.1/src/mame/seibu/darkmist.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/darkmist.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Nicola Salmoria, Tomasz Slanina -#ifndef MAME_SEIBU_DARKMIST_H -#define MAME_SEIBU_DARKMIST_H - -#pragma once - -#include "t5182.h" -#include "machine/timer.h" -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class darkmist_state : public driver_device -{ -public: - darkmist_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_t5182(*this, "t5182"), - m_screen(*this, "screen"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_spritebank(*this, "spritebank"), - m_scroll(*this, "scroll"), - m_videoram(*this, "videoram"), - m_workram(*this, "workram"), - m_spriteram(*this, "spriteram"), - m_bg_clut(*this, "bg_clut"), - m_fg_clut(*this, "fg_clut"), - m_spr_clut(*this, "spr_clut"), - m_tx_clut(*this, "tx_clut"), - m_decrypted_opcodes(*this, "decrypted_opcodes") - { } - - void darkmist(machine_config &config); - - void init_darkmist(); - -private: - required_device m_maincpu; - required_device m_t5182; - required_device m_screen; - required_device m_gfxdecode; - required_device m_palette; - - required_shared_ptr m_spritebank; - required_shared_ptr m_scroll; - required_shared_ptr m_videoram; - required_shared_ptr m_workram; - required_shared_ptr m_spriteram; - required_region_ptr m_bg_clut; - required_region_ptr m_fg_clut; - required_region_ptr m_spr_clut; - required_region_ptr m_tx_clut; - optional_shared_ptr m_decrypted_opcodes; - - int m_hw = 0; - tilemap_t *m_bgtilemap = nullptr; - tilemap_t *m_fgtilemap = nullptr; - tilemap_t *m_txtilemap = nullptr; - - void hw_w(uint8_t data); - void tx_vram_w(offs_t offset, uint8_t data); - - TILE_GET_INFO_MEMBER(get_bgtile_info); - TILE_GET_INFO_MEMBER(get_fgtile_info); - TILE_GET_INFO_MEMBER(get_txttile_info); - - virtual void machine_start() override; - virtual void video_start() override; - void darkmist_palette(palette_device &palette) const; - - bitmap_ind16 m_temp_bitmap; - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* clut); - void decrypt_fgbgtiles(uint8_t* rgn, int size); - void decrypt_gfx(); - void decrypt_snd(); - - TIMER_DEVICE_CALLBACK_MEMBER(scanline); - void decrypted_opcodes_map(address_map &map); - void memmap(address_map &map); -}; - -#endif // MAME_SEIBU_DARKMIST_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/darkmist_v.cpp mame-0.264+dfsg.1/src/mame/seibu/darkmist_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/darkmist_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/darkmist_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Nicola Salmoria, Tomasz Slanina -#include "emu.h" -#include "darkmist.h" - - - -/* vis. flags */ - -#define DISPLAY_SPR 1 -#define DISPLAY_FG 2 /* 2 or 8 */ -#define DISPLAY_BG 4 -#define DISPLAY_TXT 16 - - -TILE_GET_INFO_MEMBER(darkmist_state::get_bgtile_info) -{ - int code,attr,pal; - - code=memregion("bg_map")->base()[tile_index*2]; /* TTTTTTTT */ - attr=memregion("bg_map")->base()[(tile_index*2)+1]; /* -PPP--TT - FIXED BITS (0xxx00xx) */ - - code+=(attr&3)<<8; - pal=(attr>>4) & 0xf; - - tileinfo.set(1, - code, - pal, - 0); -} - -TILE_GET_INFO_MEMBER(darkmist_state::get_fgtile_info) -{ - int code,attr,pal; - - code = memregion("fg_map")->base()[tile_index*2]; /* TTTTTTTT */ - attr = memregion("fg_map")->base()[(tile_index*2)+1]; /* -PPP--TT - FIXED BITS (0xxx00xx) */ - - code+=(attr&3)<<8; - pal=(attr>>4) & 0xf; - - tileinfo.set(2, - code, - pal, - 0); -} - -TILE_GET_INFO_MEMBER(darkmist_state::get_txttile_info) -{ - int code,attr,pal; - - code=m_videoram[tile_index]; - attr=m_videoram[tile_index+0x400]; - pal=(attr>>1); - - code+=(attr&1)<<8; - - tileinfo.set(0, - code, - pal & 0xf, - 0); -} - -void darkmist_state::darkmist_palette(palette_device &palette) const -{ - //palette.set_indirect_color(0x100, rgb_t::black()); - - std::pair const planes[4]{ - { &m_bg_clut[0], 0x80 }, - { &m_fg_clut[0], 0x00 }, - { &m_spr_clut[0], 0x40 }, - { &m_tx_clut[0], 0xc0 } }; - - for (unsigned plane = 0; std::size(planes) > plane; ++plane) - { - for (unsigned i = 0; 0x100 > i; ++i) - { - uint8_t const clut = planes[plane].first[i]; -// if (clut & 0x40) // 0x40 indicates transparent pen -// ctabentry = 0x100; -// else - int const ctabentry = (clut & 0x3f) | planes[plane].second; - palette.set_pen_indirect((plane << 8) | i, ctabentry); - } - } -} - - -void darkmist_state::video_start() -{ - m_bgtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_bgtile_info)), TILEMAP_SCAN_ROWS, 16, 16, 512, 64); - m_fgtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_fgtile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 256); - m_txtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(darkmist_state::get_txttile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); -// m_fgtilemap->set_transparent_pen(0); -// m_txtilemap->set_transparent_pen(0); - - save_item(NAME(m_hw)); - m_screen->register_screen_bitmap(m_temp_bitmap); -} - -// TODO: move this code into framework or substitute with a valid alternative -void darkmist_state::mix_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t* clut) -{ - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) - { - uint16_t *const dest = &bitmap.pix(y); - uint16_t const *const src = &m_temp_bitmap.pix(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) - { - uint16_t const pix = (src[x] & 0xff); - uint16_t const real = clut[pix]; - - if (!(real & 0x40)) - dest[x] = src[x]; - } - } -} - -/* - Sprites - - 76543210 -0 - TTTT TTTT - tile -1 - xyBP PPP? - palette (P), flips (x,y), B - use spritebank, - ? - unknown, according to gamecode top bit of one of coords(y/x) -2 - YYYY YYYY - y coord -3 - XXXX XXXX - x coord - -*/ -void darkmist_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int i,fx,fy,tile,palette; - // fetch from top to bottom - for(i=m_spriteram.bytes()-32;i>=0;i-=32) - { - fy=m_spriteram[i+1]&0x40; - fx=m_spriteram[i+1]&0x80; - - tile=m_spriteram[i+0]; - - if(m_spriteram[i+1]&0x20) - tile += (*m_spritebank << 8); - - palette=((m_spriteram[i+1])>>1)&0xf; - - if(m_spriteram[i+1]&0x1) - palette=machine().rand()&15; - - m_gfxdecode->gfx(3)->transpen( - bitmap,cliprect, - tile, - palette, - fx,fy, - m_spriteram[i+3],m_spriteram[i+2],0 ); - } -} - -uint32_t darkmist_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ -#define DM_GETSCROLL(n) (((m_scroll[(n)]<<1)&0xff) + ((m_scroll[(n)]&0x80)?1:0) +( ((m_scroll[(n)-1]<<4) | (m_scroll[(n)-1]<<12) )&0xff00)) - - m_bgtilemap->set_scrollx(0, DM_GETSCROLL(0x2)); - m_bgtilemap->set_scrolly(0, DM_GETSCROLL(0x6)); - m_fgtilemap->set_scrollx(0, DM_GETSCROLL(0xa)); - m_fgtilemap->set_scrolly(0, DM_GETSCROLL(0xe)); - - m_temp_bitmap.fill(0,cliprect); - bitmap.fill(m_palette->black_pen(), cliprect); - - if(m_hw & DISPLAY_BG) - { - m_bgtilemap->draw(screen, m_temp_bitmap, cliprect, 0,0); - mix_layer(screen, bitmap, cliprect, m_bg_clut); - } - - if(m_hw & DISPLAY_FG) - { - m_fgtilemap->draw(screen, m_temp_bitmap, cliprect, 0,0); - mix_layer(screen, bitmap, cliprect, m_fg_clut); - } - - if(m_hw & DISPLAY_SPR) - { - draw_sprites(m_temp_bitmap,cliprect); - mix_layer(screen, bitmap, cliprect, m_spr_clut); - } - - if(m_hw & DISPLAY_TXT) - { - m_txtilemap->draw(screen, m_temp_bitmap, cliprect, 0,0); - mix_layer(screen, bitmap, cliprect, m_tx_clut); - } - - return 0; -} - -void darkmist_state::tx_vram_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - m_txtilemap->mark_tile_dirty(offset & 0x3ff); -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/dcon.cpp mame-0.264+dfsg.1/src/mame/seibu/dcon.cpp --- mame-0.263+dfsg.1/src/mame/seibu/dcon.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/dcon.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Bryan McPhail +// copyright-holders: Bryan McPhail + /*************************************************************************** D-Con (c) 1992 Success @@ -9,22 +10,274 @@ Emulation by Bryan McPhail, mish@tendril.co.uk - Coin inputs are handled by the sound CPU, so they don't work with sound - disabled. Use the service switch instead. - ***************************************************************************/ #include "emu.h" -#include "dcon.h" + +#include "sei021x_sei0220_spr.h" +#include "seibu_crtc.h" +#include "seibusound.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "sound/okim6295.h" -#include "sound/ymopm.h" #include "sound/ymopl.h" -#include "seibu_crtc.h" +#include "sound/ymopm.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class dcon_state : public driver_device, public seibu_sound_common +{ +public: + dcon_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_seibu_sound(*this, "seibu_sound"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_spritegen(*this, "spritegen"), + m_back_data(*this, "back_data"), + m_fore_data(*this, "fore_data"), + m_mid_data(*this, "mid_data"), + m_textram(*this, "textram"), + m_spriteram(*this, "spriteram") + { } + + void dcon(machine_config &config); + void sdgndmps(machine_config &config); + +protected: + virtual void video_start() override; + +private: + required_device m_maincpu; + required_device m_seibu_sound; + required_device m_gfxdecode; + required_device m_palette; + required_device m_spritegen; + + required_shared_ptr m_back_data; + required_shared_ptr m_fore_data; + required_shared_ptr m_mid_data; + required_shared_ptr m_textram; + required_shared_ptr m_spriteram; + + tilemap_t *m_background_layer = nullptr; + tilemap_t *m_foreground_layer = nullptr; + tilemap_t *m_midground_layer = nullptr; + tilemap_t *m_text_layer = nullptr; + + uint16_t m_gfx_bank_select = 0U; + uint16_t m_last_gfx_bank = 0U; + uint16_t m_scroll_ram[6]{}; + uint16_t m_layer_en = 0U; + + uint8_t sdgndmps_sound_comms_r(offs_t offset); + + void layer_en_w(uint16_t data); + void layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void gfxbank_w(uint16_t data); + void background_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void midground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + TILE_GET_INFO_MEMBER(get_back_tile_info); + TILE_GET_INFO_MEMBER(get_fore_tile_info); + TILE_GET_INFO_MEMBER(get_mid_tile_info); + TILE_GET_INFO_MEMBER(get_text_tile_info); + + uint32_t screen_update_dcon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update_sdgndmps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t pri_cb(uint8_t pri, uint8_t ext); + void dcon_map(address_map &map); + void sdgndmps_map(address_map &map); +}; + + +/******************************************************************************/ + +void dcon_state::gfxbank_w(uint16_t data) +{ + if (data & 1) + m_gfx_bank_select = 0x1000; + else + m_gfx_bank_select = 0; +} + +void dcon_state::background_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_back_data[offset]); + m_background_layer->mark_tile_dirty(offset); +} + +void dcon_state::foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_fore_data[offset]); + m_foreground_layer->mark_tile_dirty(offset); +} + +void dcon_state::midground_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_mid_data[offset]); + m_midground_layer->mark_tile_dirty(offset); +} + +void dcon_state::text_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_textram[offset]); + m_text_layer->mark_tile_dirty(offset); +} + +TILE_GET_INFO_MEMBER(dcon_state::get_back_tile_info) +{ + int tile = m_back_data[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(1, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(dcon_state::get_fore_tile_info) +{ + int tile = m_fore_data[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(2, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(dcon_state::get_mid_tile_info) +{ + int tile = m_mid_data[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(3, tile | m_gfx_bank_select, color, 0); +} + +TILE_GET_INFO_MEMBER(dcon_state::get_text_tile_info) +{ + int tile = m_textram[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(0, tile, color, 0); +} + +void dcon_state::video_start() +{ + m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_fore_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_midground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_mid_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + + m_midground_layer->set_transparent_pen(15); + m_foreground_layer->set_transparent_pen(15); + m_text_layer->set_transparent_pen(15); + + m_gfx_bank_select = 0; + + save_item(NAME(m_gfx_bank_select)); + save_item(NAME(m_last_gfx_bank)); + save_item(NAME(m_scroll_ram)); + save_item(NAME(m_layer_en)); +} + +uint32_t dcon_state::pri_cb(uint8_t pri, uint8_t ext) +{ + switch(pri) + { + case 0: return 0xf0; // above foreground layer + case 1: return 0xfc; // above midground layer + case 2: return 0xfe; // above background layer + case 3: + default: return 0; // above text layer + } +} + +uint32_t dcon_state::screen_update_dcon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + screen.priority().fill(0, cliprect); + + // Setup the tilemaps + m_background_layer->set_scrollx(0, m_scroll_ram[0]); + m_background_layer->set_scrolly(0, m_scroll_ram[1]); + m_midground_layer->set_scrollx(0, m_scroll_ram[2]); + m_midground_layer->set_scrolly(0, m_scroll_ram[3]); + m_foreground_layer->set_scrollx(0, m_scroll_ram[4]); + m_foreground_layer->set_scrolly(0, m_scroll_ram[5]); + + if (BIT(~m_layer_en, 0)) + m_background_layer->draw(screen, bitmap, cliprect, 0, 0); + else + bitmap.fill(15, cliprect); // Should always be black, not pen 15 + + if (BIT(~m_layer_en, 1)) + m_midground_layer->draw(screen, bitmap, cliprect, 0, 1); + + if (BIT(~m_layer_en, 2)) + m_foreground_layer->draw(screen, bitmap, cliprect, 0, 2); + + if (BIT(~m_layer_en, 3)) + m_text_layer->draw(screen, bitmap, cliprect, 0, 4); + + if (BIT(~m_layer_en, 4)) + m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); + + return 0; +} + +uint32_t dcon_state::screen_update_sdgndmps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + screen.priority().fill(0, cliprect); + + // Gfx banking + if (m_last_gfx_bank != m_gfx_bank_select) + { + m_midground_layer->mark_all_dirty(); + m_last_gfx_bank = m_gfx_bank_select; + } + + // Setup the tilemaps + m_background_layer->set_scrollx(0, m_scroll_ram[0] + 128); + m_background_layer->set_scrolly(0, m_scroll_ram[1]); + m_midground_layer->set_scrollx(0, m_scroll_ram[2] + 128); + m_midground_layer->set_scrolly(0, m_scroll_ram[3]); + m_foreground_layer->set_scrollx(0, m_scroll_ram[4] + 128); + m_foreground_layer->set_scrolly(0, m_scroll_ram[5]); + m_text_layer->set_scrollx(0, /*m_scroll_ram[6] + */ 128); + m_text_layer->set_scrolly(0, /*m_scroll_ram[7] + */ 0); + + if (BIT(~m_layer_en, 0)) + m_background_layer->draw(screen, bitmap, cliprect, 0, 0); + else + bitmap.fill(15, cliprect); // Should always be black, not pen 15 + + if (BIT(~m_layer_en, 1)) + m_midground_layer->draw(screen, bitmap, cliprect, 0, 1); + + if (BIT(~m_layer_en, 2)) + m_foreground_layer->draw(screen, bitmap, cliprect, 0, 2); + + if (BIT(~m_layer_en, 3)) + m_text_layer->draw(screen, bitmap, cliprect, 0, 4); + + if (BIT(~m_layer_en, 4)) + m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); + + return 0; +} /***************************************************************************/ @@ -43,12 +296,12 @@ map(0x00000, 0x7ffff).rom(); map(0x80000, 0x8bfff).ram(); - map(0x8c000, 0x8c7ff).ram().w(FUNC(dcon_state::background_w)).share("back_data"); - map(0x8c800, 0x8cfff).ram().w(FUNC(dcon_state::foreground_w)).share("fore_data"); - map(0x8d000, 0x8d7ff).ram().w(FUNC(dcon_state::midground_w)).share("mid_data"); - map(0x8d800, 0x8e7ff).ram().w(FUNC(dcon_state::text_w)).share("textram"); + map(0x8c000, 0x8c7ff).ram().w(FUNC(dcon_state::background_w)).share(m_back_data); + map(0x8c800, 0x8cfff).ram().w(FUNC(dcon_state::foreground_w)).share(m_fore_data); + map(0x8d000, 0x8d7ff).ram().w(FUNC(dcon_state::midground_w)).share(m_mid_data); + map(0x8d800, 0x8e7ff).ram().w(FUNC(dcon_state::text_w)).share(m_textram); map(0x8e800, 0x8f7ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x8f800, 0x8ffff).ram().share("spriteram"); + map(0x8f800, 0x8ffff).ram().share(m_spriteram); map(0x9d000, 0x9d7ff).w(FUNC(dcon_state::gfxbank_w)); map(0xa0000, 0xa000d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); @@ -69,7 +322,7 @@ /******************************************************************************/ static INPUT_PORTS_START( common ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU PORT_START("P1_P2") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) @@ -228,9 +481,9 @@ static const gfx_layout dcon_charlayout = { - 8,8, /* 8*8 characters */ + 8,8, // 8*8 characters RGN_FRAC(1,2), - 4, /* 4 bits per pixel */ + 4, // 4 bits per pixel { 0,4,(0x10000*8)+0,0x10000*8+4 }, { 3,2,1,0, 11,10,9,8 }, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, @@ -239,9 +492,9 @@ static const gfx_layout dcon_tilelayout = { - 16,16, /* 16*16 tiles */ + 16,16, // 16*16 tiles RGN_FRAC(1,1), - 4, /* 4 bits per pixel */ + 4, // 4 bits per pixel { 8, 12, 0,4 }, { 3,2,1,0,19,18,17,16, @@ -280,19 +533,19 @@ void dcon_state::dcon(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 10000000); + // basic machine hardware + M68000(config, m_maincpu, 10'000'000); m_maincpu->set_addrmap(AS_PROGRAM, &dcon_state::dcon_map); m_maincpu->set_vblank_int("screen", FUNC(dcon_state::irq4_line_hold)); - z80_device &audiocpu(Z80(config, "audiocpu", 4000000)); /* Perhaps 14318180/4? */ + z80_device &audiocpu(Z80(config, "audiocpu", 4'000'000)); // Perhaps 14'318'180 / 4? audiocpu.set_addrmap(AS_PROGRAM, &dcon_state::seibu_sound_map); audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(40*8, 32*8); screen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1); screen.set_screen_update(FUNC(dcon_state::screen_update_dcon)); @@ -308,14 +561,14 @@ SEI0211(config, m_spritegen, XTAL(14'318'181), m_palette, gfx_dcon_spr); m_spritegen->set_pri_callback(FUNC(dcon_state::pri_cb)); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - ym3812_device &ymsnd(YM3812(config, "ymsnd", 4000000)); + ym3812_device &ymsnd(YM3812(config, "ymsnd", 4'000'000)); ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0); - okim6295_device &oki(OKIM6295(config, "oki", 1320000, okim6295_device::PIN7_LOW)); + okim6295_device &oki(OKIM6295(config, "oki", 1'320'000, okim6295_device::PIN7_LOW)); oki.add_route(ALL_OUTPUTS, "mono", 0.40); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -326,21 +579,21 @@ m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write)); } -void dcon_state::sdgndmps(machine_config &config) /* PCB number is PB91008 */ +void dcon_state::sdgndmps(machine_config &config) // PCB number is PB91008 { - /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(20'000'000)/2); + // basic machine hardware + M68000(config, m_maincpu, XTAL(20'000'000) / 2); m_maincpu->set_addrmap(AS_PROGRAM, &dcon_state::sdgndmps_map); m_maincpu->set_vblank_int("screen", FUNC(dcon_state::irq4_line_hold)); - z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181)/4)); + z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181) / 4)); audiocpu.set_addrmap(AS_PROGRAM, &dcon_state::seibu_sound_map); audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(40*8, 32*8); screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1); screen.set_screen_update(FUNC(dcon_state::screen_update_sdgndmps)); @@ -356,15 +609,15 @@ SEI0211(config, m_spritegen, XTAL(14'318'181), m_palette, gfx_dcon_spr); m_spritegen->set_pri_callback(FUNC(dcon_state::pri_cb)); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181)/4)); + ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); ymsnd.irq_handler().set(m_seibu_sound, FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(0, "mono", 0.50); ymsnd.add_route(1, "mono", 0.50); - okim6295_device &oki(OKIM6295(config, "oki", XTAL(20'000'000)/16, okim6295_device::PIN7_LOW)); /* 1.25Mhz? unverified clock & divisor (was 1320000) */ + okim6295_device &oki(OKIM6295(config, "oki", XTAL(20'000'000) / 16, okim6295_device::PIN7_LOW)); // 1.25Mhz? unverified clock & divisor (was 1320000) oki.add_route(ALL_OUTPUTS, "mono", 0.40); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -384,48 +637,48 @@ ROM_LOAD16_BYTE("p1-0", 0x040000, 0x20000, CRC(3ec1ef7d) SHA1(6195f1402dba5b3d3913e97cd78ba1e8865f7692) ) ROM_LOAD16_BYTE("p1-1", 0x040001, 0x20000, CRC(4b8de320) SHA1(14a3ab347fc468869355951294c3e3a8f9211b6a) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k code for sound Z80 */ + ROM_REGION( 0x20000, "audiocpu", 0 ) ROM_LOAD( "fmsnd", 0x000000, 0x08000, CRC(50450faa) SHA1(d4add7d357951b51d53ed7f143ece7f3bde7f4cb) ) - ROM_CONTINUE( 0x010000, 0x08000 ) - ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) + ROM_CONTINUE( 0x010000, 0x08000 ) + ROM_COPY( "audiocpu", 0x000000, 0x18000, 0x08000 ) ROM_REGION( 0x020000, "txtiles", 0 ) - ROM_LOAD( "fix0", 0x000000, 0x10000, CRC(ab30061f) SHA1(14dba37fef7bd13c827fd542b24cc593dcdc9f99) ) /* chars */ + ROM_LOAD( "fix0", 0x000000, 0x10000, CRC(ab30061f) SHA1(14dba37fef7bd13c827fd542b24cc593dcdc9f99) ) ROM_LOAD( "fix1", 0x010000, 0x10000, CRC(a0582115) SHA1(498d6e4f631a5dfe54d5c2813c47d40c466b694d) ) ROM_REGION( 0x080000, "bgtiles", 0 ) - ROM_LOAD( "bg1", 0x000000, 0x80000, CRC(eac43283) SHA1(f5d384c98751002416013a9a920e2ab2cea61cb1) ) /* tiles */ + ROM_LOAD( "bg1", 0x000000, 0x80000, CRC(eac43283) SHA1(f5d384c98751002416013a9a920e2ab2cea61cb1) ) ROM_REGION( 0x080000, "fgtiles", 0 ) - ROM_LOAD( "bg3", 0x000000, 0x80000, CRC(1408a1e0) SHA1(d96fb8a60af02df313ffc9e0284611d7ca50540d) ) /* tiles */ + ROM_LOAD( "bg3", 0x000000, 0x80000, CRC(1408a1e0) SHA1(d96fb8a60af02df313ffc9e0284611d7ca50540d) ) ROM_REGION( 0x080000, "mgtiles", 0 ) - ROM_LOAD( "bg2", 0x000000, 0x80000, CRC(01864eb6) SHA1(78f755d7462a787bd1a378184e8fce8fa889f258) ) /* tiles */ + ROM_LOAD( "bg2", 0x000000, 0x80000, CRC(01864eb6) SHA1(78f755d7462a787bd1a378184e8fce8fa889f258) ) ROM_REGION( 0x200000, "sprites", 0 ) - ROM_LOAD( "obj0", 0x000000, 0x80000, CRC(c3af37db) SHA1(7d6ee07b6302aaec8d792faf78a37898a2ac3c4e) ) /* sprites */ + ROM_LOAD( "obj0", 0x000000, 0x80000, CRC(c3af37db) SHA1(7d6ee07b6302aaec8d792faf78a37898a2ac3c4e) ) ROM_LOAD( "obj1", 0x080000, 0x80000, CRC(be1f53ba) SHA1(061b80487e6c4040618af6ed9c5315fba44f5d0c) ) ROM_LOAD( "obj2", 0x100000, 0x80000, CRC(24e0b51c) SHA1(434b4d58f785eefb5380c08a0704c8dea6609268) ) ROM_LOAD( "obj3", 0x180000, 0x80000, CRC(5274f02d) SHA1(69b94363624177c92e1b3413244ce649c2e5a696) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "pcm", 0x000000, 0x20000, CRC(d2133b85) SHA1(a2e61c9893da8a95c35c0b47e2c43c315b654de8) ) ROM_END ROM_START( sdgndmps ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ + ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD16_BYTE( "911-a01.25", 0x00000, 0x20000, CRC(3362915d) SHA1(d98e2d4de402ca549664e148c9a6fe94fccfd5e9) ) ROM_LOAD16_BYTE( "911-a02.29", 0x00001, 0x20000, CRC(fbc78285) SHA1(85d40b0e7bb923a0daacbd78ce7d5bb9c80b9ffc) ) ROM_LOAD16_BYTE( "911-a03.27", 0x40000, 0x20000, CRC(6c24b4f2) SHA1(e9fb82884f47694bebcad9254cb57a0b01dcd9c8) ) ROM_LOAD16_BYTE( "911-a04.28", 0x40001, 0x20000, CRC(6ff9d716) SHA1(303faec19a84afd6cbcf3ca5d4877693c11d406e) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ + ROM_REGION( 0x20000, "audiocpu", 0 ) ROM_LOAD( "911-a05.010", 0x00000, 0x08000, CRC(90455406) SHA1(dd2c5b96ac4b51251a3d34d97cc9af360afaa38c) ) ROM_CONTINUE( 0x10000, 0x08000 ) - ROM_COPY( "audiocpu", 0x000000, 0x18000, 0x08000 ) + ROM_COPY( "audiocpu", 0x00000, 0x18000, 0x08000 ) ROM_REGION( 0x020000, "txtiles", 0 ) - ROM_LOAD( "911-a08.66", 0x000000, 0x10000, CRC(e7e04823) SHA1(d9b1ace5cd8218d5a4767cf5adbc267dce7c0668) ) /* chars */ + ROM_LOAD( "911-a08.66", 0x000000, 0x10000, CRC(e7e04823) SHA1(d9b1ace5cd8218d5a4767cf5adbc267dce7c0668) ) ROM_LOAD( "911-a07.73", 0x010000, 0x10000, CRC(6f40d4a9) SHA1(8abadb2dc07ac22081b2970358e9f92b90b174b0) ) ROM_REGION( 0x080000, "bgtiles", 0 ) @@ -438,16 +691,19 @@ ROM_LOAD( "911-a13.64", 0x000000, 0x100000, CRC(f38a584a) SHA1(16dd8e7086949d14e9185c37313290024d6dafdc) ) ROM_REGION( 0x200000, "sprites", 0 ) - ROM_LOAD( "911-a10.73", 0x000000, 0x100000, CRC(80e341fb) SHA1(619e71aefd0b13a01a6a2ed5d8613fe56242d209) ) /* sprites */ + ROM_LOAD( "911-a10.73", 0x000000, 0x100000, CRC(80e341fb) SHA1(619e71aefd0b13a01a6a2ed5d8613fe56242d209) ) ROM_LOAD( "911-a09.74", 0x100000, 0x100000, CRC(98f34519) SHA1(20319d546df104485ee553ce0e58364f927d1135) ) - ROM_REGION( 0x040000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x040000, "oki", 0 ) ROM_LOAD( "911-a06.97", 0x00000, 0x40000, CRC(12c79440) SHA1(9e9987527f64dfd8a51a2ab49afc465e76c5e7ac) ) - ROM_REGION( 512, "proms", 0 ) - ROM_LOAD( "bnd-007.88", 0x00000, 512, CRC(96f7646e) SHA1(400a831b83d6ac4d2a46ef95b97b1ee237099e44) ) /* Priority */ + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "bnd-007.88", 0x000, 0x200, CRC(96f7646e) SHA1(400a831b83d6ac4d2a46ef95b97b1ee237099e44) ) // Priority ROM_END +} // anonymous namespace + + /***************************************************************************/ GAME( 1991, sdgndmps, 0, sdgndmps, sdgndmps, dcon_state, empty_init, ROT0, "Banpresto / Bandai", "SD Gundam Psycho Salamander no Kyoui", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/dcon.h mame-0.264+dfsg.1/src/mame/seibu/dcon.h --- mame-0.263+dfsg.1/src/mame/seibu/dcon.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/dcon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -#ifndef MAME_SEIBU_DCON_H -#define MAME_SEIBU_DCON_H - -#pragma once - -#include "sei021x_sei0220_spr.h" - -#include "seibusound.h" - -#include "emupal.h" -#include "tilemap.h" - -class dcon_state : public driver_device, public seibu_sound_common -{ -public: - dcon_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_seibu_sound(*this, "seibu_sound"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_spritegen(*this, "spritegen"), - m_back_data(*this, "back_data"), - m_fore_data(*this, "fore_data"), - m_mid_data(*this, "mid_data"), - m_textram(*this, "textram"), - m_spriteram(*this, "spriteram") - { } - - void dcon(machine_config &config); - void sdgndmps(machine_config &config); - -private: - required_device m_maincpu; - required_device m_seibu_sound; - required_device m_gfxdecode; - required_device m_palette; - required_device m_spritegen; - - required_shared_ptr m_back_data; - required_shared_ptr m_fore_data; - required_shared_ptr m_mid_data; - required_shared_ptr m_textram; - required_shared_ptr m_spriteram; - - tilemap_t *m_background_layer = nullptr; - tilemap_t *m_foreground_layer = nullptr; - tilemap_t *m_midground_layer = nullptr; - tilemap_t *m_text_layer = nullptr; - - int m_gfx_bank_select = 0; - int m_last_gfx_bank = 0; - uint16_t m_scroll_ram[6]{}; - uint16_t m_layer_en = 0U; - - u8 sdgndmps_sound_comms_r(offs_t offset); - - void layer_en_w(uint16_t data); - void layer_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void gfxbank_w(uint16_t data); - void background_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void midground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - TILE_GET_INFO_MEMBER(get_back_tile_info); - TILE_GET_INFO_MEMBER(get_fore_tile_info); - TILE_GET_INFO_MEMBER(get_mid_tile_info); - TILE_GET_INFO_MEMBER(get_text_tile_info); - - virtual void video_start() override; - - uint32_t screen_update_dcon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_sdgndmps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t pri_cb(uint8_t pri, uint8_t ext); - void dcon_map(address_map &map); - void sdgndmps_map(address_map &map); -}; - -#endif // MAME_SEIBU_DCON_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/dcon_v.cpp mame-0.264+dfsg.1/src/mame/seibu/dcon_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/dcon_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/dcon_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -/*************************************************************************** - - D-Con video hardware. - -***************************************************************************/ - -#include "emu.h" -#include "dcon.h" -#include "screen.h" - - -/******************************************************************************/ - -void dcon_state::gfxbank_w(uint16_t data) -{ - if (data&1) - m_gfx_bank_select=0x1000; - else - m_gfx_bank_select=0; -} - -void dcon_state::background_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_back_data[offset]); - m_background_layer->mark_tile_dirty(offset); -} - -void dcon_state::foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_fore_data[offset]); - m_foreground_layer->mark_tile_dirty(offset); -} - -void dcon_state::midground_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_mid_data[offset]); - m_midground_layer->mark_tile_dirty(offset); -} - -void dcon_state::text_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_textram[offset]); - m_text_layer->mark_tile_dirty(offset); -} - -TILE_GET_INFO_MEMBER(dcon_state::get_back_tile_info) -{ - int tile=m_back_data[tile_index]; - int color=(tile>>12)&0xf; - - tile&=0xfff; - - tileinfo.set(1, - tile, - color, - 0); -} - -TILE_GET_INFO_MEMBER(dcon_state::get_fore_tile_info) -{ - int tile=m_fore_data[tile_index]; - int color=(tile>>12)&0xf; - - tile&=0xfff; - - tileinfo.set(2, - tile, - color, - 0); -} - -TILE_GET_INFO_MEMBER(dcon_state::get_mid_tile_info) -{ - int tile=m_mid_data[tile_index]; - int color=(tile>>12)&0xf; - - tile&=0xfff; - - tileinfo.set(3, - tile|m_gfx_bank_select, - color, - 0); -} - -TILE_GET_INFO_MEMBER(dcon_state::get_text_tile_info) -{ - int tile = m_textram[tile_index]; - int color=(tile>>12)&0xf; - - tile&=0xfff; - - tileinfo.set(0, - tile, - color, - 0); -} - -void dcon_state::video_start() -{ - m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); - m_foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_fore_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); - m_midground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_mid_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dcon_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - - m_midground_layer->set_transparent_pen(15); - m_foreground_layer->set_transparent_pen(15); - m_text_layer->set_transparent_pen(15); - - m_gfx_bank_select = 0; - - save_item(NAME(m_gfx_bank_select)); - save_item(NAME(m_last_gfx_bank)); - save_item(NAME(m_scroll_ram)); - save_item(NAME(m_layer_en)); -} - -uint32_t dcon_state::pri_cb(uint8_t pri, uint8_t ext) -{ - switch(pri) - { - case 0: return 0xf0; // above foreground layer - case 1: return 0xfc; // above midground layer - case 2: return 0xfe; // above background layer - case 3: - default: return 0; // above text layer - } -} - -uint32_t dcon_state::screen_update_dcon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - screen.priority().fill(0, cliprect); - - /* Setup the tilemaps */ - m_background_layer->set_scrollx(0, m_scroll_ram[0] ); - m_background_layer->set_scrolly(0, m_scroll_ram[1] ); - m_midground_layer->set_scrollx(0, m_scroll_ram[2] ); - m_midground_layer->set_scrolly(0, m_scroll_ram[3] ); - m_foreground_layer->set_scrollx(0, m_scroll_ram[4] ); - m_foreground_layer->set_scrolly(0, m_scroll_ram[5] ); - - if (BIT(~m_layer_en, 0)) - m_background_layer->draw(screen, bitmap, cliprect, 0,0); - else - bitmap.fill(15, cliprect); /* Should always be black, not pen 15 */ - - if (BIT(~m_layer_en, 1)) - m_midground_layer->draw(screen, bitmap, cliprect, 0,1); - - if (BIT(~m_layer_en, 2)) - m_foreground_layer->draw(screen, bitmap, cliprect, 0,2); - - if (BIT(~m_layer_en, 3)) - m_text_layer->draw(screen, bitmap, cliprect, 0,4); - - if (BIT(~m_layer_en, 4)) - m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); - - return 0; -} - -uint32_t dcon_state::screen_update_sdgndmps(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - screen.priority().fill(0, cliprect); - - /* Gfx banking */ - if (m_last_gfx_bank!=m_gfx_bank_select) - { - m_midground_layer->mark_all_dirty(); - m_last_gfx_bank=m_gfx_bank_select; - } - - /* Setup the tilemaps */ - m_background_layer->set_scrollx(0, m_scroll_ram[0]+128 ); - m_background_layer->set_scrolly(0, m_scroll_ram[1] ); - m_midground_layer->set_scrollx(0, m_scroll_ram[2]+128 ); - m_midground_layer->set_scrolly(0, m_scroll_ram[3] ); - m_foreground_layer->set_scrollx(0, m_scroll_ram[4]+128 ); - m_foreground_layer->set_scrolly(0, m_scroll_ram[5] ); - m_text_layer->set_scrollx(0, /*m_scroll_ram[6] + */ 128 ); - m_text_layer->set_scrolly(0, /*m_scroll_ram[7] + */ 0 ); - - if (BIT(~m_layer_en, 0)) - m_background_layer->draw(screen, bitmap, cliprect, 0,0); - else - bitmap.fill(15, cliprect); /* Should always be black, not pen 15 */ - - if (BIT(~m_layer_en, 1)) - m_midground_layer->draw(screen, bitmap, cliprect, 0,1); - - if (BIT(~m_layer_en, 2)) - m_foreground_layer->draw(screen, bitmap, cliprect, 0,2); - - if (BIT(~m_layer_en, 3)) - m_text_layer->draw(screen, bitmap, cliprect, 0,4); - - if (BIT(~m_layer_en, 4)) - m_spritegen->draw_sprites(screen, bitmap, cliprect, m_spriteram, m_spriteram.bytes()); - - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/deadang.cpp mame-0.264+dfsg.1/src/mame/seibu/deadang.cpp --- mame-0.263+dfsg.1/src/mame/seibu/deadang.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/deadang.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Bryan McPhail, David Haywood +// copyright-holders: Bryan McPhail, David Haywood + /*************************************************************************** Pop'N Run (c) 1987 Seibu Kaihatsu & Yukai Tsukai @@ -36,7 +37,7 @@ VSync 60Hz HSync 15.37kHz -Gang Hunter as an additional daughter card attached to the top board call SEI-8712 GUN +Gang Hunter has an additional daughter card attached to the top board called SEI-8712 GUN 2008-08 Dip locations and factory settings verified with US manual @@ -44,63 +45,487 @@ */ #include "emu.h" -#include "deadang.h" + +#include "seibusound.h" #include "cpu/nec/nec.h" +#include "machine/timer.h" #include "machine/watchdog.h" #include "sound/msm5205.h" +#include "sound/ymopm.h" #include "sound/ymopn.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class deadang_state : public driver_device +{ +public: + deadang_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_scroll_ram(*this, "scroll_ram"), + m_videoram(*this, "videoram"), + m_video_data(*this, "video_data"), + m_spriteram(*this, "spriteram"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_seibu_sound(*this, "seibu_sound"), + m_maincpu(*this, "maincpu"), + m_subcpu(*this, "sub"), + m_audiocpu(*this, "audiocpu"), + m_adpcm(*this, "adpcm%u", 1U), + m_track(*this, "TRACK%c", 'X') + { } + + void deadang(machine_config &config); + void ghunter(machine_config &config); + + void init_adpcm(); + void init_ghunter(); + +protected: + virtual void video_start() override; + + required_shared_ptr m_scroll_ram; + required_shared_ptr m_videoram; + required_shared_ptr m_video_data; + required_shared_ptr m_spriteram; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + required_device m_seibu_sound; + required_device m_maincpu; + required_device m_subcpu; + required_device m_audiocpu; + optional_device_array m_adpcm; + + optional_ioport_array<2> m_track; + + uint8_t m_tilebank = 0; + uint8_t m_oldtilebank = 0; + + tilemap_t *m_pf_layer[3]{}; + tilemap_t *m_text_layer = nullptr; + + void text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + uint16_t ghunter_trackball_low_r(); + uint16_t ghunter_trackball_high_r(); + + void foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + TILEMAP_MAPPER_MEMBER(bg_scan); + TILE_GET_INFO_MEMBER(get_pf1_tile_info); + TILE_GET_INFO_MEMBER(get_pf3_tile_info); + TILE_GET_INFO_MEMBER(get_pf2_tile_info); + TILE_GET_INFO_MEMBER(get_text_tile_info); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + TIMER_DEVICE_CALLBACK_MEMBER(main_scanline); + TIMER_DEVICE_CALLBACK_MEMBER(sub_scanline); + + void main_map(address_map &map); + void ghunter_main_map(address_map &map); + void sound_decrypted_opcodes_map(address_map &map); + void sound_map(address_map &map); + void sub_map(address_map &map); +}; + +class popnrun_state : public deadang_state +{ +public: + popnrun_state(const machine_config &mconfig, device_type type, const char *tag) : + deadang_state(mconfig, type, tag) + { } + + void popnrun(machine_config &config); + +protected: + virtual void video_start() override; + +private: + TILE_GET_INFO_MEMBER(get_text_tile_info); + void text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void main_map(address_map &map); + void sub_map(address_map &map); + void sound_map(address_map &map); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); +}; + + +// Video Hardware + +void deadang_state::foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_video_data[offset]); + m_pf_layer[0]->mark_tile_dirty(offset ); +} + +void deadang_state::text_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[offset]); + m_text_layer->mark_tile_dirty(offset ); +} + +void popnrun_state::text_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[offset]); + m_text_layer->mark_tile_dirty(offset / 2); +} + +void deadang_state::bank_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + if (ACCESSING_BITS_0_7) + { + m_tilebank = data & 1; + if (m_tilebank != m_oldtilebank) + { + m_oldtilebank = m_tilebank; + m_pf_layer[0]->mark_all_dirty(); + } + } +} + +/******************************************************************************/ + +TILEMAP_MAPPER_MEMBER(deadang_state::bg_scan) +{ + return (col & 0xf) | ((row & 0xf) << 4) | ((col & 0x70) << 4) | ((row & 0xf0) << 7); +} + +TILE_GET_INFO_MEMBER(deadang_state::get_pf3_tile_info) +{ + const uint16_t *bgMap = (const uint16_t *)memregion("bgmap1")->base(); + int const code = bgMap[tile_index]; + tileinfo.set(4, code & 0x7ff, code >> 12, 0); +} + +TILE_GET_INFO_MEMBER(deadang_state::get_pf2_tile_info) +{ + const uint16_t *bgMap = (const uint16_t *)memregion("bgmap2")->base(); + int const code = bgMap[tile_index]; + tileinfo.set(3, code & 0x7ff, code >> 12, 0); +} + +TILE_GET_INFO_MEMBER(deadang_state::get_pf1_tile_info) +{ + int tile = m_video_data[tile_index]; + int const color = tile >> 12; + tile &= 0xfff; + tileinfo.set(2, tile + m_tilebank * 0x1000, color, 0); +} + +TILE_GET_INFO_MEMBER(deadang_state::get_text_tile_info) +{ + int const tile = (m_videoram[tile_index] & 0xff) | ((m_videoram[tile_index] >> 6) & 0x300); + int const color = (m_videoram[tile_index] >> 8) & 0xf; + + tileinfo.set(0, tile, color, 0); +} + +void deadang_state::video_start() +{ + m_pf_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf3_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); + m_pf_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf2_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); + m_pf_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf1_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_pf_layer[1]->set_transparent_pen(15); + m_pf_layer[0]->set_transparent_pen(15); + m_text_layer->set_transparent_pen(15); + + save_item(NAME(m_tilebank)); + save_item(NAME(m_oldtilebank)); +} + + +TILE_GET_INFO_MEMBER(popnrun_state::get_text_tile_info) +{ + int tile = (m_videoram[tile_index * 2 + 0] & 0xff) << 1; // | ((m_videoram[tile_index] >> 6) & 0x300); + int const attr = (m_videoram[tile_index * 2 + 1]); + // TODO: not entirely correct (title screen/ranking colors) + // might be down to bitplanes too + int const color = (attr & 3) ^ 1; -/* Read/Write Handlers */ + if (attr & 0x40) + tile |= 1; + + tileinfo.set(0, tile, color, 0); +} + +void popnrun_state::video_start() +{ + m_pf_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(popnrun_state::get_pf3_tile_info)), tilemap_mapper_delegate(*this, FUNC(popnrun_state::bg_scan)), 16, 16, 128, 256); + m_pf_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(popnrun_state::get_pf2_tile_info)), tilemap_mapper_delegate(*this, FUNC(popnrun_state::bg_scan)), 16, 16, 128, 256); + m_pf_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(popnrun_state::get_pf1_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(popnrun_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_pf_layer[1]->set_transparent_pen(0); + m_pf_layer[0]->set_transparent_pen(0); + m_text_layer->set_transparent_pen(0); + + save_item(NAME(m_tilebank)); + save_item(NAME(m_oldtilebank)); +} + + +void deadang_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int offs = 0; offs < 0x800 / 2; offs += 4) + { + // Don't draw empty sprite table entries + if ((m_spriteram[offs + 3] & 0xff00) != 0xf00) continue; + + int pri = 0; + + switch (m_spriteram[offs + 2] & 0xc000) + { + default: + case 0xc000: pri = 0; break; // Unknown + case 0x8000: pri = 0; break; // Over all playfields + case 0x4000: pri = 0xf0; break; // Under top playfield + case 0x0000: pri = 0xf0 | 0xcc; break; // Under middle playfield + } + + int fx = m_spriteram[offs + 0] & 0x2000; + int fy = m_spriteram[offs + 0] & 0x4000; + int y = m_spriteram[offs + 0] & 0xff; + int x = m_spriteram[offs + 2] & 0xff; + if (fy) fy = 0; else fy = 1; + if (m_spriteram[offs + 2] & 0x100) x = 0 - (0xff - x); + + int const color = (m_spriteram[offs + 1] >> 12) & 0xf; + int const sprite = m_spriteram[offs + 1] & 0xfff; + + if (flip_screen()) + { + x = 240 - x; + y = 240 - y; + if (fx) fx = 0; else fx = 1; + if (fy) fy = 0; else fy = 1; + } + + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, + sprite, + color, fx, fy, x, y, + screen.priority(), pri, 15); + } +} + +uint32_t deadang_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // Setup the tilemaps + m_pf_layer[2]->set_scrolly(0, ((m_scroll_ram[0x01] & 0xf0) << 4) + ((m_scroll_ram[0x02] & 0x7f) << 1) + ((m_scroll_ram[0x02] & 0x80) >> 7)); + m_pf_layer[2]->set_scrollx(0, ((m_scroll_ram[0x09] & 0xf0) << 4) + ((m_scroll_ram[0x0a] & 0x7f) << 1) + ((m_scroll_ram[0x0a] & 0x80) >> 7)); + m_pf_layer[0]->set_scrolly(0, ((m_scroll_ram[0x11] & 0x10) << 4) + ((m_scroll_ram[0x12] & 0x7f) << 1) + ((m_scroll_ram[0x12] & 0x80) >> 7)); + m_pf_layer[0]->set_scrollx(0, ((m_scroll_ram[0x19] & 0x10) << 4) + ((m_scroll_ram[0x1a] & 0x7f) << 1) + ((m_scroll_ram[0x1a] & 0x80) >> 7)); + m_pf_layer[1]->set_scrolly(0, ((m_scroll_ram[0x21] & 0xf0) << 4) + ((m_scroll_ram[0x22] & 0x7f) << 1) + ((m_scroll_ram[0x22] & 0x80) >> 7)); + m_pf_layer[1]->set_scrollx(0, ((m_scroll_ram[0x29] & 0xf0) << 4) + ((m_scroll_ram[0x2a] & 0x7f) << 1) + ((m_scroll_ram[0x2a] & 0x80) >> 7)); + + /* Control byte: + 0x01: Background playfield disable + 0x02: Middle playfield disable + 0x04: Top playfield disable + 0x08: ? Toggles at start of game + 0x10: Sprite disable + 0x20: Unused? + 0x40: Flipscreen + 0x80: Always set? + */ + m_pf_layer[2]->enable(!(m_scroll_ram[0x34] & 1)); + m_pf_layer[0]->enable(!(m_scroll_ram[0x34] & 2)); + m_pf_layer[1]->enable(!(m_scroll_ram[0x34] & 4)); + flip_screen_set(m_scroll_ram[0x34] & 0x40); + + bitmap.fill(m_palette->black_pen(), cliprect); + screen.priority().fill(0, cliprect); + m_pf_layer[2]->draw(screen, bitmap, cliprect, 0, 1); + m_pf_layer[0]->draw(screen, bitmap, cliprect, 0, 2); + m_pf_layer[1]->draw(screen, bitmap, cliprect, 0, 4); + if (!(m_scroll_ram[0x34] & 0x10)) draw_sprites(screen, bitmap, cliprect); + m_text_layer->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + +void popnrun_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // TODO: might have more bits in either 0x3800-0x3bff or 0x3e00-0x3fff + for (int offs = 0; offs < 0x200 / 2; offs += 2) + { + // Don't draw empty sprite table entries + //if ((m_spriteram[offs + 3] & 0xff00) != 0xf00) continue; + + int pri = 0; +#if 0 + switch (m_spriteram[offs + 2] & 0xc000) + { + default: + case 0xc000: pri = 0; break; // Unknown + case 0x8000: pri = 0; break; // Over all playfields + case 0x4000: pri = 0xf0; break; // Under top playfield + case 0x0000: pri = 0xf0 | 0xcc; break; // Under middle playfield + } +#endif + + int fx = m_spriteram[offs + 0] & 0x4000; + int fy = m_spriteram[offs + 0] & 0x8000; + int y = m_spriteram[offs + 1] & 0xff; + int x = (m_spriteram[offs + 1] >> 8) & 0xff; +#if 0 + if (fy) fy = 0; else fy = 1; + if (m_spriteram[offs + 2] & 0x100) x = 0 - (0xff - x); +#endif + + int const color = (m_spriteram[offs + 0] >> 12) & 0x7; + int const sprite = m_spriteram[offs + 0] & 0xfff; + +#if 0 + if (flip_screen()) + { + x = 240 - x; + y = 240 - y; + if (fx) fx = 0; else fx = 1; + if (fy) fy = 0; else fy = 1; + } +#endif + + m_gfxdecode->gfx(1)->prio_transpen(bitmap, cliprect, + sprite, + color, fx, fy, x, y, + screen.priority(), pri, 0); + } +} + +uint32_t popnrun_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // TODO: different scroll RAM hookup + // 0x18 seems to enable the various layers + // Setup the tilemaps +// m_pf_layer[2]->set_scrolly(0, ((m_scroll_ram[0x01] & 0xf0) << 4) + ((m_scroll_ram[0x02] & 0x7f) << 1) + ((m_scroll_ram[0x02] & 0x80) >> 7)); +// m_pf_layer[2]->set_scrollx(0, ((m_scroll_ram[0x09] & 0xf0) << 4) + ((m_scroll_ram[0x0a] & 0x7f) << 1) + ((m_scroll_ram[0x0a] & 0x80) >> 7)); +// m_pf_layer[0]->set_scrolly(0, ((m_scroll_ram[0x11] & 0x10) << 4) + ((m_scroll_ram[0x12] & 0x7f) << 1) + ((m_scroll_ram[0x12] & 0x80) >> 7)); +// m_pf_layer[0]->set_scrollx(0, ((m_scroll_ram[0x19] & 0x10) << 4) + ((m_scroll_ram[0x1a] & 0x7f) << 1) + ((m_scroll_ram[0x1a] & 0x80) >> 7)); +// m_pf_layer[1]->set_scrolly(0, ((m_scroll_ram[0x21] & 0xf0) << 4) + ((m_scroll_ram[0x22] & 0x7f) << 1) + ((m_scroll_ram[0x22] & 0x80) >> 7)); +// m_pf_layer[1]->set_scrollx(0, ((m_scroll_ram[0x29] & 0xf0) << 4) + ((m_scroll_ram[0x2a] & 0x7f) << 1) + ((m_scroll_ram[0x2a] & 0x80) >> 7)); + + m_pf_layer[2]->enable(!(m_scroll_ram[0x34] & 1)); + m_pf_layer[0]->enable(!(m_scroll_ram[0x34] & 2)); + m_pf_layer[1]->enable(!(m_scroll_ram[0x34] & 4)); +// flip_screen_set(m_scroll_ram[0x34]&0x40 ); + + bitmap.fill(1, cliprect); + screen.priority().fill(0, cliprect); + // 32 pixels? +// int scrollx = (m_scroll_ram[0x4 / 2] & 0x0f); + + // debug tilemap code + // this is likely to be collision data + for (int x = 0; x < 16; x++) + { + for (int y = 0; y < 8; y++) + { + int tile = m_video_data[y + x * 8 + 0xc0] & 0xff; + int res_x, res_y; + + if (tile != 0) + { + res_x = (x * 16) & 0xff; + res_y = y * 32; + //if (cliprect.contains(res_x, res_y)) + bitmap.plot_box(res_x, res_y, 16, 16, tile + 0x10); + } + + tile = m_video_data[y + x * 8 + 0xc0] >> 8; + + if (tile != 0) + { + res_x = (x * 16) & 0xff; + res_y = y * 32 + 16; + //if (cliprect.contains(res_x, res_y)) + bitmap.plot_box(res_x, res_y, 16, 16, tile + 0x10); + } + } + } + + //m_pf_layer[2]->draw(screen, bitmap, cliprect, 0, 1); + //m_pf_layer[0]->draw(screen, bitmap, cliprect, 0, 2); + //m_pf_layer[1]->draw(screen, bitmap, cliprect, 0, 4); + if (m_scroll_ram[0x18 / 2] & 0x1) + draw_sprites(screen, bitmap, cliprect); + m_text_layer->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + + +// Read/Write Handlers uint16_t deadang_state::ghunter_trackball_low_r() { - return (ioport("TRACKX")->read() & 0xff) | ((ioport("TRACKY")->read() & 0xff) << 8); + return (m_track[0]->read() & 0xff) | ((m_track[1]->read() & 0xff) << 8); } + uint16_t deadang_state::ghunter_trackball_high_r() { - return ((ioport("TRACKX")->read() & 0x0f00) >> 4) | (ioport("TRACKY")->read() & 0x0f00); + return ((m_track[0]->read() & 0x0f00) >> 4) | (m_track[1]->read() & 0x0f00); } -/* Memory Maps */ + +// Memory Maps void deadang_state::main_map(address_map &map) { map(0x00000, 0x037ff).ram(); - map(0x03800, 0x03fff).ram().share("spriteram"); + map(0x03800, 0x03fff).ram().share(m_spriteram); map(0x04000, 0x04fff).ram().share("share1"); map(0x05000, 0x05fff).nopw(); map(0x06000, 0x0600f).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); map(0x06010, 0x07fff).nopw(); - map(0x08000, 0x087ff).w(FUNC(deadang_state::text_w)).share("videoram"); + map(0x08000, 0x087ff).w(FUNC(deadang_state::text_w)).share(m_videoram); map(0x08800, 0x0bfff).nopw(); map(0x0a000, 0x0a001).portr("P1_P2"); map(0x0a002, 0x0a003).portr("DSW"); map(0x0c000, 0x0cfff).w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0d000, 0x0dfff).nopw(); - map(0x0e000, 0x0e0ff).ram().share("scroll_ram"); + map(0x0e000, 0x0e0ff).ram().share(m_scroll_ram); map(0x0e100, 0x0ffff).nopw(); map(0xc0000, 0xfffff).rom(); } -void popnrun_state::popnrun_main_map(address_map &map) +void deadang_state::ghunter_main_map(address_map &map) +{ + main_map(map); + + map(0x80000, 0x80001).r(FUNC(deadang_state::ghunter_trackball_low_r)); + map(0xb0000, 0xb0001).r(FUNC(deadang_state::ghunter_trackball_high_r)); +} + +void popnrun_state::main_map(address_map &map) { map(0x00000, 0x03bff).ram(); - map(0x03c00, 0x03dff).ram().share("spriteram"); + map(0x03c00, 0x03dff).ram().share(m_spriteram); map(0x03e00, 0x03fff).ram(); map(0x04000, 0x04fff).ram().share("share1"); map(0x05000, 0x05fff).nopw(); map(0x06000, 0x0600f).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); map(0x06010, 0x07fff).nopw(); - map(0x08000, 0x08fff).ram().w(FUNC(popnrun_state::popnrun_text_w)).share("videoram"); + map(0x08000, 0x08fff).ram().w(FUNC(popnrun_state::text_w)).share(m_videoram); map(0x0a000, 0x0a001).portr("P1_P2"); map(0x0a002, 0x0a003).portr("DSW"); map(0x0c000, 0x0cfff).w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x0d000, 0x0dfff).nopw(); - map(0x0e000, 0x0e0ff).ram().share("scroll_ram"); + map(0x0e000, 0x0e0ff).ram().share(m_scroll_ram); map(0x0e100, 0x0ffff).nopw(); map(0xc0000, 0xfffff).rom(); } @@ -108,16 +533,16 @@ void deadang_state::sub_map(address_map &map) { map(0x00000, 0x037ff).ram(); - map(0x03800, 0x03fff).ram().w(FUNC(deadang_state::foreground_w)).share("video_data"); + map(0x03800, 0x03fff).ram().w(FUNC(deadang_state::foreground_w)).share(m_video_data); map(0x04000, 0x04fff).ram().share("share1"); map(0x08000, 0x08001).w(FUNC(deadang_state::bank_w)); map(0x0c000, 0x0c001).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0xe0000, 0xfffff).rom(); } -void popnrun_state::popnrun_sub_map(address_map &map) +void popnrun_state::sub_map(address_map &map) { - map(0x00000, 0x003ff).ram().w(FUNC(deadang_state::foreground_w)).share("video_data"); + map(0x00000, 0x003ff).ram().w(FUNC(popnrun_state::foreground_w)).share(m_video_data); map(0x00400, 0x03fff).ram(); map(0x04000, 0x04fff).ram().share("share1"); map(0xe0000, 0xfffff).rom(); @@ -131,23 +556,23 @@ map(0x4001, 0x4001).w(m_seibu_sound, FUNC(seibu_sound_device::irq_clear_w)); map(0x4002, 0x4002).w(m_seibu_sound, FUNC(seibu_sound_device::rst10_ack_w)); map(0x4003, 0x4003).w(m_seibu_sound, FUNC(seibu_sound_device::rst18_ack_w)); - map(0x4005, 0x4006).w(m_adpcm1, FUNC(seibu_adpcm_device::adr_w)); + map(0x4005, 0x4006).w(m_adpcm[0], FUNC(seibu_adpcm_device::adr_w)); map(0x4007, 0x4007).w(m_seibu_sound, FUNC(seibu_sound_device::bank_w)); map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w)); map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r)); map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r)); map(0x4013, 0x4013).portr("COIN"); map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w)); - map(0x401a, 0x401a).w(m_adpcm1, FUNC(seibu_adpcm_device::ctl_w)); + map(0x401a, 0x401a).w(m_adpcm[0], FUNC(seibu_adpcm_device::ctl_w)); map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w)); - map(0x6005, 0x6006).w(m_adpcm2, FUNC(seibu_adpcm_device::adr_w)); + map(0x6005, 0x6006).w(m_adpcm[1], FUNC(seibu_adpcm_device::adr_w)); map(0x6008, 0x6009).rw("ym2", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); - map(0x601a, 0x601a).w(m_adpcm2, FUNC(seibu_adpcm_device::ctl_w)); + map(0x601a, 0x601a).w(m_adpcm[1], FUNC(seibu_adpcm_device::ctl_w)); map(0x8000, 0xffff).bankr("seibu_bank1"); } // Air Raid sound config with extra ROM bank -void popnrun_state::popnrun_sound_map(address_map &map) +void popnrun_state::sound_map(address_map &map) { map(0x0000, 0x1fff).r("sei80bu", FUNC(sei80bu_device::data_r)); map(0x2000, 0x27ff).ram(); @@ -172,10 +597,10 @@ } -/* Input Ports */ +// Input Ports static INPUT_PORTS_START( deadang ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU PORT_START("P1_P2") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) @@ -259,13 +684,14 @@ PORT_BIT( 0x0fff, 0x0000, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) PORT_PLAYER(1) INPUT_PORTS_END -/* Graphics Layouts */ + +// Graphics Layouts static const gfx_layout charlayout = { - 8,8, /* 8*8 characters */ + 8,8, // 8*8 characters RGN_FRAC(1,2), - 4, /* 4 bits per pixel */ + 4, // 4 bits per pixel { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0, 4 }, { STEP4(3,-1), STEP4(11,-1) }, { STEP8(0,16) }, @@ -274,9 +700,9 @@ static const gfx_layout spritelayout = { - 16,16, /* 16*16 tiles */ + 16,16, // 16*16 tiles RGN_FRAC(1,1), - 4, /* 4 bits per pixel */ + 4, // 4 bits per pixel { 8,12,0,4}, { STEP4(3,-1), STEP4(19,-1), STEP4(512+3,-1), STEP4(512+19,-1) }, { STEP16(0,32) }, @@ -285,9 +711,9 @@ static const gfx_layout popnrun_charlayout = { - 8,8, /* 8*8 characters */ + 8,8, // 8*8 characters RGN_FRAC(1,1), - 2, /* 2 bits per pixel */ + 2, // 2 bits per pixel { 4, 0 }, { STEP4(8,1), STEP4(0,1) }, { STEP8(0,16) }, @@ -298,9 +724,9 @@ // TODO: this is wrong static const gfx_layout popnrun_spritelayout = { - 16,16, /* 16*16 tiles */ + 16,16, // 16*16 tiles RGN_FRAC(1,1), - 2, /* 4 bits per pixel */ + 2, // 4 bits per pixel { 0,4 }, { STEP4(0,1), STEP4(16,1), STEP4(512,1), STEP4(512+16,1) }, { STEP16(0,32) }, @@ -308,63 +734,66 @@ }; #endif -/* Graphics Decode Information */ + +// Graphics Decode Information static GFXDECODE_START( gfx_deadang ) - GFXDECODE_ENTRY( "gfx1", 0x000000, charlayout, 512, 16 ) - GFXDECODE_ENTRY( "gfx2", 0x000000, spritelayout, 768, 16 ) - GFXDECODE_ENTRY( "gfx3", 0x000000, spritelayout, 1024, 16 ) - GFXDECODE_ENTRY( "gfx4", 0x000000, spritelayout, 256, 16 ) - GFXDECODE_ENTRY( "gfx5", 0x000000, spritelayout, 0, 16 ) + GFXDECODE_ENTRY( "chars", 0x000000, charlayout, 512, 16 ) + GFXDECODE_ENTRY( "sprites", 0x000000, spritelayout, 768, 16 ) + GFXDECODE_ENTRY( "tiles1", 0x000000, spritelayout, 1024, 16 ) + GFXDECODE_ENTRY( "tiles2", 0x000000, spritelayout, 256, 16 ) + GFXDECODE_ENTRY( "tiles3", 0x000000, spritelayout, 0, 16 ) GFXDECODE_END static GFXDECODE_START( gfx_popnrun ) - GFXDECODE_ENTRY( "gfx1", 0x000000, popnrun_charlayout, 0x20, 4 ) + GFXDECODE_ENTRY( "chars", 0x000000, popnrun_charlayout, 0x20, 4 ) // TODO: probably runs on ROM based palette or just uses the first three entries? - GFXDECODE_ENTRY( "gfx2", 0x000000, spritelayout, 0, 8 ) - GFXDECODE_ENTRY( "gfx3", 0x000000, spritelayout, 1024, 16 ) - GFXDECODE_ENTRY( "gfx4", 0x000000, spritelayout, 256, 16 ) - GFXDECODE_ENTRY( "gfx5", 0x000000, spritelayout, 0, 16 ) + GFXDECODE_ENTRY( "sprites", 0x000000, spritelayout, 0, 8 ) + GFXDECODE_ENTRY( "tiles1", 0x000000, spritelayout, 1024, 16 ) + GFXDECODE_ENTRY( "tiles2", 0x000000, spritelayout, 256, 16 ) + GFXDECODE_ENTRY( "tiles3", 0x000000, spritelayout, 0, 16 ) GFXDECODE_END -/* Interrupt Generators */ + +// Interrupt Generators TIMER_DEVICE_CALLBACK_MEMBER(deadang_state::main_scanline) { - int scanline = param; + int const scanline = param; - if(scanline == 240) // vblank-out irq - m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xc4/4); // V30 + if (scanline == 240) // vblank-out irq + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc4 / 4); // V30 - if(scanline == 0) // vblank-in irq - m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xc8/4); // V30 + if (scanline == 0) // vblank-in irq + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8 / 4); // V30 } TIMER_DEVICE_CALLBACK_MEMBER(deadang_state::sub_scanline) { - int scanline = param; + int const scanline = param; - if(scanline == 240) // vblank-out irq - m_subcpu->set_input_line_and_vector(0, HOLD_LINE,0xc4/4); // V30 + if (scanline == 240) // vblank-out irq + m_subcpu->set_input_line_and_vector(0, HOLD_LINE, 0xc4 / 4); // V30 - if(scanline == 0) // vblank-in irq - m_subcpu->set_input_line_and_vector(0, HOLD_LINE,0xc8/4); // V30 + if (scanline == 0) // vblank-in irq + m_subcpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8 / 4); // V30 } -/* Machine Drivers */ + +// Machine Drivers void deadang_state::deadang(machine_config &config) { - /* basic machine hardware */ - V30(config, m_maincpu, XTAL(16'000'000)/2); /* Sony 8623h9 CXQ70116D-8 (V30 compatible) */ + // basic machine hardware + V30(config, m_maincpu, XTAL(16'000'000) / 2); // Sony 8623h9 CXQ70116D-8 (V30 compatible) m_maincpu->set_addrmap(AS_PROGRAM, &deadang_state::main_map); TIMER(config, "scantimer1").configure_scanline(FUNC(deadang_state::main_scanline), "screen", 0, 1); - V30(config, m_subcpu, XTAL(16'000'000)/2); /* Sony 8623h9 CXQ70116D-8 (V30 compatible) */ + V30(config, m_subcpu, XTAL(16'000'000) / 2); // Sony 8623h9 CXQ70116D-8 (V30 compatible) m_subcpu->set_addrmap(AS_PROGRAM, &deadang_state::sub_map); TIMER(config, "scantimer2").configure_scanline(FUNC(deadang_state::sub_scanline), "screen", 0, 1); - Z80(config, m_audiocpu, XTAL(14'318'181)/4); + Z80(config, m_audiocpu, XTAL(14'318'181) / 4); m_audiocpu->set_addrmap(AS_PROGRAM, &deadang_state::sound_map); m_audiocpu->set_addrmap(AS_OPCODES, &deadang_state::sound_decrypted_opcodes_map); m_audiocpu->set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); @@ -375,10 +804,10 @@ WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate m_screen->set_size(32*8, 32*8); m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); m_screen->set_screen_update(FUNC(deadang_state::screen_update)); @@ -387,7 +816,7 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_deadang); PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 2048); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -397,39 +826,46 @@ m_seibu_sound->ym_read_callback().set("ym1", FUNC(ym2203_device::read)); m_seibu_sound->ym_write_callback().set("ym1", FUNC(ym2203_device::write)); - ym2203_device &ym1(YM2203(config, "ym1", XTAL(14'318'181)/4)); + ym2203_device &ym1(YM2203(config, "ym1", XTAL(14'318'181) / 4)); ym1.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler)); ym1.add_route(ALL_OUTPUTS, "mono", 0.15); - ym2203_device &ym2(YM2203(config, "ym2", XTAL(14'318'181)/4)); + ym2203_device &ym2(YM2203(config, "ym2", XTAL(14'318'181) / 4)); ym2.add_route(ALL_OUTPUTS, "mono", 0.15); - SEIBU_ADPCM(config, m_adpcm1, XTAL(12'000'000)/32/48, "msm1"); - SEIBU_ADPCM(config, m_adpcm2, XTAL(12'000'000)/32/48, "msm2"); + SEIBU_ADPCM(config, m_adpcm[0], XTAL(12'000'000) / 32 / 48, "msm1"); + SEIBU_ADPCM(config, m_adpcm[1], XTAL(12'000'000) / 32 / 48, "msm2"); - msm5205_device &msm1(MSM5205(config, "msm1", XTAL(12'000'000)/32)); - msm1.vck_callback().set(m_adpcm1, FUNC(seibu_adpcm_device::msm_int)); - msm1.set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125 kHz */ + msm5205_device &msm1(MSM5205(config, "msm1", XTAL(12'000'000) / 32)); + msm1.vck_callback().set(m_adpcm[0], FUNC(seibu_adpcm_device::msm_int)); + msm1.set_prescaler_selector(msm5205_device::S48_4B); // 7.8125 kHz msm1.add_route(ALL_OUTPUTS, "mono", 0.40); - msm5205_device &msm2(MSM5205(config, "msm2", XTAL(12'000'000)/32)); - msm2.vck_callback().set(m_adpcm2, FUNC(seibu_adpcm_device::msm_int)); - msm2.set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125 kHz */ + msm5205_device &msm2(MSM5205(config, "msm2", XTAL(12'000'000) / 32)); + msm2.vck_callback().set(m_adpcm[1], FUNC(seibu_adpcm_device::msm_int)); + msm2.set_prescaler_selector(msm5205_device::S48_4B); // 7.8125 kHz msm2.add_route(ALL_OUTPUTS, "mono", 0.40); } +void deadang_state::ghunter(machine_config &config) +{ + deadang(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &deadang_state::ghunter_main_map); +} + void popnrun_state::popnrun(machine_config &config) { deadang(config); - m_maincpu->set_addrmap(AS_PROGRAM, &popnrun_state::popnrun_main_map); + m_maincpu->set_addrmap(AS_PROGRAM, &popnrun_state::main_map); - m_subcpu->set_addrmap(AS_PROGRAM, &popnrun_state::popnrun_sub_map); + m_subcpu->set_addrmap(AS_PROGRAM, &popnrun_state::sub_map); - m_audiocpu->set_addrmap(AS_PROGRAM, &popnrun_state::popnrun_sound_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &popnrun_state::sound_map); m_audiocpu->set_addrmap(AS_OPCODES, &popnrun_state::sound_decrypted_opcodes_map); - m_screen->set_screen_update(FUNC(popnrun_state::popnrun_screen_update)); + m_screen->set_screen_update(FUNC(popnrun_state::screen_update)); config.device_remove("watchdog"); @@ -445,14 +881,15 @@ m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read)); m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write)); - ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181)/4)); + ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); ymsnd.irq_handler().set(m_seibu_sound, FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(0, "mono", 0.50); ymsnd.add_route(1, "mono", 0.50); } -/* ROMs */ +// ROMs + ROM_START( popnrun ) ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_BYTE( "popnrun-27512-1-6e.bin", 0xe0001, 0x010000, CRC(cf800494) SHA1(eaed51212c91ebb16e326f8133b60a0ecf0055e5) ) @@ -466,27 +903,27 @@ ROM_LOAD( "popnrun-2764-5-22c.bin", 0x000000, 0x002000, CRC(768a2ec7) SHA1(abc02ec6c6a495e612e8708377d9e7ca98981de4) ) ROM_LOAD( "popnrun-27512-6-20c.bin", 0x010000, 0x010000, CRC(47d168ce) SHA1(36c16a400408834fcf0561c3f097e84a287560bd) ) - ROM_REGION( 0x2000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x2000, "chars", ROMREGION_ERASE00 ) ROM_LOAD( "popnrun-2764-7-1a.bin", 0x000000, 0x002000, CRC(5e508b8e) SHA1(3e49e8d25a3db83178965382295e7c437441b5fe) ) - ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD( "gfx2.bin", 0x0000, 0x80000, NO_DUMP ) // debugging fill, remove me ROM_FILL( 0x0000, 0x80000, 0x33 ) - ROM_REGION( 0x100000, "gfx3", ROMREGION_ERASE00 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", ROMREGION_ERASE00 ) // pf1 layer ROM_LOAD( "gfx3.bin", 0x0000, 0x100000, NO_DUMP ) - ROM_REGION( 0x40000, "gfx4", ROMREGION_ERASE00 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", ROMREGION_ERASE00 ) // pf2 layer ROM_LOAD( "gfx4.bin", 0x0000, 0x40000, NO_DUMP ) - ROM_REGION( 0x40000, "gfx5", ROMREGION_ERASE00) // pf3 layer + ROM_REGION( 0x40000, "tiles3", ROMREGION_ERASE00) // pf3 layer ROM_LOAD( "gfx5.bin", 0x0000, 0x40000, NO_DUMP ) - ROM_REGION16_BE( 0x10000, "gfx6", ROMREGION_ERASE00 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", ROMREGION_ERASE00 ) ROM_LOAD( "gfx6.bin", 0x0000, 0x10000, NO_DUMP ) - ROM_REGION16_BE( 0x10000, "gfx7", ROMREGION_ERASE00 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", ROMREGION_ERASE00 ) ROM_LOAD( "gfx7.bin", 0x0000, 0x10000, NO_DUMP ) ROM_REGION( 0x10000, "adpcm1", ROMREGION_ERASE00 ) @@ -510,27 +947,27 @@ ROM_LOAD( "popnrun-2764-5-22c.bin", 0x000000, 0x002000, CRC(768a2ec7) SHA1(abc02ec6c6a495e612e8708377d9e7ca98981de4) ) ROM_LOAD( "popnrun-27512-6-20c.bin", 0x010000, 0x010000, CRC(47d168ce) SHA1(36c16a400408834fcf0561c3f097e84a287560bd) ) - ROM_REGION( 0x2000, "gfx1", ROMREGION_ERASE00 ) + ROM_REGION( 0x2000, "chars", ROMREGION_ERASE00 ) ROM_LOAD( "popnrun-2764-7-1a.bin", 0x000000, 0x002000, CRC(5e508b8e) SHA1(3e49e8d25a3db83178965382295e7c437441b5fe) ) - ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD( "gfx2.bin", 0x0000, 0x80000, NO_DUMP ) // debugging fill, remove me ROM_FILL( 0x0000, 0x80000, 0x33 ) - ROM_REGION( 0x100000, "gfx3", ROMREGION_ERASE00 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", ROMREGION_ERASE00 ) // pf1 layer ROM_LOAD( "gfx3.bin", 0x0000, 0x100000, NO_DUMP ) - ROM_REGION( 0x40000, "gfx4", ROMREGION_ERASE00 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", ROMREGION_ERASE00 ) // pf2 layer ROM_LOAD( "gfx4.bin", 0x0000, 0x40000, NO_DUMP ) - ROM_REGION( 0x40000, "gfx5", ROMREGION_ERASE00) // pf3 layer + ROM_REGION( 0x40000, "tiles3", ROMREGION_ERASE00) // pf3 layer ROM_LOAD( "gfx5.bin", 0x0000, 0x40000, NO_DUMP ) - ROM_REGION16_BE( 0x10000, "gfx6", ROMREGION_ERASE00 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", ROMREGION_ERASE00 ) ROM_LOAD( "gfx6.bin", 0x0000, 0x10000, NO_DUMP ) - ROM_REGION16_BE( 0x10000, "gfx7", ROMREGION_ERASE00 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", ROMREGION_ERASE00 ) ROM_LOAD( "gfx7.bin", 0x0000, 0x10000, NO_DUMP ) ROM_REGION( 0x0100, "prom", ROMREGION_ERASE00 ) @@ -538,42 +975,42 @@ ROM_END ROM_START( deadang ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */ + ROM_REGION( 0x100000, "maincpu", 0 ) // V30 ROM_LOAD16_BYTE("2.18h", 0x0c0000, 0x10000, CRC(1bc05b7e) SHA1(21833150a1f5ab543999a67f5b3bfbaf703e5508) ) ROM_LOAD16_BYTE("4.22h", 0x0c0001, 0x10000, CRC(5751d4e7) SHA1(2e1a30c20199461fd876849f7563fef1d9a80c2d) ) ROM_LOAD16_BYTE("1.18f", 0x0e0000, 0x10000, CRC(8e7b15cc) SHA1(7e4766953c1adf04be18207a2aa6f5e861ea5f6c) ) ROM_LOAD16_BYTE("3.21f", 0x0e0001, 0x10000, CRC(e784b1fa) SHA1(3f41d31e0b36b9a2fab5e9998bb4146dfa0a97eb) ) - ROM_REGION( 0x100000, "sub", 0 ) /* v30 sub cpu */ + ROM_REGION( 0x100000, "sub", 0 ) // V30 ROM_LOAD16_BYTE("5.6b", 0x0e0000, 0x10000, CRC(9c69eb35) SHA1(d5a9714f279b71c419b4bae0f142c4cb1cc8d30e) ) ROM_LOAD16_BYTE("6.9b", 0x0e0001, 0x10000, CRC(34a44ce5) SHA1(621c69d8778d4c96ac3be06b033a5931a6a23da2) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound Z80 */ - ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) /* Encrypted */ - ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) /* Banked */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 + ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) // Encrypted + ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) // Banked - ROM_REGION( 0x08000, "gfx1", 0 ) /* Chars */ + ROM_REGION( 0x08000, "chars", 0 ) ROM_LOAD( "7.21j", 0x000000, 0x4000, CRC(fe615fcd) SHA1(d67ee5e877b937173f4c188829d5bcbd354ceb29) ) ROM_LOAD( "8.21l", 0x004000, 0x4000, CRC(905d6b27) SHA1(952f1879e6c27dc87234a4dc572e0453dc2d59fa) ) - ROM_REGION( 0x80000, "gfx2", 0 ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD( "l12", 0x000000, 0x80000, CRC(c94d5cd2) SHA1(25ded13faaed90886c9fe40f85969dab2f511e31) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", 0 ) // pf1 layer ROM_LOAD( "16n", 0x000000, 0x80000, CRC(fd70e1a5) SHA1(c3d1233f4dfe08f686ec99a556889f9ed6a21da3) ) // bank 0 (0x1000 tiles) ROM_LOAD( "16r", 0x080000, 0x80000, CRC(92f5e382) SHA1(2097b9e9bf3cd37c8613847e7aed677b5aeab7f9) ) // bank 1 (0x1000 tiles) - ROM_REGION( 0x40000, "gfx4", 0 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", 0 ) // pf2 layer ROM_LOAD( "11m", 0x000000, 0x40000, CRC(a366659a) SHA1(e2fcd82b0b2d4e3adcdf50c710984907d26acd04) ) // fixed (0x800 tiles) - ROM_REGION( 0x40000, "gfx5", 0 ) // pf3 layer + ROM_REGION( 0x40000, "tiles3", 0 ) // pf3 layer ROM_LOAD( "11k", 0x000000, 0x40000, CRC(9cf5bcc7) SHA1(cf96592e601fc373b1bf322d9b576668799130a5) ) // fixed (0x800 tiles) - ROM_REGION16_BE( 0x10000, "gfx6", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", 0 ) ROM_LOAD16_BYTE( "10.6l", 0x00000, 0x8000, CRC(ca99176b) SHA1(283e3769a1ff579c78a008b65cb8267e5770ba1f) ) ROM_LOAD16_BYTE( "9.6m", 0x00001, 0x8000, CRC(51d868ca) SHA1(3e9a4e6bc4bc68773c4ba18c5f4110e6c595d0c9) ) - ROM_REGION16_BE( 0x10000, "gfx7", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", 0 ) ROM_LOAD16_BYTE( "12.6j", 0x00000, 0x8000, CRC(2674d23f) SHA1(0533d80a23d917e20a703aeb833dcaccfa3a1967) ) ROM_LOAD16_BYTE( "11.6k", 0x00001, 0x8000, CRC(3dd4d81d) SHA1(94f0a13a8d3812f6879819ca186abf3a8665f7cb) ) @@ -585,42 +1022,42 @@ ROM_END ROM_START( leadang ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */ + ROM_REGION( 0x100000, "maincpu", 0 ) // V30 ROM_LOAD16_BYTE("2.18h", 0x0c0000, 0x10000, CRC(611247e0) SHA1(1b9ad50f67ba3a3a9e5a0d6e33f4d4be2fc20446) ) // sldh ROM_LOAD16_BYTE("4.22h", 0x0c0001, 0x10000, CRC(348c1201) SHA1(277dd77dcbc950299de0fd56a4f66db8f90752ad) ) // sldh ROM_LOAD16_BYTE("1.18f", 0x0e0000, 0x10000, CRC(fb952d71) SHA1(c6578cddf019872e6005c3a9e8e3e024d17d8c6e) ) // sldh ROM_LOAD16_BYTE("3.22f", 0x0e0001, 0x10000, CRC(2271c6df) SHA1(774a92bb698606e58d0c74ea07d7eaecf766dddf) ) - ROM_REGION( 0x100000, "sub", 0 ) /* v30 sub cpu */ + ROM_REGION( 0x100000, "sub", 0 ) // V30 ROM_LOAD16_BYTE("5.6b", 0x0e0000, 0x10000, CRC(9c69eb35) SHA1(d5a9714f279b71c419b4bae0f142c4cb1cc8d30e) ) ROM_LOAD16_BYTE("6.9b", 0x0e0001, 0x10000, CRC(34a44ce5) SHA1(621c69d8778d4c96ac3be06b033a5931a6a23da2) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound Z80 */ - ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) /* Encrypted */ - ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) /* Banked */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 + ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) // Encrypted + ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) // Banked - ROM_REGION( 0x08000, "gfx1", 0 ) /* Chars */ + ROM_REGION( 0x08000, "chars", 0 ) ROM_LOAD( "7.22k", 0x000000, 0x4000, CRC(490701e7) SHA1(2f5cbc0407d7fe41b9e7683c7531656fda7bf9f7) ) ROM_LOAD( "8.22l", 0x004000, 0x4000, CRC(18024c5e) SHA1(b02bcaa1ba6e7c188f3d2a6b20b52b2dcb8215e0) ) - ROM_REGION( 0x80000, "gfx2", 0 ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD( "l12", 0x000000, 0x80000, CRC(c94d5cd2) SHA1(25ded13faaed90886c9fe40f85969dab2f511e31) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", 0 ) // pf1 layer ROM_LOAD( "16n", 0x000000, 0x80000, CRC(fd70e1a5) SHA1(c3d1233f4dfe08f686ec99a556889f9ed6a21da3) ) // bank 0 (0x1000 tiles) ROM_LOAD( "16r", 0x080000, 0x80000, CRC(92f5e382) SHA1(2097b9e9bf3cd37c8613847e7aed677b5aeab7f9) ) // bank 1 (0x1000 tiles) - ROM_REGION( 0x40000, "gfx4", 0 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", 0 ) // pf2 layer ROM_LOAD( "11m", 0x000000, 0x40000, CRC(a366659a) SHA1(e2fcd82b0b2d4e3adcdf50c710984907d26acd04) ) // fixed (0x800 tiles) - ROM_REGION( 0x40000, "gfx5", 0 ) // pf3 layer + ROM_REGION( 0x40000, "tiles3", 0 ) // pf3 layer ROM_LOAD( "11k", 0x000000, 0x40000, CRC(9cf5bcc7) SHA1(cf96592e601fc373b1bf322d9b576668799130a5) ) // fixed (0x800 tiles) - ROM_REGION16_BE( 0x10000, "gfx6", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", 0 ) ROM_LOAD16_BYTE( "10.6l", 0x00000, 0x8000, CRC(ca99176b) SHA1(283e3769a1ff579c78a008b65cb8267e5770ba1f) ) ROM_LOAD16_BYTE( "9.6m", 0x00001, 0x8000, CRC(51d868ca) SHA1(3e9a4e6bc4bc68773c4ba18c5f4110e6c595d0c9) ) - ROM_REGION16_BE( 0x10000, "gfx7", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", 0 ) ROM_LOAD16_BYTE( "12.6j", 0x00000, 0x8000, CRC(2674d23f) SHA1(0533d80a23d917e20a703aeb833dcaccfa3a1967) ) ROM_LOAD16_BYTE( "11.6k", 0x00001, 0x8000, CRC(3dd4d81d) SHA1(94f0a13a8d3812f6879819ca186abf3a8665f7cb) ) @@ -632,42 +1069,42 @@ ROM_END ROM_START( ghunter ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */ + ROM_REGION( 0x100000, "maincpu", 0 ) // V30 ROM_LOAD16_BYTE("2.19h", 0x0c0000, 0x10000, CRC(5a511500) SHA1(69185a9efee0c3ee4d65643651eb9c613bc5f759) ) ROM_LOAD16_BYTE("4.22h", 0x0c0001, 0x10000, CRC(df5704f4) SHA1(a40848f1222253921982320155e6f7a01d2bb17f) ) // sldh ROM_LOAD16_BYTE("1.19f", 0x0e0000, 0x10000, CRC(30deb018) SHA1(099ab1f227d7e28f3e56a61d015813905a2dbc29) ) ROM_LOAD16_BYTE("3.22f", 0x0e0001, 0x10000, CRC(95f587c5) SHA1(b1431dd56200a5f849314b34daed5d3570633a77) ) // sldh - ROM_REGION( 0x100000, "sub", 0 ) /* v30 sub cpu */ + ROM_REGION( 0x100000, "sub", 0 ) // V30 ROM_LOAD16_BYTE("5.6b", 0x0e0000, 0x10000, CRC(c40bb5e5) SHA1(2a618f7db6fe6cd8d1a0e7eed91a831b721fec62) ) // sldh ROM_LOAD16_BYTE("6.10b", 0x0e0001, 0x10000, CRC(373f86a7) SHA1(6f7d219a3bc34d74fdadd812319a5387d217dffb) ) // sldh - ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound Z80 */ - ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) /* Encrypted */ - ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) /* Banked */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 + ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) // Encrypted + ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) // Banked - ROM_REGION( 0x08000, "gfx1", 0 ) /* Chars */ + ROM_REGION( 0x08000, "chars", 0 ) ROM_LOAD( "7.22k", 0x000000, 0x4000, CRC(490701e7) SHA1(2f5cbc0407d7fe41b9e7683c7531656fda7bf9f7) ) ROM_LOAD( "8.22l", 0x004000, 0x4000, CRC(18024c5e) SHA1(b02bcaa1ba6e7c188f3d2a6b20b52b2dcb8215e0) ) - ROM_REGION( 0x80000, "gfx2", 0 ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD( "l12", 0x000000, 0x80000, CRC(c94d5cd2) SHA1(25ded13faaed90886c9fe40f85969dab2f511e31) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", 0 ) // pf1 layer ROM_LOAD( "16n", 0x000000, 0x80000, CRC(fd70e1a5) SHA1(c3d1233f4dfe08f686ec99a556889f9ed6a21da3) ) // bank 0 (0x1000 tiles) ROM_LOAD( "16r", 0x080000, 0x80000, CRC(92f5e382) SHA1(2097b9e9bf3cd37c8613847e7aed677b5aeab7f9) ) // bank 1 (0x1000 tiles) - ROM_REGION( 0x40000, "gfx4", 0 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", 0 ) // pf2 layer ROM_LOAD( "11m", 0x000000, 0x40000, CRC(a366659a) SHA1(e2fcd82b0b2d4e3adcdf50c710984907d26acd04) ) // fixed (0x800 tiles) - ROM_REGION( 0x40000, "gfx5", 0 ) // pf3 layer + ROM_REGION( 0x40000, "tiles3", 0 ) // pf3 layer ROM_LOAD( "11k", 0x000000, 0x40000, CRC(9cf5bcc7) SHA1(cf96592e601fc373b1bf322d9b576668799130a5) ) // fixed (0x800 tiles) - ROM_REGION16_BE( 0x10000, "gfx6", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", 0 ) ROM_LOAD16_BYTE( "10.6l", 0x00000, 0x8000, CRC(ca99176b) SHA1(283e3769a1ff579c78a008b65cb8267e5770ba1f) ) ROM_LOAD16_BYTE( "9.6m", 0x00001, 0x8000, CRC(51d868ca) SHA1(3e9a4e6bc4bc68773c4ba18c5f4110e6c595d0c9) ) - ROM_REGION16_BE( 0x10000, "gfx7", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", 0 ) ROM_LOAD16_BYTE( "12.6j", 0x00000, 0x8000, CRC(2674d23f) SHA1(0533d80a23d917e20a703aeb833dcaccfa3a1967) ) ROM_LOAD16_BYTE( "11.6k", 0x00001, 0x8000, CRC(3dd4d81d) SHA1(94f0a13a8d3812f6879819ca186abf3a8665f7cb) ) @@ -679,42 +1116,42 @@ ROM_END ROM_START( ghunters ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */ + ROM_REGION( 0x100000, "maincpu", 0 ) // V30 ROM_LOAD16_BYTE("ggh-2.h18", 0x0c0000, 0x10000, CRC(7ccc6fee) SHA1(bccc283d82f080157f0521457b04fdd1d63caafe) ) ROM_LOAD16_BYTE("ggh-4.h22", 0x0c0001, 0x10000, CRC(d1f23ad7) SHA1(2668729af797ccab52ac2bf519d43ab2fa9e54ce) ) ROM_LOAD16_BYTE("ggh-1.f18", 0x0e0000, 0x10000, CRC(0d6ff111) SHA1(209d26170446b43d1d463737b447e30aaca614a7) ) ROM_LOAD16_BYTE("ggh-3.f22", 0x0e0001, 0x10000, CRC(66dec38d) SHA1(78dd3143265c3da90d1a0ab2c4f42b4e32716af8) ) - ROM_REGION( 0x100000, "sub", 0 ) /* v30 sub cpu */ + ROM_REGION( 0x100000, "sub", 0 ) // V30 ROM_LOAD16_BYTE("ggh-5.b6", 0x0e0000, 0x10000, CRC(1f612f3b) SHA1(71840fa0e988828a819d371f082ce31d5a5e3a30) ) ROM_LOAD16_BYTE("ggh-6.b10", 0x0e0001, 0x10000, CRC(63e18e56) SHA1(5183d0909a7c795e76540723fb710a5a75730298) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound Z80 */ - ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) /* Encrypted */ - ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) /* Banked */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 + ROM_LOAD( "13.b1", 0x000000, 0x02000, CRC(13b956fb) SHA1(f7c21ad5e988ac59073659a427b1fa66ff49b0c1) ) // Encrypted + ROM_LOAD( "14.c1", 0x010000, 0x10000, CRC(98837d57) SHA1(291769a11478291a65c959d119d19960b100d135) ) // Banked - ROM_REGION( 0x08000, "gfx1", 0 ) /* Chars */ + ROM_REGION( 0x08000, "chars", 0 ) ROM_LOAD( "7.21j", 0x000000, 0x4000, CRC(fe615fcd) SHA1(d67ee5e877b937173f4c188829d5bcbd354ceb29) ) ROM_LOAD( "8.21l", 0x004000, 0x4000, CRC(905d6b27) SHA1(952f1879e6c27dc87234a4dc572e0453dc2d59fa) ) - ROM_REGION( 0x80000, "gfx2", 0 ) /* Sprites */ + ROM_REGION( 0x80000, "sprites", 0 ) ROM_LOAD( "l12", 0x000000, 0x80000, CRC(c94d5cd2) SHA1(25ded13faaed90886c9fe40f85969dab2f511e31) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* pf1 layer */ + ROM_REGION( 0x100000, "tiles1", 0 ) // pf1 layer ROM_LOAD( "16n", 0x000000, 0x80000, CRC(fd70e1a5) SHA1(c3d1233f4dfe08f686ec99a556889f9ed6a21da3) ) // bank 0 (0x1000 tiles) ROM_LOAD( "16r", 0x080000, 0x80000, CRC(92f5e382) SHA1(2097b9e9bf3cd37c8613847e7aed677b5aeab7f9) ) // bank 1 (0x1000 tiles) - ROM_REGION( 0x40000, "gfx4", 0 ) // pf2 layer + ROM_REGION( 0x40000, "tiles2", 0 ) // pf2 layer ROM_LOAD( "11m", 0x000000, 0x40000, CRC(a366659a) SHA1(e2fcd82b0b2d4e3adcdf50c710984907d26acd04) ) // fixed (0x800 tiles) - ROM_REGION( 0x40000, "gfx5", 0 ) // pf3 layer + ROM_REGION( 0x40000, "tiles3", 0 ) // pf3 layer ROM_LOAD( "11k", 0x000000, 0x40000, CRC(9cf5bcc7) SHA1(cf96592e601fc373b1bf322d9b576668799130a5) ) // fixed (0x800 tiles) - ROM_REGION16_BE( 0x10000, "gfx6", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap1", 0 ) ROM_LOAD16_BYTE( "10.6l", 0x00000, 0x8000, CRC(ca99176b) SHA1(283e3769a1ff579c78a008b65cb8267e5770ba1f) ) ROM_LOAD16_BYTE( "9.6m", 0x00001, 0x8000, CRC(51d868ca) SHA1(3e9a4e6bc4bc68773c4ba18c5f4110e6c595d0c9) ) - ROM_REGION16_BE( 0x10000, "gfx7", 0 ) /* background map data */ + ROM_REGION16_BE( 0x10000, "bgmap2", 0 ) ROM_LOAD16_BYTE( "12.6j", 0x00000, 0x8000, CRC(2674d23f) SHA1(0533d80a23d917e20a703aeb833dcaccfa3a1967) ) ROM_LOAD16_BYTE( "11.6k", 0x00001, 0x8000, CRC(3dd4d81d) SHA1(94f0a13a8d3812f6879819ca186abf3a8665f7cb) ) @@ -725,34 +1162,24 @@ ROM_LOAD( "16.11a", 0x000000, 0x10000, CRC(a8d46fc9) SHA1(3ba51bdec4057413396a152b35015f9d95253e3f) ) ROM_END -/* Driver Initialization */ -void deadang_state::init_deadang() -{ - m_adpcm1->decrypt(); - m_adpcm2->decrypt(); -} +// Driver Initialization -void popnrun_state::init_popnrun() +void deadang_state::init_adpcm() { -// m_adpcm1->decrypt(); -// m_adpcm2->decrypt(); + m_adpcm[0]->decrypt(); + m_adpcm[1]->decrypt(); } -void deadang_state::init_ghunter() -{ - m_adpcm1->decrypt(); - m_adpcm2->decrypt(); +} // anonymous namespace - m_maincpu->space(AS_PROGRAM).install_read_handler(0x80000, 0x80001, read16smo_delegate(*this, FUNC(deadang_state::ghunter_trackball_low_r))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0xb0000, 0xb0001, read16smo_delegate(*this, FUNC(deadang_state::ghunter_trackball_high_r))); -} -/* Game Drivers */ -GAME( 1987, popnrun, 0, popnrun, deadang, popnrun_state, init_popnrun, ROT0, "Seibu Kaihatsu / Yukai Tsukai", "Pop'n Run - The Videogame (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, popnruna, popnrun, popnrun, deadang, popnrun_state, init_popnrun, ROT0, "Seibu Kaihatsu / Yukai Tsukai", "Pop'n Run - The Videogame (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +// Game Drivers + +GAME( 1987, popnrun, 0, popnrun, deadang, popnrun_state, empty_init, ROT0, "Seibu Kaihatsu / Yukai Tsukai", "Pop'n Run - The Videogame (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, popnruna, popnrun, popnrun, deadang, popnrun_state, empty_init, ROT0, "Seibu Kaihatsu / Yukai Tsukai", "Pop'n Run - The Videogame (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, deadang, 0, deadang, deadang, deadang_state, init_deadang, ROT0, "Seibu Kaihatsu", "Dead Angle", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, leadang, deadang, deadang, deadang, deadang_state, init_deadang, ROT0, "Seibu Kaihatsu", "Lead Angle (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, ghunter, deadang, deadang, ghunter, deadang_state, init_ghunter, ROT0, "Seibu Kaihatsu", "Gang Hunter / Dead Angle", MACHINE_SUPPORTS_SAVE ) // Title is 'Gang Hunter' or 'Dead Angle' depending on control method dipswitch -GAME( 1988, ghunters, deadang, deadang, ghunter, deadang_state, init_ghunter, ROT0, "Seibu Kaihatsu (SegaSA / Sonic license)", "Gang Hunter / Dead Angle (Spain)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, deadang, 0, deadang, deadang, deadang_state, init_adpcm, ROT0, "Seibu Kaihatsu", "Dead Angle", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, leadang, deadang, deadang, deadang, deadang_state, init_adpcm, ROT0, "Seibu Kaihatsu", "Lead Angle (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, ghunter, deadang, ghunter, ghunter, deadang_state, init_adpcm, ROT0, "Seibu Kaihatsu", "Gang Hunter / Dead Angle", MACHINE_SUPPORTS_SAVE ) // Title is 'Gang Hunter' or 'Dead Angle' depending on control method dipswitch +GAME( 1988, ghunters, deadang, ghunter, ghunter, deadang_state, init_adpcm, ROT0, "Seibu Kaihatsu (SegaSA / Sonic license)", "Gang Hunter / Dead Angle (Spain)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/deadang.h mame-0.264+dfsg.1/src/mame/seibu/deadang.h --- mame-0.263+dfsg.1/src/mame/seibu/deadang.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/deadang.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail, David Haywood -#ifndef MAME_SEIBU_DEADANG_H -#define MAME_SEIBU_DEADANG_H - -#pragma once - -#include "seibusound.h" - -#include "machine/timer.h" -#include "sound/ymopm.h" - -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class deadang_state : public driver_device -{ -public: - deadang_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_scroll_ram(*this, "scroll_ram"), - m_videoram(*this, "videoram"), - m_video_data(*this, "video_data"), - m_spriteram(*this, "spriteram"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_seibu_sound(*this, "seibu_sound"), - m_maincpu(*this, "maincpu"), - m_subcpu(*this, "sub"), - m_audiocpu(*this, "audiocpu"), - m_adpcm1(*this, "adpcm1"), - m_adpcm2(*this, "adpcm2") - { } - - void deadang(machine_config &config); - - void init_deadang(); - void init_ghunter(); - - void foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - TILEMAP_MAPPER_MEMBER(bg_scan); - TILE_GET_INFO_MEMBER(get_pf1_tile_info); - TILE_GET_INFO_MEMBER(get_pf3_tile_info); - TILE_GET_INFO_MEMBER(get_pf2_tile_info); - TILE_GET_INFO_MEMBER(get_text_tile_info); - -protected: - virtual void video_start() override; - - void main_map(address_map &map); - - required_shared_ptr m_scroll_ram; - required_shared_ptr m_videoram; - required_shared_ptr m_video_data; - required_shared_ptr m_spriteram; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - required_device m_seibu_sound; - - int m_tilebank = 0; - int m_oldtilebank = 0; - - tilemap_t *m_pf3_layer = nullptr; - tilemap_t *m_pf2_layer = nullptr; - tilemap_t *m_pf1_layer = nullptr; - tilemap_t *m_text_layer = nullptr; - - void text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - void sound_decrypted_opcodes_map(address_map &map); - void sound_map(address_map &map); - - required_device m_maincpu; - required_device m_subcpu; - required_device m_audiocpu; - optional_device m_adpcm1; - optional_device m_adpcm2; - - uint16_t ghunter_trackball_low_r(); - uint16_t ghunter_trackball_high_r(); - - - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - TIMER_DEVICE_CALLBACK_MEMBER(main_scanline); - TIMER_DEVICE_CALLBACK_MEMBER(sub_scanline); - void sub_map(address_map &map); -}; - -class popnrun_state : public deadang_state -{ -public: - popnrun_state(const machine_config &mconfig, device_type type, const char *tag) : - deadang_state(mconfig, type, tag) - { } - - void popnrun(machine_config &config); - - void init_popnrun(); - -protected: - virtual void video_start() override; - -private: - TILE_GET_INFO_MEMBER(get_popnrun_text_tile_info); - void popnrun_text_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void popnrun_main_map(address_map &map); - void popnrun_sub_map(address_map &map); - void popnrun_sound_map(address_map &map); - - uint32_t popnrun_screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void popnrun_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); -}; - -#endif // MAME_SEIBU_DEADANG_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/deadang_v.cpp mame-0.264+dfsg.1/src/mame/seibu/deadang_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/deadang_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/deadang_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,308 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail, David Haywood -#include "emu.h" -#include "deadang.h" -#include "screen.h" - - -/******************************************************************************/ - -void deadang_state::foreground_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_video_data[offset]); - m_pf1_layer->mark_tile_dirty(offset ); -} - -void deadang_state::text_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_videoram[offset]); - m_text_layer->mark_tile_dirty(offset ); -} - -void popnrun_state::popnrun_text_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_videoram[offset]); - m_text_layer->mark_tile_dirty(offset / 2); -} - -void deadang_state::bank_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_tilebank = data&1; - if (m_tilebank!=m_oldtilebank) - { - m_oldtilebank = m_tilebank; - m_pf1_layer->mark_all_dirty(); - } - } -} - -/******************************************************************************/ - -TILEMAP_MAPPER_MEMBER(deadang_state::bg_scan) -{ - return (col&0xf) | ((row&0xf)<<4) | ((col&0x70)<<4) | ((row&0xf0)<<7); -} - -TILE_GET_INFO_MEMBER(deadang_state::get_pf3_tile_info) -{ - const uint16_t *bgMap = (const uint16_t *)memregion("gfx6")->base(); - int code= bgMap[tile_index]; - tileinfo.set(4,code&0x7ff,code>>12,0); -} - -TILE_GET_INFO_MEMBER(deadang_state::get_pf2_tile_info) -{ - const uint16_t *bgMap = (const uint16_t *)memregion("gfx7")->base(); - int code= bgMap[tile_index]; - tileinfo.set(3,code&0x7ff,code>>12,0); -} - -TILE_GET_INFO_MEMBER(deadang_state::get_pf1_tile_info) -{ - int tile=m_video_data[tile_index]; - int color=tile >> 12; - tile=tile&0xfff; - - tileinfo.set(2,tile+m_tilebank*0x1000,color,0); -} - -TILE_GET_INFO_MEMBER(deadang_state::get_text_tile_info) -{ - int tile=(m_videoram[tile_index] & 0xff) | ((m_videoram[tile_index] >> 6) & 0x300); - int color=(m_videoram[tile_index] >> 8)&0xf; - - tileinfo.set(0,tile,color,0); -} - -void deadang_state::video_start() -{ - m_pf3_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf3_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); - m_pf2_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf2_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); - m_pf1_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf1_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_pf2_layer->set_transparent_pen(15); - m_pf1_layer->set_transparent_pen(15); - m_text_layer->set_transparent_pen(15); - - save_item(NAME(m_tilebank)); - save_item(NAME(m_oldtilebank)); -} - - -TILE_GET_INFO_MEMBER(popnrun_state::get_popnrun_text_tile_info) -{ - int tile = (m_videoram[tile_index*2+0] & 0xff) << 1; // | ((m_videoram[tile_index] >> 6) & 0x300); - int attr = (m_videoram[tile_index*2+1]); - // TODO: not entirely correct (title screen/ranking colors) - // might be down to bitplanes too - int color = (attr & 3) ^ 1; - - if(attr & 0x40) - tile |= 1; - - tileinfo.set(0,tile,color,0); -} - -void popnrun_state::video_start() -{ - m_pf3_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf3_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); - m_pf2_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf2_tile_info)), tilemap_mapper_delegate(*this, FUNC(deadang_state::bg_scan)), 16, 16, 128, 256); - m_pf1_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(deadang_state::get_pf1_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(popnrun_state::get_popnrun_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_pf2_layer->set_transparent_pen(0); - m_pf1_layer->set_transparent_pen(0); - m_text_layer->set_transparent_pen(0); - - save_item(NAME(m_tilebank)); - save_item(NAME(m_oldtilebank)); -} - - -void deadang_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int offs,fx,fy,x,y,color,sprite,pri; - - for (offs = 0; offs<0x800/2; offs+=4) - { - /* Don't draw empty sprite table entries */ - if ((m_spriteram[offs+3] & 0xff00)!=0xf00) continue; - - switch (m_spriteram[offs+2]&0xc000) { - default: - case 0xc000: pri=0; break; /* Unknown */ - case 0x8000: pri=0; break; /* Over all playfields */ - case 0x4000: pri=0xf0; break; /* Under top playfield */ - case 0x0000: pri=0xf0|0xcc; break; /* Under middle playfield */ - } - - fx= m_spriteram[offs+0]&0x2000; - fy= m_spriteram[offs+0]&0x4000; - y = m_spriteram[offs+0] & 0xff; - x = m_spriteram[offs+2] & 0xff; - if (fy) fy=0; else fy=1; - if (m_spriteram[offs+2]&0x100) x=0-(0xff-x); - - color = (m_spriteram[offs+1]>>12)&0xf; - sprite = m_spriteram[offs+1]&0xfff; - - if (flip_screen()) { - x=240-x; - y=240-y; - if (fx) fx=0; else fx=1; - if (fy) fy=0; else fy=1; - } - - m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect, - sprite, - color,fx,fy,x,y, - screen.priority(),pri,15); - } -} - -uint32_t deadang_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - /* Setup the tilemaps */ - m_pf3_layer->set_scrolly(0, ((m_scroll_ram[0x01]&0xf0)<<4)+((m_scroll_ram[0x02]&0x7f)<<1)+((m_scroll_ram[0x02]&0x80)>>7) ); - m_pf3_layer->set_scrollx(0, ((m_scroll_ram[0x09]&0xf0)<<4)+((m_scroll_ram[0x0a]&0x7f)<<1)+((m_scroll_ram[0x0a]&0x80)>>7) ); - m_pf1_layer->set_scrolly(0, ((m_scroll_ram[0x11]&0x10)<<4)+((m_scroll_ram[0x12]&0x7f)<<1)+((m_scroll_ram[0x12]&0x80)>>7) ); - m_pf1_layer->set_scrollx(0, ((m_scroll_ram[0x19]&0x10)<<4)+((m_scroll_ram[0x1a]&0x7f)<<1)+((m_scroll_ram[0x1a]&0x80)>>7) ); - m_pf2_layer->set_scrolly(0, ((m_scroll_ram[0x21]&0xf0)<<4)+((m_scroll_ram[0x22]&0x7f)<<1)+((m_scroll_ram[0x22]&0x80)>>7) ); - m_pf2_layer->set_scrollx(0, ((m_scroll_ram[0x29]&0xf0)<<4)+((m_scroll_ram[0x2a]&0x7f)<<1)+((m_scroll_ram[0x2a]&0x80)>>7) ); - - /* Control byte: - 0x01: Background playfield disable - 0x02: Middle playfield disable - 0x04: Top playfield disable - 0x08: ? Toggles at start of game - 0x10: Sprite disable - 0x20: Unused? - 0x40: Flipscreen - 0x80: Always set? - */ - m_pf3_layer->enable(!(m_scroll_ram[0x34]&1)); - m_pf1_layer->enable(!(m_scroll_ram[0x34]&2)); - m_pf2_layer->enable(!(m_scroll_ram[0x34]&4)); - flip_screen_set(m_scroll_ram[0x34]&0x40 ); - - bitmap.fill(m_palette->black_pen(), cliprect); - screen.priority().fill(0, cliprect); - m_pf3_layer->draw(screen, bitmap, cliprect, 0,1); - m_pf1_layer->draw(screen, bitmap, cliprect, 0,2); - m_pf2_layer->draw(screen, bitmap, cliprect, 0,4); - if (!(m_scroll_ram[0x34]&0x10)) draw_sprites(screen, bitmap,cliprect); - m_text_layer->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -void popnrun_state::popnrun_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int offs,fx,fy,x,y,color,sprite,pri; - - // TODO: might have more bits in either 0x3800-0x3bff or 0x3e00-0x3fff - for (offs = 0; offs<0x200/2; offs+=2) - { - /* Don't draw empty sprite table entries */ - //if ((m_spriteram[offs+3] & 0xff00)!=0xf00) continue; - - pri = 0; -#if 0 - switch (m_spriteram[offs+2]&0xc000) { - default: - case 0xc000: pri=0; break; /* Unknown */ - case 0x8000: pri=0; break; /* Over all playfields */ - case 0x4000: pri=0xf0; break; /* Under top playfield */ - case 0x0000: pri=0xf0|0xcc; break; /* Under middle playfield */ - } -#endif - - fx = m_spriteram[offs+0]&0x4000; - fy = m_spriteram[offs+0]&0x8000; - y = m_spriteram[offs+1] & 0xff; - x = (m_spriteram[offs+1] >> 8) & 0xff; -#if 0 - if (fy) fy=0; else fy=1; - if (m_spriteram[offs+2]&0x100) x=0-(0xff-x); -#endif - - color = (m_spriteram[offs+0]>>12)&0x7; - sprite = m_spriteram[offs+0]&0xfff; - -#if 0 - if (flip_screen()) { - x=240-x; - y=240-y; - if (fx) fx=0; else fx=1; - if (fy) fy=0; else fy=1; - } -#endif - - m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect, - sprite, - color,fx,fy,x,y, - screen.priority(),pri,0); - } -} - -uint32_t popnrun_state::popnrun_screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - // TODO: different scroll RAM hookup - // 0x18 seems to enable the various layers - /* Setup the tilemaps */ -// m_pf3_layer->set_scrolly(0, ((m_scroll_ram[0x01]&0xf0)<<4)+((m_scroll_ram[0x02]&0x7f)<<1)+((m_scroll_ram[0x02]&0x80)>>7) ); -// m_pf3_layer->set_scrollx(0, ((m_scroll_ram[0x09]&0xf0)<<4)+((m_scroll_ram[0x0a]&0x7f)<<1)+((m_scroll_ram[0x0a]&0x80)>>7) ); -// m_pf1_layer->set_scrolly(0, ((m_scroll_ram[0x11]&0x10)<<4)+((m_scroll_ram[0x12]&0x7f)<<1)+((m_scroll_ram[0x12]&0x80)>>7) ); -// m_pf1_layer->set_scrollx(0, ((m_scroll_ram[0x19]&0x10)<<4)+((m_scroll_ram[0x1a]&0x7f)<<1)+((m_scroll_ram[0x1a]&0x80)>>7) ); -// m_pf2_layer->set_scrolly(0, ((m_scroll_ram[0x21]&0xf0)<<4)+((m_scroll_ram[0x22]&0x7f)<<1)+((m_scroll_ram[0x22]&0x80)>>7) ); -// m_pf2_layer->set_scrollx(0, ((m_scroll_ram[0x29]&0xf0)<<4)+((m_scroll_ram[0x2a]&0x7f)<<1)+((m_scroll_ram[0x2a]&0x80)>>7) ); - - m_pf3_layer->enable(!(m_scroll_ram[0x34]&1)); - m_pf1_layer->enable(!(m_scroll_ram[0x34]&2)); - m_pf2_layer->enable(!(m_scroll_ram[0x34]&4)); -// flip_screen_set(m_scroll_ram[0x34]&0x40 ); - - bitmap.fill(1, cliprect); - screen.priority().fill(0, cliprect); - // 32 pixels? -// int scrollx = (m_scroll_ram[0x4/2] & 0x0f); - - // debug tilemap code - // this is likely to be collision data - for(int x=0;x<16;x++) - { - for(int y=0;y<8;y++) - { - int tile = m_video_data[y+x*8+0xc0] & 0xff; - int res_x, res_y; - - if(tile != 0) - { - res_x = (x*16) & 0xff; - res_y = y*32; - //if(cliprect.contains(res_x,res_y)) - bitmap.plot_box(res_x,res_y,16,16,tile+0x10); - } - - tile = m_video_data[y+x*8+0xc0] >> 8; - - if(tile != 0) - { - res_x = (x*16) & 0xff; - res_y = y*32+16; - //if(cliprect.contains(res_x,res_y)) - bitmap.plot_box(res_x,res_y,16,16,tile+0x10); - } - } - } - - //m_pf3_layer->draw(screen, bitmap, cliprect, 0,1); - //m_pf1_layer->draw(screen, bitmap, cliprect, 0,2); - //m_pf2_layer->draw(screen, bitmap, cliprect, 0,4); - if (m_scroll_ram[0x18/2]&0x1) - popnrun_draw_sprites(screen, bitmap,cliprect); - m_text_layer->draw(screen, bitmap, cliprect, 0,0); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/dynduke.cpp mame-0.264+dfsg.1/src/mame/seibu/dynduke.cpp --- mame-0.263+dfsg.1/src/mame/seibu/dynduke.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/dynduke.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -158,8 +158,6 @@ }; -// video - /******************************************************************************/ void dynduke_state::background_w(offs_t offset, uint16_t data, uint16_t mem_mask) @@ -399,8 +397,6 @@ } -// machine - // Memory Maps void dynduke_state::master_map(address_map &map) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/goal92.cpp mame-0.264+dfsg.1/src/mame/seibu/goal92.cpp --- mame-0.263+dfsg.1/src/mame/seibu/goal92.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/goal92.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - uint16_t goal92_state::fg_bank_r() { return m_fg_bank; @@ -271,8 +269,6 @@ } -// machine - uint16_t goal92_state::inputs_r(offs_t offset, uint16_t mem_mask) { switch(offset) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/kncljoe.cpp mame-0.264+dfsg.1/src/mame/seibu/kncljoe.cpp --- mame-0.263+dfsg.1/src/mame/seibu/kncljoe.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/kncljoe.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Ernesto Corvi +// copyright-holders: Ernesto Corvi + /*************************************************************************** Knuckle Joe - (c) 1985 Seibu Kaihatsu (Taito license) @@ -7,9 +8,10 @@ driver by Ernesto Corvi This board seems to be an Irem design. -The sound hardware is modified the 6803-based one used by the classic Irem -games. There's only one AY 3-8910 chip and no MSM5205. There are also two -SN76489 controlled directly by main(!) cpu, and used only for in-game music. +The sound hardware is a modified version of the 6803-based one used by the +classic Irem games. There's only one AY 3-8910 chip and no MSM5205. There +are also two SN76489 controlled directly by main(!) CPU, and used only for +in-game music. The video hardware is pretty much like Irem games too. The only strange thing is that the screen is flipped vertically. @@ -27,11 +29,290 @@ ***************************************************************************/ #include "emu.h" -#include "kncljoe.h" +#include "cpu/m6800/m6801.h" #include "cpu/z80/z80.h" +#include "machine/gen_latch.h" +#include "sound/ay8910.h" #include "sound/sn76496.h" + +#include "emupal.h" +#include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class kncljoe_state : public driver_device +{ +public: + kncljoe_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_videoram(*this, "videoram"), + m_scrollregs(*this, "scrollregs"), + m_spriteram(*this, "spriteram"), + m_maincpu(*this, "maincpu"), + m_soundcpu(*this, "soundcpu"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_ay8910(*this, "aysnd"), + m_soundlatch(*this, "soundlatch") + { } + + void kncljoe(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + +private: + required_shared_ptr m_videoram; + required_shared_ptr m_scrollregs; + required_shared_ptr m_spriteram; + + // video-related + tilemap_t *m_bg_tilemap = nullptr; + uint8_t m_tile_bank = 0U; + uint8_t m_sprite_bank = 0U; + uint8_t m_flipscreen = 0U; + + // misc + uint8_t m_port1 = 0U; + uint8_t m_port2 = 0U; + + required_device m_maincpu; + required_device m_soundcpu; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + required_device m_ay8910; + required_device m_soundlatch; + + void sound_cmd_w(uint8_t data); + void sound_irq_ack_w(uint8_t data); + void videoram_w(offs_t offset, uint8_t data); + void control_w(uint8_t data); + void scroll_w(offs_t offset, uint8_t data); + void m6803_port1_w(uint8_t data); + void m6803_port2_w(uint8_t data); + uint8_t m6803_port1_r(); + uint8_t m6803_port2_r(); + void unused_w(uint8_t data); + TILE_GET_INFO_MEMBER(get_bg_tile_info); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(sound_nmi); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +/*************************************************************************** + + Convert the color PROMs into a more useable format. + +***************************************************************************/ + +void kncljoe_state::palette(palette_device &palette) const +{ + uint8_t const *color_prom = memregion("proms")->base(); + + // create a lookup table for the palette + for (int i = 0; i < 0x80; i++) + { + int const r = pal4bit(color_prom[i + 0x000]); + int const g = pal4bit(color_prom[i + 0x100]); + int const b = pal4bit(color_prom[i + 0x200]); + + palette.set_indirect_color(i, rgb_t(r, g, b)); + } + + for (int i = 0; i < 0x10; i++) + { + int bit0, bit1, bit2; + + // red component + bit0 = 0; + bit1 = BIT(color_prom[i + 0x300], 6); + bit2 = BIT(color_prom[i + 0x300], 7); + int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + // green component + bit0 = BIT(color_prom[i + 0x300], 3); + bit1 = BIT(color_prom[i + 0x300], 4); + bit2 = BIT(color_prom[i + 0x300], 5); + int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + // blue component + bit0 = BIT(color_prom[i + 0x300], 0); + bit1 = BIT(color_prom[i + 0x300], 1); + bit2 = BIT(color_prom[i + 0x300], 2); + int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette.set_indirect_color(i + 0x80, rgb_t(r, g, b)); + } + + // color_prom now points to the beginning of the lookup table + color_prom += 0x320; + + // chars + for (int i = 0; i < 0x80; i++) + palette.set_pen_indirect(i, i); + + // sprite lookup table + for (int i = 0; i < 0x80; i++) + { + uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x80; + palette.set_pen_indirect(i + 0x80, ctabentry); + } +} + + + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +TILE_GET_INFO_MEMBER(kncljoe_state::get_bg_tile_info) +{ + int const attr = m_videoram[2 * tile_index + 1]; + int const code = m_videoram[2 * tile_index] + ((attr & 0xc0) << 2) + (m_tile_bank << 10); + + tileinfo.set(0, + code, + attr & 0xf, + TILE_FLIPXY((attr & 0x30) >> 4)); +} + + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +void kncljoe_state::video_start() +{ + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kncljoe_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + + m_bg_tilemap->set_scroll_rows(4); +} + + + +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +void kncljoe_state::videoram_w(offs_t offset, uint8_t data) +{ + m_videoram[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset / 2); +} + +void kncljoe_state::control_w(uint8_t data) +{ + /* + 0x01 screen flip + 0x02 coin counter#1 + 0x04 sprite bank + 0x10 character bank + 0x20 coin counter#2 + + reset when IN0 - Coin 1 goes low (active) + set after IN0 - Coin 1 goes high AND the credit has been added + */ + m_flipscreen = data & 0x01; + machine().tilemap().set_flip_all(m_flipscreen ? TILEMAP_FLIPX : TILEMAP_FLIPY); + + machine().bookkeeping().coin_counter_w(0, data & 0x02); + machine().bookkeeping().coin_counter_w(1, data & 0x20); + + if (m_tile_bank != BIT(data, 4)) + { + m_tile_bank = BIT(data, 4); + m_bg_tilemap->mark_all_dirty(); + } + + m_sprite_bank = BIT(data, 2); +} + +void kncljoe_state::scroll_w(offs_t offset, uint8_t data) +{ + m_scrollregs[offset] = data; + int const scrollx = m_scrollregs[0] | m_scrollregs[1] << 8; + m_bg_tilemap->set_scrollx(0, scrollx); + m_bg_tilemap->set_scrollx(1, scrollx); + m_bg_tilemap->set_scrollx(2, scrollx); + m_bg_tilemap->set_scrollx(3, 0); +} + + + +/*************************************************************************** + + Display refresh + +***************************************************************************/ + +void kncljoe_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + gfx_element *gfx = m_gfxdecode->gfx(1 + m_sprite_bank); + + for (int i = 0; i < 4; i++) + { + // clip vertical strip for each layer + rectangle clip = cliprect; + clip.min_y = m_flipscreen ? (191 - i * 64) : (i * 64 + 1); + clip.max_y = clip.min_y + 63; + clip &= cliprect; + + for (int j = 0x7c; j >= 0; j -= 4) + { + int const offs = bitswap<2>(~i, 0, 1) << 7 | j; + int sy = m_spriteram[offs] + 1; + int sx = m_spriteram[offs + 3]; + int const attr = m_spriteram[offs + 1]; + int const code = m_spriteram[offs + 2] | ((attr & 0x10) << 5) | ((attr & 0x20) << 3); + int flipx = attr & 0x40; + int flipy = !(attr & 0x80); + int const color = attr & 0x0f; + + if (m_flipscreen) + { + flipx = !flipx; + flipy = !flipy; + sx = 240 - sx; + sy = 240 - sy; + } + + if (sx >= 256 - 8) + sx -= 256; + + gfx->transpen(bitmap, clip, + code, + color, + flipx, flipy, + sx, sy, 0); + } + } +} + +uint32_t kncljoe_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect); + return 0; +} void kncljoe_state::sound_cmd_w(uint8_t data) @@ -46,20 +327,20 @@ void kncljoe_state::main_map(address_map &map) { map(0x0000, 0xbfff).rom(); - map(0xc000, 0xcfff).ram().w(FUNC(kncljoe_state::kncljoe_videoram_w)).share("videoram"); - map(0xd000, 0xd001).w(FUNC(kncljoe_state::kncljoe_scroll_w)).share("scrollregs"); + map(0xc000, 0xcfff).ram().w(FUNC(kncljoe_state::videoram_w)).share(m_videoram); + map(0xd000, 0xd001).w(FUNC(kncljoe_state::scroll_w)).share(m_scrollregs); map(0xd800, 0xd800).portr("SYSTEM"); map(0xd801, 0xd801).portr("P1"); map(0xd802, 0xd802).portr("P2"); map(0xd803, 0xd803).portr("DSWA"); map(0xd804, 0xd804).portr("DSWB"); map(0xd800, 0xd800).w(FUNC(kncljoe_state::sound_cmd_w)); - map(0xd801, 0xd801).w(FUNC(kncljoe_state::kncljoe_control_w)); + map(0xd801, 0xd801).w(FUNC(kncljoe_state::control_w)); map(0xd802, 0xd802).w("sn1", FUNC(sn76489_device::write)); map(0xd803, 0xd803).w("sn2", FUNC(sn76489_device::write)); - map(0xd807, 0xd807).nopr(); /* unknown read */ - map(0xd817, 0xd817).nopr(); /* unknown read */ - map(0xe800, 0xefff).ram().share("spriteram"); + map(0xd807, 0xd807).nopr(); // unknown read + map(0xd817, 0xd817).nopr(); // unknown read + map(0xe800, 0xefff).ram().share(m_spriteram); map(0xf000, 0xffff).ram(); } @@ -99,7 +380,7 @@ void kncljoe_state::unused_w(uint8_t data) { - // unused - no MSM on the pcb + // unused - no MSM on the PCB } void kncljoe_state::sound_map(address_map &map) @@ -207,9 +488,9 @@ }; static GFXDECODE_START( gfx_kncljoe ) - GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x3_planar, 0x00, 16 ) /* colors 0x00-0x7f direct mapped */ - GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0x80, 16 ) /* colors 0x80-0x8f with lookup table */ - GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x80, 16 ) + GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x3_planar, 0x00, 16 ) // colors 0x00-0x7f direct mapped + GFXDECODE_ENTRY( "sprites1", 0, spritelayout, 0x80, 16 ) // colors 0x80-0x8f with lookup table + GFXDECODE_ENTRY( "sprites2", 0, spritelayout, 0x80, 16 ) GFXDECODE_END @@ -238,12 +519,12 @@ void kncljoe_state::kncljoe(machine_config &config) { - /* basic machine hardware */ - Z80(config, m_maincpu, XTAL(6'000'000)); /* verified on pcb */ + // basic machine hardware + Z80(config, m_maincpu, XTAL(6'000'000)); // verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &kncljoe_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(kncljoe_state::irq0_line_hold)); - M6803(config, m_soundcpu, XTAL(3'579'545)); /* verified on pcb */ + M6803(config, m_soundcpu, XTAL(3'579'545)); // verified on PCB m_soundcpu->set_addrmap(AS_PROGRAM, &kncljoe_state::sound_map); m_soundcpu->in_p1_cb().set(FUNC(kncljoe_state::m6803_port1_r)); m_soundcpu->out_p1_cb().set(FUNC(kncljoe_state::m6803_port1_w)); @@ -251,32 +532,32 @@ m_soundcpu->out_p2_cb().set(FUNC(kncljoe_state::m6803_port2_w)); m_soundcpu->set_periodic_int(FUNC(kncljoe_state::sound_nmi), attotime::from_hz(3970)); // measured 3.970 kHz - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1500)); m_screen->set_size(32*8, 32*8); m_screen->set_visarea(1*8, 31*8-1, 0*8, 32*8-1); - m_screen->set_screen_update(FUNC(kncljoe_state::screen_update_kncljoe)); + m_screen->set_screen_update(FUNC(kncljoe_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_kncljoe); - PALETTE(config, m_palette, FUNC(kncljoe_state::kncljoe_palette), 16*8+16*8, 128+16); + PALETTE(config, m_palette, FUNC(kncljoe_state::palette), 16*8+16*8, 128+16); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, m_soundlatch); - AY8910(config, m_ay8910, XTAL(3'579'545)/4); /* verified on pcb */ + AY8910(config, m_ay8910, XTAL(3'579'545) / 4); // verified on PCB m_ay8910->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read)); m_ay8910->port_b_write_callback().set(FUNC(kncljoe_state::unused_w)); m_ay8910->add_route(ALL_OUTPUTS, "mono", 0.30); - SN76489(config, "sn1", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */ + SN76489(config, "sn1", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); // verified on PCB - SN76489(config, "sn2", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */ + SN76489(config, "sn2", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); // verified on PCB } @@ -287,30 +568,30 @@ ROM_LOAD( "kj-2.bin", 0x4000, 0x4000, CRC(cb11514b) SHA1(c75d4019d1617493ff074ce8187a81ad70d9b60c) ) ROM_LOAD( "kj-3.bin", 0x8000, 0x4000, CRC(0f50697b) SHA1(412c6aba270824299ca2a74e9bea42b83e69797b) ) - ROM_REGION( 0x8000, "soundcpu", 0 ) /* 64k for audio code */ + ROM_REGION( 0x8000, "soundcpu", 0 ) ROM_LOAD( "kj-13.bin",0x6000, 0x2000, CRC(0a0be3f5) SHA1(00be47fc76500843b6f5de63622edb1748ef5f7d) ) - ROM_REGION( 0xc000, "gfx1", 0 ) /* tiles */ + ROM_REGION( 0xc000, "tiles", 0 ) ROM_LOAD( "kj-10.bin", 0x0000, 0x4000, CRC(74d3ba33) SHA1(c7887d690cb7f7a7b24d59d490ffc088fb6cc49c) ) ROM_LOAD( "kj-11.bin", 0x4000, 0x4000, CRC(8ea01455) SHA1(b4b42fe373a1019b4f2a4b763a8a7219a5c9987e) ) ROM_LOAD( "kj-12.bin", 0x8000, 0x4000, CRC(33367c41) SHA1(e6c56bcad008f3af4bc0f7d7afe8e23c8eb9d943) ) - ROM_REGION( 0x18000, "gfx2", 0 ) /* sprites */ + ROM_REGION( 0x18000, "sprites1", 0 ) ROM_LOAD( "kj-4.bin", 0x00000, 0x8000, CRC(a499ea10) SHA1(cb671cc75b3c6029dd3529e62d83025f78b45271) ) ROM_LOAD( "kj-6.bin", 0x08000, 0x8000, CRC(815f5c0a) SHA1(ad0b59eeebb2e57035a3f643ac0ef575569bec0f) ) ROM_LOAD( "kj-5.bin", 0x10000, 0x8000, CRC(11111759) SHA1(504c62fc6778a4afa86cba69634652708535bef6) ) - ROM_REGION( 0xc000, "gfx3", 0 ) /* sprites */ + ROM_REGION( 0xc000, "sprites2", 0 ) ROM_LOAD( "kj-7.bin", 0x0000, 0x4000, CRC(121fcccb) SHA1(77f3e7e49787d6a893c5d8c0c3ac612b1180e866) ) ROM_LOAD( "kj-9.bin", 0x4000, 0x4000, CRC(affbe3eb) SHA1(056111fc5b04ff14b114b5f724d02789c8e3ee10) ) ROM_LOAD( "kj-8.bin", 0x8000, 0x4000, CRC(e057e72a) SHA1(3a85750c72caaa027f302dc6ca4086bdbd49b5ff) ) ROM_REGION( 0x420, "proms", 0 ) - ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) /* tile red */ - ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) /* tile green */ - ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) /* tile blue */ - ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) /* sprite palette */ - ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) /* sprite clut */ + ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) // tile red + ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) // tile green + ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) // tile blue + ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) // sprite palette + ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) // sprite clut ROM_END ROM_START( kncljoea ) @@ -319,30 +600,30 @@ ROM_LOAD( "kj-2.bin", 0x4000, 0x4000, CRC(cb11514b) SHA1(c75d4019d1617493ff074ce8187a81ad70d9b60c) ) ROM_LOAD( "kj-3.bin", 0x8000, 0x4000, CRC(0f50697b) SHA1(412c6aba270824299ca2a74e9bea42b83e69797b) ) - ROM_REGION( 0x8000, "soundcpu", 0 ) /* 64k for audio code */ + ROM_REGION( 0x8000, "soundcpu", 0 ) ROM_LOAD( "kj-13.bin",0x6000, 0x2000, CRC(0a0be3f5) SHA1(00be47fc76500843b6f5de63622edb1748ef5f7d) ) - ROM_REGION( 0xc000, "gfx1", 0 ) /* tiles */ + ROM_REGION( 0xc000, "tiles", 0 ) ROM_LOAD( "kj-10.bin", 0x0000, 0x4000, CRC(74d3ba33) SHA1(c7887d690cb7f7a7b24d59d490ffc088fb6cc49c) ) ROM_LOAD( "kj-11.bin", 0x4000, 0x4000, CRC(8ea01455) SHA1(b4b42fe373a1019b4f2a4b763a8a7219a5c9987e) ) ROM_LOAD( "kj-12.bin", 0x8000, 0x4000, CRC(33367c41) SHA1(e6c56bcad008f3af4bc0f7d7afe8e23c8eb9d943) ) - ROM_REGION( 0x18000, "gfx2", 0 ) /* sprites */ + ROM_REGION( 0x18000, "sprites1", 0 ) ROM_LOAD( "kj-4.bin", 0x00000, 0x8000, CRC(a499ea10) SHA1(cb671cc75b3c6029dd3529e62d83025f78b45271) ) ROM_LOAD( "kj-6.bin", 0x08000, 0x8000, CRC(815f5c0a) SHA1(ad0b59eeebb2e57035a3f643ac0ef575569bec0f) ) ROM_LOAD( "kj-5.bin", 0x10000, 0x8000, CRC(11111759) SHA1(504c62fc6778a4afa86cba69634652708535bef6) ) - ROM_REGION( 0xc000, "gfx3", 0 ) /* sprites */ + ROM_REGION( 0xc000, "sprites2", 0 ) ROM_LOAD( "kj-7.bin", 0x0000, 0x4000, CRC(121fcccb) SHA1(77f3e7e49787d6a893c5d8c0c3ac612b1180e866) ) ROM_LOAD( "kj-9.bin", 0x4000, 0x4000, CRC(affbe3eb) SHA1(056111fc5b04ff14b114b5f724d02789c8e3ee10) ) ROM_LOAD( "kj-8.bin", 0x8000, 0x4000, CRC(e057e72a) SHA1(3a85750c72caaa027f302dc6ca4086bdbd49b5ff) ) ROM_REGION( 0x420, "proms", 0 ) - ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) /* tile red */ - ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) /* tile green */ - ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) /* tile blue */ - ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) /* sprite palette */ - ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) /* sprite clut */ + ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) // tile red + ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) // tile green + ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) // tile blue + ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) // sprite palette + ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) // sprite clut ROM_END ROM_START( bcrusher ) @@ -351,34 +632,35 @@ ROM_LOAD( "bcrush2.bin", 0x4000, 0x4000, CRC(1be4c731) SHA1(11f3a33263d66172902dfb6f3fe2d0ab5cad38d7) ) ROM_LOAD( "bcrush3.bin", 0x8000, 0x4000, CRC(0772d993) SHA1(430f0319bd4765add2f1ee197e7217fdf9ae79c8) ) - ROM_REGION( 0x8000, "soundcpu", 0 ) /* 64k for audio code */ + ROM_REGION( 0x8000, "soundcpu", 0 ) ROM_LOAD( "kj-13.bin",0x6000, 0x2000, CRC(0a0be3f5) SHA1(00be47fc76500843b6f5de63622edb1748ef5f7d) ) - ROM_REGION( 0xc000, "gfx1", 0 ) /* tiles */ + ROM_REGION( 0xc000, "tiles", 0 ) ROM_LOAD( "bcrush10.bin", 0x0000, 0x4000, CRC(a62f4572) SHA1(4e38e175e25a955e5f83cac8c935163e2e861e94) ) ROM_LOAD( "bcrush11.bin", 0x4000, 0x4000, CRC(79cc5644) SHA1(bc356065a2475d0e0921fc5c84fa46f6629caae7) ) ROM_LOAD( "bcrush12.bin", 0x8000, 0x4000, CRC(8f09641d) SHA1(5ccc423b15148d96c0a348d41a3f4fff7bbae7b9) ) - ROM_REGION( 0x18000, "gfx2", 0 ) /* sprites */ + ROM_REGION( 0x18000, "sprites1", 0 ) ROM_LOAD( "kj-4.bin", 0x00000, 0x8000, CRC(a499ea10) SHA1(cb671cc75b3c6029dd3529e62d83025f78b45271) ) ROM_LOAD( "kj-6.bin", 0x08000, 0x8000, CRC(815f5c0a) SHA1(ad0b59eeebb2e57035a3f643ac0ef575569bec0f) ) ROM_LOAD( "kj-5.bin", 0x10000, 0x8000, CRC(11111759) SHA1(504c62fc6778a4afa86cba69634652708535bef6) ) - ROM_REGION( 0xc000, "gfx3", 0 ) /* sprites */ + ROM_REGION( 0xc000, "sprites2", 0 ) ROM_LOAD( "kj-7.bin", 0x0000, 0x4000, CRC(121fcccb) SHA1(77f3e7e49787d6a893c5d8c0c3ac612b1180e866) ) ROM_LOAD( "kj-9.bin", 0x4000, 0x4000, CRC(affbe3eb) SHA1(056111fc5b04ff14b114b5f724d02789c8e3ee10) ) ROM_LOAD( "kj-8.bin", 0x8000, 0x4000, CRC(e057e72a) SHA1(3a85750c72caaa027f302dc6ca4086bdbd49b5ff) ) ROM_REGION( 0x420, "proms", 0 ) - ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) /* tile red */ - ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) /* tile green */ - ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) /* tile blue */ - ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) /* sprite palette */ - ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) /* sprite clut */ + ROM_LOAD( "kjclr1.bin", 0x000, 0x100, CRC(c3378ac2) SHA1(264fdc0718b36e02fc1fc1064a9566e349f4bf25) ) // tile red + ROM_LOAD( "kjclr2.bin", 0x100, 0x100, CRC(2126da97) SHA1(6ca394a5977fab72200a00716a1f25f2a9447896) ) // tile green + ROM_LOAD( "kjclr3.bin", 0x200, 0x100, CRC(fde62164) SHA1(d0f6b8d0dce63ce592a5f0c9dc8e6260f69a9141) ) // tile blue + ROM_LOAD( "kjprom5.bin", 0x300, 0x020, CRC(5a81dd9f) SHA1(090ec9135b12e85ed02ab71fca55cc8d1ea8215a) ) // sprite palette + ROM_LOAD( "kjprom4.bin", 0x320, 0x100, CRC(48dc2066) SHA1(b8007a5115d475b535284965681ae341f819d3db) ) // sprite clut ROM_END +} // anonymous namespace GAME( 1985, kncljoe, 0, kncljoe, kncljoe, kncljoe_state, empty_init, ROT0, "Seibu Kaihatsu (Taito license)", "Knuckle Joe (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, kncljoea, kncljoe, kncljoe, kncljoe, kncljoe_state, empty_init, ROT0, "Seibu Kaihatsu (Taito license)", "Knuckle Joe (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, bcrusher, kncljoe, kncljoe, kncljoe, kncljoe_state, empty_init, ROT0, "bootleg", "Bone Crusher", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, bcrusher, kncljoe, kncljoe, kncljoe, kncljoe_state, empty_init, ROT0, "bootleg", "Bone Crusher", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/kncljoe.h mame-0.264+dfsg.1/src/mame/seibu/kncljoe.h --- mame-0.263+dfsg.1/src/mame/seibu/kncljoe.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/kncljoe.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ernesto Corvi -/************************************************************************* - - Knuckle Joe - -*************************************************************************/ - -#ifndef MAME_SEIBU_KNCLJOE_H -#define MAME_SEIBU_KNCLJOE_H - -#pragma once - -#include "cpu/m6800/m6801.h" -#include "machine/gen_latch.h" -#include "sound/ay8910.h" - -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class kncljoe_state : public driver_device -{ -public: - kncljoe_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), - m_scrollregs(*this, "scrollregs"), - m_spriteram(*this, "spriteram"), - m_maincpu(*this, "maincpu"), - m_soundcpu(*this, "soundcpu"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_ay8910(*this, "aysnd"), - m_soundlatch(*this, "soundlatch") - { } - - void kncljoe(machine_config &config); - -private: - /* memory pointers */ - required_shared_ptr m_videoram; - required_shared_ptr m_scrollregs; - required_shared_ptr m_spriteram; - - /* video-related */ - tilemap_t *m_bg_tilemap = nullptr; - int m_tile_bank = 0; - int m_sprite_bank = 0; - int m_flipscreen = 0; - - /* misc */ - uint8_t m_port1 = 0U; - uint8_t m_port2 = 0U; - - /* devices */ - required_device m_maincpu; - required_device m_soundcpu; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - required_device m_ay8910; - required_device m_soundlatch; - - void sound_cmd_w(uint8_t data); - void sound_irq_ack_w(uint8_t data); - void kncljoe_videoram_w(offs_t offset, uint8_t data); - void kncljoe_control_w(uint8_t data); - void kncljoe_scroll_w(offs_t offset, uint8_t data); - void m6803_port1_w(uint8_t data); - void m6803_port2_w(uint8_t data); - uint8_t m6803_port1_r(); - uint8_t m6803_port2_r(); - void unused_w(uint8_t data); - TILE_GET_INFO_MEMBER(get_bg_tile_info); - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - void kncljoe_palette(palette_device &palette) const; - uint32_t screen_update_kncljoe(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(sound_nmi); - void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); - void main_map(address_map &map); - void sound_map(address_map &map); -}; - -#endif // MAME_SEIBU_KNCLJOE_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/kncljoe_v.cpp mame-0.264+dfsg.1/src/mame/seibu/kncljoe_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/kncljoe_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/kncljoe_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,214 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ernesto Corvi -/*************************************************************************** - - Knuckle Joe - -***************************************************************************/ - -#include "emu.h" -#include "kncljoe.h" - - -/*************************************************************************** - - Convert the color PROMs into a more useable format. - -***************************************************************************/ - -void kncljoe_state::kncljoe_palette(palette_device &palette) const -{ - uint8_t const *color_prom = memregion("proms")->base(); - - // create a lookup table for the palette - for (int i = 0; i < 0x80; i++) - { - int const r = pal4bit(color_prom[i + 0x000]); - int const g = pal4bit(color_prom[i + 0x100]); - int const b = pal4bit(color_prom[i + 0x200]); - - palette.set_indirect_color(i, rgb_t(r, g, b)); - } - - for (int i = 0; i < 0x10; i++) - { - int bit0, bit1, bit2; - - // red component - bit0 = 0; - bit1 = BIT(color_prom[i + 0x300], 6); - bit2 = BIT(color_prom[i + 0x300], 7); - int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - - // green component - bit0 = BIT(color_prom[i + 0x300], 3); - bit1 = BIT(color_prom[i + 0x300], 4); - bit2 = BIT(color_prom[i + 0x300], 5); - int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - - // blue component - bit0 = BIT(color_prom[i + 0x300], 0); - bit1 = BIT(color_prom[i + 0x300], 1); - bit2 = BIT(color_prom[i + 0x300], 2); - int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - - palette.set_indirect_color(i + 0x80, rgb_t(r, g, b)); - } - - // color_prom now points to the beginning of the lookup table - color_prom += 0x320; - - // chars - for (int i = 0; i < 0x80; i++) - palette.set_pen_indirect(i, i); - - // sprite lookup table - for (int i = 0; i < 0x80; i++) - { - uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x80; - palette.set_pen_indirect(i + 0x80, ctabentry); - } -} - - - -/*************************************************************************** - - Callbacks for the TileMap code - -***************************************************************************/ - -TILE_GET_INFO_MEMBER(kncljoe_state::get_bg_tile_info) -{ - int attr = m_videoram[2 * tile_index + 1]; - int code = m_videoram[2 * tile_index] + ((attr & 0xc0) << 2) + (m_tile_bank << 10); - - tileinfo.set(0, - code, - attr & 0xf, - TILE_FLIPXY((attr & 0x30) >> 4)); -} - - - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -void kncljoe_state::video_start() -{ - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kncljoe_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - - m_bg_tilemap->set_scroll_rows(4); -} - - - -/*************************************************************************** - - Memory handlers - -***************************************************************************/ - -void kncljoe_state::kncljoe_videoram_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - m_bg_tilemap->mark_tile_dirty(offset / 2); -} - -void kncljoe_state::kncljoe_control_w(uint8_t data) -{ - /* - 0x01 screen flip - 0x02 coin counter#1 - 0x04 sprite bank - 0x10 character bank - 0x20 coin counter#2 - - reset when IN0 - Coin 1 goes low (active) - set after IN0 - Coin 1 goes high AND the credit has been added - */ - m_flipscreen = data & 0x01; - machine().tilemap().set_flip_all(m_flipscreen ? TILEMAP_FLIPX : TILEMAP_FLIPY); - - machine().bookkeeping().coin_counter_w(0, data & 0x02); - machine().bookkeeping().coin_counter_w(1, data & 0x20); - - if (m_tile_bank != BIT(data, 4)) - { - m_tile_bank = BIT(data, 4); - m_bg_tilemap->mark_all_dirty(); - } - - m_sprite_bank = BIT(data, 2); -} - -void kncljoe_state::kncljoe_scroll_w(offs_t offset, uint8_t data) -{ - m_scrollregs[offset] = data; - int scrollx = m_scrollregs[0] | m_scrollregs[1] << 8; - m_bg_tilemap->set_scrollx(0, scrollx); - m_bg_tilemap->set_scrollx(1, scrollx); - m_bg_tilemap->set_scrollx(2, scrollx); - m_bg_tilemap->set_scrollx(3, 0); -} - - - -/*************************************************************************** - - Display refresh - -***************************************************************************/ - -void kncljoe_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) -{ - gfx_element *gfx = m_gfxdecode->gfx(1 + m_sprite_bank); - - for (int i = 0; i < 4; i++) - { - // clip vertical strip for each layer - rectangle clip = cliprect; - clip.min_y = m_flipscreen ? (191 - i * 64) : (i * 64 + 1); - clip.max_y = clip.min_y + 63; - clip &= cliprect; - - for (int j = 0x7c; j >= 0; j -= 4) - { - int offs = bitswap<2>(~i, 0, 1) << 7 | j; - int sy = m_spriteram[offs] + 1; - int sx = m_spriteram[offs + 3]; - int attr = m_spriteram[offs + 1]; - int code = m_spriteram[offs + 2] | ((attr & 0x10) << 5) | ((attr & 0x20) << 3); - int flipx = attr & 0x40; - int flipy = !(attr & 0x80); - int color = attr & 0x0f; - - if (m_flipscreen) - { - flipx = !flipx; - flipy = !flipy; - sx = 240 - sx; - sy = 240 - sy; - } - - if (sx >= 256-8) - sx -= 256; - - gfx->transpen(bitmap,clip, - code, - color, - flipx,flipy, - sx,sy,0); - } - } -} - -uint32_t kncljoe_state::screen_update_kncljoe(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_sprites(bitmap, cliprect); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/mustache.cpp mame-0.264+dfsg.1/src/mame/seibu/mustache.cpp --- mame-0.263+dfsg.1/src/mame/seibu/mustache.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/mustache.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -95,8 +95,6 @@ }; -// video - void mustache_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset] = data; @@ -194,8 +192,6 @@ } -// machine - void mustache_state::memmap(address_map &map) { map(0x0000, 0x7fff).r("sei80bu", FUNC(sei80bu_device::data_r)); diff -Nru mame-0.263+dfsg.1/src/mame/seibu/raiden.cpp mame-0.264+dfsg.1/src/mame/seibu/raiden.cpp --- mame-0.263+dfsg.1/src/mame/seibu/raiden.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/raiden.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,6 +1,7 @@ // license:BSD-3-Clause -// copyright-holders:Bryan McPhail -// thanks-to:Oliver Bergmann,Randy Mongenel (for initial CPU core) +// copyright-holders: Bryan McPhail +// thanks-to: Oliver Bergmann, Randy Mongenel (for initial CPU core) + /*************************************************************************** Seibu Raiden hardware @@ -10,13 +11,13 @@ To access test mode, reset with both start buttons held. There are 3 configuration bytes at 0xffffb, 0xffffd and 0xfffff. - The byte at 0xffffb (0x1fffd in program rom 4) controls the appearance of + The byte at 0xffffb (0x1fffd in program ROM 4) controls the appearance of the "Winners Don't Use Drugs" screen: 0x00 = Normal 0x01 = "Winners Don't Use Drugs" screen appears on boot and between attract loops 0x02 = Unknown, identical to 0x00? (seen in raident and raidenk) - The byte at 0xffffd (0x1fffe in program rom 4) in the main cpu region controls the + The byte at 0xffffd (0x1fffe in program ROM 4) in the main CPU region controls the country/game mode: bit 7 = if set, respawn instantly; else restart at checkpoint bit 5 = unknown (seen in raidenk) @@ -35,7 +36,7 @@ 0x*8 = Greece version 0x*9 = Union Trading Co. license - The byte at 0xfffff (0x1ffff in program rom 4) controls whether invincibility is enabled: + The byte at 0xfffff (0x1ffff in program ROM 4) controls whether invincibility is enabled: 0x00 = Disabled 0xFF = Enabled On sets with the newer hardware, any non-zero value can be used, but setting SW1:7 to On @@ -91,15 +92,380 @@ ***************************************************************************/ #include "emu.h" -#include "raiden.h" + +#include "seibu_crtc.h" +#include "seibusound.h" #include "cpu/nec/nec.h" #include "cpu/z80/z80.h" #include "sound/okim6295.h" #include "sound/ymopl.h" -#include "seibu_crtc.h" +#include "video/bufsprite.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class raiden_state : public driver_device, public seibu_sound_common +{ +public: + raiden_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_seibu_sound(*this, "seibu_sound"), + m_subcpu(*this, "sub"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_spriteram(*this, "spriteram"), + m_shared_ram(*this, "shared_ram"), + m_textram(*this, "textram"), + m_scroll_ram(*this, "scroll_ram"), + m_bgram(*this, "bgram"), + m_fgram(*this, "fgram") + { } + + void raidene(machine_config &config); + void raiden(machine_config &config); + void raidenkb(machine_config &config); + void raidenu(machine_config &config); + + void init_decryption(); + +protected: + required_device m_maincpu; + required_device m_seibu_sound; + + bool m_bg_layer_enabled = 0; + bool m_fg_layer_enabled = 0; + bool m_tx_layer_enabled = 0; + bool m_sp_layer_enabled = 0; + bool m_flipscreen = 0; + + virtual void video_start() override; + + u32 screen_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *scrollregs); + + void textram_w(offs_t offset, u16 data, u16 mem_mask = ~0); + + void common_video_start(); + + required_device m_subcpu; + required_device m_gfxdecode; + required_device m_palette; + required_device m_spriteram; + + required_shared_ptr m_shared_ram; + required_shared_ptr m_textram; + optional_shared_ptr m_scroll_ram; + required_shared_ptr m_bgram; + required_shared_ptr m_fgram; + + tilemap_t *m_bg_layer = nullptr; + tilemap_t *m_fg_layer = nullptr; + tilemap_t *m_tx_layer = nullptr; + + void bgram_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void fgram_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void control_w(u8 data); + + TILE_GET_INFO_MEMBER(get_back_tile_info); + TILE_GET_INFO_MEMBER(get_fore_tile_info); + TILE_GET_INFO_MEMBER(get_text_tile_info); + + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void vblank_irq(int state); + + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap); + + void main_map(address_map &map); + void sub_map(address_map &map); + void raiden_sound_map(address_map &map); + void raiden_sound_decrypted_opcodes_map(address_map &map); + void raidenu_main_map(address_map &map); + void raidenu_sub_map(address_map &map); + void sei80bu_encrypted_full_map(address_map &map); +}; + + +class raidenb_state : public raiden_state +{ +public: + using raiden_state::raiden_state; + + void raidenb(machine_config &config); + +protected: + virtual void video_start() override; + +private: + u16 m_scroll_ram[6]; + + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void control_w(u8 data); + void layer_enable_w(u16 data); + void layer_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); + + void main_map(address_map &map); +}; + + +/******************************************************************************/ + +void raiden_state::bgram_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_bgram[offset]); + m_bg_layer->mark_tile_dirty(offset); +} + +void raiden_state::fgram_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_fgram[offset]); + m_fg_layer->mark_tile_dirty(offset); +} + +void raiden_state::textram_w(offs_t offset, u16 data, u16 mem_mask) +{ + COMBINE_DATA(&m_textram[offset]); + m_tx_layer->mark_tile_dirty(offset); +} + + +void raiden_state::control_w(u8 data) +{ + // d0: back layer disable + // d1: fore layer disable + // d2: text layer disable + // d3: sprite layer disable + // d4: unused + // d5: unused + // d6: flipscreen + // d7: toggles, maybe spriteram bank? (for buffering) + m_bg_layer_enabled = BIT(~data, 0); + m_fg_layer_enabled = BIT(~data, 1); + m_tx_layer_enabled = BIT(~data, 2); + m_sp_layer_enabled = BIT(~data, 3); + + m_flipscreen = BIT(data, 6); + machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); +} + +void raidenb_state::control_w(u8 data) +{ + // d1: flipscreen + // d2: toggles, maybe spriteram bank? (for buffering) + // d3: text layer disable (I guess raidenb textlayer isn't part of sei_crtc?) + // other bits: unused + m_tx_layer_enabled = BIT(~data, 3); + + m_flipscreen = BIT(data, 1); + machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); +} + +void raidenb_state::layer_enable_w(u16 data) +{ + // d0: back layer disable + // d1: fore layer disable + // d4: sprite layer disable + // other bits: unused? (d2-d3 always set, d5-d7 always clear) + m_bg_layer_enabled = BIT(~data, 0); + m_fg_layer_enabled = BIT(~data, 1); + m_sp_layer_enabled = BIT(~data, 4); +} + + +/******************************************************************************/ + +void raiden_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap) +{ + if (!m_sp_layer_enabled) + return; + + u16 *sprites = m_spriteram->buffer(); + const u32 size = m_spriteram->bytes() / 2; + gfx_element *gfx = m_gfxdecode->gfx(3); + + for (int offs = 0; offs < size; offs += 4) + { + /* + Word #0 + x------- -------- active + -x------ -------- flipy + --x----- -------- flipx + ---x---- -------- unused + ----xxxx -------- color + -------- xxxxxxxx y + + Word #1 + x------- -------- ? (set when groundboss explodes) + -xxx---- -------- unused + ----xxxx xxxxxxxx code + + Word #2 + xx------ -------- priority + --xxxxx- -------- unused + -------x xxxxxxxx x (signed) + + Word #3 unused + */ + + if (!BIT(sprites[offs + 0], 15)) + continue; + + const u8 priority = BIT(sprites[offs + 2], 14, 2); + if (priority == 0) + continue; + + u32 pri_mask = GFX_PMASK_4 | GFX_PMASK_2 | GFX_PMASK_1; + switch (priority) + { + case 1: // draw sprites underneath foreground + pri_mask = GFX_PMASK_4 | GFX_PMASK_2; + break; + case 2: + case 3: // rest of sprites, draw underneath text + default: + pri_mask = GFX_PMASK_4; + break; + } + + bool flipy = BIT(sprites[offs + 0], 14); + bool flipx = BIT(sprites[offs + 0], 13); + const u32 color = BIT(sprites[offs + 0], 8, 4); + const u32 code = BIT(sprites[offs + 1], 0, 12); + + s32 y = BIT(sprites[offs + 0], 0, 8); + s32 x = BIT(sprites[offs + 2], 0, 9); + if (BIT(x, 8)) // sign bit + x |= ~0x1ff; + + if (m_flipscreen) + { + x = 240 - x; + y = 240 - y; + flipy = !flipy; + flipx = !flipx; + } + + gfx->prio_transpen(bitmap, cliprect, code, color, flipx, flipy, x, y, primap, pri_mask, 15); + } +} + +u32 raiden_state::screen_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *scrollregs) +{ + // set tilemaps scroll + m_bg_layer->set_scrollx(0, scrollregs[0]); + m_bg_layer->set_scrolly(0, scrollregs[1]); + m_fg_layer->set_scrollx(0, scrollregs[2]); + m_fg_layer->set_scrolly(0, scrollregs[3]); + + screen.priority().fill(0, cliprect); + bitmap.fill(m_palette->black_pen(), cliprect); + + // back layer + if (m_bg_layer_enabled) + m_bg_layer->draw(screen, bitmap, cliprect, 0, 1); + + // fore layer + if (m_fg_layer_enabled) + m_fg_layer->draw(screen, bitmap, cliprect, 0, 2); + + // text layer + if (m_tx_layer_enabled) + m_tx_layer->draw(screen, bitmap, cliprect, 0, 4); + + draw_sprites(bitmap, cliprect, screen.priority()); + + return 0; +} + +u32 raiden_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // set up scrollregs + // scroll_ram is only 8 bits wide. 4 bytes per scroll, skip uneven ones + // 00-03: 28 *0 ** ae - bg layer scroll y + // 08-0b: 28 *0 ** b9 - bg layer scroll x + // 10-13: 28 *0 ** ae - fg layer scroll y + // 18-1b: 28 *0 ** b9 - fg layer scroll x + u16 scrollregs[4]; + scrollregs[0] = ((m_scroll_ram[0x09] & 0xf0) << 4) | ((m_scroll_ram[0x0a] & 0x7f) << 1) | ((m_scroll_ram[0x0a] & 0x80) >> 7); + scrollregs[1] = ((m_scroll_ram[0x01] & 0xf0) << 4) | ((m_scroll_ram[0x02] & 0x7f) << 1) | ((m_scroll_ram[0x02] & 0x80) >> 7); + scrollregs[2] = ((m_scroll_ram[0x19] & 0xf0) << 4) | ((m_scroll_ram[0x1a] & 0x7f) << 1) | ((m_scroll_ram[0x1a] & 0x80) >> 7); + scrollregs[3] = ((m_scroll_ram[0x11] & 0xf0) << 4) | ((m_scroll_ram[0x12] & 0x7f) << 1) | ((m_scroll_ram[0x12] & 0x80) >> 7); + + return screen_update_common(screen, bitmap, cliprect, scrollregs); +} + +u32 raidenb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return screen_update_common(screen, bitmap, cliprect, m_scroll_ram); +} + + +/******************************************************************************/ + +TILE_GET_INFO_MEMBER(raiden_state::get_back_tile_info) +{ + const u16 tiledata = m_bgram[tile_index]; + const u32 tile = tiledata & 0x0fff; + const u32 color = tiledata >> 12; + + tileinfo.set(1, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(raiden_state::get_fore_tile_info) +{ + const u16 tiledata = m_fgram[tile_index]; + const u32 tile = tiledata & 0x0fff; + const u32 color = tiledata >> 12; + + tileinfo.set(2, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(raiden_state::get_text_tile_info) +{ + const u16 tiledata = m_textram[tile_index]; + const u32 tile = (tiledata & 0xff) | ((tiledata >> 6) & 0x300); + const u32 color = (tiledata >> 8) & 0x0f; + + tileinfo.set(0, tile, color, 0); +} + +void raiden_state::common_video_start() +{ + m_bg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); + m_fg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_fore_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32); + m_fg_layer->set_transparent_pen(15); + + save_item(NAME(m_bg_layer_enabled)); + save_item(NAME(m_fg_layer_enabled)); + save_item(NAME(m_tx_layer_enabled)); + save_item(NAME(m_sp_layer_enabled)); + save_item(NAME(m_flipscreen)); +} + +void raiden_state::video_start() +{ + common_video_start(); + + m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_tx_layer->set_transparent_pen(15); +} + +void raidenb_state::video_start() +{ + common_video_start(); + + m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raidenb_state::get_text_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 32, 32); + m_tx_layer->set_transparent_pen(15); + + save_item(NAME(m_scroll_ram)); +} /******************************************************************************/ @@ -108,24 +474,24 @@ { map(0x00000, 0x06fff).ram(); map(0x07000, 0x07fff).ram().share("spriteram"); - map(0x08000, 0x08fff).ram().share("shared_ram"); + map(0x08000, 0x08fff).ram().share(m_shared_ram); map(0x0a000, 0x0a00d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); - map(0x0c000, 0x0c7ff).w(FUNC(raiden_state::textram_w)).share("textram"); + map(0x0c000, 0x0c7ff).w(FUNC(raiden_state::textram_w)).share(m_textram); map(0x0e000, 0x0e001).portr("P1_P2"); map(0x0e002, 0x0e003).portr("DSW"); map(0x0e004, 0x0e005).nopw(); // watchdog? - map(0x0e006, 0x0e006).w(FUNC(raiden_state::raiden_control_w)); - map(0x0f000, 0x0f03f).writeonly().share("scroll_ram"); + map(0x0e006, 0x0e006).w(FUNC(raiden_state::control_w)); + map(0x0f000, 0x0f03f).writeonly().share(m_scroll_ram); map(0xa0000, 0xfffff).rom().region("maincpu", 0); } void raiden_state::sub_map(address_map &map) { map(0x00000, 0x01fff).ram(); - map(0x02000, 0x027ff).ram().w(FUNC(raiden_state::bgram_w)).share("bgram"); - map(0x02800, 0x02fff).ram().w(FUNC(raiden_state::fgram_w)).share("fgram"); + map(0x02000, 0x027ff).ram().w(FUNC(raiden_state::bgram_w)).share(m_bgram); + map(0x02800, 0x02fff).ram().w(FUNC(raiden_state::fgram_w)).share(m_fgram); map(0x03000, 0x03fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x04000, 0x04fff).ram().share("shared_ram"); + map(0x04000, 0x04fff).ram().share(m_shared_ram); map(0x07ffe, 0x07fff).nopw(); // ? map(0x08000, 0x08001).nopw(); // watchdog? map(0x0a000, 0x0a001).nopw(); // ? @@ -139,13 +505,13 @@ { map(0x00000, 0x06fff).ram(); map(0x07000, 0x07fff).ram().share("spriteram"); - map(0x08000, 0x0803f).writeonly().share("scroll_ram"); - map(0x0a000, 0x0afff).ram().share("shared_ram"); + map(0x08000, 0x0803f).writeonly().share(m_scroll_ram); + map(0x0a000, 0x0afff).ram().share(m_shared_ram); map(0x0b000, 0x0b001).portr("P1_P2"); map(0x0b002, 0x0b003).portr("DSW"); map(0x0b004, 0x0b005).nopw(); // watchdog? - map(0x0b006, 0x0b006).w(FUNC(raiden_state::raiden_control_w)); - map(0x0c000, 0x0c7ff).w(FUNC(raiden_state::textram_w)).share("textram"); + map(0x0b006, 0x0b006).w(FUNC(raiden_state::control_w)); + map(0x0c000, 0x0c7ff).w(FUNC(raiden_state::textram_w)).share(m_textram); map(0x0d000, 0x0d00d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); map(0xa0000, 0xfffff).rom().region("maincpu", 0); } @@ -153,10 +519,10 @@ void raiden_state::raidenu_sub_map(address_map &map) { map(0x00000, 0x05fff).ram(); - map(0x06000, 0x067ff).ram().w(FUNC(raiden_state::bgram_w)).share("bgram"); - map(0x06800, 0x06fff).ram().w(FUNC(raiden_state::fgram_w)).share("fgram"); + map(0x06000, 0x067ff).ram().w(FUNC(raiden_state::bgram_w)).share(m_bgram); + map(0x06800, 0x06fff).ram().w(FUNC(raiden_state::fgram_w)).share(m_fgram); map(0x07000, 0x07fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x08000, 0x08fff).ram().share("shared_ram"); + map(0x08000, 0x08fff).ram().share(m_shared_ram); map(0x0a000, 0x0a001).nopw(); // ? map(0x0c000, 0x0c001).nopw(); // watchdog? map(0xc0000, 0xfffff).rom().region("sub", 0); @@ -165,16 +531,16 @@ /******************************************************************************/ -void raidenb_state::raidenb_main_map(address_map &map) +void raidenb_state::main_map(address_map &map) { map(0x00000, 0x06fff).ram(); map(0x07000, 0x07fff).ram().share("spriteram"); - map(0x0a000, 0x0afff).ram().share("shared_ram"); + map(0x0a000, 0x0afff).ram().share(m_shared_ram); map(0x0b000, 0x0b001).portr("P1_P2"); map(0x0b002, 0x0b003).portr("DSW"); map(0x0b004, 0x0b005).nopw(); // watchdog? - map(0x0b006, 0x0b006).w(FUNC(raidenb_state::raidenb_control_w)); - map(0x0c000, 0x0c7ff).w(FUNC(raidenb_state::textram_w)).share("textram"); + map(0x0b006, 0x0b006).w(FUNC(raidenb_state::control_w)); + map(0x0c000, 0x0c7ff).w(FUNC(raidenb_state::textram_w)).share(m_textram); map(0x0d000, 0x0d00d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); map(0x0d040, 0x0d08f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write)); map(0xa0000, 0xfffff).rom().region("maincpu", 0); @@ -216,7 +582,7 @@ /*****************************************************************************/ static INPUT_PORTS_START( raiden ) - SEIBU_COIN_INPUTS // coin inputs read through sound cpu + SEIBU_COIN_INPUTS // coin inputs read through sound CPU PORT_START("P1_P2") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) @@ -339,21 +705,21 @@ { if (state) { - m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8/4); // V30 - m_subcpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8/4); // V30 + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8 / 4); // V30 + m_subcpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8 / 4); // V30 } } void raiden_state::raiden(machine_config &config) { // basic machine hardware - V30(config, m_maincpu, XTAL(20'000'000)/2); // NEC V30 CPU, 20MHz verified on pcb + V30(config, m_maincpu, XTAL(20'000'000) / 2); // NEC V30 CPU, 20MHz verified on PCB m_maincpu->set_addrmap(AS_PROGRAM, &raiden_state::main_map); - V30(config, m_subcpu, XTAL(20'000'000)/2); // NEC V30 CPU, 20MHz verified on pcb + V30(config, m_subcpu, XTAL(20'000'000) / 2); // NEC V30 CPU, 20MHz verified on PCB m_subcpu->set_addrmap(AS_PROGRAM, &raiden_state::sub_map); - z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181)/4)); // verified on pcb + z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181) / 4)); // verified on PCB audiocpu.set_addrmap(AS_PROGRAM, &raiden_state::seibu_sound_map); audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); @@ -363,11 +729,11 @@ BUFFERED_SPRITERAM16(config, m_spriteram); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(59.60); // verified on pcb + screen.set_refresh_hz(59.60); // verified on PCB screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(32*8, 32*8); screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); - screen.set_screen_update(FUNC(raiden_state::screen_update_raiden)); + screen.set_screen_update(FUNC(raiden_state::screen_update)); screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising)); screen.screen_vblank().append(FUNC(raiden_state::vblank_irq)); screen.set_palette(m_palette); @@ -378,11 +744,11 @@ // sound hardware SPEAKER(config, "mono").front_center(); - ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); + ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181) / 4)); ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0); - okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH)); // frequency and pin 7 verified + okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH)); // frequency and pin 7 verified oki.add_route(ALL_OUTPUTS, "mono", 0.75); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -410,9 +776,9 @@ m_subcpu->set_addrmap(AS_PROGRAM, &raiden_state::raidenu_sub_map); } -void raidenb_state::raidenb_layer_scroll_w(offs_t offset, u16 data, u16 mem_mask) +void raidenb_state::layer_scroll_w(offs_t offset, u16 data, u16 mem_mask) { - COMBINE_DATA(&m_raidenb_scroll_ram[offset]); + COMBINE_DATA(&m_scroll_ram[offset]); } void raiden_state::raidenkb(machine_config &config) @@ -427,56 +793,56 @@ raiden(config); // basic machine hardware - m_maincpu->set_addrmap(AS_PROGRAM, &raidenb_state::raidenb_main_map); + m_maincpu->set_addrmap(AS_PROGRAM, &raidenb_state::main_map); // video hardware seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0)); - crtc.layer_en_callback().set(FUNC(raidenb_state::raidenb_layer_enable_w)); - crtc.layer_scroll_callback().set(FUNC(raidenb_state::raidenb_layer_scroll_w)); + crtc.layer_en_callback().set(FUNC(raidenb_state::layer_enable_w)); + crtc.layer_scroll_callback().set(FUNC(raidenb_state::layer_scroll_w)); - subdevice("screen")->set_screen_update(FUNC(raidenb_state::screen_update_raidenb)); + subdevice("screen")->set_screen_update(FUNC(raidenb_state::screen_update)); } /***************************************************************************/ /* - Note: Seibu labeled the roms simply as 1 through 10 and didn't generally + Note: Seibu labeled the ROMs simply as 1 through 10 and didn't generally change the labels at all between versions even though the data was different between them. */ // These versions use the same board and make use of the configuration bytes at 0x1fffd & 0x1fffe ROM_START( raidenj ) // from a board with 2 daughter cards, no official board #s? - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3.u022", 0x020000, 0x20000, CRC(f6af09d0) SHA1(ecd49f3351359ea2d5cbd140c9962d45c5544ecd) ) // both 3 & 4 had a red "dot" on label, 4 also had printed "J" ROM_LOAD16_BYTE( "4j.u023", 0x020001, 0x20000, CRC(505c4c5d) SHA1(07f61fd1ff24f482a1ae2f86c4c0f32850cbd539) ) // 0x1fffd == 0x00, 0x1fffe == 0x04 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8.u212", 0x000000, 0x08000, CRC(cbe055c7) SHA1(34a06a541d059c621d87fdf41546c9d052a61963) ) ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // tiles @ U105 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // tiles @ U115 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x2000, "plds", 0 ) // 2x Altera EP910PC-40 (read protected) @@ -489,35 +855,35 @@ ROM_END ROM_START( raiden ) - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3.u022", 0x020000, 0x20000, CRC(f6af09d0) SHA1(ecd49f3351359ea2d5cbd140c9962d45c5544ecd) ) ROM_LOAD16_BYTE( "4.u023", 0x020001, 0x20000, CRC(6bdfd416) SHA1(7c3692d0c46c0fd360b9b2b5a8dc55d9217be357) ) // 0x1fffd == 0x00, 0x1fffe == 0x84 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8.u212", 0x000000, 0x08000, CRC(cbe055c7) SHA1(34a06a541d059c621d87fdf41546c9d052a61963) ) ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // tiles @ U105 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // tiles @ U115 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x2000, "plds", 0 ) // 2x Altera EP910PC-40 (read protected) @@ -530,35 +896,35 @@ ROM_END ROM_START( raident ) - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3.u022", 0x020000, 0x20000, CRC(f6af09d0) SHA1(ecd49f3351359ea2d5cbd140c9962d45c5544ecd) ) ROM_LOAD16_BYTE( "4t.u023", 0x020001, 0x20000, CRC(61eefab1) SHA1(a886ce1eb1c6451b1cf9eb8dbdc2d484d9881ced) ) // 0x1fffd == 0x02, 0x1fffe == 0x06 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8.u212", 0x000000, 0x08000, CRC(cbe055c7) SHA1(34a06a541d059c621d87fdf41546c9d052a61963) ) ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // tiles @ U105 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // tiles @ U115 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x2000, "plds", 0 ) // 2x Altera EP910PC-40 (read protected) @@ -571,35 +937,35 @@ ROM_END ROM_START( raidenu ) - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3a.u022", 0x020000, 0x20000, CRC(a8fadbdd) SHA1(a23729a51c45c1dba4e625503a37d111ae72ced0) ) // Both 3A & 4A different for the US version ROM_LOAD16_BYTE( "4a.u023", 0x020001, 0x20000, CRC(bafb268d) SHA1(132d3ebf9d9d5fffa3040338106fad428c54dbaa) ) // 0x1fffd == 0x01, 0x1fffe == 0x85 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8.u212", 0x000000, 0x08000, CRC(cbe055c7) SHA1(34a06a541d059c621d87fdf41546c9d052a61963) ) ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // tiles @ U105 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // tiles @ U115 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x2000, "plds", 0 ) // 2x Altera EP910PC-40 (read protected) @@ -612,35 +978,35 @@ ROM_END ROM_START( raidenk ) // Same board as above. Not sure why the sound CPU would be decrypted - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3.u022", 0x020000, 0x20000, CRC(f6af09d0) SHA1(ecd49f3351359ea2d5cbd140c9962d45c5544ecd) ) ROM_LOAD16_BYTE( "4k.u023", 0x020001, 0x20000, CRC(fddf24da) SHA1(ececed0b0b96d070d85bfb6174029142bc96d5f0) ) // 0x1fffd == 0x02, 0x1fffe == 0xA4 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8b.u212", 0x000000, 0x08000, CRC(99ee7505) SHA1(b97c8ee5e26e8554b5de506fba3b32cc2fde53c9) ) // Not encrypted ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // tiles @ U105 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // tiles @ U115 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x2000, "plds", 0 ) // 2x Altera EP910PC-40 (read protected) @@ -652,45 +1018,45 @@ ROM_LOAD( "rd012.u094", 0x0100, 0x0100, NO_DUMP ) ROM_END -ROM_START( raidenkb ) // Korean bootleg board. ROMs for main, sub, audiocpu, chars and oki match raidenk, while object and tile ROMs are differently split - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu +ROM_START( raidenkb ) // Korean bootleg board. ROMs for main, sub, audio CPUs, chars and Oki match raidenk, while object and tile ROMs are differently split + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3.u022", 0x020000, 0x20000, CRC(f6af09d0) SHA1(ecd49f3351359ea2d5cbd140c9962d45c5544ecd) ) ROM_LOAD16_BYTE( "4k.u023", 0x020001, 0x20000, CRC(fddf24da) SHA1(ececed0b0b96d070d85bfb6174029142bc96d5f0) ) // 0x1fffd == 0x02, 0x1fffe == 0xA4 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.u042", 0x000000, 0x20000, CRC(ed03562e) SHA1(bf6b44fb53fa2321cd52c00fcb43b8ceb6ceffff) ) ROM_LOAD16_BYTE( "6.u043", 0x000001, 0x20000, CRC(a19d5b5d) SHA1(aa5e5be60b737913e5677f88ebc218302245e5af) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8b.u212", 0x000000, 0x08000, CRC(99ee7505) SHA1(b97c8ee5e26e8554b5de506fba3b32cc2fde53c9) ) // Not encrypted ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD16_BYTE( "rkb15bg.bin", 0x00000, 0x20000, CRC(13a69064) SHA1(a9fcd785e3bac7c0d39be532b3755e6dd45fc314) ) ROM_LOAD16_BYTE( "rkb17bg.bin", 0x00001, 0x20000, CRC(d7a6c649) SHA1(01d6f18af0385466e3956c3f3afc82393acee6bc) ) ROM_LOAD16_BYTE( "rkb16bg.bin", 0x40000, 0x20000, CRC(66ea8484) SHA1(f4452e1b0991bf81a60b580ba822fc43b1a443e6) ) ROM_LOAD16_BYTE( "rkb18bg.bin", 0x40001, 0x20000, CRC(42362d56) SHA1(1cad19fa3f66e34865383d9a94e9058114910365) ) - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD16_BYTE( "rkb7bg.bin", 0x00000, 0x20000, CRC(25239711) SHA1(978cfc6487ed711cc1b513824741c347ec92889d) ) ROM_LOAD16_BYTE( "rkb9bg.bin", 0x00001, 0x20000, CRC(6ca0d7b3) SHA1(ef63657a01b07aaa0ded7b0d405b872b4d3a56a8) ) ROM_LOAD16_BYTE( "rkb8bg.bin", 0x40000, 0x20000, CRC(3cad38fc) SHA1(de2257f70c3e71905bc959f80be183c6d95fd06d) ) ROM_LOAD16_BYTE( "rkb10bg.bin", 0x40001, 0x20000, CRC(6fce95a3) SHA1(1d3beda3a4dd0a2a3afbb7b5b16d87bf3257bcb4) ) - ROM_REGION( 0x090000, "sprites", 0 ) // sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD16_BYTE( "rkb19obj.bin", 0x00000, 0x20000, CRC(34fa4485) SHA1(d9893c484ee4f80e364824500c6c048f58f49752) ) ROM_LOAD16_BYTE( "rkb21obj.bin", 0x00001, 0x20000, CRC(d806395b) SHA1(7c6fc848aa40a49590e00d0b02ce21ad5414e387) ) ROM_LOAD16_BYTE( "rkb20obj.bin", 0x40000, 0x20000, CRC(8b7ca3c6) SHA1(81c3e98cbd81a39e04b5e7fb3683aba50545f774) ) ROM_LOAD16_BYTE( "rkb22obj.bin", 0x40001, 0x20000, CRC(82ee78a0) SHA1(4af0593f9c7d8db59f17d75d6f9020ecd4bdcb98) ) - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x0200, "proms", 0 ) @@ -698,35 +1064,35 @@ ROM_END ROM_START( raidenb )// Different hardware, Main & Sub CPU code not encrypted. - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3__,raidenb.u022", 0x020000, 0x20000, CRC(9d735bf5) SHA1(531981eac2ef0c0635f067a649899f98738d5c67) ) // Simply labeled as 3 ROM_LOAD16_BYTE( "4__,raidenb.u023", 0x020001, 0x20000, CRC(8d184b99) SHA1(71cd4179aa2341d2ceecbb6a9c26f5919d46ca4c) ) // Simply labeled as 4; 0x1fffd == 0x00, 0x1fffe == 0x80 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5__,raidenb.u042", 0x000000, 0x20000, CRC(7aca6d61) SHA1(4d80ec87e54d7495b9bdf819b9985b1c8183c80d) ) // Simply labeled as 5 ROM_LOAD16_BYTE( "6__,raidenb.u043", 0x000001, 0x20000, CRC(e3d35cc2) SHA1(4329865985aaf3fb524618e2e958563c8fa6ead5) ) // Simply labeled as 6 - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "rai6.u212", 0x000000, 0x08000, CRC(723a483b) SHA1(50e67945e83ea1748fb748de3287d26446d4e0a0) ) // Should be labeled "8" ??? ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // U919 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // U920 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // Sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) // U165 on this PCB - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x0100, "proms", 0 ) // N82S135N bipolar PROM @@ -734,35 +1100,35 @@ ROM_END ROM_START( raidenub ) // only region bits differ from raidenb - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.u0253", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.u0252", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3u.u022", 0x020000, 0x20000, CRC(9d735bf5) SHA1(531981eac2ef0c0635f067a649899f98738d5c67) ) // Simply labeled as 3u ROM_LOAD16_BYTE( "4u.u023", 0x020001, 0x20000, CRC(95c110ef) SHA1(e6aea374ca63cdd851af66240e51461882d170e8) ) // Simply labeled as 4u; 0x1fffd == 0x01, 0x1fffe == 0x81 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5__,raidenb.u042", 0x000000, 0x20000, CRC(7aca6d61) SHA1(4d80ec87e54d7495b9bdf819b9985b1c8183c80d) ) // Simply labeled as 5 ROM_LOAD16_BYTE( "6__,raidenb.u043", 0x000001, 0x20000, CRC(e3d35cc2) SHA1(4329865985aaf3fb524618e2e958563c8fa6ead5) ) // Simply labeled as 6 - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "rai6.u212", 0x000000, 0x08000, CRC(723a483b) SHA1(50e67945e83ea1748fb748de3287d26446d4e0a0) ) // Should be labeled "8" ??? ROM_CONTINUE( 0x010000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // On some PCBs there is no explicit - ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two roms + ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U location for these two ROMs - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // U919 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // U920 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // Sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) // U165 on this PCB - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) ) ROM_REGION( 0x0100, "proms", 0 ) // N82S135N bipolar PROM @@ -770,35 +1136,35 @@ ROM_END ROM_START( raidenua )// Different hardware, Main, Sub & sound CPU code not encrypted. - ROM_REGION( 0x060000, "maincpu", 0 ) // v30 main cpu + ROM_REGION( 0x060000, "maincpu", 0 ) // v30 ROM_LOAD16_BYTE( "1.c8", 0x000000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) ROM_LOAD16_BYTE( "2.c7", 0x000001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) ) ROM_LOAD16_BYTE( "3dd.e8", 0x020000, 0x20000, CRC(b6f3bad2) SHA1(214474ab9fa65e2716155b77d7825951cc98148a) ) ROM_LOAD16_BYTE( "4dd.e7", 0x020001, 0x20000, CRC(d294dfc1) SHA1(03606ddfa35d5cb34c447fa370495e1fbb0cad0e) ) // 0x1fffd == 0x01, 0x1fffe == 0x81 - ROM_REGION( 0x040000, "sub", 0 ) // v30 sub cpu + ROM_REGION( 0x040000, "sub", 0 ) // v30 ROM_LOAD16_BYTE( "5.p8", 0x000000, 0x20000, CRC(15c1cf45) SHA1(daac732a1d3e8f36fa665f984e05651cbca74fef) ) ROM_LOAD16_BYTE( "6.p7", 0x000001, 0x20000, CRC(261c381b) SHA1(64a9e0ea9abcba6287829cf4abb806362b62c806) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) // 64k code for sound Z80 + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 ROM_LOAD( "8.w8", 0x00000, 0x08000, CRC(105b9c11) SHA1(eb142806f8410d584d914b91207361a15ab18e6f) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_COPY( "audiocpu", 0x000000, 0x18000, 0x08000 ) - ROM_REGION( 0x010000, "text", 0 ) // Chars + ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD16_BYTE( "9", 0x00001, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) // U016 on this PCB ROM_LOAD16_BYTE( "10", 0x00000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) // U017 on this PCB - ROM_REGION( 0x080000, "bgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) // U011 on this PCB - ROM_REGION( 0x080000, "fgtiles", 0 ) // tiles + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) // U013 on this PCB - ROM_REGION( 0x090000, "sprites", 0 ) // Sprites + ROM_REGION( 0x090000, "sprites", 0 ) ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) // U012 on this PCB - ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "7.x10", 0x00000, 0x10000, CRC(2051263e) SHA1(dff96caa11adf619360d88704e3af8427ddfe524) ) ROM_REGION( 0x0200, "proms", 0 ) @@ -815,57 +1181,52 @@ bit-swapping */ -void raiden_state::common_decrypt() +void raiden_state::init_decryption() { - u16 *RAM = (u16 *)memregion("maincpu")->base(); - int i; + u16 *rom = (u16 *)memregion("maincpu")->base(); - for (i = 0; i < 0x20000; i++) + for (int i = 0; i < 0x20000; i++) { - static const u16 xor_table[] = { 0x200e,0x0006,0x000a,0x0002,0x240e,0x000e,0x04c2,0x00c2,0x008c,0x0004,0x0088,0x0000,0x048c,0x000c,0x04c0,0x00c0 }; - u16 data = RAM[0x20000/2 + i]; + static const u16 xor_table[] = { 0x200e, 0x0006, 0x000a, 0x0002, 0x240e, 0x000e, 0x04c2, 0x00c2, 0x008c, 0x0004, 0x0088, 0x0000, 0x048c, 0x000c, 0x04c0, 0x00c0 }; + u16 data = rom[0x20000 / 2 + i]; data ^= xor_table[i & 0x0f]; - data = bitswap<16>(data, 15,14,10,12,11,13,9,8,3,2,5,4,7,1,6,0); - RAM[0x20000/2 + i] = data; + data = bitswap<16>(data, 15, 14, 10, 12, 11, 13, 9, 8, 3, 2, 5, 4, 7, 1, 6, 0); + rom[0x20000 / 2 + i] = data; } - RAM = (u16 *)memregion("sub")->base(); + rom = (u16 *)memregion("sub")->base(); - for (i = 0; i < 0x20000; i++) + for (int i = 0; i < 0x20000; i++) { - static const u16 xor_table[] = { 0x0080,0x0080,0x0244,0x0288,0x0288,0x0288,0x1041,0x1009 }; - u16 data = RAM[0x00000/2 + i]; + static const u16 xor_table[] = { 0x0080, 0x0080, 0x0244, 0x0288, 0x0288, 0x0288, 0x1041, 0x1009 }; + u16 data = rom[0x00000 / 2 + i]; data ^= xor_table[i & 0x07]; - data = bitswap<16>(data, 15,14,13,9,11,10,12,8,2,0,5,4,7,3,1,6); - RAM[0x00000/2 + i] = data; + data = bitswap<16>(data, 15, 14, 13, 9, 11, 10, 12, 8, 2, 0, 5, 4, 7, 3, 1, 6); + rom[0x00000 / 2 + i] = data; } } - -void raiden_state::init_raiden() -{ - common_decrypt(); -} +} // anonymous namespace /***************************************************************************/ // Same PCB, differ by region byte(s) -GAME( 1990, raiden, 0, raidene, raiden, raiden_state, init_raiden, ROT270, "Seibu Kaihatsu", "Raiden (World set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, raidenj, raiden, raidene, raiden, raiden_state, init_raiden, ROT270, "Seibu Kaihatsu", "Raiden (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, raidenu, raiden, raidene, raiden, raiden_state, init_raiden, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, raident, raiden, raidene, raiden, raiden_state, init_raiden, ROT270, "Seibu Kaihatsu (Liang HWA Electronics license)", "Raiden (Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raiden, 0, raidene, raiden, raiden_state, init_decryption, ROT270, "Seibu Kaihatsu", "Raiden (World set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenj, raiden, raidene, raiden, raiden_state, init_decryption, ROT270, "Seibu Kaihatsu", "Raiden (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenu, raiden, raidene, raiden, raiden_state, init_decryption, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raident, raiden, raidene, raiden, raiden_state, init_decryption, ROT270, "Seibu Kaihatsu (Liang HWA Electronics license)", "Raiden (Taiwan)", MACHINE_SUPPORTS_SAVE ) // Same as above, but the sound CPU code is not encrypted -GAME( 1990, raidenk, raiden, raiden, raiden, raiden_state, init_raiden, ROT270, "Seibu Kaihatsu (IBL Corporation license)", "Raiden (Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenk, raiden, raiden, raiden, raiden_state, init_decryption, ROT270, "Seibu Kaihatsu (IBL Corporation license)", "Raiden (Korea)", MACHINE_SUPPORTS_SAVE ) // Bootleg of the Korean release // real hw has heavy slow downs, sometimes making the game borderline unplayable (https://www.youtube.com/watch?v=_FF4N9mBxao) -GAME( 1990, raidenkb, raiden, raidenkb, raiden, raiden_state, init_raiden, ROT270, "bootleg", "Raiden (Korea, bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenkb, raiden, raidenkb, raiden, raiden_state, init_decryption, ROT270, "bootleg", "Raiden (Korea, bootleg)", MACHINE_SUPPORTS_SAVE ) // Alternate hardware; SEI8904 + SEI9008 PCBs. Main & Sub CPU code not encrypted -GAME( 1990, raidenua, raiden, raidenu, raiden, raiden_state, empty_init, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 2, SEI8904 hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenua, raiden, raidenu, raiden, raiden_state, empty_init, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 2, SEI8904 hardware)", MACHINE_SUPPORTS_SAVE ) // Alternate hardware. Main, Sub & Sound CPU code not encrypted. It also sports a Seibu custom CRTC. -GAME( 1990, raidenb, raiden, raidenb, raiden, raidenb_state, empty_init, ROT270, "Seibu Kaihatsu", "Raiden (World set 2, newer hardware)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, raidenub, raiden, raidenb, raiden, raidenb_state, empty_init, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 3, newer hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenb, raiden, raidenb, raiden, raidenb_state, empty_init, ROT270, "Seibu Kaihatsu", "Raiden (World set 2, newer hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, raidenub, raiden, raidenb, raiden, raidenb_state, empty_init, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 3, newer hardware)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/raiden.h mame-0.264+dfsg.1/src/mame/seibu/raiden.h --- mame-0.263+dfsg.1/src/mame/seibu/raiden.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/raiden.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -/******************************************************************************* - - Seibu Raiden hardware - -*******************************************************************************/ -#ifndef MAME_SEIBU_RAIDEN_H -#define MAME_SEIBU_RAIDEN_H - -#pragma once - -#include "seibusound.h" - -#include "video/bufsprite.h" - -#include "emupal.h" -#include "tilemap.h" - -class raiden_state : public driver_device, public seibu_sound_common -{ -public: - raiden_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_seibu_sound(*this, "seibu_sound"), - m_subcpu(*this, "sub"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_spriteram(*this, "spriteram"), - m_shared_ram(*this, "shared_ram"), - m_textram(*this, "textram"), - m_scroll_ram(*this, "scroll_ram"), - m_bgram(*this, "bgram"), - m_fgram(*this, "fgram") - { } - - void raidene(machine_config &config); - void raiden(machine_config &config); - void raidenkb(machine_config &config); - void raidenu(machine_config &config); - - void init_raiden(); - -protected: - required_device m_maincpu; - required_device m_seibu_sound; - - bool m_bg_layer_enabled = 0; - bool m_fg_layer_enabled = 0; - bool m_tx_layer_enabled = 0; - bool m_sp_layer_enabled = 0; - bool m_flipscreen = 0; - - virtual void video_start() override; - - u32 screen_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *scrollregs); - - void textram_w(offs_t offset, u16 data, u16 mem_mask = ~0); - - void common_video_start(); - - required_device m_subcpu; - required_device m_gfxdecode; - required_device m_palette; - required_device m_spriteram; - - required_shared_ptr m_shared_ram; - required_shared_ptr m_textram; - optional_shared_ptr m_scroll_ram; - required_shared_ptr m_bgram; - required_shared_ptr m_fgram; - - tilemap_t *m_bg_layer = nullptr; - tilemap_t *m_fg_layer = nullptr; - tilemap_t *m_tx_layer = nullptr; - - void bgram_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void fgram_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void raiden_control_w(u8 data); - - TILE_GET_INFO_MEMBER(get_back_tile_info); - TILE_GET_INFO_MEMBER(get_fore_tile_info); - TILE_GET_INFO_MEMBER(get_text_tile_info); - - u32 screen_update_raiden(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void vblank_irq(int state); - - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap); - void common_decrypt(); - - void main_map(address_map &map); - void sub_map(address_map &map); - void raiden_sound_map(address_map &map); - void raiden_sound_decrypted_opcodes_map(address_map &map); - void raidenu_main_map(address_map &map); - void raidenu_sub_map(address_map &map); - void sei80bu_encrypted_full_map(address_map &map); -}; - - -class raidenb_state : public raiden_state -{ -public: - using raiden_state::raiden_state; - - void raidenb(machine_config &config); - -protected: - virtual void video_start() override; - -private: - u16 m_raidenb_scroll_ram[6]; - - u32 screen_update_raidenb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void raidenb_control_w(u8 data); - void raidenb_layer_enable_w(u16 data); - void raidenb_layer_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); - - void raidenb_main_map(address_map &map); -}; - -#endif // MAME_SEIBU_RAIDEN_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/raiden_v.cpp mame-0.264+dfsg.1/src/mame/seibu/raiden_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/raiden_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/raiden_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,266 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail -/******************************************************************************* - - Seibu Raiden hardware - - Functions to emulate the video hardware - -*******************************************************************************/ - -#include "emu.h" -#include "raiden.h" -#include "screen.h" - - -/******************************************************************************/ - -void raiden_state::bgram_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_bgram[offset]); - m_bg_layer->mark_tile_dirty(offset); -} - -void raiden_state::fgram_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_fgram[offset]); - m_fg_layer->mark_tile_dirty(offset); -} - -void raiden_state::textram_w(offs_t offset, u16 data, u16 mem_mask) -{ - COMBINE_DATA(&m_textram[offset]); - m_tx_layer->mark_tile_dirty(offset); -} - - -void raiden_state::raiden_control_w(u8 data) -{ - // d0: back layer disable - // d1: fore layer disable - // d2: text layer disable - // d3: sprite layer disable - // d4: unused - // d5: unused - // d6: flipscreen - // d7: toggles, maybe spriteram bank? (for buffering) - m_bg_layer_enabled = BIT(~data, 0); - m_fg_layer_enabled = BIT(~data, 1); - m_tx_layer_enabled = BIT(~data, 2); - m_sp_layer_enabled = BIT(~data, 3); - - m_flipscreen = BIT(data, 6); - machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); -} - -void raidenb_state::raidenb_control_w(u8 data) -{ - // d1: flipscreen - // d2: toggles, maybe spriteram bank? (for buffering) - // d3: text layer disable (i guess raidenb textlayer isn't part of sei_crtc?) - // other bits: unused - m_tx_layer_enabled = BIT(~data, 3); - - m_flipscreen = BIT(data, 1); - machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); -} - -void raidenb_state::raidenb_layer_enable_w(u16 data) -{ - // d0: back layer disable - // d1: fore layer disable - // d4: sprite layer disable - // other bits: unused? (d2-d3 always set, d5-d7 always clear) - m_bg_layer_enabled = BIT(~data, 0); - m_fg_layer_enabled = BIT(~data, 1); - m_sp_layer_enabled = BIT(~data, 4); -} - - -/******************************************************************************/ - -void raiden_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap) -{ - if (!m_sp_layer_enabled) - return; - - u16 *sprites = m_spriteram->buffer(); - const u32 size = m_spriteram->bytes() / 2; - gfx_element *gfx = m_gfxdecode->gfx(3); - - for (int offs = 0; offs < size; offs += 4) - { - /* - Word #0 - x------- -------- active - -x------ -------- flipy - --x----- -------- flipx - ---x---- -------- unused - ----xxxx -------- color - -------- xxxxxxxx y - - Word #1 - x------- -------- ? (set when groundboss explodes) - -xxx---- -------- unused - ----xxxx xxxxxxxx code - - Word #2 - xx------ -------- priority - --xxxxx- -------- unused - -------x xxxxxxxx x (signed) - - Word #3 unused - */ - - if (!BIT(sprites[offs + 0], 15)) - continue; - - const u8 priority = BIT(sprites[offs + 2], 14, 2); - if (priority == 0) - continue; - - u32 pri_mask = GFX_PMASK_4 | GFX_PMASK_2 | GFX_PMASK_1; - switch (priority) - { - case 1: // draw sprites underneath foreground - pri_mask = GFX_PMASK_4 | GFX_PMASK_2; - break; - case 2: - case 3: // rest of sprites, draw underneath text - default: - pri_mask = GFX_PMASK_4; - break; - } - - bool flipy = BIT(sprites[offs + 0], 14); - bool flipx = BIT(sprites[offs + 0], 13); - const u32 color = BIT(sprites[offs + 0], 8, 4); - const u32 code = BIT(sprites[offs + 1], 0, 12); - - s32 y = BIT(sprites[offs + 0], 0, 8); - s32 x = BIT(sprites[offs + 2], 0, 9); - if (BIT(x, 8)) // sign bit - x |= ~0x1ff; - - if (m_flipscreen) - { - x = 240 - x; - y = 240 - y; - flipy = !flipy; - flipx = !flipx; - } - - gfx->prio_transpen(bitmap, cliprect, code, color, flipx, flipy, x, y, primap, pri_mask, 15); - } -} - -u32 raiden_state::screen_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *scrollregs) -{ - // set tilemaps scroll - m_bg_layer->set_scrollx(0, scrollregs[0]); - m_bg_layer->set_scrolly(0, scrollregs[1]); - m_fg_layer->set_scrollx(0, scrollregs[2]); - m_fg_layer->set_scrolly(0, scrollregs[3]); - - screen.priority().fill(0, cliprect); - bitmap.fill(m_palette->black_pen(), cliprect); - - // back layer - if (m_bg_layer_enabled) - m_bg_layer->draw(screen, bitmap, cliprect, 0, 1); - - // fore layer - if (m_fg_layer_enabled) - m_fg_layer->draw(screen, bitmap, cliprect, 0, 2); - - // text layer - if (m_tx_layer_enabled) - m_tx_layer->draw(screen, bitmap, cliprect, 0, 4); - - draw_sprites(bitmap, cliprect, screen.priority()); - - return 0; -} - -u32 raiden_state::screen_update_raiden(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - // set up scrollregs - // scroll_ram is only 8 bits wide. 4 bytes per scroll, skip uneven ones - // 00-03: 28 *0 ** ae - bg layer scroll y - // 08-0b: 28 *0 ** b9 - bg layer scroll x - // 10-13: 28 *0 ** ae - fg layer scroll y - // 18-1b: 28 *0 ** b9 - fg layer scroll x - u16 scrollregs[4]; - scrollregs[0] = ((m_scroll_ram[0x09] & 0xf0) << 4) | ((m_scroll_ram[0x0a] & 0x7f) << 1) | ((m_scroll_ram[0x0a] & 0x80) >> 7); - scrollregs[1] = ((m_scroll_ram[0x01] & 0xf0) << 4) | ((m_scroll_ram[0x02] & 0x7f) << 1) | ((m_scroll_ram[0x02] & 0x80) >> 7); - scrollregs[2] = ((m_scroll_ram[0x19] & 0xf0) << 4) | ((m_scroll_ram[0x1a] & 0x7f) << 1) | ((m_scroll_ram[0x1a] & 0x80) >> 7); - scrollregs[3] = ((m_scroll_ram[0x11] & 0xf0) << 4) | ((m_scroll_ram[0x12] & 0x7f) << 1) | ((m_scroll_ram[0x12] & 0x80) >> 7); - - return screen_update_common(screen, bitmap, cliprect, scrollregs); -} - -u32 raidenb_state::screen_update_raidenb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return screen_update_common(screen, bitmap, cliprect, m_raidenb_scroll_ram); -} - - -/******************************************************************************/ - -TILE_GET_INFO_MEMBER(raiden_state::get_back_tile_info) -{ - const u16 tiledata = m_bgram[tile_index]; - const u32 tile = tiledata & 0x0fff; - const u32 color = tiledata >> 12; - - tileinfo.set(1, tile, color, 0); -} - -TILE_GET_INFO_MEMBER(raiden_state::get_fore_tile_info) -{ - const u16 tiledata = m_fgram[tile_index]; - const u32 tile = tiledata & 0x0fff; - const u32 color = tiledata >> 12; - - tileinfo.set(2, tile, color, 0); -} - -TILE_GET_INFO_MEMBER(raiden_state::get_text_tile_info) -{ - const u16 tiledata = m_textram[tile_index]; - const u32 tile = (tiledata & 0xff) | ((tiledata >> 6) & 0x300); - const u32 color = (tiledata >> 8) & 0x0f; - - tileinfo.set(0, tile, color, 0); -} - -void raiden_state::common_video_start() -{ - m_bg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); - m_fg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_fore_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); - m_fg_layer->set_transparent_pen(15); - - save_item(NAME(m_bg_layer_enabled)); - save_item(NAME(m_fg_layer_enabled)); - save_item(NAME(m_tx_layer_enabled)); - save_item(NAME(m_sp_layer_enabled)); - save_item(NAME(m_flipscreen)); -} - -void raiden_state::video_start() -{ - common_video_start(); - - m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32,32); - m_tx_layer->set_transparent_pen(15); -} - -void raidenb_state::video_start() -{ - common_video_start(); - - m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raidenb_state::get_text_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 32,32); - m_tx_layer->set_transparent_pen(15); - - save_item(NAME(m_raidenb_scroll_ram)); -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/sengokmj.cpp mame-0.264+dfsg.1/src/mame/seibu/sengokmj.cpp --- mame-0.263+dfsg.1/src/mame/seibu/sengokmj.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/sengokmj.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -649,5 +649,5 @@ } // anonymous namespace -GAME( 1991, sengokmj, 0, sengokmj, sengokmj, sengokmj_state, empty_init, ROT0, "Sigma", "Sengoku Mahjong [BET] (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, sengokmj, 0, sengokmj, sengokmj, sengokmj_state, empty_init, ROT0, "Sigma", "Sengoku Mahjong (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) /*Non-Bet Version?*/ diff -Nru mame-0.263+dfsg.1/src/mame/seibu/stfight.cpp mame-0.264+dfsg.1/src/mame/seibu/stfight.cpp --- mame-0.263+dfsg.1/src/mame/seibu/stfight.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/stfight.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Mark McDougall +// copyright-holders: Mark McDougall + /***************************** (by Mark McDougall) *** STREET FIGHT hardware *** This has been adapted from the excellent ***************************** Psychic 5 description (by Roberto Ventura) @@ -31,7 +32,7 @@ 1) ROM CONTENTS. SF01 Main program code (encrypted) -SF02 Main program code bank-switched? into main cpu space +SF02 Main program code bank-switched? into main CPU space SF03 Sound program code SF04 ADPCM voice data SF05-07 Foreground tile pixel data @@ -43,10 +44,10 @@ SF17 Character pixel data SF18-21 Sprite pixel data -All ROMS are 32K except SF17 which is 8K. +All ROMs are 32K except SF17 which is 8K. Graphics format is a little messy, the 4 planes come from a bit in -the high and low nibble of each byte of a consecutive pair of roms. +the high and low nibble of each byte of a consecutive pair of ROMs. All graphics are made of 16x16 (composite) tiles, each of which is composed of 4 consecutive 8x8 tiles. In all there are 1024 composite (16x16) tiles @@ -226,13 +227,13 @@ 256x224 viewport rather than 256 square. The layers can be individually enabled/disabled. Inactive sprites are 'parked' at row 0. -The rom layout for the foreground and sprite tiles are as you would expect, +The ROM layout for the foreground and sprite tiles are as you would expect, with the four 8x8 tiles that make a single composite tile consecutive in address. The background tiles are interleaved for presumably some good reason, the first two 8x8 tiles from composite tile n are followed by two 8x8 tiles from the (n+512)'th composite tile. -The map roms are similarly interleaved for the background layer only. +The map ROMs are similarly interleaved for the background layer only. 7) SPRITES @@ -244,11 +245,11 @@ TODO: - handle transparency in text layer properly (how?) -- second bank of sf02 is this used? (probably NOT) +- is the second bank of sf02 used? (probably NOT) - empcity/stfight never writes the YM2203s' divider registers but it expects 0x2f, there's a workaround for it in the driver init - if empcity turns out to really be a bootleg, maybe it doesn't have an MCU, - and instead does the ADPCM with the audiocpu? (see the driver notes above + and instead does the ADPCM with the audio CPU? (see the driver notes above mentioning an unused NMI handler) - Each version of empcity/stfight has a different protection code stored in the MCU (at $1D2) so each 68705 will need to be dumped. @@ -264,18 +265,297 @@ *****************************************************************************/ #include "emu.h" -#include "stfight.h" +#include "airraid_dev.h" +#include "stfight_dev.h" + +#include "cpu/m6805/m68705.h" #include "cpu/z80/z80.h" +#include "sound/msm5205.h" #include "sound/ymopn.h" #include "speaker.h" +namespace { + +class stfight_state : public driver_device +{ +public: + stfight_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_audiocpu(*this, "audiocpu") + , m_mcu(*this, "mcu") + , m_msm(*this, "msm") + , m_ym(*this, "ym%u", 0) + , m_main_bank(*this, "mainbank") + , m_samples(*this, "adpcm") + , m_decrypted_opcodes(*this, "decrypted_opcodes") + , m_coin_mech(*this, "COIN") + , m_coin_state(0) + , m_fm_data(0) + , m_cpu_to_mcu_empty(true) + , m_cpu_to_mcu_data(0x0f) + , m_port_a_out(0xff) + , m_port_c_out(0xff) + , m_vck2(false) + , m_adpcm_reset(true) + , m_adpcm_data_offs(0x0000) + { + } + + void stfight_base(machine_config &config); + void stfight(machine_config &config); + void cshooter(machine_config &config); + + void init_stfight(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_audiocpu; + required_device m_mcu; + required_device m_msm; + required_device_array m_ym; + + required_memory_bank m_main_bank; + + required_region_ptr m_samples; + optional_shared_ptr m_decrypted_opcodes; + + required_ioport m_coin_mech; + + uint8_t m_coin_state = 0; + + uint8_t m_fm_data = 0; + + bool m_cpu_to_mcu_empty = false; + uint8_t m_cpu_to_mcu_data = 0; + uint8_t m_port_a_out = 0; + uint8_t m_port_c_out = 0; + + bool m_vck2 = false; + bool m_adpcm_reset = false; + uint16_t m_adpcm_data_offs = 0; + + emu_timer *m_int1_timer = nullptr; + + void adpcm_int(int state); + + void io_w(uint8_t data); + uint8_t coin_r(); + void coin_w(uint8_t data); + void fm_w(uint8_t data); + void mcu_w(uint8_t data); + + void cshooter_bank_w(uint8_t data); + + uint8_t fm_r(); + + INTERRUPT_GEN_MEMBER(vb_interrupt); + TIMER_CALLBACK_MEMBER(rst08_tick); + + // MCU specifics + uint8_t _68705_port_b_r(); + void _68705_port_a_w(uint8_t data); + void _68705_port_b_w(uint8_t data); + void _68705_port_c_w(uint8_t data); + + void cpu1_map(address_map &map); + void cpu2_map(address_map &map); + void cshooter_cpu1_map(address_map &map); + void decrypted_opcodes_map(address_map &map); + void stfight_cpu1_map(address_map &map); +}; + + +void stfight_state::machine_start() +{ + m_main_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000); + m_main_bank->set_entry(0); + + m_int1_timer = timer_alloc(FUNC(stfight_state::rst08_tick), this); + + save_item(NAME(m_coin_state)); + save_item(NAME(m_fm_data)); + + save_item(NAME(m_cpu_to_mcu_empty)); + save_item(NAME(m_cpu_to_mcu_data)); + save_item(NAME(m_port_a_out)); + save_item(NAME(m_port_c_out)); + + save_item(NAME(m_vck2)); + save_item(NAME(m_adpcm_reset)); + save_item(NAME(m_adpcm_data_offs)); +} + + +void stfight_state::machine_reset() +{ + m_fm_data = 0; + m_cpu_to_mcu_empty = true; + m_adpcm_reset = true; + + // Coin signals are active low + m_coin_state = 3; +} + +// It's entirely possible that this bank is never switched out +// - in fact I don't even know how/where it's switched in! +void stfight_state::cshooter_bank_w(uint8_t data) +{ + m_main_bank->set_entry(bitswap(data, 7, 2)); +} + +/* + * CPU 1 timed interrupt - 60Hz??? + */ + +TIMER_CALLBACK_MEMBER(stfight_state::rst08_tick) +{ + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 +} + +INTERRUPT_GEN_MEMBER(stfight_state::vb_interrupt) +{ + // Do a RST10 + device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 + m_int1_timer->adjust(attotime::from_hz(120)); +} + +/* + * Hardware handlers + */ + +void stfight_state::io_w(uint8_t data) +{ + // TODO: What is bit 4? + machine().bookkeeping().coin_counter_w(0, data & 1); + machine().bookkeeping().coin_counter_w(1, data & 2); +} + +uint8_t stfight_state::coin_r() +{ + return m_coin_state; +} + +void stfight_state::coin_w(uint8_t data) +{ + // Acknowledge coin signals (active low) + if (!BIT(data, 0)) + m_coin_state |= 1; + + if (!BIT(data, 1)) + m_coin_state |= 2; +} + +/* + * Machine hardware for MSM5205 ADPCM sound control + */ + +void stfight_state::adpcm_int(int state) +{ + if (!state) + return; + + // Falling edge triggered interrupt at half the rate of /VCK? + m_mcu->set_input_line(M68705_IRQ_LINE, m_vck2 ? ASSERT_LINE : CLEAR_LINE); + m_vck2 = !m_vck2; + + if (!m_adpcm_reset) + { + uint8_t adpcm_data = m_samples[(m_adpcm_data_offs >> 1) & 0x7fff]; + + if (!BIT(m_adpcm_data_offs, 0)) + adpcm_data >>= 4; + ++m_adpcm_data_offs; + + m_msm->data_w(adpcm_data & 0x0f); + } +} + + +/* + * Machine hardware for YM2303 FM sound control + */ + +void stfight_state::fm_w(uint8_t data) +{ + // The sound CPU ignores any FM data without bit 7 set + m_fm_data = 0x80 | data; +} + +uint8_t stfight_state::fm_r() +{ + uint8_t const data = m_fm_data; + + // Acknowledge the command + if (!machine().side_effects_disabled()) + m_fm_data &= ~0x80; + + return data; +} + + +/* + * MCU communications + */ + +void stfight_state::mcu_w(uint8_t data) +{ + m_cpu_to_mcu_data = data & 0x0f; + m_cpu_to_mcu_empty = false; +} + +void stfight_state::_68705_port_a_w(uint8_t data) +{ + m_port_a_out = data; +} + +uint8_t stfight_state::_68705_port_b_r() +{ + return + (m_coin_mech->read() << 6) | + (m_cpu_to_mcu_empty ? 0x10 : 0x00) | + (m_cpu_to_mcu_data & 0x0f); +} + +void stfight_state::_68705_port_b_w(uint8_t data) +{ + // Acknowledge Z80 command + if (!BIT(data, 5)) + m_cpu_to_mcu_empty = true; +} + +void stfight_state::_68705_port_c_w(uint8_t data) +{ + // Signal a valid coin on the falling edge + if (BIT(m_port_c_out, 0) && !BIT(data, 0)) + m_coin_state &= ~1; + if (BIT(m_port_c_out, 1) && !BIT(data, 1)) + m_coin_state &= ~2; + + // Latch ADPCM data address when dropping the reset line + m_adpcm_reset = BIT(data, 2); + if (!m_adpcm_reset && BIT(m_port_c_out, 2)) + m_adpcm_data_offs = m_port_a_out << 9; + m_msm->reset_w(m_adpcm_reset ? ASSERT_LINE : CLEAR_LINE); + + // Generate NMI on host CPU (used on handshake error or stuck coin) + m_maincpu->set_input_line(INPUT_LINE_NMI, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE); + + m_port_c_out = data; +} + + void stfight_state::cpu1_map(address_map &map) { map(0x0000, 0x7fff).rom(); - map(0x8000, 0xbfff).bankr("mainbank"); /* sf02.bin */ + map(0x8000, 0xbfff).bankr(m_main_bank); // sf02.bin map(0xc000, 0xc0ff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); map(0xc100, 0xc1ff).ram().w("palette", FUNC(palette_device::write8_ext)).share("palette_ext"); map(0xc200, 0xc200).portr("P1"); @@ -283,12 +563,12 @@ map(0xc202, 0xc202).portr("START"); map(0xc203, 0xc203).portr("DSW0"); map(0xc204, 0xc204).portr("DSW1"); - map(0xc205, 0xc205).r(FUNC(stfight_state::stfight_coin_r)); - map(0xc500, 0xc500).w(FUNC(stfight_state::stfight_fm_w)); - map(0xc600, 0xc600).w(FUNC(stfight_state::stfight_mcu_w)); - map(0xc700, 0xc700).w(FUNC(stfight_state::stfight_coin_w)); - map(0xc804, 0xc804).w(FUNC(stfight_state::stfight_io_w)); - map(0xc806, 0xc806).nopw(); /* TBD */ + map(0xc205, 0xc205).r(FUNC(stfight_state::coin_r)); + map(0xc500, 0xc500).w(FUNC(stfight_state::fm_w)); + map(0xc600, 0xc600).w(FUNC(stfight_state::mcu_w)); + map(0xc700, 0xc700).w(FUNC(stfight_state::coin_w)); + map(0xc804, 0xc804).w(FUNC(stfight_state::io_w)); + map(0xc806, 0xc806).nopw(); // TBD map(0xe000, 0xefff).ram(); } @@ -304,14 +584,14 @@ void stfight_state::decrypted_opcodes_map(address_map &map) { - map(0x0000, 0x7fff).rom().share("decrypted_opcodes"); + map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes); } void stfight_state::cshooter_cpu1_map(address_map &map) { cpu1_map(map); - map(0xc801, 0xc801).w(FUNC(stfight_state::stfight_bank_w)); + map(0xc801, 0xc801).w(FUNC(stfight_state::cshooter_bank_w)); map(0xd000, 0xd7ff).ram().w("airraid_vid", FUNC(airraid_video_device::txram_w)).share("txram"); map(0xd800, 0xd80f).ram().w("airraid_vid", FUNC(airraid_video_device::vregs_w)).share("vregs"); // wrong? map(0xf000, 0xfdff).ram(); @@ -328,13 +608,13 @@ map(0xd000, 0xd000).nopr(); map(0xd800, 0xd800).nopw(); map(0xe800, 0xe800).nopw(); - map(0xf000, 0xf000).r(FUNC(stfight_state::stfight_fm_r)); + map(0xf000, 0xf000).r(FUNC(stfight_state::fm_r)); map(0xf800, 0xffff).ram(); } static INPUT_PORTS_START( stfight ) - PORT_START("P1") /* PLAYER 1 */ + PORT_START("P1") // PLAYER 1 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY @@ -344,7 +624,7 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("P2") /* PLAYER 2 */ + PORT_START("P2") // PLAYER 2 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL @@ -354,13 +634,13 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("START") /* START BUTTONS */ + PORT_START("START") // START BUTTONS PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0xe7, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("DSW0") /* DSW1 */ - /* Manual refers to these as Dip-Switch Bank B, but TEST mode shows them as DIP-SW 1 */ + PORT_START("DSW0") // DSW1 + // Manual refers to these as Dip-Switch Bank B, but TEST mode shows them as DIP-SW 1 PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) @@ -383,8 +663,8 @@ PORT_DIPSETTING( 0x00, "Red" ) PORT_DIPSETTING( 0x80, "Blue" ) - PORT_START("DSW1") /* DSWA */ - /* Manual refers to these as Dip-Switch Bank A, but TEST mode shows them as DIP-SW 2 */ + PORT_START("DSW1") // DSWA + // Manual refers to these as Dip-Switch Bank A, but TEST mode shows them as DIP-SW 2 PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) @@ -407,7 +687,7 @@ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("COIN") /* COIN MECH */ + PORT_START("COIN") // COIN MECH PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) INPUT_PORTS_END @@ -415,7 +695,7 @@ static INPUT_PORTS_START( cshooter ) PORT_INCLUDE(stfight) - PORT_MODIFY("DSW0") /* DSW2 (0xc203) */ + PORT_MODIFY("DSW0") // DSW2 (0xc203) PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x02, DEF_STR( Medium ) ) @@ -434,7 +714,7 @@ PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:7" ) PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) - PORT_MODIFY("DSW1") /* DSW1 (0xc204) */ + PORT_MODIFY("DSW1") // DSW1 (0xc204) PORT_DIPNAME( 0x01, 0x01, "Coin Slots" ) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, "1" ) PORT_DIPSETTING( 0x00, "2" ) @@ -459,26 +739,25 @@ void stfight_state::stfight_base(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware Z80(config, m_maincpu, 12_MHz_XTAL / 4); m_maincpu->set_addrmap(AS_PROGRAM, &stfight_state::cpu1_map); - m_maincpu->set_vblank_int("stfight_vid:screen", FUNC(stfight_state::stfight_vb_interrupt)); Z80(config, m_audiocpu, 12_MHz_XTAL / 4); m_audiocpu->set_addrmap(AS_PROGRAM, &stfight_state::cpu2_map); m_audiocpu->set_periodic_int(FUNC(stfight_state::irq0_line_hold), attotime::from_hz(120)); M68705P5(config, m_mcu, 12_MHz_XTAL / 4); - m_mcu->portb_r().set(FUNC(stfight_state::stfight_68705_port_b_r)); - m_mcu->porta_w().set(FUNC(stfight_state::stfight_68705_port_a_w)); - m_mcu->portb_w().set(FUNC(stfight_state::stfight_68705_port_b_w)); - m_mcu->portc_w().set(FUNC(stfight_state::stfight_68705_port_c_w)); + m_mcu->portb_r().set(FUNC(stfight_state::_68705_port_b_r)); + m_mcu->porta_w().set(FUNC(stfight_state::_68705_port_a_w)); + m_mcu->portb_w().set(FUNC(stfight_state::_68705_port_b_w)); + m_mcu->portc_w().set(FUNC(stfight_state::_68705_port_c_w)); config.set_maximum_quantum(attotime::from_hz(600)); PALETTE(config, "palette").set_format(palette_device::xBRG_444, 256); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); YM2203(config, m_ym[0], 12_MHz_XTAL / 8); @@ -494,7 +773,7 @@ m_ym[1]->add_route(3, "mono", 0.10); MSM5205(config, m_msm, 384_kHz_XTAL); - m_msm->vck_callback().set(FUNC(stfight_state::stfight_adpcm_int)); // Interrupt function + m_msm->vck_callback().set(FUNC(stfight_state::adpcm_int)); // Interrupt function m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8KHz, 4-bit m_msm->add_route(ALL_OUTPUTS, "mono", 0.50); } @@ -504,7 +783,7 @@ stfight_base(config); m_maincpu->set_addrmap(AS_PROGRAM, &stfight_state::stfight_cpu1_map); m_maincpu->set_addrmap(AS_OPCODES, &stfight_state::decrypted_opcodes_map); - m_maincpu->set_vblank_int("stfight_vid:screen", FUNC(stfight_state::stfight_vb_interrupt)); + m_maincpu->set_vblank_int("stfight_vid:screen", FUNC(stfight_state::vb_interrupt)); STFIGHT_VIDEO(config, "stfight_vid", 0); } @@ -513,7 +792,7 @@ { stfight_base(config); m_maincpu->set_addrmap(AS_PROGRAM, &stfight_state::cshooter_cpu1_map); - m_maincpu->set_vblank_int("airraid_vid:screen", FUNC(stfight_state::stfight_vb_interrupt)); + m_maincpu->set_vblank_int("airraid_vid:screen", FUNC(stfight_state::vb_interrupt)); AIRRAID_VIDEO(config, "airraid_vid", 0); } @@ -527,503 +806,504 @@ // Is this a bootleg? The MCU protection check at $00A7 has been disabled ROM_START( empcity ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "ec_01.rom", 0x00000, 0x8000, CRC(fe01d9b1) SHA1(c4b62d1b7e3a062f6a7a75f49cce5712f9016f98) ) - ROM_LOAD( "ec_02.rom", 0x10000, 0x8000, CRC(b3cf1ef7) SHA1(91bc92293cbb47c38a2552c5beea53894b87d446) ) /* bank switched */ + ROM_LOAD( "ec_02.rom", 0x10000, 0x8000, CRC(b3cf1ef7) SHA1(91bc92293cbb47c38a2552c5beea53894b87d446) ) // bank switched - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "ec_04.rom", 0x0000, 0x8000, CRC(aa3e7d1e) SHA1(da350384d55f011253d19ce17fc327cd2604257f) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "empcityu_68705.3j", 0x0000, 0x0800, CRC(182f7616) SHA1(38b4f23a559ae13f8ca1b974407a2a40fc52879f) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) + + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END -/* set just contained the 3 roms cpu.4u, cpu.2u and vid.2p and the prom 82s123.a7 */ +// set just contained the 3 ROMs cpu.4u, cpu.2u and vid.2p and the PROM 82s123.a7 ROM_START( empcityu ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "cpu.4u", 0x00000, 0x8000, CRC(e2c40ea3) SHA1(fd3c21fe3b5faf323a16be54ad2eed23b12c977e) ) - ROM_LOAD( "cpu.2u", 0x10000, 0x8000, CRC(96ee8b81) SHA1(95b516c023766fae79241d4422814e39e268ae7d) ) /* bank switched */ + ROM_LOAD( "cpu.2u", 0x10000, 0x8000, CRC(96ee8b81) SHA1(95b516c023766fae79241d4422814e39e268ae7d) ) // bank switched - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "ec_04.rom", 0x0000, 0x8000, CRC(aa3e7d1e) SHA1(da350384d55f011253d19ce17fc327cd2604257f) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "empcityu_68705.3j", 0x0000, 0x0800, CRC(182f7616) SHA1(38b4f23a559ae13f8ca1b974407a2a40fc52879f) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "vid.2p", 0x0000, 0x2000, CRC(15593793) SHA1(ac9ca8a0aa0ce3810f45aa41e74d4946ecced245) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_REGION( 0x020, "user1", 0 ) - ROM_LOAD( "82s123.a7", 0x0000, 0x0020, CRC(93e2d292) SHA1(af8edd0cfe85f28ede9604cfaf4516d54e5277c9) ) /* ?*/ + ROM_LOAD( "82s123.a7", 0x0000, 0x0020, CRC(93e2d292) SHA1(af8edd0cfe85f28ede9604cfaf4516d54e5277c9) ) // ? ROM_END ROM_START( empcityj ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "1.bin", 0x00000, 0x8000, CRC(8162331c) SHA1(f2fdf5fbc52d4ea692fb87fa049c48935a73d67b) ) // sldh - ROM_LOAD( "2.bin", 0x10000, 0x8000, CRC(960edea6) SHA1(fd19475e841defe42625a94c40c6390b7e6e7682) ) /* bank switched */ // sldh + ROM_LOAD( "2.bin", 0x10000, 0x8000, CRC(960edea6) SHA1(fd19475e841defe42625a94c40c6390b7e6e7682) ) // bank switched // sldh - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "ec_04.rom", 0x0000, 0x8000, CRC(aa3e7d1e) SHA1(da350384d55f011253d19ce17fc327cd2604257f) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "empcityj_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(19bdb0a9) SHA1(6baba9a46d64ae8349c7e9713419141f76a7af96) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END ROM_START( stfight ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "a-1.4q", 0x00000, 0x8000, CRC(ff83f316) SHA1(84553ebd96ddbf59a1bcb221d53781980a006925) ) - ROM_LOAD( "sf02.bin", 0x10000, 0x8000, CRC(e626ce9e) SHA1(2c6c5a5cf15cc50217c9864a4d861af8a1b1b5ad) ) /* bank switched */ + ROM_LOAD( "sf02.bin", 0x10000, 0x8000, CRC(e626ce9e) SHA1(2c6c5a5cf15cc50217c9864a4d861af8a1b1b5ad) ) // bank switched - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "sf03.bin", 0x0000, 0x8000, CRC(6a8cb7a6) SHA1(dc123cc48d3623752b78e7c23dd8d2f5adf84f92) ) ROM_REGION( 0x0800, "mcu", 0 ) - ROM_LOAD( "stfight_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) ) + ROM_LOAD( "_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END -/* not sure if this is a bootleg or not, it still displays the seibu copyright on a screen during the attract mode +/* not sure if this is a bootleg or not, it still displays the Seibu copyright on a screen during the attract mode but not during the initial startup, must investigate this set more later */ ROM_START( stfighta ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ - ROM_LOAD( "sfight2.bin", 0x00000, 0x8000, CRC(8fb4dfc9) SHA1(0350f4a8749883a4e2e9c4aed2447a64a078f9ce) )// 2.bin 58.532715% - ROM_LOAD( "sfight1.bin", 0x10000, 0x8000, CRC(983ce746) SHA1(3c7b9498f1adf253ba651558ee40641ec3dbc5eb) )/* bank switched */ // a-1.4q 99.737549% + ROM_REGION( 2*0x18000, "maincpu", 0 ) + ROM_LOAD( "sfight2.bin", 0x00000, 0x8000, CRC(8fb4dfc9) SHA1(0350f4a8749883a4e2e9c4aed2447a64a078f9ce) ) // 2.bin 58.532715% + ROM_LOAD( "sfight1.bin", 0x10000, 0x8000, CRC(983ce746) SHA1(3c7b9498f1adf253ba651558ee40641ec3dbc5eb) ) // bank switched // a-1.4q 99.737549% - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "sf03.bin", 0x0000, 0x8000, CRC(6a8cb7a6) SHA1(dc123cc48d3623752b78e7c23dd8d2f5adf84f92) ) ROM_REGION( 0x0800, "mcu", 0 ) - ROM_LOAD( "stfight_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) ) + ROM_LOAD( "_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(f4cc50d6) SHA1(2ff62a349b74fa965b5d19615e52b867c04988dc) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END ROM_START( empcityi ) // very similar to above set - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "1.bin", 0x00000, 0x8000, CRC(32378e47) SHA1(1194e5a6b77ee754450ce532e048a55cf48d416c) ) ROM_LOAD( "2.bin", 0x10000, 0x8000, CRC(d20010c6) SHA1(8f30b385cbe733a4256461ab6f4aa82bc6694a6e) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "sf03.bin", 0x0000, 0x8000, CRC(6a8cb7a6) SHA1(dc123cc48d3623752b78e7c23dd8d2f5adf84f92) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "empcityi_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(b1817d44) SHA1(395aad763eb054514f658a14c12b92c1b90c02ce) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END ROM_START( empcityfr ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "pr.4t", 0x00000, 0x8000, CRC(aa1f84ac) SHA1(b484b85270091511860f5b4041099c5335ff1204) ) ROM_LOAD( "pr.2t", 0x10000, 0x8000, CRC(af381247) SHA1(93812d6b6a2dead07670b789597d23f29b8f0c5d) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "092-5c", 0x0000, 0x8000, CRC(6a8cb7a6) SHA1(dc123cc48d3623752b78e7c23dd8d2f5adf84f92) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "empcityfr_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(d66ac61f) SHA1(5f44d69886d4db46f2e4c07ebdf01e337ee4fd35) ) - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "115.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "116.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "113.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "114.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "109.4j", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "110.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "097.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "108.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "095.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "096.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "093.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "094.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "117.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "118.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "111.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "112.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "091.5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END ROM_START( stfightgb ) - ROM_REGION( 2*0x18000, "maincpu", 0 ) /* 96k for code + 96k for decrypted opcodes */ + ROM_REGION( 2*0x18000, "maincpu", 0 ) ROM_LOAD( "1.4t", 0x00000, 0x8000, CRC(0ce5ca11) SHA1(f753107a0c4ce52fe761ea2edce4c5e96169dfbd) ) - ROM_LOAD( "2.2t", 0x10000, 0x8000, CRC(936ba873) SHA1(bab519c587692a44a9cd1e9af2aeb7e3347c3f1b) ) /* bank switched */ + ROM_LOAD( "2.2t", 0x10000, 0x8000, CRC(936ba873) SHA1(bab519c587692a44a9cd1e9af2aeb7e3347c3f1b) ) // bank switched - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "c5", 0x0000, 0x8000, CRC(6a8cb7a6) SHA1(dc123cc48d3623752b78e7c23dd8d2f5adf84f92) ) ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "stfightgb_68705.3j", 0x0000, 0x0800, BAD_DUMP CRC(3b1b2660) SHA1(8d5d853a0861ff9cdea27eb3588586b441cc77b1) ) //hand-crafted, to be dumped - ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) /* character data */ + ROM_REGION( 0x02000, "stfight_vid:tx_gfx", 0 ) ROM_LOAD( "17.2n", 0x0000, 0x2000, CRC(1b3706b5) SHA1(61f069329a7a836523ffc8cce915b0d0129fd896) ) - ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) /* foreground tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:fg_gfx", 0 ) ROM_LOAD( "7.4c", 0x10000, 0x8000, CRC(2c6caa5f) SHA1(f6893cb87004979ead331897c684f995f850447e) ) ROM_LOAD( "8.5c", 0x18000, 0x8000, CRC(e11ded31) SHA1(e3e634ad324d51e52d79dd79e5e6e5697cb8d21f) ) ROM_LOAD( "5.2c", 0x00000, 0x8000, CRC(0c099a31) SHA1(dabaf8edc59e4954941cd8176031a358f45a1956) ) ROM_LOAD( "6.3c", 0x08000, 0x8000, CRC(3cc77c31) SHA1(13d2324df5a322d499c9959a6bb3a844edaefb45) ) - ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) /* background tile pixel data */ + ROM_REGION( 0x20000, "stfight_vid:bg_gfx", 0 ) ROM_LOAD( "13.4c", 0x10000, 0x8000, CRC(0ae48dd3) SHA1(ca3d9aeb9f4343c379cef9282e408fbf8aa67d99) ) ROM_LOAD( "14.5j", 0x18000, 0x8000, CRC(debf5d76) SHA1(eb18c35166eb5f93be98b3c30c7d909c0a68eada) ) ROM_LOAD( "11.2j", 0x00000, 0x8000, CRC(8261ecfe) SHA1(5817f4a0458a949298414fe09c86bbcf50be52f3) ) ROM_LOAD( "12.3j", 0x08000, 0x8000, CRC(71137301) SHA1(087a9f401939bc30f1dafa9916e8d8c564595a57) ) - ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) /* sprite data */ + ROM_REGION( 0x20000, "stfight_vid:spr_gfx", 0 ) ROM_LOAD( "20.8w", 0x10000, 0x8000, CRC(8299f247) SHA1(71891f7b1fbfaed14c3854b7f6e10a3ddb4bd479) ) ROM_LOAD( "21.9w", 0x18000, 0x8000, CRC(b57dc037) SHA1(69ac79a95ba9ace7c9ca7af480a4a10176be5ace) ) ROM_LOAD( "18.6w", 0x00000, 0x8000, CRC(68acd627) SHA1(f98ff9ccb0913711079a2988e8dd08695fb5e107) ) ROM_LOAD( "19.7w", 0x08000, 0x8000, CRC(5170a057) SHA1(9222f9febc222fa0c2eead258ad77c857f6d40c8) ) - ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) /* foreground map data */ + ROM_REGION( 0x10000, "stfight_vid:fg_map", 0 ) ROM_LOAD( "9.7c", 0x00000, 0x8000, CRC(8ceaf4fe) SHA1(5698f2ff44c109825b8d9d0b6dd2426624df668b) ) ROM_LOAD( "10.8c", 0x08000, 0x8000, CRC(5a1a227a) SHA1(24928ab218824ae1f5380398ceb90dcad525cc08) ) - ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) /* background map data */ + ROM_REGION( 0x10000, "stfight_vid:bg_map", 0 ) ROM_LOAD( "15.7j", 0x00000, 0x8000, CRC(27a310bc) SHA1(dd30d72bc33b0bf7ddaf3ab730e028f51b20152a) ) ROM_LOAD( "16.8j", 0x08000, 0x8000, CRC(3d19ce18) SHA1(38f691a23c96ef672637965c1a13f6d1595f9d51) ) ROM_REGION( 0x0100, "stfight_vid:tx_clut", 0 ) - ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) /* text lookup table */ + ROM_LOAD( "82s129.006", 0x0000, 0x0100, CRC(f9424b5b) SHA1(e3bc23213406d35d54f1221f17f25d433df273a2) ) ROM_REGION( 0x0100, "stfight_vid:fg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) /* fg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.002", 0x0000, 0x0100, CRC(c883d49b) SHA1(e84900ccf6f27e5043e43c0d85ea1e4eee7e52d3) ) ROM_LOAD_NIB_LOW( "82s129.003", 0x0000, 0x0100, CRC(af81882a) SHA1(b1008c991bd8d1157b3479e465ab286c70418b58) ) ROM_REGION( 0x0100, "stfight_vid:bg_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) /* bg lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.004", 0x0000, 0x0100, CRC(1831ce7c) SHA1(57afbee9225f0efd63895a5f522e96dc87ca2616) ) ROM_LOAD_NIB_LOW( "82s129.005", 0x0000, 0x0100, CRC(96cb6293) SHA1(1dcdeaa995e6ffa3753b742842c5ffe0f68ef8cd) ) ROM_REGION( 0x0100, "stfight_vid:spr_clut", 0 ) - ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) /* sprite lookup table */ + ROM_LOAD_NIB_HIGH( "82s129.052", 0x0000, 0x0100, CRC(3d915ffc) SHA1(921be6d5e5fc0fdee9c9f545c1c4a0c334e9844c) ) ROM_LOAD_NIB_LOW( "82s129.066", 0x0000, 0x0100, CRC(51e8832f) SHA1(ed8c00559e7a02bb8c11861d747c8c64c01b7437) ) ROM_REGION( 0x0800, "proms", 0 ) - ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* timing? (not used) */ + ROM_LOAD( "82s129.015", 0x0700, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // timing? (not used) - ROM_REGION( 0x08000, "adpcm", 0 ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", 0 ) ROM_LOAD( "5j", 0x00000, 0x8000, CRC(1b8d0c07) SHA1(c163ccd2b7ed6c84facc075eb1564ca399f3ba17) ) ROM_END @@ -1073,16 +1353,16 @@ */ ROM_START( cshootert ) - ROM_REGION( 0x20000, "maincpu", 0 ) // Main CPU + ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "r1.4u", 0x00000, 0x08000, CRC(fbe8c518) SHA1(bff8319f4892e6d06f1c7a679f67dc8407279cfa) ) ROM_LOAD( "r2.2u", 0x10000, 0x10000, CRC(5ddf9f4e) SHA1(69e4d422ca272bf2e9f00edbe7d23760485fdfe6) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) // Sub/Sound CPU + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "r4.5c", 0x00000, 0x08000, CRC(84fed017) SHA1(9a564c9379eb48569cfba48562889277991864d8) ) - ROM_REGION( 0x08000, "adpcm", ROMREGION_ERASEFF ) /* ADPCM voice data */ + ROM_REGION( 0x08000, "adpcm", ROMREGION_ERASEFF ) - ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */ + ROM_REGION( 0x0800, "mcu", 0 ) ROM_LOAD( "crshooter.3j", 0x0000, 0x0800, CRC(aae61ce7) SHA1(bb2b9887ec73a5b82604b9b64c533c2242d20d0f) ) ROM_REGION( 0x820, "proms", 0 ) @@ -1092,13 +1372,13 @@ // below are from the video board - ROM_REGION( 0x02000, "airraid_vid:tx_gfx", 0 ) // TX Layer + ROM_REGION( 0x02000, "airraid_vid:tx_gfx", 0 ) ROM_LOAD( "r3.11a", 0x00000, 0x02000, CRC(67b50a47) SHA1(b1f4aefc9437edbeefba5371149cc08c0b55c741) ) ROM_REGION( 0x100, "airraid_vid:tx_clut", 0 ) - ROM_LOAD( "63s281.16a", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) // clut + ROM_LOAD( "63s281.16a", 0x0000, 0x0100, CRC(0b8b914b) SHA1(8cf4910b846de79661cc187887171ed8ebfd6719) ) - /* ### MODULE 1 ### Background generation / graphics */ + // ### MODULE 1 ### Background generation / graphics ROM_REGION( 0x40000, "airraid_vid:bg_map", 0 ) ROM_LOAD16_BYTE( "bg_layouts_even", 0x00000, 0x20000, NO_DUMP ) ROM_LOAD16_BYTE( "bg_layouts_odd", 0x00001, 0x20000, NO_DUMP ) @@ -1108,7 +1388,7 @@ ROM_REGION( 0x100, "airraid_vid:bg_clut", 0 ) ROM_LOAD( "bg_clut", 0x000, 0x100, NO_DUMP ) - /* ### MODULE 2 ### Foreground generation / graphics */ + // ### MODULE 2 ### Foreground generation / graphics ROM_REGION( 0x40000, "airraid_vid:fg_map", 0 ) ROM_LOAD16_BYTE( "fg_layouts_even", 0x00000, 0x20000, NO_DUMP ) ROM_LOAD16_BYTE( "fg_layouts_odd", 0x00001, 0x20000, NO_DUMP ) @@ -1118,7 +1398,7 @@ ROM_REGION( 0x100, "airraid_vid:fg_clut", 0 ) ROM_LOAD( "fg_clut", 0x000, 0x100, NO_DUMP ) - /* ### MODULE 3 ### Sprite graphics */ + // ### MODULE 3 ### Sprite graphics ROM_REGION( 0x40000, "airraid_vid:spr_gfx", 0 ) ROM_LOAD16_BYTE( "sprite_tiles_even", 0x00000, 0x20000, NO_DUMP ) ROM_LOAD16_BYTE( "sprite_tiles_odd", 0x00001, 0x20000, NO_DUMP ) @@ -1127,6 +1407,59 @@ ROM_END +/* + +Encryption PAL 16R4 on CPU board + + +---U---+ + CP --| |-- VCC + ROM D1 --| |-- ROM D0 M1 = 0 M1 = 1 + ROM D3 --| |-- (NC) + ROM D4 --| |-- D6 D6 = D1 ^^ D3 D6 = / ( D1 ^^ D0 ) + ROM D6 --| |-- D4 D4 = / ( D6 ^^ A7 ) D4 = D3 ^^ A0 + A0 --| |-- D3 D3 = / ( D0 ^^ A1 ) D3 = D4 ^^ A4 + A1 --| |-- D0 D0 = D1 ^^ D4 D0 = / ( D6 ^^ A0 ) + A4 --| |-- (NC) + A7 --| |-- /M1 + GND --| |-- /OE + +-------+ + +*/ + + +void stfight_state::init_stfight() +{ + uint8_t *rom = memregion("maincpu")->base(); + + for (uint32_t A = 0; A < 0x8000; ++A) + { + uint8_t src = rom[A]; + + // decode opcode + m_decrypted_opcodes[A] = + ( src & 0xa6 ) | + ( ( ( ( src << 2 ) ^ src ) << 3 ) & 0x40 ) | + ( ~( ( src ^ ( A >> 1 ) ) >> 2 ) & 0x10 ) | + ( ~( ( ( src << 1 ) ^ A ) << 2 ) & 0x08 ) | + ( ( ( src ^ ( src >> 3 ) ) >> 1 ) & 0x01 ); + + // decode operand + rom[A] = + ( src & 0xa6 ) | + ( ~( ( src ^ ( src << 1 ) ) << 5 ) & 0x40 ) | + ( ( ( src ^ ( A << 3 ) ) << 1 ) & 0x10 ) | + ( ( ( src ^ A ) >> 1 ) & 0x08 ) | + ( ~( ( src >> 6 ) ^ A ) & 0x01 ); + } + + // Set clock prescaler FM:1/2 PSG:1/1 + m_ym[0]->write(0, 0x2f); + m_ym[1]->write(0, 0x2f); +} + +} // anonymous namespace + + // Note: Marked MACHINE_IMPERFECT_SOUND due to YM2203 clock issue GAME( 1986, empcity, 0, stfight, stfight, stfight_state, init_stfight, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, init_stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // different title logo @@ -1138,4 +1471,4 @@ GAME( 1986, stfightgb, empcity, stfight, stfight, stfight_state, init_stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany - Benelux)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // Cross Shooter uses the same base board, but different video board -GAME( 1987, cshootert, airraid, cshooter, cshooter, stfight_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Cross Shooter (2 PCB Stack)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, cshootert, airraid, cshooter, cshooter, stfight_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Cross Shooter (2 PCB Stack)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/stfight.h mame-0.264+dfsg.1/src/mame/seibu/stfight.h --- mame-0.263+dfsg.1/src/mame/seibu/stfight.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/stfight.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Mark McDougall -#ifndef MAME_SEIBU_STFIGHT_H -#define MAME_SEIBU_STFIGHT_H - -#pragma once - -#include "cpu/m6805/m68705.h" -#include "sound/ymopn.h" -#include "sound/msm5205.h" -#include "stfight_dev.h" -#include "airraid_dev.h" - -class stfight_state : public driver_device -{ -public: - stfight_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_coin_mech(*this, "COIN") - , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") - , m_mcu(*this, "mcu") - , m_msm(*this, "msm") - , m_ym(*this, "ym%u", 0) - , m_main_bank(*this, "mainbank") - , m_samples(*this, "adpcm") - , m_decrypted_opcodes(*this, "decrypted_opcodes") - , m_coin_state(0) - , m_fm_data(0) - , m_cpu_to_mcu_empty(true) - , m_cpu_to_mcu_data(0x0f) - , m_port_a_out(0xff) - , m_port_c_out(0xff) - , m_vck2(false) - , m_adpcm_reset(true) - , m_adpcm_data_offs(0x0000) - { - } - - void stfight_base(machine_config &config); - void stfight(machine_config &config); - void cshooter(machine_config &config); - - void init_stfight(); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - TIMER_CALLBACK_MEMBER(rst08_tick); - -private: - void stfight_adpcm_int(int state); - - void stfight_io_w(uint8_t data); - uint8_t stfight_coin_r(); - void stfight_coin_w(uint8_t data); - void stfight_fm_w(uint8_t data); - void stfight_mcu_w(uint8_t data); - - void stfight_bank_w(uint8_t data); - - uint8_t stfight_fm_r(); - - INTERRUPT_GEN_MEMBER(stfight_vb_interrupt); - - // MCU specifics - uint8_t stfight_68705_port_b_r(); - void stfight_68705_port_a_w(uint8_t data); - void stfight_68705_port_b_w(uint8_t data); - void stfight_68705_port_c_w(uint8_t data); - - void cpu1_map(address_map &map); - void cpu2_map(address_map &map); - void cshooter_cpu1_map(address_map &map); - void decrypted_opcodes_map(address_map &map); - void stfight_cpu1_map(address_map &map); - - required_ioport m_coin_mech; - - required_device m_maincpu; - required_device m_audiocpu; - required_device m_mcu; - required_device m_msm; - required_device_array m_ym; - - required_memory_bank m_main_bank; - - required_region_ptr m_samples; - optional_shared_ptr m_decrypted_opcodes; - - uint8_t m_coin_state = 0; - - uint8_t m_fm_data = 0; - - bool m_cpu_to_mcu_empty = false; - uint8_t m_cpu_to_mcu_data = 0; - uint8_t m_port_a_out = 0; - uint8_t m_port_c_out = 0; - - bool m_vck2 = false; - bool m_adpcm_reset = false; - uint16_t m_adpcm_data_offs = 0; - - emu_timer *m_int1_timer = nullptr; -}; - -#endif // MAME_SEIBU_STFIGHT_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/stfight_m.cpp mame-0.264+dfsg.1/src/mame/seibu/stfight_m.cpp --- mame-0.263+dfsg.1/src/mame/seibu/stfight_m.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/stfight_m.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Mark McDougall -/*************************************************************************** - - stfight.c - - Functions to emulate general aspects of the machine (RAM, ROM, interrupts, - I/O ports) - -***************************************************************************/ - -#include "emu.h" -#include "stfight.h" - -#include "cpu/m6805/m68705.h" -#include "cpu/z80/z80.h" -#include "sound/msm5205.h" - - -/* - -Encryption PAL 16R4 on CPU board - - +---U---+ - CP --| |-- VCC - ROM D1 --| |-- ROM D0 M1 = 0 M1 = 1 - ROM D3 --| |-- (NC) - ROM D4 --| |-- D6 D6 = D1 ^^ D3 D6 = / ( D1 ^^ D0 ) - ROM D6 --| |-- D4 D4 = / ( D6 ^^ A7 ) D4 = D3 ^^ A0 - A0 --| |-- D3 D3 = / ( D0 ^^ A1 ) D3 = D4 ^^ A4 - A1 --| |-- D0 D0 = D1 ^^ D4 D0 = / ( D6 ^^ A0 ) - A4 --| |-- (NC) - A7 --| |-- /M1 - GND --| |-- /OE - +-------+ - -*/ - - -void stfight_state::init_stfight() -{ - uint8_t *rom = memregion("maincpu")->base(); - - for (uint32_t A = 0; A < 0x8000; ++A) - { - uint8_t src = rom[A]; - - // decode opcode - m_decrypted_opcodes[A] = - ( src & 0xA6 ) | - ( ( ( ( src << 2 ) ^ src ) << 3 ) & 0x40 ) | - ( ~( ( src ^ ( A >> 1 ) ) >> 2 ) & 0x10 ) | - ( ~( ( ( src << 1 ) ^ A ) << 2 ) & 0x08 ) | - ( ( ( src ^ ( src >> 3 ) ) >> 1 ) & 0x01 ); - - // decode operand - rom[A] = - ( src & 0xA6 ) | - ( ~( ( src ^ ( src << 1 ) ) << 5 ) & 0x40 ) | - ( ( ( src ^ ( A << 3 ) ) << 1 ) & 0x10 ) | - ( ( ( src ^ A ) >> 1 ) & 0x08 ) | - ( ~( ( src >> 6 ) ^ A ) & 0x01 ); - } - - // Set clock prescaler FM:1/2 PSG:1/1 - m_ym[0]->write(0, 0x2f); - m_ym[1]->write(0, 0x2f); -} - -void stfight_state::machine_start() -{ - m_main_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000); - m_main_bank->set_entry(0); - - m_int1_timer = timer_alloc(FUNC(stfight_state::rst08_tick), this); - - save_item(NAME(m_coin_state)); - save_item(NAME(m_fm_data)); - - save_item(NAME(m_cpu_to_mcu_empty)); - save_item(NAME(m_cpu_to_mcu_data)); - save_item(NAME(m_port_a_out)); - save_item(NAME(m_port_c_out)); - - save_item(NAME(m_vck2)); - save_item(NAME(m_adpcm_reset)); - save_item(NAME(m_adpcm_data_offs)); -} - - -void stfight_state::machine_reset() -{ - m_fm_data = 0; - m_cpu_to_mcu_empty = true; - m_adpcm_reset = true; - - // Coin signals are active low - m_coin_state = 3; -} - -// It's entirely possible that this bank is never switched out -// - in fact I don't even know how/where it's switched in! -void stfight_state::stfight_bank_w(uint8_t data) -{ - m_main_bank->set_entry(bitswap(data, 7, 2)); -} - -/* - * CPU 1 timed interrupt - 60Hz??? - */ - -TIMER_CALLBACK_MEMBER(stfight_state::rst08_tick) -{ - m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 -} - -INTERRUPT_GEN_MEMBER(stfight_state::stfight_vb_interrupt) -{ - // Do a RST10 - device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - m_int1_timer->adjust(attotime::from_hz(120)); -} - -/* - * Hardware handlers - */ - -void stfight_state::stfight_io_w(uint8_t data) -{ - // TODO: What is bit 4? - machine().bookkeeping().coin_counter_w(0, data & 1); - machine().bookkeeping().coin_counter_w(1, data & 2); -} - -uint8_t stfight_state::stfight_coin_r() -{ - return m_coin_state; -} - -void stfight_state::stfight_coin_w(uint8_t data) -{ - // Acknowledge coin signals (active low) - if (!BIT(data, 0)) - m_coin_state |= 1; - - if (!BIT(data, 1)) - m_coin_state |= 2; -} - -/* - * Machine hardware for MSM5205 ADPCM sound control - */ - -void stfight_state::stfight_adpcm_int(int state) -{ - if (!state) - return; - - // Falling edge triggered interrupt at half the rate of /VCK? - m_mcu->set_input_line(M68705_IRQ_LINE, m_vck2 ? ASSERT_LINE : CLEAR_LINE); - m_vck2 = !m_vck2; - - if (!m_adpcm_reset) - { - uint8_t adpcm_data = m_samples[(m_adpcm_data_offs >> 1) & 0x7fff]; - - if (!BIT(m_adpcm_data_offs, 0)) - adpcm_data >>= 4; - ++m_adpcm_data_offs; - - m_msm->data_w(adpcm_data & 0x0f); - } -} - - -/* - * Machine hardware for YM2303 FM sound control - */ - -void stfight_state::stfight_fm_w(uint8_t data) -{ - // The sound cpu ignores any FM data without bit 7 set - m_fm_data = 0x80 | data; -} - -uint8_t stfight_state::stfight_fm_r() -{ - uint8_t const data = m_fm_data; - - // Acknowledge the command - if (!machine().side_effects_disabled()) - m_fm_data &= ~0x80; - - return data; -} - - -/* - * MCU communications - */ - -void stfight_state::stfight_mcu_w(uint8_t data) -{ - m_cpu_to_mcu_data = data & 0x0f; - m_cpu_to_mcu_empty = false; -} - -void stfight_state::stfight_68705_port_a_w(uint8_t data) -{ - m_port_a_out = data; -} - -uint8_t stfight_state::stfight_68705_port_b_r() -{ - return - (m_coin_mech->read() << 6) | - (m_cpu_to_mcu_empty ? 0x10 : 0x00) | - (m_cpu_to_mcu_data & 0x0f); -} - -void stfight_state::stfight_68705_port_b_w(uint8_t data) -{ - // Acknowledge Z80 command - if (!BIT(data, 5)) - m_cpu_to_mcu_empty = true; -} - -void stfight_state::stfight_68705_port_c_w(uint8_t data) -{ - // Signal a valid coin on the falling edge - if (BIT(m_port_c_out, 0) && !BIT(data, 0)) - m_coin_state &= ~1; - if (BIT(m_port_c_out, 1) && !BIT(data, 1)) - m_coin_state &= ~2; - - // Latch ADPCM data address when dropping the reset line - m_adpcm_reset = BIT(data, 2); - if (!m_adpcm_reset && BIT(m_port_c_out, 2)) - m_adpcm_data_offs = m_port_a_out << 9; - m_msm->reset_w(m_adpcm_reset ? ASSERT_LINE : CLEAR_LINE); - - // Generate NMI on host CPU (used on handshake error or stuck coin) - m_maincpu->set_input_line(INPUT_LINE_NMI, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE); - - m_port_c_out = data; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/toki.cpp mame-0.264+dfsg.1/src/mame/seibu/toki.cpp --- mame-0.263+dfsg.1/src/mame/seibu/toki.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/toki.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Jarek Parchanski +// copyright-holders: Jarek Parchanski + /*************************************************************************** Toki @@ -11,7 +12,7 @@ Notes by bmcphail@vcmame.net, 1/1/2008 -Toki stores high score at $60008 in main ram (init code at $ADA, compared with player score at $1A1BA) +Toki stores high score at $60008 in main RAM (init code at $ADA, compared with player score at $1A1BA) Tokiu stores high score at $60010 instead (init code at $B16, equivalent compare code at $1a204), $60008 is used for different purposes in many parts of the code. @@ -90,30 +91,420 @@ ***************************************************************************/ #include "emu.h" -#include "toki.h" + +#include "seibusound.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" +#include "machine/gen_latch.h" #include "machine/watchdog.h" +#include "sound/msm5205.h" #include "sound/okim6295.h" #include "sound/ymopl.h" +#include "video/bufsprite.h" + +#include "emupal.h" +#include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class base_state : public driver_device +{ +public: + base_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_audiocpu_rom(*this, "audiocpu"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_spriteram(*this, "spriteram"), + m_background_videoram(*this, "bg_vram%u", 1U), + m_videoram(*this, "videoram"), + m_scrollram(*this, "scrollram") + { } + +protected: + virtual void video_start() override; + + required_device m_maincpu; + required_device m_audiocpu; + required_region_ptr m_audiocpu_rom; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + required_device m_spriteram; + + required_shared_ptr_array m_background_videoram; + required_shared_ptr m_videoram; + required_shared_ptr m_scrollram; + + tilemap_t *m_background_layer = nullptr; + tilemap_t *m_foreground_layer = nullptr; + tilemap_t *m_text_layer = nullptr; + + void foreground_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void background1_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void background2_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + TILE_GET_INFO_MEMBER(get_text_tile_info); + TILE_GET_INFO_MEMBER(get_back_tile_info); + TILE_GET_INFO_MEMBER(get_fore_tile_info); +}; + +class toki_state : public base_state +{ +public: + toki_state(const machine_config &mconfig, device_type type, const char *tag) : + base_state(mconfig, type, tag), + m_seibu_sound(*this, "seibu_sound") + { } + + void toki(machine_config &config); + void jujuba(machine_config &config); + + void init_jujuba(); + void init_toki(); + +private: + required_device m_seibu_sound; + + void control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + uint8_t jujuba_z80_data_decrypt(offs_t offset); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + + void jujuba_audio_map(address_map &map); + void jujuba_audio_opcodes_map(address_map &map); + void toki_audio_map(address_map &map); + void toki_audio_opcodes_map(address_map &map); + void main_map(address_map &map); +}; + +class tokib_state : public base_state +{ +public: + tokib_state(const machine_config &mconfig, device_type type, const char *tag) : + base_state(mconfig, type, tag), + m_msm(*this, "msm"), + m_audiobank(*this, "audiobank") + { } + + void tokib(machine_config &config); + + void init_tokib(); + +private: + required_device m_msm; + + required_memory_bank m_audiobank; + + uint8_t m_msm5205next = 0; + uint8_t m_toggle = 0; + + uint16_t pip_r(); + void adpcm_control_w(uint8_t data); + void adpcm_data_w(uint8_t data); + void adpcm_int(int state); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + + void audio_map(address_map &map); + void main_map(address_map &map); +}; + + +/************************************************************************* + RASTER EFFECTS + +Xscroll can be altered per scanline to create rowscroll effect. + +(The driver does not implement rowscroll on the bootleg. It seems unlikely +the bootleggers would have been able to do this on their chipset. They +remapped the scroll registers, so obviously they were using a different +chip. + +Why then would the old ghost of one of the remapped registers +still cause rowscroll? Probably the bootleggers simply didn't bother to +remove all the code writing the $a0000 area.) + +*************************************************************************/ + +void toki_state::control_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + m_screen->update_partial(m_screen->vpos() - 1); + COMBINE_DATA(&m_scrollram[offset]); +} + +TILE_GET_INFO_MEMBER(base_state::get_text_tile_info) +{ + int tile = m_videoram[tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(0, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(base_state::get_back_tile_info) +{ + int tile = m_background_videoram[0][tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(2, tile, color, 0); +} + +TILE_GET_INFO_MEMBER(base_state::get_fore_tile_info) +{ + int tile = m_background_videoram[1][tile_index]; + int const color = (tile >> 12) & 0xf; + + tile &= 0xfff; + + tileinfo.set(3, tile, color, 0); +} + + +/************************************* + * + * Start/Stop + * + *************************************/ + +void base_state::video_start() +{ + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_fore_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + + m_text_layer->set_transparent_pen(15); + m_background_layer->set_transparent_pen(15); + m_foreground_layer->set_transparent_pen(15); +} + +/*************************************/ + +void base_state::foreground_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[offset]); + m_text_layer->mark_tile_dirty(offset); +} + +void base_state::background1_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_background_videoram[0][offset]); + m_background_layer->mark_tile_dirty(offset); +} + +void base_state::background2_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_background_videoram[1][offset]); + m_foreground_layer->mark_tile_dirty(offset); +} + +/*************************************************************************** + SPRITES + + Original Spriteram + ------------------ + + It's not clear what purpose is served by marking tiles as being part of + big sprites. (Big sprites in the attract abduction scene have all tiles + marked as "first" unlike big sprites in-game.) + + We just ignore this top nibble (although perhaps in theory the bits + enable X/Y offsets in the low byte). + + +0 x....... ........ sprite disable ?? + +0 .xx..... ........ tile is part of big sprite (4=first, 6=middle, 2=last) + +0 .....x.. ........ ??? always set? (could be priority - see Bloodbro) + +0 .......x ........ Flip x + +0 ........ xxxx.... X offset: add (this * 16) to X coord + +0 ........ ....xxxx Y offset: add (this * 16) to Y coord + + +1 xxxx.... ........ Color bank + +1 ....xxxx xxxxxxxx Tile number (lo bits) + +2 x....... ........ Tile number (hi bit) + +2 .???.... ........ (set in not yet used entries) + +2 .......x xxxxxxxx X coordinate + +3 .......x xxxxxxxx Y coordinate + + f000 0000 f000 0000 entry not yet used: unless this is honored there + will be junk sprites in top left corner + ffff ???? ???? ???? sprite marked as dead: unless this is honored + there will be junk sprites after floating monkey machine + + + Bootleg Spriteram + ----------------- + + +0 .......x xxxxxxxx Sprite Y coordinate + +1 ...xxxxx xxxxxxxx Sprite tile number + +1 .x...... ........ Sprite flip x + +2 xxxx.... ........ Sprite color bank + +3 .......x xxxxxxxx Sprite X coordinate + + f100 ???? ???? ???? dead / unused sprite ?? + ???? ???? 0000 ???? dead / unused sprite ?? + + +***************************************************************************/ + + +void toki_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int offs = (m_spriteram->bytes() / 2) - 4; offs >= 0; offs -= 4) + { + uint16_t const *sprite_word = &m_spriteram->buffer()[offs]; + + if ((sprite_word[2] != 0xf000) && (sprite_word[0] != 0xffff)) + { + int const xoffs = (sprite_word[0] & 0xf0); + int x = (sprite_word[2] + xoffs) & 0x1ff; + if (x > 256) + x -= 512; + + int const yoffs = (sprite_word[0] & 0xf) << 4; + int y = (sprite_word[3] + yoffs) & 0x1ff; + if (y > 256) + y -= 512; + + int const color = sprite_word[1] >> 12; + int flipx = sprite_word[0] & 0x100; + int flipy = 0; + int const tile = (sprite_word[1] & 0xfff) + ((sprite_word[2] & 0x8000) >> 3); + + if (flip_screen()) + { + x = 240 - x; + y= 240 - y; + if (flipx) flipx = 0; else flipx = 1; + flipy = 1; + } + + m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, + tile, + color, + flipx, flipy, + x, y, 15); + } + } +} + + +void tokib_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int offs = 0; offs < m_spriteram->bytes() / 2; offs += 4) + { + uint16_t const *sprite_word = &m_spriteram->buffer()[offs]; + + if (sprite_word[0] == 0xf100) + break; + if (sprite_word[2]) + { + int x = sprite_word[3] & 0x1ff; + if (x > 256) + x -= 512; + + int y = sprite_word[0] & 0x1ff; + if (y > 256) + y = (512 - y) + 240; + else + y = 240 - y; + + int const flipx = sprite_word[1] & 0x4000; + int const tile = sprite_word[1] & 0x1fff; + int const color = sprite_word[2] >> 12; + + m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, + tile, + color, + flipx, 0, + x, y - 1, 15); + } + } +} + +/************************************* + * + * Master update function + * + *************************************/ +uint32_t toki_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int const background_x_scroll = ((m_scrollram[0x06] & 0x7f) << 1) | ((m_scrollram[0x06] & 0x80) >> 7) | ((m_scrollram[0x05] & 0x10) << 4); + int const background_y_scroll = ((m_scrollram[0x0d] & 0x10) << 4) + ((m_scrollram[0x0e] & 0x7f) << 1) + ((m_scrollram[0x0e] & 0x80) >> 7); + + m_background_layer->set_scrollx(0, background_x_scroll); + m_background_layer->set_scrolly(0, background_y_scroll); + + int const foreground_x_scroll = ((m_scrollram[0x16] & 0x7f) << 1) | ((m_scrollram[0x16] & 0x80) >> 7) | ((m_scrollram[0x15] & 0x10) << 4); + int const foreground_y_scroll = ((m_scrollram[0x1d] & 0x10) << 4) + ((m_scrollram[0x1e] & 0x7f) << 1) + ((m_scrollram[0x1e] & 0x80) >> 7); + + m_foreground_layer->set_scrollx(0, foreground_x_scroll); + m_foreground_layer->set_scrolly(0, foreground_y_scroll); + + flip_screen_set((m_scrollram[0x28] & 0x8000) == 0); + + if (m_scrollram[0x28] & 0x100) + { + m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + m_foreground_layer->draw(screen, bitmap, cliprect, 0, 0); + } + else + { + m_foreground_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + m_background_layer->draw(screen, bitmap, cliprect, 0, 0); + } + draw_sprites(bitmap, cliprect); + m_text_layer->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} -void toki_state::tokib_soundcommand_w(uint16_t data) +uint32_t tokib_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_soundlatch->write(data & 0xff); - m_audiocpu->set_input_line(0, HOLD_LINE); + m_foreground_layer->set_scroll_rows(1); + m_background_layer->set_scroll_rows(1); + m_background_layer->set_scrolly(0, m_scrollram[0] + 1); + m_background_layer->set_scrollx(0, m_scrollram[1] - 0x103); + m_foreground_layer->set_scrolly(0, m_scrollram[2] + 1); + m_foreground_layer->set_scrollx(0, m_scrollram[3] - 0x101); + + if (m_scrollram[3] & 0x2000) + { + m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + m_foreground_layer->draw(screen, bitmap, cliprect, 0, 0); + } + else + { + m_foreground_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + m_background_layer->draw(screen, bitmap, cliprect, 0, 0); + } + + draw_sprites(bitmap, cliprect); + m_text_layer->draw(screen, bitmap, cliprect, 0, 0); + return 0; } -uint16_t toki_state::pip_r() + +uint16_t tokib_state::pip_r() { return ~0; } -void toki_state::tokib_adpcm_int(int state) +void tokib_state::adpcm_int(int state) { m_msm->data_w(m_msm5205next); m_msm5205next >>= 4; @@ -123,15 +514,15 @@ m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } -void toki_state::tokib_adpcm_control_w(uint8_t data) +void tokib_state::adpcm_control_w(uint8_t data) { - /* the code writes either 2 or 3 in the bottom two bits */ - membank("bank1")->set_entry(data & 1); + // the code writes either 2 or 3 in the bottom two bits + m_audiobank->set_entry(data & 1); m_msm->reset_w(data & 0x08); } -void toki_state::tokib_adpcm_data_w(uint8_t data) +void tokib_state::adpcm_data_w(uint8_t data) { m_msm5205next = data; } @@ -139,44 +530,44 @@ /*****************************************************************************/ -void toki_state::toki_map(address_map &map) +void toki_state::main_map(address_map &map) { map(0x000000, 0x05ffff).rom(); map(0x060000, 0x06d7ff).ram(); map(0x06d800, 0x06dfff).ram().share("spriteram"); map(0x06e000, 0x06e7ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x06e800, 0x06efff).ram().w(FUNC(toki_state::background1_videoram_w)).share("bg1_vram"); - map(0x06f000, 0x06f7ff).ram().w(FUNC(toki_state::background2_videoram_w)).share("bg2_vram"); - map(0x06f800, 0x06ffff).ram().w(FUNC(toki_state::foreground_videoram_w)).share("videoram"); + map(0x06e800, 0x06efff).ram().w(FUNC(toki_state::background1_videoram_w)).share(m_background_videoram[0]); + map(0x06f000, 0x06f7ff).ram().w(FUNC(toki_state::background2_videoram_w)).share(m_background_videoram[1]); + map(0x06f800, 0x06ffff).ram().w(FUNC(toki_state::foreground_videoram_w)).share(m_videoram); map(0x080000, 0x08000d).rw(m_seibu_sound, FUNC(seibu_sound_device::main_r), FUNC(seibu_sound_device::main_w)).umask16(0x00ff); - map(0x0a0000, 0x0a005f).w(FUNC(toki_state::toki_control_w)).share("scrollram"); + map(0x0a0000, 0x0a005f).w(FUNC(toki_state::control_w)).share(m_scrollram); map(0x0c0000, 0x0c0001).portr("DSW"); map(0x0c0002, 0x0c0003).portr("INPUTS"); map(0x0c0004, 0x0c0005).portr("SYSTEM"); } -/* In the bootleg, sound and sprites are remapped to 0x70000 */ -void toki_state::tokib_map(address_map &map) +// In the bootleg, sound and sprites are remapped to 0x70000 +void tokib_state::main_map(address_map &map) { map(0x000000, 0x05ffff).rom(); map(0x060000, 0x06dfff).ram(); map(0x06e000, 0x06e7ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x06e800, 0x06efff).ram().w(FUNC(toki_state::background1_videoram_w)).share("bg1_vram"); - map(0x06f000, 0x06f7ff).ram().w(FUNC(toki_state::background2_videoram_w)).share("bg2_vram"); - map(0x06f800, 0x06ffff).ram().w(FUNC(toki_state::foreground_videoram_w)).share("videoram"); - map(0x071000, 0x071001).nopw(); /* sprite related? seems another scroll register */ - /* gets written the same value as 75000a (bg2 scrollx) */ + map(0x06e800, 0x06efff).ram().w(FUNC(tokib_state::background1_videoram_w)).share(m_background_videoram[0]); + map(0x06f000, 0x06f7ff).ram().w(FUNC(tokib_state::background2_videoram_w)).share(m_background_videoram[1]); + map(0x06f800, 0x06ffff).ram().w(FUNC(tokib_state::foreground_videoram_w)).share(m_videoram); + map(0x071000, 0x071001).nopw(); // sprite related? seems another scroll register + // gets written the same value as 75000a (bg2 scrollx) map(0x071804, 0x071807).nopw(); /* sprite related, always 01be0100 */ map(0x07180e, 0x071e45).writeonly().share("spriteram"); - map(0x072000, 0x072001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); /* probably */ - map(0x075000, 0x075001).w(FUNC(toki_state::tokib_soundcommand_w)); - map(0x075004, 0x07500b).writeonly().share("scrollram"); + map(0x072000, 0x072001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // probably + map(0x075001, 0x075001).w("soundlatch", FUNC(generic_latch_8_device::write)); + map(0x075004, 0x07500b).writeonly().share(m_scrollram); map(0x0c0000, 0x0c0001).portr("DSW"); map(0x0c0002, 0x0c0003).portr("INPUTS"); map(0x0c0004, 0x0c0005).portr("SYSTEM"); - map(0x0c000e, 0x0c000f).r(FUNC(toki_state::pip_r)); /* sound related, if we return 0 the code writes */ - /* the sound command quickly followed by 0 and the */ - /* sound CPU often misses the command. */ + map(0x0c000e, 0x0c000f).r(FUNC(tokib_state::pip_r)); // sound related, if we return 0 the code writes + // the sound command quickly followed by 0 and the + // sound CPU often misses the command. } /*****************************************************************************/ @@ -236,21 +627,21 @@ return m_audiocpu_rom[offset] ^ 0x55; } -void toki_state::tokib_audio_map(address_map &map) +void tokib_state::audio_map(address_map &map) { map(0x0000, 0x7fff).rom(); - map(0x8000, 0xbfff).bankr("bank1"); - map(0xe000, 0xe000).w(FUNC(toki_state::tokib_adpcm_control_w)); /* MSM5205 + ROM bank */ - map(0xe400, 0xe400).w(FUNC(toki_state::tokib_adpcm_data_w)); + map(0x8000, 0xbfff).bankr(m_audiobank); + map(0xe000, 0xe000).w(FUNC(tokib_state::adpcm_control_w)); // MSM5205 + ROM bank + map(0xe400, 0xe400).w(FUNC(tokib_state::adpcm_data_w)); map(0xec00, 0xec01).mirror(0x0008).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write)); map(0xf000, 0xf7ff).ram(); - map(0xf800, 0xf800).r(m_soundlatch, FUNC(generic_latch_8_device::read)); + map(0xf800, 0xf800).r("soundlatch", FUNC(generic_latch_8_device::read)); } /*****************************************************************************/ static INPUT_PORTS_START( toki ) - SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */ + SEIBU_COIN_INPUTS // coin inputs read through sound CPU PORT_START("DSW") PORT_DIPNAME( 0x001f, 0x001f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3,4,5") @@ -445,25 +836,25 @@ }; static GFXDECODE_START( gfx_toki ) - GFXDECODE_ENTRY( "gfx1", 0, toki_charlayout, 16*16, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, toki_tilelayout, 0*16, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, toki_tilelayout, 32*16, 16 ) - GFXDECODE_ENTRY( "gfx4", 0, toki_tilelayout, 48*16, 16 ) + GFXDECODE_ENTRY( "chars", 0, toki_charlayout, 16*16, 16 ) + GFXDECODE_ENTRY( "sprites", 0, toki_tilelayout, 0*16, 16 ) + GFXDECODE_ENTRY( "bgtiles", 0, toki_tilelayout, 32*16, 16 ) + GFXDECODE_ENTRY( "fgtiles", 0, toki_tilelayout, 48*16, 16 ) GFXDECODE_END static const gfx_layout tokib_tilelayout = { - 16,16, /* 16 by 16 */ - 4096, /* 4096 characters */ - 4, /* 4 bits per pixel */ - { 4096*16*16*3,4096*16*16*2,4096*16*16*1,4096*16*16*0 }, /* planes */ + 16,16, // 16 by 16 + 4096, // 4096 characters + 4, // 4 bits per pixel + { 4096*16*16*3,4096*16*16*2,4096*16*16*1,4096*16*16*0 }, // planes { 0, 1, 2, 3, 4, 5, 6, 7, 0x8000*8+0, 0x8000*8+1, 0x8000*8+2, 0x8000*8+3, 0x8000*8+4, 0x8000*8+5, 0x8000*8+6, 0x8000*8+7 }, /* x bit */ { 0,8,16,24,32,40,48,56, 0x10000*8+ 0, 0x10000*8+ 8, 0x10000*8+16, 0x10000*8+24, 0x10000*8+32, - 0x10000*8+40, 0x10000*8+48, 0x10000*8+56 }, /* y bit */ + 0x10000*8+40, 0x10000*8+48, 0x10000*8+56 }, // y bit 8*8 }; @@ -480,50 +871,50 @@ }; static GFXDECODE_START( gfx_tokib ) - GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_planar, 16*16, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, tokib_spriteslayout, 0*16, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, tokib_tilelayout, 32*16, 16 ) - GFXDECODE_ENTRY( "gfx4", 0, tokib_tilelayout, 48*16, 16 ) + GFXDECODE_ENTRY( "chars", 0, gfx_8x8x4_planar, 16*16, 16 ) + GFXDECODE_ENTRY( "sprites", 0, tokib_spriteslayout, 0*16, 16 ) + GFXDECODE_ENTRY( "bgtiles", 0, tokib_tilelayout, 32*16, 16 ) + GFXDECODE_ENTRY( "fgtiles", 0, tokib_tilelayout, 48*16, 16 ) GFXDECODE_END /*****************************************************************************/ -/* KOYO 20.000MHz near the cpu */ +// KOYO 20.000MHz near the CPU void toki_state::toki(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(20'000'000) / 2); /* verified on pcb */ - m_maincpu->set_addrmap(AS_PROGRAM, &toki_state::toki_map); - m_maincpu->set_vblank_int("screen", FUNC(toki_state::irq1_line_hold)); /* VBL */ + // basic machine hardware + M68000(config, m_maincpu, XTAL(20'000'000) / 2); // verified on PCB + m_maincpu->set_addrmap(AS_PROGRAM, &toki_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(toki_state::irq1_line_hold)); // VBL - Z80(config, m_audiocpu, XTAL(14'318'181) / 4); // verified on pcb + Z80(config, m_audiocpu, XTAL(14'318'181) / 4); // verified on PCB m_audiocpu->set_addrmap(AS_PROGRAM, &toki_state::toki_audio_map); m_audiocpu->set_addrmap(AS_OPCODES, &toki_state::toki_audio_opcodes_map); m_audiocpu->set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb)); SEI80BU(config, "sei80bu", 0).set_device_rom_tag("audiocpu"); - /* video hardware */ + // video hardware BUFFERED_SPRITERAM16(config, m_spriteram); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(XTAL(12'000'000)/2, 390, 0, 256, 258, 16, 240); - m_screen->set_screen_update(FUNC(toki_state::screen_update_toki)); + m_screen->set_raw(XTAL(12'000'000) / 2, 390, 0, 256, 258, 16, 240); + m_screen->set_screen_update(FUNC(toki_state::screen_update)); m_screen->screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_toki); PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181) / 4)); ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler)); ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0); - okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH)); // verified on pcb + okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH)); // verified on PCB oki.add_route(ALL_OUTPUTS, "mono", 1.0); SEIBU_SOUND(config, m_seibu_sound, 0); @@ -543,44 +934,44 @@ m_audiocpu->set_addrmap(AS_OPCODES, &toki_state::jujuba_audio_opcodes_map); } -void toki_state::tokib(machine_config &config) +void tokib_state::tokib(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 10000000); /* 10MHz causes bad slowdowns with monkey machine rd1, but is correct, 20Mhz XTAL */ - m_maincpu->set_addrmap(AS_PROGRAM, &toki_state::tokib_map); - m_maincpu->set_vblank_int("screen", FUNC(toki_state::irq6_line_hold)); /* VBL (could be level1, same vector) */ + // basic machine hardware + M68000(config, m_maincpu, 20_MHz_XTAL / 2); // 10MHz causes bad slowdowns with monkey machine rd1, but is correct + m_maincpu->set_addrmap(AS_PROGRAM, &tokib_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(tokib_state::irq6_line_hold)); // VBL (could be level1, same vector) - Z80(config, m_audiocpu, 4000000); /* verified with PCB */ - m_audiocpu->set_addrmap(AS_PROGRAM, &toki_state::tokib_audio_map); + Z80(config, m_audiocpu, 4'000'000); // verified with PCB + m_audiocpu->set_addrmap(AS_PROGRAM, &tokib_state::audio_map); WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ + // video hardware BUFFERED_SPRITERAM16(config, m_spriteram); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // TODO: refresh rate is unknown for bootlegs m_screen->set_refresh_hz(60); m_screen->set_size(32*8, 32*8); - m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); /* verified */ - m_screen->set_screen_update(FUNC(toki_state::screen_update_tokib)); + m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); // verified + m_screen->set_screen_update(FUNC(tokib_state::screen_update)); m_screen->screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tokib); PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - GENERIC_LATCH_8(config, m_soundlatch); + GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0); - ym3812_device &ymsnd(YM3812(config, "ymsnd", 3579545)); + ym3812_device &ymsnd(YM3812(config, "ymsnd", 3'579'545)); ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0); - MSM5205(config, m_msm, 384000); - m_msm->vck_legacy_callback().set(FUNC(toki_state::tokib_adpcm_int)); /* interrupt function */ - m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz */ + MSM5205(config, m_msm, 384'000); + m_msm->vck_legacy_callback().set(FUNC(tokib_state::adpcm_int)); // interrupt function + m_msm->set_prescaler_selector(msm5205_device::S96_4B); // 4KHz m_msm->add_route(ALL_OUTPUTS, "mono", 0.60); } @@ -593,55 +984,55 @@ ***************************************************************************/ ROM_START( toki ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6e.m10", 0x00000, 0x20000, CRC(94015d91) SHA1(8b8d7c589eff038467f55e81ffd450f726c5a8b5) ) ROM_LOAD16_BYTE( "4e.k10", 0x00001, 0x20000, CRC(531bd3ef) SHA1(2e561f92f5c5f2da16c4791274ccbd421b9b0a05) ) ROM_LOAD16_BYTE( "5.m12", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3.k12", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "2.c3", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) ROM_LOAD( "toki_obj2.c22", 0x080000, 0x80000, CRC(fa687718) SHA1(f194b742399d8124d97cfa3d59beb980c36cfb3c) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "9.m1", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( tokip ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6 10-m", 0x00000, 0x20000, CRC(91b554a3) SHA1(ab003e82552eba381099eb2d00577f952cad42f7) ) // different ROM_LOAD16_BYTE( "4 10-k", 0x00001, 0x20000, CRC(404220f7) SHA1(f614692d05f1280cbe801fe0486a611f38b5e866) ) // different ROM_LOAD16_BYTE( "5 12-m", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3 12-k", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8 3-m", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7 7-m", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8 3-m", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7 7-m", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1 5-c", 0x000000, 0x10000, CRC(fd0ff303) SHA1(e861b8efd7b3050b95a7d9ff1732bb9641e4dbcc) ) /* chars */ // different + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1 5-c", 0x000000, 0x10000, CRC(fd0ff303) SHA1(e861b8efd7b3050b95a7d9ff1732bb9641e4dbcc) ) // different ROM_LOAD( "2 3-c", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_REGION( 0x100000, "sprites", 0 ) ROM_LOAD16_BYTE( "obj 1-0.rom10", 0x00000, 0x20000, CRC(a027bd8e) SHA1(33cc4ae75332ab35df1c03f74db8cb17f2749ead) ) ROM_LOAD16_BYTE( "obj 1-1.rom9", 0x00001, 0x20000, CRC(43a767ea) SHA1(bfc879ff714828f7a1b8f784db8728c91287ed20) ) ROM_LOAD16_BYTE( "obj 1-2.rom12", 0x40000, 0x20000, CRC(1aecc9d8) SHA1(e7a79783e71de472f07761f9dc71f2a78e629676) ) @@ -651,161 +1042,161 @@ ROM_LOAD16_BYTE( "obj 2-2.rom16", 0xc0000, 0x20000, CRC(6a8e6e22) SHA1(a6144201e9a18aa46f65957694653a40071d92d4) ) ROM_LOAD16_BYTE( "obj 2-3.rom15", 0xc0001, 0x20000, CRC(25d9a16c) SHA1(059d1e2e874bb41f8ef576e0cf33bdbffb57ddc0) ) - ROM_REGION( 0x080000, "gfx3", 0 ) + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD16_BYTE( "back 1-0.rom5", 0x00000, 0x20000, CRC(fac7e32f) SHA1(13f789c209aa6a6866dfc5a83ca68d83271b12c6) ) ROM_LOAD16_BYTE( "back 1-1.rom6", 0x00001, 0x20000 ,CRC(ee1135d6) SHA1(299bb3f82d6ded4f401fb407e298842a47a45b1d) ) ROM_LOAD16_BYTE( "back 1-2.rom7", 0x40000, 0x20000, CRC(78db8d57) SHA1(a03bb854205c410c05d9a82f20354370c0af0bda) ) ROM_LOAD16_BYTE( "back 1-3.rom8", 0x40001, 0x20000, CRC(d719de71) SHA1(decbb5213d97f75b80ae74e4ccf2ff465d1dfad9) ) - ROM_REGION( 0x080000, "gfx4", 0 ) + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD16_BYTE( "back 2-0.rom1", 0x00000, 0x20000, CRC(949d8025) SHA1(919821647d1bfd0b5b35afcb1c76fddc51a74854)) ROM_LOAD16_BYTE( "back 2-1.rom2", 0x00001, 0x20000, CRC(4b28b4b4) SHA1(22e5d9098069833ab1dcc89abe07f9ade1b00459) ) ROM_LOAD16_BYTE( "back 2-2.rom3", 0x40000, 0x20000, CRC(1aa9a5cf) SHA1(305101589f6f56584c8147456dbb4360eaa31fef) ) ROM_LOAD16_BYTE( "back 2-3.rom4", 0x40001, 0x20000, CRC(6759571f) SHA1(bff3a73ed33c236b38425570f3eb0bbf9a3ca84c) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ - ROM_LOAD( "9 1-m", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) // + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "9 1-m", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( tokia ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6.m10", 0x00000, 0x20000, CRC(03d726b1) SHA1(bbe3a1ea1943cd73b821b3de4d5bf3dfbffd2168) ) ROM_LOAD16_BYTE( "4c.k10", 0x00001, 0x20000, CRC(b2c345c5) SHA1(ff8ff31551e835e29192d7ddd3e1601968b3e2c5) ) ROM_LOAD16_BYTE( "5.m12", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3.k12", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "2.c3", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) ROM_LOAD( "toki_obj2.c22", 0x080000, 0x80000, CRC(fa687718) SHA1(f194b742399d8124d97cfa3d59beb980c36cfb3c) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "9.m1", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( tokiua ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6.m10", 0x00000, 0x20000, CRC(03d726b1) SHA1(bbe3a1ea1943cd73b821b3de4d5bf3dfbffd2168) ) ROM_LOAD16_BYTE( "4u.k10", 0x00001, 0x20000, CRC(ca2f50d9) SHA1(e2660a9627850fa39469804a3ff563caedd0782b) ) ROM_LOAD16_BYTE( "5.m12", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3.k12", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "2.c3", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) ROM_LOAD( "toki_obj2.c22", 0x080000, 0x80000, CRC(fa687718) SHA1(f194b742399d8124d97cfa3d59beb980c36cfb3c) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "9.m1", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( tokiu ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6b.10m", 0x00000, 0x20000, CRC(3674d9fe) SHA1(7c610bee23b0f7e6a9e3d5d72d6084e025eb89ec) ) ROM_LOAD16_BYTE( "14.10k", 0x00001, 0x20000, CRC(bfdd48af) SHA1(3e48375019471a51f0c00d3444b0c1d37d2f8e92) ) ROM_LOAD16_BYTE( "5.m12", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3.k12", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "2.c3", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) ROM_LOAD( "toki_obj2.c22", 0x080000, 0x80000, CRC(fa687718) SHA1(f194b742399d8124d97cfa3d59beb980c36cfb3c) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "9.m1", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( juju ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "6.m10", 0x00000, 0x20000, CRC(03d726b1) SHA1(bbe3a1ea1943cd73b821b3de4d5bf3dfbffd2168) ) ROM_LOAD16_BYTE( "4.k10", 0x00001, 0x20000, CRC(54a45e12) SHA1(240538c8b010bb6e1e7fea2ed2fb1d5f9bc64b2b) ) ROM_LOAD16_BYTE( "5.m12", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "3.k12", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) /* encrypted */ - ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "8.m3", 0x00000, 0x02000, CRC(6c87c4c5) SHA1(d76822bcde3d42afae72a0945b6acbf3c6a1d955) ) // encrypted + ROM_LOAD( "7.m7", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "1.c5", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "2.c3", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "toki_obj1.c20", 0x000000, 0x80000, CRC(a27a80ba) SHA1(3dd3b6b0ace6ca6653603bea952b828b154a2223) ) ROM_LOAD( "toki_obj2.c22", 0x080000, 0x80000, CRC(fa687718) SHA1(f194b742399d8124d97cfa3d59beb980c36cfb3c) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki_bk1.cd8", 0x000000, 0x80000, CRC(fdaa5f4b) SHA1(ea850361bc8274639e8433bd2a5307fd3a0c9a24) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki_bk2.ef8", 0x000000, 0x80000, CRC(d86ac664) SHA1(bcb64d8e7ad29b8201ebbada1f858075eb8a0f1d) ) - ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "9.m1", 0x00000, 0x20000, CRC(ae7a6b8b) SHA1(1d410f91354ffd1774896b2e64f20a2043607805) ) - ROM_REGION( 0x0200, "proms", 0 ) /* video-related */ + ROM_REGION( 0x0200, "proms", 0 ) // video-related ROM_LOAD( "prom26.b6", 0x0000, 0x0100, CRC(ea6312c6) SHA1(44e2ae948cb79884a3acd8d7d3ff1c9e31562e3e) ) ROM_LOAD( "prom27.j3", 0x0100, 0x0100, CRC(e616ae85) SHA1(49614f87615f1a608eeb90bc68d5fc6d9109a565) ) ROM_END ROM_START( jujuba ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "8.19g", 0x20000, 0x10000, CRC(208fb08a) SHA1(113d3924d738705cb73d137712a23fa25cd4c78c) ) ROM_LOAD16_BYTE( "5.19e", 0x20001, 0x10000, CRC(722e5183) SHA1(87b813e818670bad45043db7f692619052987ce8) ) ROM_LOAD16_BYTE( "9.20g", 0x00000, 0x10000, CRC(cb82cc33) SHA1(1c774b72d12e84e9e159f66fc151f779dabbdfbd) ) @@ -813,16 +1204,19 @@ ROM_LOAD16_BYTE( "10.21g", 0x40000, 0x10000, CRC(6c7a3ffe) SHA1(c9a266ef7a5aeaa78b4d645c4df28068bcab96d0) ) ROM_LOAD16_BYTE( "7.21e", 0x40001, 0x10000, CRC(b0628230) SHA1(f8ed24ee53efc595e4dae13e2563021322c049e1) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code, banked data */ - ROM_LOAD( "3.9c", 0x00000, 0x02000, CRC(808f5e44) SHA1(a72d04367adf428b8f0955ef6269c39eb47eee14) ) /* first 0x2000 is empty */ + ROM_REGION( 0x20000, "audiocpu", 0 ) // Z80 code, banked data + ROM_LOAD( "3.9c", 0x00000, 0x02000, CRC(808f5e44) SHA1(a72d04367adf428b8f0955ef6269c39eb47eee14) ) // first 0x2000 is empty, 1ST AND 2ND HALF IDENTICAL ROM_CONTINUE(0x0000,0x6000) - ROM_LOAD( "4.11c", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) /* banked stuff */ + ROM_LOAD( "4.11c", 0x10000, 0x10000, CRC(a67969c4) SHA1(99781fbb005b6ba4a19a9cc83c8b257a3b425fa6) ) // banked stuff - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "5.19h", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) /* chars */ + ROM_REGION( 0x800, "mcu", 0 ) // P8749H right above audio CPU + ROM_LOAD( "p8749h.bin", 0x000, 0x800, NO_DUMP ) + + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "5.19h", 0x000000, 0x10000, CRC(8aa964a2) SHA1(875129bdd5f699ee30a98160718603a3bc958d84) ) ROM_LOAD( "6.20h", 0x010000, 0x10000, CRC(86e87e48) SHA1(29634d8c58ef7195cd0ce166f1b7fae01bbc110b) ) - ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_REGION( 0x100000, "sprites", 0 ) ROM_LOAD16_BYTE( "1.17d", 0x00000, 0x20000, CRC(a027bd8e) SHA1(33cc4ae75332ab35df1c03f74db8cb17f2749ead) ) ROM_LOAD16_BYTE( "27.17b", 0x00001, 0x20000, CRC(43a767ea) SHA1(bfc879ff714828f7a1b8f784db8728c91287ed20) ) ROM_LOAD16_BYTE( "2.18d", 0x40000, 0x20000, CRC(1aecc9d8) SHA1(e7a79783e71de472f07761f9dc71f2a78e629676) ) @@ -832,7 +1226,7 @@ ROM_LOAD16_BYTE( "4.21d", 0xc0000, 0x20000, CRC(6a8e6e22) SHA1(a6144201e9a18aa46f65957694653a40071d92d4) ) ROM_LOAD16_BYTE( "30.21b", 0xc0001, 0x20000, CRC(25d9a16c) SHA1(059d1e2e874bb41f8ef576e0cf33bdbffb57ddc0) ) - ROM_REGION( 0x080000, "gfx3", 0 ) + ROM_REGION( 0x080000, "bgtiles", 0 ) ROM_LOAD16_BYTE( "11.1j", 0x00001, 0x10000, CRC(6ad15560) SHA1(707a05ac0c61a66ac65c8c3718e5d2b958da9142) ) ROM_LOAD16_BYTE( "12.2j", 0x20001, 0x10000, CRC(68534844) SHA1(ff4aa635e2221a552f844e30db93c73107a70cf2) ) ROM_LOAD16_BYTE( "13.4j", 0x40001, 0x10000, CRC(f271be5a) SHA1(c9847439f0c48f6bb710999acc172a2d6fc8d58b) ) @@ -842,7 +1236,7 @@ ROM_LOAD16_BYTE( "21.4l", 0x40000, 0x10000, CRC(946862a3) SHA1(398913ccef8bd5242987c516194752ac38e10918) ) ROM_LOAD16_BYTE( "22.5l", 0x60000, 0x10000, CRC(b45f5608) SHA1(fbf9f748db285f8693e0493d9b449c23cf02748b) ) - ROM_REGION( 0x080000, "gfx4", 0 ) + ROM_REGION( 0x080000, "fgtiles", 0 ) ROM_LOAD16_BYTE( "15.18j", 0x00001, 0x10000, CRC(cb8b1d31) SHA1(8dc858c4a096d71ee66541d04f8a3acb97565ac8) ) ROM_LOAD16_BYTE( "16.19j", 0x20001, 0x10000, CRC(81594e0a) SHA1(6390798f0829d69a70a05dbb169b0eb9183cc9a9) ) ROM_LOAD16_BYTE( "17.20j", 0x40001, 0x10000, CRC(4acd44ce) SHA1(517444d22f252784ad0cb2b8948d86d4db186ae4) ) @@ -852,29 +1246,29 @@ ROM_LOAD16_BYTE( "25.20l", 0x40000, 0x10000, CRC(be064c4b) SHA1(d777b560942e9f6300aed1bf22a07b381c27a479) ) ROM_LOAD16_BYTE( "26.21l", 0x60000, 0x10000, CRC(f8b5b38d) SHA1(6ec60cf5259469cc9c4bdd9ffc6c63bc2785b708) ) - ROM_REGION( 0x40000, "oki", 0 ) /* OKI samples */ + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "1.6a", 0x00000, 0x10000, CRC(377153ad) SHA1(1c184197b344c2b65b5842f9ba99fab776a9577b) ) ROM_LOAD( "2.7a", 0x10000, 0x10000, CRC(093ca15d) SHA1(1b298146c9eea93c22c03e63513200b483b86a3f) ) ROM_END ROM_START( tokib ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "toki.e3", 0x00000, 0x20000, CRC(ae9b3da4) SHA1(14eabbd0b3596528e96e4399dde03f5817eddbaa) ) ROM_LOAD16_BYTE( "toki.e5", 0x00001, 0x20000, CRC(66a5a1d6) SHA1(9a8330d19234863952b0a5dce3f5ad28fcabaa31) ) ROM_LOAD16_BYTE( "tokijp.005", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) ROM_LOAD16_BYTE( "tokijp.003", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for code + banked data */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code, banked data ROM_LOAD( "toki.e1", 0x00000, 0x10000, CRC(2832ef75) SHA1(c15dc67a1251230fe79625b582c255678f3714d8) ) - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "toki.e21", 0x000000, 0x08000, CRC(bb8cacbd) SHA1(05cdd2efe63de30dec2e5d2948567cee22e82a63) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "toki.e21", 0x000000, 0x08000, CRC(bb8cacbd) SHA1(05cdd2efe63de30dec2e5d2948567cee22e82a63) ) ROM_LOAD( "toki.e13", 0x008000, 0x08000, CRC(052ad275) SHA1(0f4a9c752348cf5fb43d706bacbcd3e5937441e7) ) ROM_LOAD( "toki.e22", 0x010000, 0x08000, CRC(04dcdc21) SHA1(3b74019d764a13ffc155f154522c6fe60cf1c5ea) ) ROM_LOAD( "toki.e7", 0x018000, 0x08000, CRC(70729106) SHA1(e343c02d139d20a54e837e65b6a964e202f5811e) ) - ROM_REGION( 0x100000, "gfx2", ROMREGION_INVERT ) - ROM_LOAD( "toki.e26", 0x000000, 0x20000, CRC(a8ba71fc) SHA1(331d7396b6e862e32bb6a0d62c25fc201203b951) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) + ROM_LOAD( "toki.e26", 0x000000, 0x20000, CRC(a8ba71fc) SHA1(331d7396b6e862e32bb6a0d62c25fc201203b951) ) ROM_LOAD( "toki.e28", 0x020000, 0x20000, CRC(29784948) SHA1(9e17e57e2cb65a0aff61385c6d3a97b52474b6e7) ) ROM_LOAD( "toki.e34", 0x040000, 0x20000, CRC(e5f6e19b) SHA1(77dc5cf961c8062b86ebeb896ad2075c3bfa2205) ) ROM_LOAD( "toki.e36", 0x060000, 0x20000, CRC(96e8db8b) SHA1(9a0421fc57af27a8886e35b7a1a873aa06a112af) ) @@ -883,8 +1277,8 @@ ROM_LOAD( "toki.e38", 0x0c0000, 0x20000, CRC(87f4e7fb) SHA1(07d6bf00b1145a11f3d3f0af4425a3c5baeca3db) ) ROM_LOAD( "toki.e40", 0x0e0000, 0x20000, CRC(96e87350) SHA1(754947f71261d8358e158fa9c8fcfd242cd58bc3) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki.e23", 0x000000, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki.e23", 0x000000, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) ROM_LOAD( "toki.e24", 0x010000, 0x10000, CRC(5b365637) SHA1(434775b0614d904beaf40d7e00c1eaf59b704cb1) ) ROM_LOAD( "toki.e15", 0x020000, 0x10000, CRC(617c32e6) SHA1(a80f93c83a06acf836e638e4ad2453692622015d) ) ROM_LOAD( "toki.e16", 0x030000, 0x10000, CRC(2a11c0f0) SHA1(f9b1910c4932f5b95e5a9a8e8d5376c7210bcde7) ) @@ -893,8 +1287,8 @@ ROM_LOAD( "toki.e8", 0x060000, 0x10000, CRC(46a1b821) SHA1(74d9762aef3891463dc100d1bc2d4fdc3c1d163f) ) ROM_LOAD( "toki.e9", 0x070000, 0x10000, CRC(82ce27f6) SHA1(db29396a336098664f48e3c04930b973a6ffe969) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki.e25", 0x000000, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki.e25", 0x000000, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) ROM_LOAD( "toki.e20", 0x010000, 0x10000, CRC(a7f2ce26) SHA1(6b12b3bd872112b42d91ce3c0d5bc95c0fc0f5b5) ) ROM_LOAD( "toki.e11", 0x020000, 0x10000, CRC(48989aa0) SHA1(109c68c9f0966862194226cecc8b269d9307dd25) ) ROM_LOAD( "toki.e12", 0x030000, 0x10000, CRC(c2ad9342) SHA1(7c9b5c14c8061e1a57797b79677741b1b98e64fa) ) @@ -904,25 +1298,25 @@ ROM_LOAD( "toki.e6", 0x070000, 0x10000, CRC(6f4b878a) SHA1(4560b1e705a0eb9fad7fdc11fadf952ff67eb264) ) ROM_END -/* This had Playmark stickers on all the roms */ +// This had Playmark stickers on all the ROMs ROM_START( jujub ) - ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */ - ROM_LOAD16_BYTE( "jujub_playmark.e3", 0x00000, 0x20000, CRC(b50c73ec) SHA1(64855e3f5ceab39abf45035eeee80ae6dc39a421) ) - ROM_LOAD16_BYTE( "jujub_playmark.e5", 0x00001, 0x20000, CRC(b2812942) SHA1(aec7e08770935cc59a8246544d99b283583e9601) ) - ROM_LOAD16_BYTE( "tokijp.005", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) - ROM_LOAD16_BYTE( "tokijp.003", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) + ROM_REGION( 0x60000, "maincpu", 0 ) // 68000 + ROM_LOAD16_BYTE( "jujub_playmark.e3", 0x00000, 0x20000, CRC(b50c73ec) SHA1(64855e3f5ceab39abf45035eeee80ae6dc39a421) ) + ROM_LOAD16_BYTE( "jujub_playmark.e5", 0x00001, 0x20000, CRC(b2812942) SHA1(aec7e08770935cc59a8246544d99b283583e9601) ) + ROM_LOAD16_BYTE( "tokijp.005", 0x40000, 0x10000, CRC(d6a82808) SHA1(9fcd3e97f7eaada5374347383dc8a6cea2378f7f) ) + ROM_LOAD16_BYTE( "tokijp.003", 0x40001, 0x10000, CRC(a01a5b10) SHA1(76d6da114105402aab9dd5167c0c00a0bddc3bba) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for code + banked data */ + ROM_REGION( 0x10000, "audiocpu", 0 ) // Z80 code, banked data ROM_LOAD( "toki.e1", 0x00000, 0x10000, CRC(2832ef75) SHA1(c15dc67a1251230fe79625b582c255678f3714d8) ) - ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD( "toki.e21", 0x000000, 0x08000, CRC(bb8cacbd) SHA1(05cdd2efe63de30dec2e5d2948567cee22e82a63) ) /* chars */ + ROM_REGION( 0x020000, "chars", 0 ) + ROM_LOAD( "toki.e21", 0x000000, 0x08000, CRC(bb8cacbd) SHA1(05cdd2efe63de30dec2e5d2948567cee22e82a63) ) ROM_LOAD( "toki.e13", 0x008000, 0x08000, CRC(052ad275) SHA1(0f4a9c752348cf5fb43d706bacbcd3e5937441e7) ) ROM_LOAD( "toki.e22", 0x010000, 0x08000, CRC(04dcdc21) SHA1(3b74019d764a13ffc155f154522c6fe60cf1c5ea) ) ROM_LOAD( "toki.e7", 0x018000, 0x08000, CRC(70729106) SHA1(e343c02d139d20a54e837e65b6a964e202f5811e) ) - ROM_REGION( 0x100000, "gfx2", ROMREGION_INVERT ) - ROM_LOAD( "toki.e26", 0x000000, 0x20000, CRC(a8ba71fc) SHA1(331d7396b6e862e32bb6a0d62c25fc201203b951) ) /* sprites */ + ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) + ROM_LOAD( "toki.e26", 0x000000, 0x20000, CRC(a8ba71fc) SHA1(331d7396b6e862e32bb6a0d62c25fc201203b951) ) ROM_LOAD( "toki.e28", 0x020000, 0x20000, CRC(29784948) SHA1(9e17e57e2cb65a0aff61385c6d3a97b52474b6e7) ) ROM_LOAD( "toki.e34", 0x040000, 0x20000, CRC(e5f6e19b) SHA1(77dc5cf961c8062b86ebeb896ad2075c3bfa2205) ) ROM_LOAD( "toki.e36", 0x060000, 0x20000, CRC(96e8db8b) SHA1(9a0421fc57af27a8886e35b7a1a873aa06a112af) ) @@ -931,8 +1325,8 @@ ROM_LOAD( "toki.e38", 0x0c0000, 0x20000, CRC(87f4e7fb) SHA1(07d6bf00b1145a11f3d3f0af4425a3c5baeca3db) ) ROM_LOAD( "toki.e40", 0x0e0000, 0x20000, CRC(96e87350) SHA1(754947f71261d8358e158fa9c8fcfd242cd58bc3) ) - ROM_REGION( 0x080000, "gfx3", 0 ) - ROM_LOAD( "toki.e23", 0x000000, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) /* tiles 1 */ + ROM_REGION( 0x080000, "bgtiles", 0 ) + ROM_LOAD( "toki.e23", 0x000000, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) ROM_LOAD( "toki.e24", 0x010000, 0x10000, CRC(5b365637) SHA1(434775b0614d904beaf40d7e00c1eaf59b704cb1) ) ROM_LOAD( "toki.e15", 0x020000, 0x10000, CRC(617c32e6) SHA1(a80f93c83a06acf836e638e4ad2453692622015d) ) ROM_LOAD( "toki.e16", 0x030000, 0x10000, CRC(2a11c0f0) SHA1(f9b1910c4932f5b95e5a9a8e8d5376c7210bcde7) ) @@ -941,8 +1335,8 @@ ROM_LOAD( "toki.e8", 0x060000, 0x10000, CRC(46a1b821) SHA1(74d9762aef3891463dc100d1bc2d4fdc3c1d163f) ) ROM_LOAD( "toki.e9", 0x070000, 0x10000, CRC(82ce27f6) SHA1(db29396a336098664f48e3c04930b973a6ffe969) ) - ROM_REGION( 0x080000, "gfx4", 0 ) - ROM_LOAD( "toki.e25", 0x000000, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) /* tiles 2 */ + ROM_REGION( 0x080000, "fgtiles", 0 ) + ROM_LOAD( "toki.e25", 0x000000, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) ROM_LOAD( "toki.e20", 0x010000, 0x10000, CRC(a7f2ce26) SHA1(6b12b3bd872112b42d91ce3c0d5bc95c0fc0f5b5) ) ROM_LOAD( "toki.e11", 0x020000, 0x10000, CRC(48989aa0) SHA1(109c68c9f0966862194226cecc8b269d9307dd25) ) ROM_LOAD( "toki.e12", 0x030000, 0x10000, CRC(c2ad9342) SHA1(7c9b5c14c8061e1a57797b79677741b1b98e64fa) ) @@ -956,28 +1350,28 @@ void toki_state::init_toki() { - uint8_t *ROM = memregion("oki")->base(); + uint8_t *rom = memregion("oki")->base(); uint8_t buffer[0x20000]; - memcpy(&buffer[0],ROM,0x20000); + memcpy(&buffer[0], rom, 0x20000); for (int i = 0; i < 0x20000; i++) { - ROM[i] = buffer[bitswap<24>(i,23,22,21,20,19,18,17,16,13,14,15,12,11,10,9,8,7,6,5,4,3,2,1,0)]; + rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 13, 14, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)]; } } -void toki_state::init_tokib() +void tokib_state::init_tokib() { uint8_t temp[0x20000]; - /* merge background tile graphics together */ - int len = memregion("gfx3")->bytes(); - uint8_t *rom = memregion("gfx3")->base(); + // merge background tile graphics together + int len = memregion("bgtiles")->bytes(); + uint8_t *rom = memregion("bgtiles")->base(); for (int offs = 0; offs < len; offs += 0x20000) { uint8_t *base = &rom[offs]; - memcpy (&temp[0], base, 65536 * 2); + memcpy (&temp[0], base, 0x10000 * 2); for (int i = 0; i < 16; i++) { memcpy(&base[0x00000 + i * 0x800], &temp[0x0000 + i * 0x2000], 0x800); @@ -987,12 +1381,12 @@ } } - len = memregion("gfx4")->bytes(); - rom = memregion("gfx4")->base(); + len = memregion("fgtiles")->bytes(); + rom = memregion("fgtiles")->base(); for (int offs = 0; offs < len; offs += 0x20000) { uint8_t *base = &rom[offs]; - memcpy (&temp[0], base, 65536 * 2); + memcpy (&temp[0], base, 0x10000 * 2); for (int i = 0; i < 16; i++) { memcpy(&base[0x00000 + i * 0x800], &temp[0x0000 + i * 0x2000], 0x800); @@ -1002,48 +1396,39 @@ } } - membank("bank1")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); + m_audiobank->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); save_item(NAME(m_msm5205next)); save_item(NAME(m_toggle)); } void toki_state::init_jujuba() { - /* Program ROMs are bitswapped */ + // Program ROMs are bitswapped uint16_t *prgrom = (uint16_t*)memregion("maincpu")->base(); - for (int i = 0; i < 0x60000/2; i++) - { - prgrom[i] = bitswap<16>(prgrom[i],15,12,13,14, - 11,10, 9, 8, - 7, 6, 5, 3, - 4, 2, 1, 0); - } + for (int i = 0; i < 0x60000 / 2; i++) + prgrom[i] = bitswap<16>(prgrom[i], 15, 12, 13, 14, 11, 10, 9, 8, 7, 6, 5, 3, 4, 2, 1, 0); - uint8_t *ROM = memregion("oki")->base(); - uint8_t buffer[0x20000]; - - memcpy(&buffer[0],ROM,0x20000); - for (int i = 0; i < 0x20000; i++) - { - ROM[i] = buffer[bitswap<24>(i,23,22,21,20,19,18,17,16,13,14,15,12,11,10,9,8,7,6,5,4,3,2,1,0)]; - } + init_toki(); } +} // anonymous namespace + // these 2 are both unique revisions -GAME( 1989, toki, 0, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "Toki (World, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, tokiu, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, toki, 0, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "Toki (World, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, tokiu, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, tokip, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, prototype?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, tokip, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, prototype?)", MACHINE_SUPPORTS_SAVE ) // these 3 are all the same revision, only the region byte differs -GAME( 1989, tokia, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "Toki (World, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, tokiua,toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, juju, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "JuJu Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) - -GAME( 1990, tokib, toki, tokib, tokib, toki_state, init_tokib, ROT0, "bootleg (Datsu)", "Toki (Datsu bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, jujub, toki, tokib, tokib, toki_state, init_tokib, ROT0, "bootleg (Playmark)", "JuJu Densetsu (Playmark bootleg)", MACHINE_SUPPORTS_SAVE ) -/* Sound hardware seems to have been slightly modified, the coins are handled ok, but there is no music and bad sfx. Program roms have a slight bitswap, Flipscreen also seems to be ignored */ -GAME( 1989, jujuba, toki, jujuba, toki, toki_state, init_jujuba, ROT180, "bootleg", "JuJu Densetsu (Japan, bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // bootleg of tokia/juju revison +GAME( 1989, tokia, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "Toki (World, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, tokiua, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation (Fabtek license)", "Toki (US, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, juju, toki, toki, toki, toki_state, init_toki, ROT0, "TAD Corporation", "JuJu Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) + +GAME( 1990, tokib, toki, tokib, tokib, tokib_state, init_tokib, ROT0, "bootleg (Datsu)", "Toki (Datsu bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, jujub, toki, tokib, tokib, tokib_state, init_tokib, ROT0, "bootleg (Playmark)", "JuJu Densetsu (Playmark bootleg)", MACHINE_SUPPORTS_SAVE ) + +// Sound hardware seems to have been slightly modified, the coins are handled ok, but there is no music and bad SFX. Program ROMs have a slight bitswap, flipscreen also seems to be ignored +GAME( 1989, jujuba, toki, jujuba, toki, toki_state, init_jujuba, ROT180, "bootleg", "JuJu Densetsu (Japan, bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // bootleg of tokia/juju revison diff -Nru mame-0.263+dfsg.1/src/mame/seibu/toki.h mame-0.264+dfsg.1/src/mame/seibu/toki.h --- mame-0.263+dfsg.1/src/mame/seibu/toki.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/toki.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Jarek Parchanski -#ifndef MAME_SEIBU_TOKI_H -#define MAME_SEIBU_TOKI_H - -#pragma once - -#include "seibusound.h" - -#include "machine/gen_latch.h" -#include "sound/msm5205.h" -#include "video/bufsprite.h" - -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - - -class toki_state : public driver_device -{ -public: - toki_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_audiocpu_rom(*this, "audiocpu"), - m_seibu_sound(*this, "seibu_sound"), - m_msm(*this, "msm"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_soundlatch(*this, "soundlatch"), - m_spriteram(*this, "spriteram"), - m_background1_videoram(*this, "bg1_vram"), - m_background2_videoram(*this, "bg2_vram"), - m_videoram(*this, "videoram"), - m_scrollram(*this, "scrollram") - { } - - void toki(machine_config &config); - void jujuba(machine_config &config); - void tokib(machine_config &config); - - void init_tokib(); - void init_jujuba(); - void init_toki(); - -private: - required_device m_maincpu; - required_device m_audiocpu; - required_region_ptr m_audiocpu_rom; - optional_device m_seibu_sound; - optional_device m_msm; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - optional_device m_soundlatch; // tokib - - required_device m_spriteram; - required_shared_ptr m_background1_videoram; - required_shared_ptr m_background2_videoram; - required_shared_ptr m_videoram; - required_shared_ptr m_scrollram; - - int m_msm5205next = 0; - int m_toggle = 0; - - tilemap_t *m_background_layer = nullptr; - tilemap_t *m_foreground_layer = nullptr; - tilemap_t *m_text_layer = nullptr; - - void tokib_soundcommand_w(uint16_t data); - uint16_t pip_r(); - void toki_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void foreground_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void background1_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void background2_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void tokib_adpcm_control_w(uint8_t data); - void tokib_adpcm_data_w(uint8_t data); - void tokib_adpcm_int(int state); - - uint8_t jujuba_z80_data_decrypt(offs_t offset); - - TILE_GET_INFO_MEMBER(get_text_tile_info); - TILE_GET_INFO_MEMBER(get_back_tile_info); - TILE_GET_INFO_MEMBER(get_fore_tile_info); - - virtual void video_start() override; - - uint32_t screen_update_toki(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_tokib(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void toki_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); - void tokib_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); - - void jujuba_audio_map(address_map &map); - void jujuba_audio_opcodes_map(address_map &map); - void toki_audio_map(address_map &map); - void toki_audio_opcodes_map(address_map &map); - void toki_map(address_map &map); - void tokib_audio_map(address_map &map); - void tokib_map(address_map &map); -}; - -#endif // MAME_SEIBU_TOKI_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/toki_v.cpp mame-0.264+dfsg.1/src/mame/seibu/toki_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/toki_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/toki_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,303 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Jarek Parchanski -/*************************************************************************** - - video.c - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" -#include "toki.h" - - -/************************************************************************* - RASTER EFFECTS - -Xscroll can be altered per scanline to create rowscroll effect. - -(The driver does not implement rowscroll on the bootleg. It seems unlikely -the bootleggers would have been able to do this on their chipset. They -remapped the scroll registers, so obviously they were using a different -chip. - -Why then would the old ghost of one of the remapped registers -still cause rowscroll? Probably the bootleggers simply didn't bother to -remove all the code writing the $a0000 area.) - -*************************************************************************/ - -void toki_state::toki_control_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - m_screen->update_partial(m_screen->vpos() - 1); - COMBINE_DATA(&m_scrollram[offset]); -} - -TILE_GET_INFO_MEMBER(toki_state::get_text_tile_info) -{ - uint16_t *videoram = m_videoram; - int tile = videoram[tile_index]; - int color = (tile >> 12) & 0xf; - - tile &= 0xfff; - - tileinfo.set(0, - tile, - color, - 0); -} - -TILE_GET_INFO_MEMBER(toki_state::get_back_tile_info) -{ - int tile = m_background1_videoram[tile_index]; - int color = (tile >> 12) & 0xf; - - tile &= 0xfff; - - tileinfo.set(2, - tile, - color, - 0); -} - -TILE_GET_INFO_MEMBER(toki_state::get_fore_tile_info) -{ - int tile = m_background2_videoram[tile_index]; - int color = (tile >> 12) & 0xf; - - tile &= 0xfff; - - tileinfo.set(3, - tile, - color, - 0); -} - - -/************************************* - * - * Start/Stop - * - *************************************/ - -void toki_state::video_start() -{ - m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 32,32); - m_background_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_back_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 32,32); - m_foreground_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(toki_state::get_fore_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 32,32); - - m_text_layer->set_transparent_pen(15); - m_background_layer->set_transparent_pen(15); - m_foreground_layer->set_transparent_pen(15); -} - -/*************************************/ - -void toki_state::foreground_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_videoram[offset]); - m_text_layer->mark_tile_dirty(offset); -} - -void toki_state::background1_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_background1_videoram[offset]); - m_background_layer->mark_tile_dirty(offset); -} - -void toki_state::background2_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_background2_videoram[offset]); - m_foreground_layer->mark_tile_dirty(offset); -} - -/*************************************************************************** - SPRITES - - Original Spriteram - ------------------ - - It's not clear what purpose is served by marking tiles as being part of - big sprites. (Big sprites in the attract abduction scene have all tiles - marked as "first" unlike big sprites in-game.) - - We just ignore this top nibble (although perhaps in theory the bits - enable X/Y offsets in the low byte). - - +0 x....... ........ sprite disable ?? - +0 .xx..... ........ tile is part of big sprite (4=first, 6=middle, 2=last) - +0 .....x.. ........ ??? always set? (could be priority - see Bloodbro) - +0 .......x ........ Flip x - +0 ........ xxxx.... X offset: add (this * 16) to X coord - +0 ........ ....xxxx Y offset: add (this * 16) to Y coord - - +1 xxxx.... ........ Color bank - +1 ....xxxx xxxxxxxx Tile number (lo bits) - +2 x....... ........ Tile number (hi bit) - +2 .???.... ........ (set in not yet used entries) - +2 .......x xxxxxxxx X coordinate - +3 .......x xxxxxxxx Y coordinate - - f000 0000 f000 0000 entry not yet used: unless this is honored there - will be junk sprites in top left corner - ffff ???? ???? ???? sprite marked as dead: unless this is honored - there will be junk sprites after floating monkey machine - - - Bootleg Spriteram - ----------------- - - +0 .......x xxxxxxxx Sprite Y coordinate - +1 ...xxxxx xxxxxxxx Sprite tile number - +1 .x...... ........ Sprite flip x - +2 xxxx.... ........ Sprite color bank - +3 .......x xxxxxxxx Sprite X coordinate - - f100 ???? ???? ???? dead / unused sprite ?? - ???? ???? 0000 ???? dead / unused sprite ?? - - -***************************************************************************/ - - -void toki_state::toki_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) -{ - int x,y,xoffs,yoffs,tile,flipx,flipy,color,offs; - uint16_t *sprite_word; - - for (offs = (m_spriteram->bytes()/2)-4;offs >= 0;offs -= 4) - { - sprite_word = &m_spriteram->buffer()[offs]; - - if ((sprite_word[2] != 0xf000) && (sprite_word[0] != 0xffff)) - { - xoffs = (sprite_word[0] &0xf0); - x = (sprite_word[2] + xoffs) & 0x1ff; - if (x > 256) - x -= 512; - - yoffs = (sprite_word[0] &0xf) << 4; - y = (sprite_word[3] + yoffs) & 0x1ff; - if (y > 256) - y -= 512; - - color = sprite_word[1] >> 12; - flipx = sprite_word[0] & 0x100; - flipy = 0; - tile = (sprite_word[1] & 0xfff) + ((sprite_word[2] & 0x8000) >> 3); - - if (flip_screen()) { - x=240-x; - y=240-y; - if (flipx) flipx=0; else flipx=1; - flipy=1; - } - - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, - tile, - color, - flipx,flipy, - x,y,15); - } - } -} - - -void toki_state::tokib_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) -{ - int x,y,tile,flipx,color,offs; - uint16_t *sprite_word; - - for (offs = 0;offs < m_spriteram->bytes() / 2;offs += 4) - { - sprite_word = &m_spriteram->buffer()[offs]; - - if (sprite_word[0] == 0xf100) - break; - if (sprite_word[2]) - { - x = sprite_word[3] & 0x1ff; - if (x > 256) - x -= 512; - - y = sprite_word[0] & 0x1ff; - if (y > 256) - y = (512-y)+240; - else - y = 240-y; - - flipx = sprite_word[1] & 0x4000; - tile = sprite_word[1] & 0x1fff; - color = sprite_word[2] >> 12; - - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, - tile, - color, - flipx,0, - x,y-1,15); - } - } -} - -/************************************* - * - * Master update function - * - *************************************/ - -uint32_t toki_state::screen_update_toki(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int background_y_scroll,foreground_y_scroll,background_x_scroll,foreground_x_scroll; - - background_x_scroll=((m_scrollram[0x06] &0x7f) << 1) - |((m_scrollram[0x06] &0x80) >> 7) - |((m_scrollram[0x05] &0x10) << 4); - background_y_scroll=((m_scrollram[0x0d]&0x10)<<4)+((m_scrollram[0x0e]&0x7f)<<1)+((m_scrollram[0x0e]&0x80)>>7); - - m_background_layer->set_scrollx(0, background_x_scroll ); - m_background_layer->set_scrolly(0, background_y_scroll ); - - foreground_x_scroll= ((m_scrollram[0x16] &0x7f) << 1) - |((m_scrollram[0x16] &0x80) >> 7) - |((m_scrollram[0x15] &0x10) << 4); - foreground_y_scroll=((m_scrollram[0x1d]&0x10)<<4)+((m_scrollram[0x1e]&0x7f)<<1)+((m_scrollram[0x1e]&0x80)>>7); - - m_foreground_layer->set_scrollx(0, foreground_x_scroll ); - m_foreground_layer->set_scrolly(0, foreground_y_scroll ); - - flip_screen_set((m_scrollram[0x28]&0x8000)==0); - - if (m_scrollram[0x28]&0x100) { - m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - m_foreground_layer->draw(screen, bitmap, cliprect, 0,0); - } else { - m_foreground_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - m_background_layer->draw(screen, bitmap, cliprect, 0,0); - } - toki_draw_sprites(bitmap,cliprect); - m_text_layer->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -uint32_t toki_state::screen_update_tokib(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_foreground_layer->set_scroll_rows(1); - m_background_layer->set_scroll_rows(1); - m_background_layer->set_scrolly(0, m_scrollram[0]+1 ); - m_background_layer->set_scrollx(0, m_scrollram[1]-0x103 ); - m_foreground_layer->set_scrolly(0, m_scrollram[2]+1 ); - m_foreground_layer->set_scrollx(0, m_scrollram[3]-0x101 ); - - if (m_scrollram[3]&0x2000) { - m_background_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - m_foreground_layer->draw(screen, bitmap, cliprect, 0,0); - } else { - m_foreground_layer->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - m_background_layer->draw(screen, bitmap, cliprect, 0,0); - } - - tokib_draw_sprites(bitmap,cliprect); - m_text_layer->draw(screen, bitmap, cliprect, 0,0); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seibu/wiz.cpp mame-0.264+dfsg.1/src/mame/seibu/wiz.cpp --- mame-0.263+dfsg.1/src/mame/seibu/wiz.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/wiz.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Zsolt Vasvari +// copyright-holders: Zsolt Vasvari + /*************************************************************************** Seibu Stinger/Wiz hardware @@ -78,7 +79,7 @@ TODO: - Verify sprite colors in stinger/scion -- Global palette is wrong in stinger/scion compared to pcb, or could it be +- Global palette is wrong in stinger/scion compared to PCB, or could it be due to gamma/hue? - cpu/video/interrupt frequency measurements - sprite-sprite priorities are not correct yet, eg: @@ -86,7 +87,7 @@ than that 'vacuum cleaner' enemy sphere, * the cloud in kungfut should have higher prio than player char - Improve stinger/scion discrete sound, shot sound should include noise -- stinger/scion audiocpu jumps to lalaland after receiving a soundlatch of 0x90, +- stinger/scion audio CPU jumps to lalaland after receiving a soundlatch of 0x90, basically resetting itself. I assume this is a game bug - scion insert-coin sound sometimes repeats or is silent due to soundlatch timing, this could be a game bug as well @@ -106,7 +107,7 @@ 2xZ80 , 3x AY8910 (DSW 1 , bit 2 ) "THE MICROPHONE IS OUT OF CONTROL, SO THIS GAME DEPENDS ON THE BUTTONS" - There's no additional hw or connectors on the pcb + There's no additional hw or connectors on the PCB (except for small (bit 0 - ON, bit 1 - ON) DSW near AY chips ) Tomasz Slanina @@ -177,16 +178,328 @@ ***************************************************************************/ #include "emu.h" -#include "wiz.h" #include "cpu/z80/z80.h" #include "machine/gen_latch.h" #include "machine/watchdog.h" #include "sound/ay8910.h" +#include "sound/discrete.h" +#include "video/resnet.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +namespace { + +class wiz_state : public driver_device +{ +public: + wiz_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_videoram(*this, "videoram%u", 1U), + m_colorram(*this, "colorram%u", 1U), + m_attrram(*this, "attrram%u", 1U), + m_spriteram(*this, "spriteram%u", 1U) + { } + + void wiz(machine_config &config); + void kungfut(machine_config &config); + void kungfuta(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr_array m_videoram; + required_shared_ptr_array m_colorram; + required_shared_ptr_array m_attrram; + required_shared_ptr_array m_spriteram; + + uint8_t m_flipx = 0; + uint8_t m_flipy = 0; + uint8_t m_bgcolor = 0; + uint8_t m_charbank[2]{}; + uint8_t m_palbank[2]{}; + uint8_t m_main_nmi_mask = 0; + uint8_t m_sound_nmi_mask = 0; + uint8_t m_sprite_bank = 0; + + uint8_t wiz_protection_r(); + uint8_t kungfuta_protection_r(); + void wiz_coin_counter_w(offs_t offset, uint8_t data); + void main_nmi_mask_w(uint8_t data); + void sound_nmi_mask_w(uint8_t data); + void palette_bank_w(offs_t offset, uint8_t data); + void wiz_sprite_bank_w(uint8_t data); + void bgcolor_w(uint8_t data); + void char_bank_w(offs_t offset, uint8_t data); + void flipx_w(uint8_t data); + void flipy_w(uint8_t data); + + void palette(palette_device &palette) const; + uint32_t screen_update_wiz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update_kungfut(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(vblank_interrupt); + INTERRUPT_GEN_MEMBER(sound_interrupt); + void draw_tiles(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int charbank, int colortype); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int set, int charbank); + + void kungfut_main_map(address_map &map); + void kungfuta_main_map(address_map &map); + void sound_map(address_map &map); + void wiz_main_map(address_map &map); +}; + +class stinger_state : public wiz_state +{ +public: + stinger_state(const machine_config &mconfig, device_type type, const char *tag) : + wiz_state(mconfig, type, tag), + m_discrete(*this, "discrete"), + m_decrypted_opcodes(*this, "decrypted_opcodes") + { } + + void scion(machine_config &config); + void stinger(machine_config &config); + + void init_stinger(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_discrete; + + optional_shared_ptr m_decrypted_opcodes; + + uint8_t m_dsc0 = 0; + uint8_t m_dsc1 = 0; + + void explosion_w(uint8_t data); + void shot_w(uint8_t data); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void decrypted_opcodes_map(address_map &map); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +/*************************************************************************** + + Convert the color PROMs into a more useable format. + + Stinger has three 256x4 palette PROMs (one per gun). + The palette PROMs are connected to the RGB output this way: + + bit 3 -- 100 ohm resistor -- RED/GREEN/BLUE + -- 220 ohm resistor -- RED/GREEN/BLUE + -- 470 ohm resistor -- RED/GREEN/BLUE + bit 0 -- 1 kohm resistor -- RED/GREEN/BLUE + +***************************************************************************/ + +void wiz_state::palette(palette_device &palette) const +{ + uint8_t const *const color_prom = memregion("proms")->base(); + static constexpr int resistances[4] = { 1000, 470, 220, 100 }; + + // compute the color output resistor weights + double rweights[4], gweights[4], bweights[4]; + compute_resistor_weights(0, 255, -1.0, + 4, resistances, rweights, 470, 0, + 4, resistances, gweights, 470, 0, + 4, resistances, bweights, 470, 0); + + // initialize the palette with these colors + for (int i = 0; i < 0x100; i++) + { + int bit0, bit1, bit2, bit3; + + // red component + bit0 = BIT(color_prom[i + 0x000], 0); + bit1 = BIT(color_prom[i + 0x000], 1); + bit2 = BIT(color_prom[i + 0x000], 2); + bit3 = BIT(color_prom[i + 0x000], 3); + int const r = combine_weights(rweights, bit0, bit1, bit2, bit3); + + // green component + bit0 = BIT(color_prom[i + 0x100], 0); + bit1 = BIT(color_prom[i + 0x100], 1); + bit2 = BIT(color_prom[i + 0x100], 2); + bit3 = BIT(color_prom[i + 0x100], 3); + int const g = combine_weights(gweights, bit0, bit1, bit2, bit3); + + // blue component + bit0 = BIT(color_prom[i + 0x200], 0); + bit1 = BIT(color_prom[i + 0x200], 1); + bit2 = BIT(color_prom[i + 0x200], 2); + bit3 = BIT(color_prom[i + 0x200], 3); + int const b = combine_weights(bweights, bit0, bit1, bit2, bit3); + + m_palette->set_pen_color(i, rgb_t(r, g, b)); + } +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +void wiz_state::palette_bank_w(offs_t offset, uint8_t data) +{ + m_palbank[offset] = data & 1; +} + +void wiz_state::char_bank_w(offs_t offset, uint8_t data) +{ + m_charbank[offset] = data & 1; +} + +void wiz_state::wiz_sprite_bank_w(uint8_t data) +{ + m_sprite_bank = data & 1; +} + +void wiz_state::bgcolor_w(uint8_t data) +{ + m_bgcolor = data; +} + +void wiz_state::flipx_w(uint8_t data) +{ + m_flipx = data & 1; +} + +void wiz_state::flipy_w(uint8_t data) +{ + m_flipy = data & 1; +} + + + +/*************************************************************************** + + Screen Update + +***************************************************************************/ + +void wiz_state::draw_tiles(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int charbank, int colortype) +{ + gfx_element *gfx = m_gfxdecode->gfx(charbank); + int const palbank = m_palbank[1] << 4 | m_palbank[0] << 3; + + // draw the tiles. They are characters, but draw them as sprites. + for (int offs = 0x400 - 1; offs >= 0; offs--) + { + int const code = m_videoram[layer][offs]; + int sx = offs & 0x1f; + int const sy = offs >> 5; + int color = m_attrram[layer][sx << 1 | 1] & 7; + + // wiz/kungfut hw allows more color variety on screen + if (colortype) + color = layer ? (m_colorram[layer][offs] & 7) : ((color & 4) | (code & 3)); + + int scroll = (8 * sy + 256 - m_attrram[layer][sx << 1]) & 0xff; + if (m_flipy) + scroll = (248 - scroll) & 0xff; + if (m_flipx) + sx = 31 - sx; + + gfx->transpen(bitmap, cliprect, + code, + palbank | color, + m_flipx, m_flipy, + 8 * sx, scroll, 0); + } +} + + +void wiz_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int set, int charbank) +{ + gfx_element *gfx = m_gfxdecode->gfx(charbank); + int const palbank = m_palbank[1] << 4 | m_palbank[0] << 3; + + for (int offs = 0x20 - 4; offs >= 0; offs -= 4) + { + int const code = m_spriteram[set][offs + 1]; + int sx = m_spriteram[set][offs + 3]; + int sy = m_spriteram[set][offs]; + int const color = m_spriteram[set][offs + 2] & 7; // high bits unused + + if (!sx || !sy) continue; + + // like on galaxian hw, the first three sprites match against y-1 (not on m_spriteram[1]) + if (set == 0 && offs <= 8) + sy += (m_flipy) ? 1 : -1; + + if (m_flipx) sx = 240 - sx; + if (!m_flipy) sy = 240 - sy; + + gfx->transpen(bitmap, cliprect, + code, + palbank | color, + m_flipx, m_flipy, + sx, sy, 0); + } +} + + +/**************************************************************************/ + +uint32_t wiz_state::screen_update_kungfut(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(m_bgcolor, cliprect); + draw_tiles(bitmap, cliprect, 0, 2 + m_charbank[0], 1); + draw_tiles(bitmap, cliprect, 1, m_charbank[1], 1); + draw_sprites(bitmap, cliprect, 1, 4); + draw_sprites(bitmap, cliprect, 0, 5); + return 0; +} + +uint32_t wiz_state::screen_update_wiz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(m_bgcolor, cliprect); + draw_tiles(bitmap, cliprect, 0, 2 + ((m_charbank[0] << 1) | m_charbank[1]), 1); + draw_tiles(bitmap, cliprect, 1, m_charbank[1], 1); + + const rectangle spritevisiblearea(2*8, 32*8-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflipx(0*8, 30*8-1, 2*8, 30*8-1); + const rectangle &visible_area = m_flipx ? spritevisibleareaflipx : spritevisiblearea; + + draw_sprites(bitmap, visible_area, 1, 6); + draw_sprites(bitmap, visible_area, 0, 7 + m_sprite_bank); + return 0; +} + + +uint32_t stinger_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(m_bgcolor, cliprect); + draw_tiles(bitmap, cliprect, 0, 2 + m_charbank[0], 0); + draw_tiles(bitmap, cliprect, 1, m_charbank[1], 0); + draw_sprites(bitmap, cliprect, 1, 4); + draw_sprites(bitmap, cliprect, 0, 5); + return 0; +} + + /*************************************************************************** Stinger/Scion discrete sound @@ -202,16 +515,16 @@ static const discrete_lfsr_desc stinger_lfsr = { DISC_CLK_IS_FREQ, - 16, /* Bit Length */ - 0, /* Reset Value */ - 6, /* Use Bit 6 as XOR input 0 */ - 14, /* Use Bit 14 as XOR input 1 */ - DISC_LFSR_XNOR, /* Feedback stage1 is XNOR */ - DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */ - DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */ - 0x000001, /* Everything is shifted into the first bit only */ - 0, /* Output is already inverted by XNOR */ - 16 /* Output bit is feedback bit */ + 16, // Bit Length + 0, // Reset Value + 6, // Use Bit 6 as XOR input 0 + 14, // Use Bit 14 as XOR input 1 + DISC_LFSR_XNOR, // Feedback stage1 is XNOR + DISC_LFSR_OR, // Feedback stage2 is just stage 1 output OR with external feed + DISC_LFSR_REPLACE, // Feedback stage3 replaces the shifted register contents + 0x000001, // Everything is shifted into the first bit only + 0, // Output is already inverted by XNOR + 16 // Output bit is feedback bit }; static DISCRETE_SOUND_START(stinger_discrete) @@ -221,10 +534,10 @@ #define STINGER_FINAL_MIX NODE_99 // triggers are interleaved to give each circuit sufficient time to reset - DISCRETE_INPUT_LOGIC (STINGER_SHOT_EN1) // even-inteval shots - DISCRETE_INPUT_LOGIC (STINGER_SHOT_EN2) // odd-inteval shots - DISCRETE_INPUT_LOGIC (STINGER_BOOM_EN1) // even-inteval explosions - DISCRETE_INPUT_LOGIC (STINGER_BOOM_EN2) // odd-inteval explosions + DISCRETE_INPUT_LOGIC (STINGER_SHOT_EN1) // even-interval shots + DISCRETE_INPUT_LOGIC (STINGER_SHOT_EN2) // odd-interval shots + DISCRETE_INPUT_LOGIC (STINGER_BOOM_EN1) // even-interval explosions + DISCRETE_INPUT_LOGIC (STINGER_BOOM_EN2) // odd-interval explosions //--------------------------------------- // Sample Shot Sound Circuit @@ -264,18 +577,18 @@ DISCRETE_SOUND_END -void wiz_state::stinger_explosion_w(uint8_t data) +void stinger_state::explosion_w(uint8_t data) { // explosion sound trigger(analog?) m_discrete->write(STINGER_BOOM_EN1, m_dsc1); - m_discrete->write(STINGER_BOOM_EN2, m_dsc1^=1); + m_discrete->write(STINGER_BOOM_EN2, m_dsc1 ^= 1); } -void wiz_state::stinger_shot_w(uint8_t data) +void stinger_state::shot_w(uint8_t data) { // player shot sound trigger(analog?) m_discrete->write(STINGER_SHOT_EN1, m_dsc0); - m_discrete->write(STINGER_SHOT_EN2, m_dsc0^=1); + m_discrete->write(STINGER_SHOT_EN2, m_dsc0 ^= 1); } @@ -288,24 +601,24 @@ uint8_t wiz_state::wiz_protection_r() { - switch (m_colorram2[0]) + switch (m_colorram[1][0]) { - case 0x35: return 0x25; /* FIX: sudden player death + free play afterwards */ - case 0x8f: return 0x1f; /* FIX: early boss appearance with corrupt graphics */ - case 0xa0: return 0x00; /* FIX: executing junk code after defeating the boss */ + case 0x35: return 0x25; // FIX: sudden player death + free play afterwards + case 0x8f: return 0x1f; // FIX: early boss appearance with corrupt graphics + case 0xa0: return 0x00; // FIX: executing junk code after defeating the boss } - return m_colorram2[0]; + return m_colorram[1][0]; } uint8_t wiz_state::kungfuta_protection_r() { - // this cases are based on looking at the code, the kungfut set has no such checks + // these cases are based on looking at the code, the kungfut set has no such checks // and is a very different version of the game // much like wiz, kungfuta writes a value to the first byte of 'colorram2' reads it // back, then checks against a fixed value - switch (m_colorram2[0]) + switch (m_colorram[1][0]) { case 0x3a: return 0x0a; case 0x5a: return 0xda; // after bonus round, prevents infinite loop @@ -316,7 +629,7 @@ case 0xff: return 0xff; // done before other checks, although code at 0xacc8 will skip 2nd check like this } - return m_colorram2[0]; + return m_colorram[1][0]; } void wiz_state::wiz_coin_counter_w(offs_t offset, uint8_t data) @@ -324,7 +637,7 @@ machine().bookkeeping().coin_counter_w(offset, data & 1); } -void wiz_state::wiz_main_nmi_mask_w(uint8_t data) +void wiz_state::main_nmi_mask_w(uint8_t data) { m_main_nmi_mask = data & 1; } @@ -334,30 +647,30 @@ { map(0x0000, 0xbfff).rom(); map(0xc000, 0xc7ff).ram(); - map(0xd000, 0xd3ff).ram().share("videoram2"); - map(0xd400, 0xd7ff).ram().share("colorram2"); - map(0xd800, 0xd83f).ram().share("attrram2"); - map(0xd840, 0xd85f).ram().share("spriteram2"); - map(0xe000, 0xe3ff).ram().share("videoram"); - map(0xe400, 0xe7ff).ram().share("colorram"); - map(0xe800, 0xe83f).ram().share("attrram"); - map(0xe840, 0xe85f).ram().share("spriteram"); + map(0xd000, 0xd3ff).ram().share(m_videoram[1]); + map(0xd400, 0xd7ff).ram().share(m_colorram[1]); + map(0xd800, 0xd83f).ram().share(m_attrram[1]); + map(0xd840, 0xd85f).ram().share(m_spriteram[1]); + map(0xe000, 0xe3ff).ram().share(m_videoram[0]); + map(0xe400, 0xe7ff).ram().share(m_colorram[0]); + map(0xe800, 0xe83f).ram().share(m_attrram[0]); + map(0xe840, 0xe85f).ram().share(m_spriteram[0]); map(0xf000, 0xf000).portr("DSW0"); - map(0xf001, 0xf001).w(FUNC(wiz_state::wiz_main_nmi_mask_w)); - map(0xf002, 0xf003).w(FUNC(wiz_state::wiz_palette_bank_w)); - map(0xf004, 0xf005).w(FUNC(wiz_state::wiz_char_bank_w)); - map(0xf006, 0xf006).w(FUNC(wiz_state::wiz_flipx_w)); - map(0xf007, 0xf007).w(FUNC(wiz_state::wiz_flipy_w)); + map(0xf001, 0xf001).w(FUNC(wiz_state::main_nmi_mask_w)); + map(0xf002, 0xf003).w(FUNC(wiz_state::palette_bank_w)); + map(0xf004, 0xf005).w(FUNC(wiz_state::char_bank_w)); + map(0xf006, 0xf006).w(FUNC(wiz_state::flipx_w)); + map(0xf007, 0xf007).w(FUNC(wiz_state::flipy_w)); map(0xf008, 0xf008).portr("DSW1"); map(0xf010, 0xf010).portr("IN0"); map(0xf018, 0xf018).portr("IN1"); map(0xf800, 0xf800).w("soundlatch", FUNC(generic_latch_8_device::write)); - map(0xf818, 0xf818).w(FUNC(wiz_state::wiz_bgcolor_w)); + map(0xf818, 0xf818).w(FUNC(wiz_state::bgcolor_w)); } -void wiz_state::decrypted_opcodes_map(address_map &map) +void stinger_state::decrypted_opcodes_map(address_map &map) { - map(0x0000, 0xbfff).rom().share("decrypted_opcodes"); + map(0x0000, 0xbfff).rom().share(m_decrypted_opcodes); } void wiz_state::kungfuta_main_map(address_map &map) @@ -375,25 +688,25 @@ } -void wiz_state::stinger_main_map(address_map &map) +void stinger_state::main_map(address_map &map) { kungfut_main_map(map); // map(0xf008, 0xf00f).nopw(); // ? map(0xf800, 0xf800).r("watchdog", FUNC(watchdog_timer_device::reset_r)); - map(0xf808, 0xf808).w(FUNC(wiz_state::stinger_explosion_w)); - map(0xf80a, 0xf80a).w(FUNC(wiz_state::stinger_shot_w)); + map(0xf808, 0xf808).w(FUNC(stinger_state::explosion_w)); + map(0xf80a, 0xf80a).w(FUNC(stinger_state::shot_w)); } /**************************************************************************/ -void wiz_state::wiz_sound_nmi_mask_w(uint8_t data) +void wiz_state::sound_nmi_mask_w(uint8_t data) { m_sound_nmi_mask = data & 1; } -void wiz_state::kungfut_sound_map(address_map &map) +void wiz_state::sound_map(address_map &map) { map.global_mask(0x7fff); map(0x0000, 0x1fff).rom(); @@ -401,19 +714,19 @@ map(0x4000, 0x4001).w("8910.3", FUNC(ay8910_device::address_data_w)); map(0x5000, 0x5001).w("8910.1", FUNC(ay8910_device::address_data_w)); map(0x6000, 0x6001).w("8910.2", FUNC(ay8910_device::address_data_w)); - map(0x7000, 0x7000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(wiz_state::wiz_sound_nmi_mask_w)); + map(0x7000, 0x7000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(wiz_state::sound_nmi_mask_w)); } -void wiz_state::stinger_sound_map(address_map &map) +void stinger_state::sound_map(address_map &map) { map.global_mask(0x7fff); map(0x0000, 0x1fff).rom(); map(0x2000, 0x23ff).ram(); - map(0x3000, 0x3000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(wiz_state::wiz_sound_nmi_mask_w)); + map(0x3000, 0x3000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(stinger_state::sound_nmi_mask_w)); map(0x4000, 0x4000).nopw(); // ? map(0x5000, 0x5001).w("8910.1", FUNC(ay8910_device::address_data_w)); map(0x6000, 0x6001).w("8910.2", FUNC(ay8910_device::address_data_w)); - map(0x5000, 0x7fff).nopr(); // prevent error.log spam, cpu jumps here by accident + map(0x5000, 0x7fff).nopr(); // prevent error.log spam, CPU jumps here by accident } @@ -471,7 +784,7 @@ PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_START("DSW1") - PORT_DIPNAME( 0x01, 0x00, "Debug Mode" ) /* See notes */ + PORT_DIPNAME( 0x01, 0x00, "Debug Mode" ) // See notes PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Coin_B ) ) @@ -509,7 +822,7 @@ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x70, 0x20, DEF_STR( Coin_B ) ) /* See notes */ + PORT_DIPNAME( 0x70, 0x20, DEF_STR( Coin_B ) ) // See notes PORT_DIPSETTING( 0x70, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 1C_3C ) ) @@ -570,13 +883,13 @@ PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) -// PORT_DIPSETTING( 0x20, DEF_STR( On ) ) /* See notes */ +// PORT_DIPSETTING( 0x20, DEF_STR( On ) ) // See notes PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) -// PORT_DIPSETTING( 0x40, DEF_STR( On ) ) /* See notes */ +// PORT_DIPSETTING( 0x40, DEF_STR( On ) ) // See notes PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) -// PORT_DIPSETTING( 0x80, DEF_STR( On ) ) /* See notes */ +// PORT_DIPSETTING( 0x80, DEF_STR( On ) ) // See notes INPUT_PORTS_END static INPUT_PORTS_START( kungfut ) @@ -632,7 +945,7 @@ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Microphone" ) /* See notes */ + PORT_DIPNAME( 0x04, 0x04, "Microphone" ) // See notes PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x18, 0x08, DEF_STR( Lives ) ) @@ -642,7 +955,7 @@ PORT_DIPSETTING( 0x18, "5" ) PORT_DIPNAME( 0x60, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x00, "20000 40000" ) -// PORT_DIPSETTING( 0x20, "20000 40000" ) // duplicated setting + PORT_DIPSETTING( 0x20, "20000 40000" ) // duplicated setting PORT_DIPSETTING( 0x10, "20000 80000" ) PORT_DIPSETTING( 0x30, "30000 90000" ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) @@ -728,26 +1041,26 @@ static const gfx_layout charlayout = { - 8,8, /* 8*8 characters */ - 256, /* 256 characters */ - 3, /* 3 bits per pixel */ - { 0x4000*8, 0x2000*8, 0 }, /* the three bitplanes are separated */ + 8,8, // 8*8 characters + 256, // 256 characters + 3, // 3 bits per pixel + { 0x4000*8, 0x2000*8, 0 }, // the three bitplanes are separated { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 /* every char takes 8 consecutive bytes */ + 8*8 // every char takes 8 consecutive bytes }; static const gfx_layout spritelayout = { - 16,16, /* 16*16 sprites */ - 256, /* 256 sprites */ - 3, /* 3 bits per pixel */ - { 0x4000*8, 0x2000*8, 0 }, /* the three bitplanes are separated */ + 16,16, // 16*16 sprites + 256, // 256 sprites + 3, // 3 bits per pixel + { 0x4000*8, 0x2000*8, 0 }, // the three bitplanes are separated { 0, 1, 2, 3, 4, 5, 6, 7, 8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 }, - 32*8 /* every sprite takes 32 consecutive bytes */ + 32*8 // every sprite takes 32 consecutive bytes }; @@ -778,7 +1091,6 @@ { m_main_nmi_mask = 0; m_sound_nmi_mask = 0; - m_dsc0 = m_dsc1 = 1; m_sprite_bank = 0; m_charbank[0] = m_charbank[1] = 0; @@ -788,13 +1100,18 @@ m_bgcolor = 0; } +void stinger_state::machine_reset() +{ + wiz_state::machine_reset(); + + m_dsc0 = m_dsc1 = 1; +} + void wiz_state::machine_start() { // register for savestates save_item(NAME(m_main_nmi_mask)); save_item(NAME(m_sound_nmi_mask)); - save_item(NAME(m_dsc0)); - save_item(NAME(m_dsc1)); save_item(NAME(m_sprite_bank)); save_item(NAME(m_charbank)); @@ -804,15 +1121,24 @@ save_item(NAME(m_bgcolor)); } +void stinger_state::machine_start() +{ + wiz_state::machine_start(); + + // register for savestates + save_item(NAME(m_dsc0)); + save_item(NAME(m_dsc1)); +} + /**************************************************************************/ -INTERRUPT_GEN_MEMBER(wiz_state::wiz_vblank_interrupt) +INTERRUPT_GEN_MEMBER(wiz_state::vblank_interrupt) { if (m_main_nmi_mask & 1) device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero); } -INTERRUPT_GEN_MEMBER(wiz_state::wiz_sound_interrupt) +INTERRUPT_GEN_MEMBER(wiz_state::sound_interrupt) { if (m_sound_nmi_mask & 1) device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero); @@ -820,37 +1146,37 @@ void wiz_state::kungfut(machine_config &config) { - /* basic machine hardware */ - Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz ??? */ + // basic machine hardware + Z80(config, m_maincpu, 18'432'000 / 6); // 3.072 MHz ??? m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_main_map); - m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt)); + m_maincpu->set_vblank_int("screen", FUNC(wiz_state::vblank_interrupt)); - Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz ??? */ - m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_sound_map); - m_audiocpu->set_periodic_int(FUNC(wiz_state::wiz_sound_interrupt), attotime::from_hz(4*60)); /* ??? */ + Z80(config, m_audiocpu, 18'432'000 / 6); // 3.072 MHz ??? + m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::sound_map); + m_audiocpu->set_periodic_int(FUNC(wiz_state::sound_interrupt), attotime::from_hz(4*60)); // ??? - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ ); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(32*8, 32*8); screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); screen.set_screen_update(FUNC(wiz_state::screen_update_kungfut)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_stinger); - PALETTE(config, m_palette, FUNC(wiz_state::wiz_palette), 256); + PALETTE(config, m_palette, FUNC(wiz_state::palette), 256); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, "soundlatch"); - AY8910(config, "8910.1", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10); + AY8910(config, "8910.1", 18'432'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.10); - AY8910(config, "8910.2", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10); + AY8910(config, "8910.2", 18'432'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.10); - AY8910(config, "8910.3", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10); + AY8910(config, "8910.3", 18'432'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.10); } void wiz_state::kungfuta(machine_config &config) @@ -864,46 +1190,43 @@ { kungfut(config); - /* basic machine hardware */ + // basic machine hardware m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::wiz_main_map); - /* video hardware */ + // video hardware m_gfxdecode->set_info(gfx_wiz); subdevice("screen")->set_screen_update(FUNC(wiz_state::screen_update_wiz)); } -void wiz_state::stinger(machine_config &config) +void stinger_state::stinger(machine_config &config) { kungfut(config); - /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map); - m_maincpu->set_addrmap(AS_OPCODES, &wiz_state::decrypted_opcodes_map); + // basic machine hardware + m_maincpu->set_addrmap(AS_PROGRAM, &stinger_state::main_map); + m_maincpu->set_addrmap(AS_OPCODES, &stinger_state::decrypted_opcodes_map); - /* basic machine hardware */ - m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_sound_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &stinger_state::sound_map); WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ - subdevice("screen")->set_screen_update(FUNC(wiz_state::screen_update_stinger)); + // video hardware + subdevice("screen")->set_screen_update(FUNC(stinger_state::screen_update)); - /* sound hardware */ + // sound hardware config.device_remove("8910.3"); DISCRETE(config, m_discrete, stinger_discrete).add_route(ALL_OUTPUTS, "mono", 0.5); } -void wiz_state::scion(machine_config &config) +void stinger_state::scion(machine_config &config) { stinger(config); - Z80(config.replace(), m_maincpu, 18432000/6); /* 3.072 MHz ??? */ - m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map); - m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt)); + m_maincpu->set_addrmap(AS_OPCODES, address_map_constructor()); - /* video hardware */ + // video hardware subdevice("screen")->set_visarea(2*8, 32*8-1, 2*8, 30*8-1); } @@ -974,12 +1297,12 @@ ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57_10.bin", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "ic12_04.bin", 0x0000, 0x2000, CRC(8969acdd) SHA1(f37c4697232b4fb4171d6290c9407f740e7d1448) ) ROM_LOAD( "ic13_05.bin", 0x2000, 0x2000, CRC(2868e6a5) SHA1(1b8ac71a6b901df845bab945bfcf11df47932990) ) ROM_LOAD( "ic14_06.bin", 0x4000, 0x2000, CRC(b398e142) SHA1(1cafaf5cbfa96b410ae236a298473ff51122d9fc) ) - ROM_REGION( 0xc000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0xc000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "ic03_07.bin", 0x0000, 0x2000, CRC(297c02fc) SHA1(8eee765a660e3ff1b6cdcdac0d068177098cc339) ) ROM_CONTINUE( 0x6000, 0x2000 ) ROM_LOAD( "ic02_08.bin", 0x2000, 0x2000, CRC(ede77d37) SHA1(01fe35fc3373b7513ea90e8262d66200629b89fe) ) @@ -988,9 +1311,9 @@ ROM_CONTINUE( 0xa000, 0x2000 ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) /* palette red component */ - ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) /* palette green component */ - ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) /* palette blue component */ + ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) // palette red component + ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) // palette green component + ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) // palette blue component ROM_END ROM_START( wizt ) @@ -1002,12 +1325,12 @@ ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57_10.bin", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "wiz4.bin", 0x0000, 0x2000, CRC(e6c636b3) SHA1(0d5b98d404d2d87f375cde5d5a90c7d6318ea197) ) ROM_LOAD( "wiz5.bin", 0x2000, 0x2000, CRC(77986058) SHA1(8002affdd9ac246a0b9c887654d0db8d3a6913b2) ) ROM_LOAD( "wiz6.bin", 0x4000, 0x2000, CRC(f6970b23) SHA1(82d1fe0fee6bf9c6c2f472ed3479c02da85d5f69) ) - ROM_REGION( 0xc000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0xc000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "wiz7.bin", 0x0000, 0x2000, CRC(601f2f3f) SHA1(6c0cc7de5fd94628eaecca409c4faa155f684bdc) ) ROM_CONTINUE( 0x6000, 0x2000 ) ROM_LOAD( "wiz8.bin", 0x2000, 0x2000, CRC(f5ab982d) SHA1(5e0e72ec702dd5f48814a15f1a92bcdd29c944d8) ) @@ -1016,12 +1339,12 @@ ROM_CONTINUE( 0xa000, 0x2000 ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) /* palette red component */ - ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) /* palette green component */ - ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) /* palette blue component */ + ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) // palette red component + ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) // palette green component + ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) // palette blue component ROM_END -/* was marked as Wiz Alt Sound */ +// was marked as Wiz Alt Sound ROM_START( wizta ) ROM_REGION( 0xc000, "maincpu", 0 ) ROM_LOAD( "ic7", 0x0000, 0x4000, CRC(b2ec49ad) SHA1(f1624995e9d426dd69d6567a91713aa023e716ad) ) @@ -1031,12 +1354,12 @@ ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "ic57", 0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "ic12", 0x0000, 0x2000, CRC(e6c636b3) SHA1(0d5b98d404d2d87f375cde5d5a90c7d6318ea197) ) ROM_LOAD( "ic13", 0x2000, 0x2000, CRC(77986058) SHA1(8002affdd9ac246a0b9c887654d0db8d3a6913b2) ) ROM_LOAD( "ic14", 0x4000, 0x2000, CRC(f6970b23) SHA1(82d1fe0fee6bf9c6c2f472ed3479c02da85d5f69) ) - ROM_REGION( 0xc000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0xc000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "ic3", 0x0000, 0x2000, CRC(601f2f3f) SHA1(6c0cc7de5fd94628eaecca409c4faa155f684bdc) ) ROM_CONTINUE( 0x6000, 0x2000 ) ROM_LOAD( "ic2", 0x2000, 0x2000, CRC(f5ab982d) SHA1(5e0e72ec702dd5f48814a15f1a92bcdd29c944d8) ) @@ -1045,63 +1368,63 @@ ROM_CONTINUE( 0xa000, 0x2000 ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) /* palette red component */ - ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) /* palette green component */ - ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) /* palette blue component */ + ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) ) // palette red component + ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) ) // palette green component + ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) ) // palette blue component ROM_END ROM_START( stinger ) ROM_REGION( 0xc000, "maincpu", 0 ) - ROM_LOAD( "1-5j.bin", 0x0000, 0x2000, CRC(1a2ca600) SHA1(473e89f2c49f6e6f38df5d6fc2267ffecf84c6c8) ) /* encrypted */ - ROM_LOAD( "2-6j.bin", 0x2000, 0x2000, CRC(957cd39c) SHA1(38bb589b3bfd962415b31d1151adf4bdb661122f) ) /* encrypted */ - ROM_LOAD( "3-8j.bin", 0x4000, 0x2000, CRC(404c932e) SHA1(c23eac49e06ff38564062c0e8c8cdadf877f1d6a) ) /* encrypted */ - ROM_LOAD( "4-9j.bin", 0x6000, 0x2000, CRC(2d570f91) SHA1(31d54d9fd5254c33f07c605bd6112c7eb53c42a1) ) /* encrypted */ - ROM_LOAD( "5-10j.bin", 0x8000, 0x2000, CRC(c841795c) SHA1(e03860813c03ca1c737935accc2b5fe87c6b624a) ) /* encrypted */ + ROM_LOAD( "1-5j.bin", 0x0000, 0x2000, CRC(1a2ca600) SHA1(473e89f2c49f6e6f38df5d6fc2267ffecf84c6c8) ) // encrypted + ROM_LOAD( "2-6j.bin", 0x2000, 0x2000, CRC(957cd39c) SHA1(38bb589b3bfd962415b31d1151adf4bdb661122f) ) // encrypted + ROM_LOAD( "3-8j.bin", 0x4000, 0x2000, CRC(404c932e) SHA1(c23eac49e06ff38564062c0e8c8cdadf877f1d6a) ) // encrypted + ROM_LOAD( "4-9j.bin", 0x6000, 0x2000, CRC(2d570f91) SHA1(31d54d9fd5254c33f07c605bd6112c7eb53c42a1) ) // encrypted + ROM_LOAD( "5-10j.bin", 0x8000, 0x2000, CRC(c841795c) SHA1(e03860813c03ca1c737935accc2b5fe87c6b624a) ) // encrypted ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6-9f.bin", 0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "7-9e.bin", 0x0000, 0x2000, CRC(775489be) SHA1(5fccede323895626cf2eabd606ed21282aa36356) ) ROM_LOAD( "8-11e.bin", 0x2000, 0x2000, CRC(43c61b3f) SHA1(5cdb6a5096b42406c2f2784d37e4e39207c35d40) ) ROM_LOAD( "9-14e.bin", 0x4000, 0x2000, CRC(c9ed8fc7) SHA1(259d7681b663adb1c5fe057e2ef08469ddcbd3c3) ) - ROM_REGION( 0x6000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "10-9h.bin", 0x0000, 0x2000, CRC(6fc3a22d) SHA1(6875b86d60a06aa329d8ff18d0eb48d158074c5d) ) ROM_LOAD( "11-11h.bin", 0x2000, 0x2000, CRC(3df1f57e) SHA1(e365ee4cc8c055cc39abb4598ad80597d3ae19c7) ) ROM_LOAD( "12-14h.bin", 0x4000, 0x2000, CRC(2fbe1391) SHA1(669edc154164944d82dfccda328774ea4a2318ba) ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "stinger.a7", 0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) ) /* red component */ - ROM_LOAD( "stinger.b7", 0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) ) /* green component */ - ROM_LOAD( "stinger.a8", 0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) ) /* blue component */ + ROM_LOAD( "stinger.a7", 0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) ) // palette red component + ROM_LOAD( "stinger.b7", 0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) ) // palette green component + ROM_LOAD( "stinger.a8", 0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) ) // palette blue component ROM_END ROM_START( stinger2 ) ROM_REGION( 0xc000, "maincpu", 0 ) - ROM_LOAD( "n1.bin", 0x0000, 0x2000, CRC(f2d2790c) SHA1(0e5e92ef45b5bc27b0818f83c89b3bda0e701403) ) /* encrypted */ - ROM_LOAD( "n2.bin", 0x2000, 0x2000, CRC(8fd2d8d8) SHA1(d3318a81fddeb3fa50d01569c1e1145e26ce7277) ) /* encrypted */ - ROM_LOAD( "n3.bin", 0x4000, 0x2000, CRC(f1794d36) SHA1(7954500f489c0bc58cda8e7ffc2e4474759fdc33) ) /* encrypted */ - ROM_LOAD( "n4.bin", 0x6000, 0x2000, CRC(230ba682) SHA1(c419ffebd021d41b3f5021948007fb6bcdb1cdf7) ) /* encrypted */ - ROM_LOAD( "n5.bin", 0x8000, 0x2000, CRC(a03a01da) SHA1(28fecac7a821ac4718242919840266a907160df0) ) /* encrypted */ + ROM_LOAD( "n1.bin", 0x0000, 0x2000, CRC(f2d2790c) SHA1(0e5e92ef45b5bc27b0818f83c89b3bda0e701403) ) // encrypted + ROM_LOAD( "n2.bin", 0x2000, 0x2000, CRC(8fd2d8d8) SHA1(d3318a81fddeb3fa50d01569c1e1145e26ce7277) ) // encrypted + ROM_LOAD( "n3.bin", 0x4000, 0x2000, CRC(f1794d36) SHA1(7954500f489c0bc58cda8e7ffc2e4474759fdc33) ) // encrypted + ROM_LOAD( "n4.bin", 0x6000, 0x2000, CRC(230ba682) SHA1(c419ffebd021d41b3f5021948007fb6bcdb1cdf7) ) // encrypted + ROM_LOAD( "n5.bin", 0x8000, 0x2000, CRC(a03a01da) SHA1(28fecac7a821ac4718242919840266a907160df0) ) // encrypted ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6-9f.bin", 0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "7-9e.bin", 0x0000, 0x2000, CRC(775489be) SHA1(5fccede323895626cf2eabd606ed21282aa36356) ) ROM_LOAD( "8-11e.bin", 0x2000, 0x2000, CRC(43c61b3f) SHA1(5cdb6a5096b42406c2f2784d37e4e39207c35d40) ) ROM_LOAD( "9-14e.bin", 0x4000, 0x2000, CRC(c9ed8fc7) SHA1(259d7681b663adb1c5fe057e2ef08469ddcbd3c3) ) - ROM_REGION( 0x6000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "10.bin", 0x0000, 0x2000, CRC(f6721930) SHA1(fb903f1deb5f093ff5fe129e213966af58a68339) ) ROM_LOAD( "11.bin", 0x2000, 0x2000, CRC(a4404e63) SHA1(50ae99748547af20e04f6c6c8c7eba85f967b9dc) ) ROM_LOAD( "12.bin", 0x4000, 0x2000, CRC(b60fa88c) SHA1(2d3bca35076625251933989f5e566d5d3290542b) ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "stinger.a7", 0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) ) /* red component */ - ROM_LOAD( "stinger.b7", 0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) ) /* green component */ - ROM_LOAD( "stinger.a8", 0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) ) /* blue component */ + ROM_LOAD( "stinger.a7", 0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) ) // palette red component + ROM_LOAD( "stinger.b7", 0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) ) // palette green component + ROM_LOAD( "stinger.a8", 0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) ) // palette blue component ROM_END ROM_START( finger ) // AFC 02300 Rev.0 + AFC 03300 Rev.0 PCBs. Only the first three main CPU ROMs differ. Basically just a GFX hack of the stinger2 set. @@ -1142,20 +1465,20 @@ ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "sc6", 0x0000, 0x2000, CRC(09f5f9c1) SHA1(83e489f32597880fb1a13f0bafedd275facb21f7) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "7.10e", 0x0000, 0x2000, CRC(223e0d2a) SHA1(073638172ce0762d103cc07705fc493432e5aa63) ) ROM_LOAD( "8.12e", 0x2000, 0x2000, CRC(d3e39b48) SHA1(c686ef35bf866d044637df295bb70c9c005fc98c) ) ROM_LOAD( "9.15e", 0x4000, 0x2000, CRC(630861b5) SHA1(a6ccfa10e43e92407c452f9744aa1735b257c28e) ) - ROM_REGION( 0x6000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "10.10h", 0x0000, 0x2000, CRC(0d2a0d1e) SHA1(518689f91019e64138ed3560e161d3ef93d0671d) ) ROM_LOAD( "11.12h", 0x2000, 0x2000, CRC(dc6ef8ab) SHA1(ba93392a494a66336197d28e45832b9f8f3e4376) ) ROM_LOAD( "12.15h", 0x4000, 0x2000, CRC(c82c28bf) SHA1(8952b515f01027a94bee0186221a1989ea2cd919) ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "82s129.7a", 0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) ) /* red component */ - ROM_LOAD( "82s129.7b", 0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) ) /* green component */ - ROM_LOAD( "82s129.8a", 0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) ) /* blue component */ + ROM_LOAD( "82s129.7a", 0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) ) // palette red component + ROM_LOAD( "82s129.7b", 0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) ) // palette green component + ROM_LOAD( "82s129.8a", 0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) ) // palette blue component ROM_END ROM_START( scionc ) @@ -1169,24 +1492,24 @@ ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "6.9f", 0x0000, 0x2000, CRC(a66a0ce6) SHA1(b2d6a8ded007c362c58496ead33d1561a982440a) ) - ROM_REGION( 0x6000, "gfx1", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx1", 0 ) // sprites/chars ROM_LOAD( "7.10e", 0x0000, 0x2000, CRC(223e0d2a) SHA1(073638172ce0762d103cc07705fc493432e5aa63) ) ROM_LOAD( "8.12e", 0x2000, 0x2000, CRC(d3e39b48) SHA1(c686ef35bf866d044637df295bb70c9c005fc98c) ) ROM_LOAD( "9.15e", 0x4000, 0x2000, CRC(630861b5) SHA1(a6ccfa10e43e92407c452f9744aa1735b257c28e) ) - ROM_REGION( 0x6000, "gfx2", 0 ) /* sprites/chars */ + ROM_REGION( 0x6000, "gfx2", 0 ) // sprites/chars ROM_LOAD( "10.10h", 0x0000, 0x2000, CRC(0d2a0d1e) SHA1(518689f91019e64138ed3560e161d3ef93d0671d) ) ROM_LOAD( "11.12h", 0x2000, 0x2000, CRC(dc6ef8ab) SHA1(ba93392a494a66336197d28e45832b9f8f3e4376) ) ROM_LOAD( "12.15h", 0x4000, 0x2000, CRC(c82c28bf) SHA1(8952b515f01027a94bee0186221a1989ea2cd919) ) ROM_REGION( 0x0300, "proms", 0 ) - ROM_LOAD( "82s129.7a", 0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) ) /* red component */ - ROM_LOAD( "82s129.7b", 0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) ) /* green component */ - ROM_LOAD( "82s129.8a", 0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) ) /* blue component */ + ROM_LOAD( "82s129.7a", 0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) ) // palette red component + ROM_LOAD( "82s129.7b", 0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) ) // palette green component + ROM_LOAD( "82s129.8a", 0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) ) // palette blue component ROM_END -void wiz_state::init_stinger() +void stinger_state::init_stinger() { static const uint8_t swap_xor_table[4][4] = { @@ -1203,31 +1526,33 @@ { if (a & 0x2040) { - /* not encrypted */ + // not encrypted m_decrypted_opcodes[a] = rom[a]; } else { const uint8_t src = rom[a]; - /* pick the translation table from bits 3 and 5 of the address */ + // pick the translation table from bits 3 and 5 of the address int row = ((a >> 3) & 1) + (((a >> 5) & 1) << 1); - /* decode the opcodes */ + // decode the opcodes tbl = swap_xor_table[row]; m_decrypted_opcodes[a] = bitswap<8>(src, tbl[0], 6, tbl[1], 4, tbl[2], 2, 1, 0) ^ tbl[3]; } } } +} // anonymous namespace + -GAME( 1983, stinger, 0, stinger, stinger, wiz_state, init_stinger, ROT90, "Seibu Denshi", "Stinger", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, stinger2, stinger, stinger, stinger2, wiz_state, init_stinger, ROT90, "Seibu Denshi", "Stinger (prototype?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1983, finger, stinger, stinger, stinger2, wiz_state, init_stinger, ROT90, "bootleg", "Finger (bootleg of Stinger)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, scion, 0, scion, scion, wiz_state, empty_init, ROT0, "Seibu Denshi", "Scion", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, scionc, scion, scion, scion, wiz_state, empty_init, ROT0, "Seibu Denshi (Cinematronics license)", "Scion (Cinematronics)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, kungfut, 0, kungfut, kungfut, wiz_state, empty_init, ROT0, "Seibu Kaihatsu", "Kung-Fu Taikun (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE ) -GAME( 1984, kungfuta, kungfut, kungfuta,kungfut, wiz_state, empty_init, ROT0, "Seibu Kaihatsu", "Kung-Fu Taikun (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE ) /* board was a bootleg but set might still be original */ -GAME( 1985, wiz, 0, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu", "Wiz", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, wizt, wiz, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, wizta, wiz, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, stinger, 0, stinger, stinger, stinger_state, init_stinger, ROT90, "Seibu Denshi", "Stinger", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, stinger2, stinger, stinger, stinger2, stinger_state, init_stinger, ROT90, "Seibu Denshi", "Stinger (prototype?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, finger, stinger, stinger, stinger2, stinger_state, init_stinger, ROT90, "bootleg", "Finger (bootleg of Stinger)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, scion, 0, scion, scion, stinger_state, empty_init, ROT0, "Seibu Denshi", "Scion", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, scionc, scion, scion, scion, stinger_state, empty_init, ROT0, "Seibu Denshi (Cinematronics license)", "Scion (Cinematronics)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, kungfut, 0, kungfut, kungfut, wiz_state, empty_init, ROT0, "Seibu Kaihatsu", "Kung-Fu Taikun (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE ) +GAME( 1984, kungfuta, kungfut, kungfuta,kungfut, wiz_state, empty_init, ROT0, "Seibu Kaihatsu", "Kung-Fu Taikun (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE ) // board was a bootleg but set might still be original +GAME( 1985, wiz, 0, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu", "Wiz", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, wizt, wiz, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, wizta, wiz, wiz, wiz, wiz_state, empty_init, ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 2)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seibu/wiz.h mame-0.264+dfsg.1/src/mame/seibu/wiz.h --- mame-0.263+dfsg.1/src/mame/seibu/wiz.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/wiz.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Zsolt Vasvari -/*************************************************************************** - - Seibu Stinger/Wiz hardware - -***************************************************************************/ -#ifndef MAME_SEIBU_WIZ_H -#define MAME_SEIBU_WIZ_H - -#pragma once - -#include "sound/discrete.h" -#include "emupal.h" - -class wiz_state : public driver_device -{ -public: - wiz_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_discrete(*this, "discrete"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_videoram(*this, "videoram"), - m_videoram2(*this, "videoram2"), - m_colorram(*this, "colorram"), - m_colorram2(*this, "colorram2"), - m_attrram(*this, "attrram"), - m_attrram2(*this, "attrram2"), - m_spriteram(*this, "spriteram"), - m_spriteram2(*this, "spriteram2"), - m_decrypted_opcodes(*this, "decrypted_opcodes") - { } - - void wiz(machine_config &config); - void kungfut(machine_config &config); - void kungfuta(machine_config &config); - void scion(machine_config &config); - void stinger(machine_config &config); - - void init_stinger(); - -private: - required_device m_maincpu; - required_device m_audiocpu; - optional_device m_discrete; - required_device m_gfxdecode; - required_device m_palette; - - required_shared_ptr m_videoram; - required_shared_ptr m_videoram2; - required_shared_ptr m_colorram; - required_shared_ptr m_colorram2; - required_shared_ptr m_attrram; - required_shared_ptr m_attrram2; - required_shared_ptr m_spriteram; - required_shared_ptr m_spriteram2; - optional_shared_ptr m_decrypted_opcodes; - - int32_t m_flipx = 0; - int32_t m_flipy = 0; - int32_t m_bgcolor = 0; - uint8_t m_charbank[2]{}; - uint8_t m_palbank[2]{}; - uint8_t m_main_nmi_mask = 0; - uint8_t m_sound_nmi_mask = 0; - uint8_t m_sprite_bank = 0; - - int m_dsc0 = 0; - int m_dsc1 = 0; - - uint8_t wiz_protection_r(); - uint8_t kungfuta_protection_r(); - void wiz_coin_counter_w(offs_t offset, uint8_t data); - void wiz_main_nmi_mask_w(uint8_t data); - void wiz_sound_nmi_mask_w(uint8_t data); - void wiz_palette_bank_w(offs_t offset, uint8_t data); - void wiz_sprite_bank_w(uint8_t data); - void wiz_bgcolor_w(uint8_t data); - void wiz_char_bank_w(offs_t offset, uint8_t data); - void wiz_flipx_w(uint8_t data); - void wiz_flipy_w(uint8_t data); - void stinger_explosion_w(uint8_t data); - void stinger_shot_w(uint8_t data); - - virtual void machine_reset() override; - virtual void machine_start() override; - void wiz_palette(palette_device &palette) const; - uint32_t screen_update_wiz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_stinger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_kungfut(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(wiz_vblank_interrupt); - INTERRUPT_GEN_MEMBER(wiz_sound_interrupt); - void draw_tiles(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int charbank, int colortype); - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int set, int charbank); - - void decrypted_opcodes_map(address_map &map); - void kungfut_main_map(address_map &map); - void kungfuta_main_map(address_map &map); - void kungfut_sound_map(address_map &map); - void stinger_main_map(address_map &map); - void stinger_sound_map(address_map &map); - void wiz_main_map(address_map &map); -}; - -#endif // MAME_SEIBU_WIZ_H diff -Nru mame-0.263+dfsg.1/src/mame/seibu/wiz_v.cpp mame-0.264+dfsg.1/src/mame/seibu/wiz_v.cpp --- mame-0.263+dfsg.1/src/mame/seibu/wiz_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seibu/wiz_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Zsolt Vasvari -/*************************************************************************** - - Seibu Stinger/Wiz hardware - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" -#include "wiz.h" - -#include "video/resnet.h" - - -/*************************************************************************** - - Convert the color PROMs into a more useable format. - - Stinger has three 256x4 palette PROMs (one per gun). - The palette PROMs are connected to the RGB output this way: - - bit 3 -- 100 ohm resistor -- RED/GREEN/BLUE - -- 220 ohm resistor -- RED/GREEN/BLUE - -- 470 ohm resistor -- RED/GREEN/BLUE - bit 0 -- 1 kohm resistor -- RED/GREEN/BLUE - -***************************************************************************/ - -void wiz_state::wiz_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - static constexpr int resistances[4] = { 1000, 470, 220, 100 }; - - // compute the color output resistor weights - double rweights[4], gweights[4], bweights[4]; - compute_resistor_weights(0, 255, -1.0, - 4, resistances, rweights, 470, 0, - 4, resistances, gweights, 470, 0, - 4, resistances, bweights, 470, 0); - - // initialize the palette with these colors - for (int i = 0; i < 0x100; i++) - { - int bit0, bit1, bit2, bit3; - - // red component - bit0 = BIT(color_prom[i + 0x000], 0); - bit1 = BIT(color_prom[i + 0x000], 1); - bit2 = BIT(color_prom[i + 0x000], 2); - bit3 = BIT(color_prom[i + 0x000], 3); - int const r = combine_weights(rweights, bit0, bit1, bit2, bit3); - - // green component - bit0 = BIT(color_prom[i + 0x100], 0); - bit1 = BIT(color_prom[i + 0x100], 1); - bit2 = BIT(color_prom[i + 0x100], 2); - bit3 = BIT(color_prom[i + 0x100], 3); - int const g = combine_weights(gweights, bit0, bit1, bit2, bit3); - - // blue component - bit0 = BIT(color_prom[i + 0x200], 0); - bit1 = BIT(color_prom[i + 0x200], 1); - bit2 = BIT(color_prom[i + 0x200], 2); - bit3 = BIT(color_prom[i + 0x200], 3); - int const b = combine_weights(bweights, bit0, bit1, bit2, bit3); - - m_palette->set_pen_color(i, rgb_t(r, g, b)); - } -} - - - -/*************************************************************************** - - I/O - -***************************************************************************/ - -void wiz_state::wiz_palette_bank_w(offs_t offset, uint8_t data) -{ - m_palbank[offset] = data & 1; -} - -void wiz_state::wiz_char_bank_w(offs_t offset, uint8_t data) -{ - m_charbank[offset] = data & 1; -} - -void wiz_state::wiz_sprite_bank_w(uint8_t data) -{ - m_sprite_bank = data & 1; -} - -void wiz_state::wiz_bgcolor_w(uint8_t data) -{ - m_bgcolor = data; -} - -void wiz_state::wiz_flipx_w(uint8_t data) -{ - m_flipx = data & 1; -} - -void wiz_state::wiz_flipy_w(uint8_t data) -{ - m_flipy = data & 1; -} - - - -/*************************************************************************** - - Screen Update - -***************************************************************************/ - -void wiz_state::draw_tiles(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int charbank, int colortype) -{ - uint8_t *vram = layer ? m_videoram2 : m_videoram; - uint8_t *aram = layer ? m_attrram2 : m_attrram; - uint8_t *cram = layer ? m_colorram2 : m_colorram; - gfx_element *gfx = m_gfxdecode->gfx(charbank); - int palbank = m_palbank[1] << 4 | m_palbank[0] << 3; - - /* draw the tiles. They are characters, but draw them as sprites. */ - for (int offs = 0x400-1; offs >= 0; offs--) - { - int code = vram[offs]; - int sx = offs & 0x1f; - int sy = offs >> 5; - int color = aram[sx << 1 | 1] & 7; - - // wiz/kungfut hw allows more color variety on screen - if (colortype) - color = layer ? (cram[offs] & 7) : ((color & 4) | (code & 3)); - - int scroll = (8*sy + 256 - aram[sx << 1]) & 0xff; - if (m_flipy) - scroll = (248 - scroll) & 0xff; - if (m_flipx) - sx = 31 - sx; - - gfx->transpen(bitmap,cliprect, - code, - palbank | color, - m_flipx,m_flipy, - 8*sx,scroll,0); - } -} - - -void wiz_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int set, int charbank) -{ - uint8_t *sram = set ? m_spriteram2 : m_spriteram; - gfx_element *gfx = m_gfxdecode->gfx(charbank); - int palbank = m_palbank[1] << 4 | m_palbank[0] << 3; - - for (int offs = 0x20-4; offs >= 0; offs -= 4) - { - int code = sram[offs + 1]; - int sx = sram[offs + 3]; - int sy = sram[offs]; - int color = sram[offs + 2] & 7; // high bits unused - - if (!sx || !sy) continue; - - // like on galaxian hw, the first three sprites match against y-1 (not on m_spriteram2) - if (set == 0 && offs <= 8) - sy += (m_flipy) ? 1 : -1; - - if ( m_flipx) sx = 240 - sx; - if (!m_flipy) sy = 240 - sy; - - gfx->transpen(bitmap,cliprect, - code, - palbank | color, - m_flipx,m_flipy, - sx,sy,0); - } -} - - -/**************************************************************************/ - -uint32_t wiz_state::screen_update_kungfut(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(m_bgcolor, cliprect); - draw_tiles(bitmap, cliprect, 0, 2 + m_charbank[0], 1); - draw_tiles(bitmap, cliprect, 1, m_charbank[1], 1); - draw_sprites(bitmap, cliprect, 1, 4); - draw_sprites(bitmap, cliprect, 0, 5); - return 0; -} - -uint32_t wiz_state::screen_update_wiz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(m_bgcolor, cliprect); - draw_tiles(bitmap, cliprect, 0, 2 + ((m_charbank[0] << 1) | m_charbank[1]), 1); - draw_tiles(bitmap, cliprect, 1, m_charbank[1], 1); - - const rectangle spritevisiblearea(2*8, 32*8-1, 2*8, 30*8-1); - const rectangle spritevisibleareaflipx(0*8, 30*8-1, 2*8, 30*8-1); - const rectangle &visible_area = m_flipx ? spritevisibleareaflipx : spritevisiblearea; - - draw_sprites(bitmap, visible_area, 1, 6); - draw_sprites(bitmap, visible_area, 0, 7 + m_sprite_bank); - return 0; -} - - -uint32_t wiz_state::screen_update_stinger(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(m_bgcolor, cliprect); - draw_tiles(bitmap, cliprect, 0, 2 + m_charbank[0], 0); - draw_tiles(bitmap, cliprect, 1, m_charbank[1], 0); - draw_sprites(bitmap, cliprect, 1, 4); - draw_sprites(bitmap, cliprect, 0, 5); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/seta/albazc.cpp mame-0.264+dfsg.1/src/mame/seta/albazc.cpp --- mame-0.263+dfsg.1/src/mame/seta/albazc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/albazc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -54,8 +54,6 @@ -// video - void albazc_state::palette(palette_device &palette) const { uint8_t const *const color_prom(memregion("proms")->base()); diff -Nru mame-0.263+dfsg.1/src/mame/seta/seta2.cpp mame-0.264+dfsg.1/src/mame/seta/seta2.cpp --- mame-0.263+dfsg.1/src/mame/seta/seta2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/seta2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -112,9 +112,9 @@ void seta2_state::machine_start() { - if (memregion( "x1snd" ) != nullptr) + if (memregion("x1snd") != nullptr) { - uint32_t const max = memregion( "x1snd" )->bytes() / 0x20000; + uint32_t const max = memregion("x1snd")->bytes() / 0x20000; for (int i = 0; i < 8; i++) { if (m_x1_bank[i] != nullptr) @@ -122,7 +122,7 @@ uint32_t ind = 0; while (ind < 256) { - m_x1_bank[i]->configure_entries(ind, max, memregion( "x1snd" )->base(), 0x20000); // TODO : Mirrored? + m_x1_bank[i]->configure_entries(ind, max, memregion("x1snd")->base(), 0x20000); // TODO : Mirrored? ind += max; } } @@ -160,7 +160,7 @@ // initially 0, then either $25 (coin 1) or $2a (coin 2) machine().bookkeeping().coin_counter_w(0,data & 0x01); // or 0x04 machine().bookkeeping().coin_counter_w(1,data & 0x02); // or 0x08 -// popmessage("%04X", data & 0xff); + //popmessage("%04X", data & 0xff); } void seta2_state::grdians_map(address_map &map) @@ -429,7 +429,7 @@ m_dispenser->motor_w(BIT(data, 8)); // ticket dispenser } -// popmessage("LED %04X", data); + //popmessage("LED %04X", data); } void seta2_state::reelquak_coin_w(uint8_t data) @@ -438,9 +438,9 @@ machine().bookkeeping().coin_counter_w(1, data & 0x02); // coin in machine().bookkeeping().coin_counter_w(2, data & 0x04); // pay out machine().bookkeeping().coin_counter_w(3, data & 0x08); // key in - // data & 0x10); // Sound IRQ Ack.? 1->0 - // data & 0x20); // Vblank IRQ.? 1 -// popmessage("COIN %04X", data & 0xff); + // data & 0x10); // Sound IRQ Ack.? 1->0 + // data & 0x20); // Vblank IRQ.? 1 + //popmessage("COIN %04X", data & 0xff); } void seta2_state::reelquak_map(address_map &map) @@ -485,10 +485,11 @@ { machine().bookkeeping().coin_counter_w(0, data & 0x10); machine().bookkeeping().coin_counter_w(1, data & 0x20); + // Are these connected? They are set in I/O test machine().bookkeeping().coin_lockout_w(0,~data & 0x40); machine().bookkeeping().coin_lockout_w(1,~data & 0x80); -// popmessage("%04x",data); + //popmessage("%04x",data); } void seta2_state::samshoot_map(address_map &map) @@ -527,35 +528,35 @@ void staraudi_state::staraudi_debug_outputs() { -// popmessage("L1: %04X L2: %04X CAM: %04X", m_lamps1, m_lamps2, m_cam); + //popmessage("L1: %04X L2: %04X CAM: %04X", m_lamps1, m_lamps2, m_cam); } void staraudi_state::lamps1_w(offs_t offset, uint8_t data, uint8_t mem_mask) { COMBINE_DATA(&m_lamps1); - m_leds[0] = BIT(data, 0); // Lamp 1 | - m_leds[1] = BIT(data, 1); // Lamp 2 |- Camera Lamps - m_leds[2] = BIT(data, 2); // Lamp 3 | - // data & 0x08 ); // Degauss + m_leds[0] = BIT(data, 0); // Lamp 1 | + m_leds[1] = BIT(data, 1); // Lamp 2 |- Camera Lamps + m_leds[2] = BIT(data, 2); // Lamp 3 | + // data & 0x08 ); // Degauss staraudi_debug_outputs(); } void staraudi_state::lamps2_w(offs_t offset, uint8_t data, uint8_t mem_mask) { COMBINE_DATA(&m_lamps2); - // data & 0x20 ); // ? Always On - m_leds[3] = BIT(data, 6); // 2P Switch Lamp - m_leds[4] = BIT(data, 7); // 1P Switch Lamp + // data & 0x20 ); // ? Always On + m_leds[3] = BIT(data, 6); // 2P Switch Lamp + m_leds[4] = BIT(data, 7); // 1P Switch Lamp staraudi_debug_outputs(); } void staraudi_state::camera_w(offs_t offset, uint8_t data, uint8_t mem_mask) { COMBINE_DATA(&m_cam); - // data & 0x01 ); // ? Always On - // data & 0x02 ); // ? Print Test - // data & 0x08 ); // Camera On (Test Mode) - // data & 0x20 ); // ? + // data & 0x01 ); // ? Always On + // data & 0x02 ); // ? Print Test + // data & 0x08 ); // Camera On (Test Mode) + // data & 0x20 ); // ? staraudi_debug_outputs(); } @@ -621,7 +622,7 @@ for (int i = 0; i <= 7; i++) m_lamps[i] = BIT(data, i); -// popmessage("LAMP1 %04X", data); + //popmessage("LAMP1 %04X", data); } void seta2_state::telpacfl_lamp2_w(uint8_t data) @@ -629,11 +630,11 @@ m_lamps[8] = BIT(data, 0); // on/off lamp (throughout) m_lamps[9] = BIT(data, 1); // bet lamp m_lamps[10] = BIT(data, 2); // payout lamp - m_dispenser->motor_w( data & 0x08 ); // coin out motor - machine().bookkeeping().coin_counter_w(0, data & 0x10); // coin out counter - // data & 0x20 ); // on credit increase + m_dispenser->motor_w(data & 0x08); // coin out motor + machine().bookkeeping().coin_counter_w(0, data & 0x10); // coin out counter + // data & 0x20 ); // on credit increase -// popmessage("LAMP2 %04X", data); + //popmessage("LAMP2 %04X", data); } void seta2_state::telpacfl_lockout_w(uint8_t data) @@ -643,7 +644,7 @@ machine().bookkeeping().coin_lockout_w(1, ~data & 0x08); // 100yen blocker // bits 0x30 ? -// popmessage("LOCK %04X", data); + //popmessage("LOCK %04X", data); } void seta2_state::telpacfl_map(address_map &map) @@ -756,7 +757,8 @@ TIMER_CALLBACK_MEMBER(funcube_touchscreen_device::read_buttons) { uint8_t button_state = m_btn->read(); - if(m_button_state != button_state) { + if (m_button_state != button_state) + { m_button_state = button_state; m_serial[0] = button_state ? 0xfe : 0xfd; m_serial[1] = m_x->read(); @@ -769,7 +771,7 @@ void funcube_touchscreen_device::tra_complete() { - if(m_serial_pos != 4) + if (m_serial_pos != 4) transmit_register_setup(m_serial[m_serial_pos++]); } @@ -779,30 +781,8 @@ } -// Bus conversion functions: - -// RAM shared with the sub CPU -uint32_t funcube_state::nvram_r(offs_t offset) -{ - uint16_t val = m_nvram[offset]; - return ((val & 0xff00) << 8) | (val & 0x00ff); -} - -void funcube_state::nvram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_nvram[offset] = (m_nvram[offset] & 0xff00) | (data & 0x000000ff); - } - if (ACCESSING_BITS_16_23) - { - m_nvram[offset] = (m_nvram[offset] & 0x00ff) | ((data & 0x00ff0000) >> 8); - } -} - // Main CPU - uint32_t funcube_state::debug_r() { uint32_t ret = ioport("DEBUG")->read(); @@ -829,7 +809,7 @@ map(0x00840000, 0x0084ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette map(0x00860000, 0x0086003f).rw(FUNC(funcube_state::vregs_r), FUNC(funcube_state::vregs_w)); - map(0x00c00000, 0x00c002ff).rw(FUNC(funcube_state::nvram_r), FUNC(funcube_state::nvram_w)); + map(0x00c00000, 0x00c002ff).rw(FUNC(funcube_state::nvram_r), FUNC(funcube_state::nvram_w)).umask32(0x00ff00ff); map(0xf0000000, 0xf00001ff).rw("maincpu_onboard", FUNC(mcf5206e_peripheral_device::seta2_coldfire_regs_r), FUNC(mcf5206e_peripheral_device::seta2_coldfire_regs_w)); // technically this can be moved with MBAR map(0xffffe000, 0xffffffff).ram(); // SRAM @@ -850,7 +830,7 @@ map(0x00840000, 0x0084ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); map(0x00860000, 0x0086003f).rw(FUNC(funcube_state::vregs_r), FUNC(funcube_state::vregs_w)); - map(0x00c00000, 0x00c002ff).rw(FUNC(funcube_state::nvram_r), FUNC(funcube_state::nvram_w)); + map(0x00c00000, 0x00c002ff).rw(FUNC(funcube_state::nvram_r), FUNC(funcube_state::nvram_w)).umask32(0x00ff00ff); map(0xf0000000, 0xf00001ff).rw("maincpu_onboard", FUNC(mcf5206e_peripheral_device::seta2_coldfire_regs_r), FUNC(mcf5206e_peripheral_device::seta2_coldfire_regs_w)); // technically this can be moved with MBAR map(0xffffe000, 0xffffffff).ram(); // SRAM @@ -861,7 +841,7 @@ void funcube_state::funcube_sub_map(address_map &map) { map(0x000000, 0x01ffff).rom(); - map(0x200000, 0x20017f).ram().share("nvram"); + map(0x200000, 0x20017f).rw(FUNC(funcube_state::nvram_r), FUNC(funcube_state::nvram_w)).umask16(0xffff); } @@ -871,23 +851,23 @@ #define FUNCUBE_SUB_CPU_CLOCK (XTAL(14'745'600)) -uint16_t funcube_state::coins_r() +uint8_t funcube_state::coins_r() { uint8_t ret = ioport("SWITCH")->read(); - uint8_t coin_bit0 = 1; // active low + uint8_t coin_bit0 = 1; // active low uint8_t coin_bit1 = 1; - uint8_t hopper_bit = (m_hopper_motor && !(m_screen->frame_number()%20)) ? 1 : 0; + uint8_t hopper_bit = (m_hopper_motor && !(m_screen->frame_number() % 20)) ? 1 : 0; const uint64_t coin_total_cycles = FUNCUBE_SUB_CPU_CLOCK.value() / (1000/10); - if ( m_coin_start_cycles ) + if (m_coin_start_cycles) { uint64_t elapsed = m_sub->total_cycles() - m_coin_start_cycles; - if ( elapsed < coin_total_cycles/2 ) + if (elapsed < coin_total_cycles/2) coin_bit0 = 0; - else if ( elapsed < coin_total_cycles ) + else if (elapsed < coin_total_cycles) coin_bit1 = 0; else m_coin_start_cycles = 0; @@ -903,12 +883,10 @@ void funcube_state::funcube_debug_outputs() { -#ifdef MAME_DEBUG -// popmessage("LED: %02x OUT: %02x", m_funcube_leds, m_outputs); -#endif + //popmessage("LED: %02x OUT: %02x", m_funcube_leds, m_outputs); } -void funcube_state::leds_w(uint16_t data) +void funcube_state::leds_w(uint8_t data) { m_funcube_leds = data; @@ -924,13 +902,13 @@ funcube_debug_outputs(); } -uint16_t funcube_state::outputs_r() +uint8_t funcube_state::outputs_r() { // Bits 1,2,3 read return m_outputs; } -void funcube_state::outputs_w(uint16_t data) +void funcube_state::outputs_w(uint8_t data) { m_outputs = data; @@ -947,7 +925,7 @@ funcube_debug_outputs(); } -uint16_t funcube_state::battery_r() +uint8_t funcube_state::battery_r() { return ioport("BATTERY")->read() ? 0x40 : 0x00; } diff -Nru mame-0.263+dfsg.1/src/mame/seta/seta2.h mame-0.264+dfsg.1/src/mame/seta/seta2.h --- mame-0.263+dfsg.1/src/mame/seta/seta2.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/seta2.h 2024-03-25 14:00:46.000000000 +0000 @@ -35,7 +35,6 @@ m_dispenser(*this, "dispenser"), m_x1_bank(*this, "x1_bank_%u", 1U), - m_nvram(*this, "nvram"), m_spriteram(*this, "spriteram", 0x40000, ENDIANNESS_BIG), m_tileram(*this, "tileram"), m_vregs(*this, "vregs", 0x40, ENDIANNESS_BIG), @@ -127,7 +126,6 @@ optional_device m_dispenser; optional_memory_bank_array<8> m_x1_bank; - optional_shared_ptr m_nvram; memory_share_creator m_spriteram; optional_shared_ptr m_tileram; memory_share_creator m_vregs; @@ -168,6 +166,7 @@ public: funcube_state(const machine_config &mconfig, device_type type, const char *tag) : seta2_state(mconfig, type, tag) + , m_nvram(*this, "nvram", 0x180, ENDIANNESS_BIG) { } void funcube(machine_config &config); @@ -179,17 +178,20 @@ void init_funcube2(); private: + memory_share_creator m_nvram; + virtual void machine_start() override; virtual void machine_reset() override; - uint32_t nvram_r(offs_t offset); - void nvram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + uint8_t nvram_r(offs_t offset) { return m_nvram[offset]; } + void nvram_w(offs_t offset, uint8_t data) { m_nvram[offset] = data; } + uint32_t debug_r(); - uint16_t coins_r(); - void leds_w(uint16_t data); - uint16_t outputs_r(); - void outputs_w(uint16_t data); - uint16_t battery_r(); + uint8_t coins_r(); + void leds_w(uint8_t data); + uint8_t outputs_r(); + void outputs_w(uint8_t data); + uint8_t battery_r(); TIMER_DEVICE_CALLBACK_MEMBER(funcube_interrupt); @@ -199,7 +201,7 @@ void funcube_debug_outputs(); - uint16_t m_outputs, m_funcube_leds; + uint8_t m_outputs, m_funcube_leds; uint64_t m_coin_start_cycles = 0; uint8_t m_hopper_motor = 0; }; diff -Nru mame-0.263+dfsg.1/src/mame/seta/seta2_v.cpp mame-0.264+dfsg.1/src/mame/seta/seta2_v.cpp --- mame-0.263+dfsg.1/src/mame/seta/seta2_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/seta2_v.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -565,7 +565,7 @@ if (nozoom_fixedpalette_fixedposition) { use_shadow = 0; - // which_gfx = 4 << 8; + //which_gfx = 4 << 8; usedscanline = realscanline; // no zooming? usedxzoom = 0x10000; usedxoffset = 0; @@ -854,7 +854,7 @@ yy &= 0x07ffffff; yy >>= 16; - // printf("line %04x yline requested %04x\n", y, yy); + //printf("line %04x yline requested %04x\n", y, yy); if (yy & 0x400) yy -= 0x800; @@ -899,7 +899,7 @@ // Black or pen 0? bitmap.fill(m_palette->pen(0), cliprect); - if ( (m_vregs[0x30/2] & 1) == 0 ) // 1 = BLANK SCREEN + if ((m_vregs[0x30/2] & 1) == 0) // 1 = BLANK SCREEN draw_sprites(bitmap, cliprect); return 0; diff -Nru mame-0.263+dfsg.1/src/mame/seta/srmp2.cpp mame-0.264+dfsg.1/src/mame/seta/srmp2.cpp --- mame-0.263+dfsg.1/src/mame/seta/srmp2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/srmp2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -58,17 +58,166 @@ ****************************************************************************/ - #include "emu.h" -#include "srmp2.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/nvram.h" #include "sound/ay8910.h" +#include "sound/msm5205.h" +#include "video/x1_001.h" +#include "emupal.h" #include "screen.h" #include "speaker.h" +namespace { + +class srmp2_state : public driver_device +{ +public: + srmp2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_spritegen(*this, "spritegen"), + m_msm(*this, "msm"), + m_adpcm_rom(*this, "adpcm"), + m_mainbank(*this, "mainbank"), + m_keys(*this, "KEY%u", 0U), + m_service(*this, "SERVICE") + { } + + void mjyuugi(machine_config &config); + void srmp2(machine_config &config); + void rmgoldyh(machine_config &config); + void srmp3(machine_config &config); + +private: + struct iox_t + { + int reset = 0, ff_event,ff_1 = 0, protcheck[4]{}, protlatch[4]{}; + uint8_t data = 0; + uint8_t mux = 0; + uint8_t ff = 0; + }; + + required_device m_maincpu; + required_device m_spritegen; + required_device m_msm; + required_region_ptr m_adpcm_rom; + optional_memory_bank m_mainbank; + required_ioport_array<8> m_keys; + required_ioport m_service; + + uint8_t m_color_bank = 0; + uint8_t m_gfx_bank = 0; + uint8_t m_adpcm_bank = 0; + int16_t m_adpcm_data = 0; + uint32_t m_adpcm_sptr = 0; + uint32_t m_adpcm_eptr = 0; + iox_t m_iox; + + // common + uint8_t vox_status_r(); + uint8_t iox_mux_r(); + uint8_t iox_status_r(); + void iox_command_w(uint8_t data); + void iox_data_w(uint8_t data); + void adpcm_int(int state); + + // mjuugi + void mjyuugi_flags_w(uint16_t data); + void mjyuugi_adpcm_bank_w(uint16_t data); + uint8_t mjyuugi_irq2_ack_r(address_space &space); + uint8_t mjyuugi_irq4_ack_r(address_space &space); + + // rmgoldyh + void rmgoldyh_rombank_w(uint8_t data); + + // srmp2 + void srmp2_irq2_ack_w(uint8_t data); + void srmp2_irq4_ack_w(uint8_t data); + void srmp2_flags_w(uint16_t data); + void adpcm_code_w(uint8_t data); + + // srmp3 + void srmp3_rombank_w(uint8_t data); + void srmp3_flags_w(uint8_t data); + void srmp3_irq_ack_w(uint8_t data); + + virtual void machine_start() override; + DECLARE_MACHINE_START(srmp2); + void srmp2_palette(palette_device &palette) const; + DECLARE_MACHINE_START(srmp3); + void srmp3_palette(palette_device &palette) const; + DECLARE_MACHINE_START(rmgoldyh); + DECLARE_MACHINE_START(mjyuugi); + + uint32_t screen_update_srmp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update_srmp3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + X1_001_SPRITE_GFXBANK_CB_MEMBER(srmp3_gfxbank_callback); + + uint8_t iox_key_matrix_calc(uint8_t p_side); + + void mjyuugi_map(address_map &map); + void rmgoldyh_io_map(address_map &map); + void rmgoldyh_map(address_map &map); + void srmp2_map(address_map &map); + void srmp3_io_map(address_map &map); + void srmp3_map(address_map &map); +}; + + +/*************************************************************************** + + Video hardware + +***************************************************************************/ + +void srmp2_state::srmp2_palette(palette_device &palette) const +{ + uint8_t const *const color_prom = memregion("proms")->base(); + for (int i = 0; i < palette.entries(); i++) + { + int const col = (color_prom[i] << 8) + color_prom[i + palette.entries()]; + palette.set_pen_color(i ^ 0x0f, pal5bit(col >> 10), pal5bit(col >> 5), pal5bit(col >> 0)); + } +} + + +void srmp2_state::srmp3_palette(palette_device &palette) const +{ + uint8_t const *const color_prom = memregion("proms")->base(); + for (int i = 0; i < palette.entries(); i++) + { + int const col = (color_prom[i] << 8) + color_prom[i + palette.entries()]; + palette.set_pen_color(i,pal5bit(col >> 10), pal5bit(col >> 5), pal5bit(col >> 0)); + } +} + +X1_001_SPRITE_GFXBANK_CB_MEMBER(srmp2_state::srmp3_gfxbank_callback) +{ + return (code & 0x3fff) + ((code & 0x2000) ? (m_gfx_bank<<13) : 0); +} + + +uint32_t srmp2_state::screen_update_srmp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(0x1ff, cliprect); + + m_spritegen->set_colorbase(m_color_bank<<5); + + m_spritegen->draw_sprites(screen,bitmap,cliprect,0x1000); + return 0; +} + +uint32_t srmp2_state::screen_update_srmp3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(0x1f0, cliprect); + + m_spritegen->draw_sprites(screen,bitmap,cliprect,0x1000); + return 0; +} + /*************************************************************************** @@ -1586,12 +1735,13 @@ ROM_LOAD( "um2_1_10.u63", 0x080000, 0x080000, CRC(53e643e9) SHA1(3b221217e8f846ae96a9a47149037cea19d97549) ) ROM_END +} // anonymous namespace GAME( 1987, srmp1, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 1 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, srmp2, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 2 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, srmp3, 0, srmp3, srmp3, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 3 (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, srmp2_state, empty_init, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, srmp2_state, empty_init, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, mjyuugi, 0, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, mjyuugia, mjyuugi, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, ponchin, 0, mjyuugi, ponchin, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 1)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/seta/srmp2.h mame-0.264+dfsg.1/src/mame/seta/srmp2.h --- mame-0.263+dfsg.1/src/mame/seta/srmp2.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/srmp2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Yochizo, Takahiro Nogi -#ifndef MAME_SETA_SRMP2_H -#define MAME_SETA_SRMP2_H - -#pragma once - -#include "sound/msm5205.h" -#include "video/x1_001.h" -#include "emupal.h" - -class srmp2_state : public driver_device -{ -public: - srmp2_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_spritegen(*this, "spritegen"), - m_msm(*this, "msm"), - m_adpcm_rom(*this, "adpcm"), - m_mainbank(*this, "mainbank"), - m_keys(*this, "KEY%u", 0U), - m_service(*this, "SERVICE") - { } - - void mjyuugi(machine_config &config); - void srmp2(machine_config &config); - void rmgoldyh(machine_config &config); - void srmp3(machine_config &config); - -private: - struct iox_t - { - int reset = 0, ff_event,ff_1 = 0, protcheck[4]{}, protlatch[4]{}; - uint8_t data = 0; - uint8_t mux = 0; - uint8_t ff = 0; - }; - - required_device m_maincpu; - required_device m_spritegen; - required_device m_msm; - required_region_ptr m_adpcm_rom; - optional_memory_bank m_mainbank; - required_ioport_array<8> m_keys; - required_ioport m_service; - - uint8_t m_color_bank = 0; - uint8_t m_gfx_bank = 0; - uint8_t m_adpcm_bank = 0; - int16_t m_adpcm_data = 0; - uint32_t m_adpcm_sptr = 0; - uint32_t m_adpcm_eptr = 0; - iox_t m_iox; - - // common - uint8_t vox_status_r(); - uint8_t iox_mux_r(); - uint8_t iox_status_r(); - void iox_command_w(uint8_t data); - void iox_data_w(uint8_t data); - void adpcm_int(int state); - - // mjuugi - void mjyuugi_flags_w(uint16_t data); - void mjyuugi_adpcm_bank_w(uint16_t data); - uint8_t mjyuugi_irq2_ack_r(address_space &space); - uint8_t mjyuugi_irq4_ack_r(address_space &space); - - // rmgoldyh - void rmgoldyh_rombank_w(uint8_t data); - - // srmp2 - void srmp2_irq2_ack_w(uint8_t data); - void srmp2_irq4_ack_w(uint8_t data); - void srmp2_flags_w(uint16_t data); - void adpcm_code_w(uint8_t data); - - // srmp3 - void srmp3_rombank_w(uint8_t data); - void srmp3_flags_w(uint8_t data); - void srmp3_irq_ack_w(uint8_t data); - - virtual void machine_start() override; - DECLARE_MACHINE_START(srmp2); - void srmp2_palette(palette_device &palette) const; - DECLARE_MACHINE_START(srmp3); - void srmp3_palette(palette_device &palette) const; - DECLARE_MACHINE_START(rmgoldyh); - DECLARE_MACHINE_START(mjyuugi); - - uint32_t screen_update_srmp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_srmp3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - X1_001_SPRITE_GFXBANK_CB_MEMBER(srmp3_gfxbank_callback); - - uint8_t iox_key_matrix_calc(uint8_t p_side); - - void mjyuugi_map(address_map &map); - void rmgoldyh_io_map(address_map &map); - void rmgoldyh_map(address_map &map); - void srmp2_map(address_map &map); - void srmp3_io_map(address_map &map); - void srmp3_map(address_map &map); -}; - -#endif // MAME_SETA_SRMP2_H diff -Nru mame-0.263+dfsg.1/src/mame/seta/srmp2_v.cpp mame-0.264+dfsg.1/src/mame/seta/srmp2_v.cpp --- mame-0.263+dfsg.1/src/mame/seta/srmp2_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/seta/srmp2_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Yochizo, Takahiro Nogi -/*************************************************************************** - -Functions to emulate the video hardware of the machine. - -***************************************************************************/ - - -#include "emu.h" -#include "srmp2.h" - -void srmp2_state::srmp2_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - for (int i = 0; i < palette.entries(); i++) - { - int const col = (color_prom[i] << 8) + color_prom[i + palette.entries()]; - palette.set_pen_color(i ^ 0x0f, pal5bit(col >> 10), pal5bit(col >> 5), pal5bit(col >> 0)); - } -} - - -void srmp2_state::srmp3_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - for (int i = 0; i < palette.entries(); i++) - { - int const col = (color_prom[i] << 8) + color_prom[i + palette.entries()]; - palette.set_pen_color(i,pal5bit(col >> 10), pal5bit(col >> 5), pal5bit(col >> 0)); - } -} - -X1_001_SPRITE_GFXBANK_CB_MEMBER(srmp2_state::srmp3_gfxbank_callback) -{ - return (code & 0x3fff) + ((code & 0x2000) ? (m_gfx_bank<<13) : 0); -} - - -uint32_t srmp2_state::screen_update_srmp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(0x1ff, cliprect); - - m_spritegen->set_colorbase(m_color_bank<<5); - - m_spritegen->draw_sprites(screen,bitmap,cliprect,0x1000); - return 0; -} - -uint32_t srmp2_state::screen_update_srmp3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(0x1f0, cliprect); - - m_spritegen->draw_sprites(screen,bitmap,cliprect,0x1000); - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/adds2020.cpp mame-0.264+dfsg.1/src/mame/skeleton/adds2020.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/adds2020.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/adds2020.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:AJR -/*********************************************************************************************************************************** - - Skeleton driver for ADDS 2020 terminal. - - The PCB has a 68-pin PLCC ASIC at the top right corner, next to the 36.000 (Y4), 24.0000 (Y5), 4.9152 MHz (Y6) XTALs: - - ©NCR 1986 - 006-0130001 PT - 200-87700 - M823270 8701A - - This presumably does the video encoding, and possibly also contains the character graphics (not present in any dumped ROMs). - -***********************************************************************************************************************************/ - -#include "emu.h" -//#include "bus/rs232/rs232.h" -#include "cpu/mcs51/mcs51.h" -#include "machine/input_merger.h" -#include "machine/nvram.h" -#include "machine/scn_pci.h" -#include "video/scn2674.h" -#include "screen.h" - -namespace { - -class adds2020_state : public driver_device -{ -public: - adds2020_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_epci(*this, "epci") - , m_avdc(*this, "avdc") - , m_ram(*this, "nvram") - { - } - - void adds2020(machine_config &config); - -private: - SCN2674_DRAW_CHARACTER_MEMBER(draw_character); - - u8 char_r(offs_t offset); - - void unknown_0000_w(u8 data); - void unknown_9800_w(offs_t offset, u8 data); - - void prog_map(address_map &map); - void ext_map(address_map &map); - void char_map(address_map &map); - - required_device m_maincpu; - required_device m_epci; - required_device m_avdc; - required_shared_ptr m_ram; -}; - -SCN2674_DRAW_CHARACTER_MEMBER(adds2020_state::draw_character) -{ -} - -u8 adds2020_state::char_r(offs_t offset) -{ - return m_ram[offset & 0x1fff]; -} - -void adds2020_state::unknown_0000_w(u8 data) -{ - logerror("%s: Writing %02Xh to 0000h\n", machine().describe_context(), data); -} - -void adds2020_state::unknown_9800_w(offs_t offset, u8 data) -{ - logerror("%s: Writing %02Xh to %04Xh\n", machine().describe_context(), data, offset + 0x9800); -} - -void adds2020_state::prog_map(address_map &map) -{ - map(0x0000, 0xbfff).rom().region("firmware", 0); -} - -void adds2020_state::ext_map(address_map &map) -{ - map(0x0000, 0x0000).w(FUNC(adds2020_state::unknown_0000_w)); - map(0x4000, 0x5fff).ram().share("nvram"); - map(0x6000, 0x67ff).mirror(0x1800).ram(); // code suggests one HW variant may have a full 8K here - map(0x8000, 0x8000).select(6).lr8([this](offs_t offset) { return m_epci->read(offset >> 1); }, "epci_r"); - map(0x8001, 0x8001).select(6).lw8([this](offs_t offset, u8 data) { m_epci->write(offset >> 1, data); }, "epci_w"); - map(0x8800, 0x8807).rw(m_avdc, FUNC(scn2674_device::read), FUNC(scn2674_device::write)); - map(0x9800, 0x9801).w(FUNC(adds2020_state::unknown_9800_w)); -} - -void adds2020_state::char_map(address_map &map) -{ - map.global_mask(0x7ff); - map(0x000, 0x7ff).ram(); -} - -static INPUT_PORTS_START(adds2020) -INPUT_PORTS_END - -void adds2020_state::adds2020(machine_config &config) -{ - I8031(config, m_maincpu, 10.92_MHz_XTAL); // P8031AH - m_maincpu->set_addrmap(AS_PROGRAM, &adds2020_state::prog_map); - m_maincpu->set_addrmap(AS_IO, &adds2020_state::ext_map); - - INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, MCS51_INT1_LINE); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // NEC D4464C-15L + 3.5V battery (only first 3K is actually saved) - - SCN2661B(config, m_epci, 4.9152_MHz_XTAL); - m_epci->rxrdy_handler().set("mainint", FUNC(input_merger_device::in_w<0>)); - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - //screen.set_raw(24_MHz_XTAL, 960, 0, 800, 361, 0, 338); - screen.set_raw(36_MHz_XTAL, 1440, 0, 1188, 361, 0, 338); - screen.set_screen_update(m_avdc, FUNC(scn2674_device::screen_update)); - - SCN2674(config, m_avdc, 36_MHz_XTAL / 9); // SCN2674B - m_avdc->set_character_width(9); // cell width guessed (10 in 80-column mode?) - m_avdc->set_screen("screen"); - m_avdc->set_addrmap(0, &adds2020_state::char_map); - m_avdc->set_display_callback(FUNC(adds2020_state::draw_character)); - m_avdc->mbc_char_callback().set(FUNC(adds2020_state::char_r)); - m_avdc->breq_callback().set_inputline(m_maincpu, MCS51_T0_LINE); - m_avdc->intr_callback().set("mainint", FUNC(input_merger_device::in_w<1>)); - - // TODO: speaker -} - -ROM_START(adds2020) - ROM_REGION(0xc000, "firmware", ROMREGION_ERASEFF) - ROM_LOAD("2020_v2.5_ua5.bin", 0x0000, 0x4000, CRC(2d9e3397) SHA1(9aec8fdfe064618c20b4ba85dd8b71a44e29bbd3)) - ROM_LOAD("2020_v2.5_ua6.bin", 0x4000, 0x2000, CRC(f4cbda6f) SHA1(efe03a15d7eab4038de1e8118c6891d2078166fd)) - ROM_LOAD("2020_v2.5_ua8.bin", 0x8000, 0x4000, CRC(4a8ac850) SHA1(ce02a0e904ed07930a891360f1e5779fbee8eaac)) -ROM_END - -} // anonymous namespace - -COMP(1986, adds2020, 0, 0, adds2020, adds2020, adds2020_state, empty_init, "Applied Digital Data Systems", "ADDS 2020", MACHINE_IS_SKELETON) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/hudson_poems.cpp mame-0.264+dfsg.1/src/mame/skeleton/hudson_poems.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/hudson_poems.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/hudson_poems.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -71,8 +71,8 @@ private: u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void draw_tile(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal); - void draw_tile8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal); + void draw_tile(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal, bool use_flips); + void draw_tile8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal, bool use_flips); void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which, int priority); @@ -228,6 +228,11 @@ PORT_START( "IN1" ) INPUT_PORTS_END +static INPUT_PORTS_START( poemspoo ) + PORT_START( "IN1" ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + void hudson_poems_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int spritebase = (m_spritelistbase & 0x0003ffff) / 4; @@ -314,6 +319,8 @@ { int width, base, bpp, gfxbase, extrapal; + bool use_flips; + // guess, could be more/less bits, or somewhere else entirely, works for the 2 scenes that need it const int thispriority = (m_tilemapcfg[which] & 0x01f00000) >> 20; @@ -336,6 +343,14 @@ else bpp = 4; + // this might not be the correct enable flag + // marimba needs 2 of the tile bits to act as flip, while poemspoo, poembase, poemgolf use them as tile number bits + if (m_tilemapcfg[which] & 0x10000000) + use_flips = false; + else + use_flips = true; + + if (m_tilemapcfg[which] & 0x00080000) extrapal = 1; else @@ -388,13 +403,13 @@ if (bpp == 4) { - draw_tile(screen, bitmap, cliprect, (tiles & 0xffff), xpos, ypos, gfxbase, extrapal); - draw_tile(screen, bitmap, cliprect, ((tiles >> 16) & 0xffff), xpos + 8, ypos, gfxbase, extrapal); + draw_tile(screen, bitmap, cliprect, (tiles & 0xffff), xpos, ypos, gfxbase, extrapal, use_flips); + draw_tile(screen, bitmap, cliprect, ((tiles >> 16) & 0xffff), xpos + 8, ypos, gfxbase, extrapal, use_flips); } else if (bpp == 8) { - draw_tile8(screen, bitmap, cliprect, (tiles & 0xffff), xpos, ypos, gfxbase, extrapal); - draw_tile8(screen, bitmap, cliprect, ((tiles >> 16) & 0xffff), xpos + 8, ypos, gfxbase, extrapal); + draw_tile8(screen, bitmap, cliprect, (tiles & 0xffff), xpos, ypos, gfxbase, extrapal, use_flips); + draw_tile8(screen, bitmap, cliprect, ((tiles >> 16) & 0xffff), xpos + 8, ypos, gfxbase, extrapal, use_flips); } } } @@ -426,26 +441,48 @@ template u32 hudson_poems_state::tilemap_scr_r(offs_t offset, u32 mem_mask) { return m_tilemapscr[Layer]; } -void hudson_poems_state::draw_tile(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal) +void hudson_poems_state::draw_tile(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal, bool use_flips) { gfx_element *gfx = m_gfxdecode->gfx(2); - const int flipx = tile & 0x0800; - const int flipy = tile & 0x0400; + int flipx = 0; + int flipy = 0; int pal = (tile & 0xf000)>>12; + + if (use_flips) + { + flipx = tile & 0x0800; + flipy = tile & 0x0400; + tile &= 0x3ff; + } + else + { + tile &= 0xfff; + } + pal += extrapal * 0x10; - tile &= 0x3ff; tile += gfxbase / 32; gfx->transpen(bitmap,cliprect,tile,pal,flipx,flipy,xx,yy, 0); } -void hudson_poems_state::draw_tile8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal) +void hudson_poems_state::draw_tile8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 tile, int xx, int yy, int gfxbase, int extrapal, bool use_flips) { gfx_element *gfx = m_gfxdecode->gfx(3); - const int flipx = tile & 0x0800; - const int flipy = tile & 0x0400; + int flipx = 0; + int flipy = 0; int pal = 0;//(tile & 0xf000)>>8; + + if (use_flips) + { + flipx = tile & 0x0800; + flipy = tile & 0x0400; + tile &= 0x3ff; + } + else + { + tile &= 0xfff; + } + pal += extrapal; - tile &= 0x3ff; tile += gfxbase / 64; gfx->transpen(bitmap,cliprect,tile,pal,flipx,flipy,xx,yy, 0); } @@ -893,6 +930,14 @@ ROM_LOAD( "at24c08a.u3", 0x000000, 0x400, CRC(5f3d5352) SHA1(94386f5703751e66d6a62e23c344ab7711aad769) ) ROM_END +ROM_START(poemspoo) + ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) + ROM_LOAD( "poems_spoo.u2", 0x000000, 0x400000, CRC(1ebc473a) SHA1(6ebc33f274f71183bcd4a93d06e565eff71e2f47) ) // glob with TSOP pads + + // seeprom position not populated +ROM_END + + } // anonymous namespace @@ -901,8 +946,10 @@ // waits for 2c008f00 to become 0 (missing irq?) happens before it gets to the DMA transfers CONS( 2004, poemgolf, 0, 0, hudson_poems, poemgolf, hudson_poems_state, init_marimba, "Konami", "Soukai Golf Champ (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) // waits for 2c005d00 to become 0 (missing irq?) happens before it gets to the DMA transfers -CONS( 2004, poembase, 0, 0, hudson_poems, poemgolf, hudson_poems_state, init_marimba, "Konami", "Nekketsu Powerpro Champ (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) +CONS( 2004, poembase, 0, 0, hudson_poems, poemgolf, hudson_poems_state, init_marimba, "Konami", "Nekketsu Pawapuro Champ (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) CONS( 2004, poemzet, 0, 0, hudson_poems, poemzet, hudson_poems_state, init_marimba, "Konami", "Zettai Zetsumei Dangerous Jiisan - Mini Game de Taiketsu ja!", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) CONS( 2005, poemzet2, 0, 0, hudson_poems, poemzet, hudson_poems_state, init_marimba, "Konami", "Zettai Zetsumei Dangerous Jiisan Party ja! Zen-in Shuugou!!", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND ) + +CONS( 2005, poemspoo, 0, 0, hudson_poems, poemspoo, hudson_poems_state, init_marimba, "Konami", "Goo Choco Lantan Spoo Daisuki! Playmat", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/pullttrigger.cpp mame-0.264+dfsg.1/src/mame/skeleton/pullttrigger.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/pullttrigger.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/pullttrigger.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,94 @@ +// license:BSD-3-Clause +// copyright-holders: +/*********************************************************************************************************** + +"Pull The Trigger", developed by the Korean company "Digital Silkroad Co. Ltd." and distributed by Covielsa. + +Standard PC with: +-Elitegroup L4S5MG/651+ V5.0 motherboard. +-512MB RAM, DDR PC2100 (one SIMM). +-Wibu Systems WibuKey USB security dongle. +-GeForce 4 MX440 8X 64MB DDR TV-OUT video card. +-Exact CPU model and speed unknown. +-Samsung SP0411N/OMD 40GB HDD. + +And an external PCB for inputs (guns, etc.) with: +-ATF1502AS +-AT89C51 +-AT89C2051 +-11.0592 MHz xtal near the AT89C2051 +-11.0592 MHz xtal near the AT89C51 +-4.9152 MHz xtal near the ATF1502AS. + +Also, the machine allows players to keep their scores on military dogtag like cards with a SEEPROM, named +"DSR-PT1 MEMORY" (they were probably for sale). + +***********************************************************************************************************/ + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "machine/pci.h" + + +namespace { + +class pullttrig_state : public driver_device +{ +public: + pullttrig_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + + void pullttrig(machine_config &config); + +private: + required_device m_maincpu; + void pullttrig_io(address_map &map); + void pullttrig_map(address_map &map); +}; + + +void pullttrig_state::pullttrig_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000e0000, 0x000fffff).rom().region("bios", 0x20000); + map(0xfffc0000, 0xffffffff).rom().region("bios", 0); +} + +void pullttrig_state::pullttrig_io(address_map &map) +{ +} + +static INPUT_PORTS_START(pullttrig) +INPUT_PORTS_END + +void pullttrig_state::pullttrig(machine_config &config) +{ + PENTIUM4(config, m_maincpu, 100'000'000); // Exact CPU and frequency unknown + m_maincpu->set_addrmap(AS_PROGRAM, &pullttrig_state::pullttrig_map); + m_maincpu->set_addrmap(AS_IO, &pullttrig_state::pullttrig_io); + + PCI_ROOT(config, "pci", 0); + // ... +} + + +ROM_START(pullttrig) + ROM_REGION32_LE(0x40000, "bios", 0) + ROM_LOAD("51402.bin", 0x00000, 0x40000, CRC(33bed7c0) SHA1(169374b6dac5bbba335e113a97ac34dc830c2599)) + + ROM_REGION(0x50000, "io", 0) + ROM_LOAD("at89c51.bin", 0x00000, 0x01000, NO_DUMP) // AT89C51, protected + ROM_LOAD("at89c2051.u3", 0x10000, 0x04000, NO_DUMP) // 2 Kbytes internal ROM + + + DISK_REGION("ide:0:hdd") + DISK_IMAGE("pullthetrigger", 0, SHA1(438d57499e435e9e4e4a5980e9b1ca0df4f4ccca)) +ROM_END + +} // anonymous namespace + + +COMP(2003, pullttrig, 0, 0, pullttrig, pullttrig, pullttrig_state, empty_init, "Digital Silkroad", "Pull The Trigger", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/qmquasar.cpp mame-0.264+dfsg.1/src/mame/skeleton/qmquasar.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/qmquasar.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/qmquasar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,150 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/*************************************************************************** + + Skeleton driver for Quasimidi Quasar & TechnoX synthesizer modules. + +***************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "machine/6850acia.h" +#include "video/hd44780.h" +#include "emupal.h" +#include "screen.h" + +namespace { + +class qmquasar_state : public driver_device +{ +public: + qmquasar_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void quasar(machine_config &config); + void technox(machine_config &config); + +protected: + virtual void driver_start() override; + +private: + HD44780_PIXEL_UPDATE(quasar_pixel_update); + HD44780_PIXEL_UPDATE(technox_pixel_update); + + void prog_map(address_map &map); + void ext_map(address_map &map); + + required_device m_maincpu; +}; + +HD44780_PIXEL_UPDATE(qmquasar_state::quasar_pixel_update) +{ + if (x < 5 && y < 8 && line < 2 && pos < 40) + bitmap.pix(line * 8 + y, pos * 6 + x) = state; +} + +HD44780_PIXEL_UPDATE(qmquasar_state::technox_pixel_update) +{ + if (x < 5 && y < 8 && line < 2 && pos < 16) + bitmap.pix(line * 8 + y, pos * 6 + x) = state; +} + + +void qmquasar_state::prog_map(address_map &map) +{ + map(0x0000, 0xffff).rom().region("program", 0); // TODO: banking? +} + +void qmquasar_state::ext_map(address_map &map) +{ + map(0x0000, 0x38ff).ram(); + map(0x3900, 0x3903).nopr(); + map(0x390b, 0x390b).nopr(); + map(0x7c00, 0x7fff).noprw(); + map(0x8000, 0x8003).noprw(); + map(0xa000, 0xa001).w("acia", FUNC(acia6850_device::write)); + map(0xa002, 0xa003).r("acia", FUNC(acia6850_device::read)); + map(0xb000, 0xb001).w("lcdc", FUNC(hd44780_device::write)); + map(0xb002, 0xb003).r("lcdc", FUNC(hd44780_device::read)); + map(0xc000, 0xc0ff).nopw(); + map(0xff10, 0xff10).noprw(); +} + + +static INPUT_PORTS_START(qmquasar) +INPUT_PORTS_END + +void qmquasar_state::quasar(machine_config &config) +{ + I8032(config, m_maincpu, 12'000'000); // exact type and clock unknown + m_maincpu->set_addrmap(AS_PROGRAM, &qmquasar_state::prog_map); + m_maincpu->set_addrmap(AS_IO, &qmquasar_state::ext_map); + + acia6850_device &acia(ACIA6850(config, "acia")); + acia.irq_handler().set_inputline(m_maincpu, MCS51_INT1_LINE); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update)); + screen.set_size(6*40, 8*2); + screen.set_visarea_full(); + screen.set_palette("palette"); + + PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + hd44780_device &lcdc(HD44780(config, "lcdc", 270'000)); // TODO: clock not measured, datasheet typical clock used + lcdc.set_lcd_size(2, 40); + lcdc.set_pixel_update_cb(FUNC(qmquasar_state::quasar_pixel_update)); +} + +void qmquasar_state::technox(machine_config &config) +{ + quasar(config); + + subdevice("screen")->set_size(6*16, 8*2); + subdevice("screen")->set_visarea_full(); + + subdevice("lcdc")->set_lcd_size(2, 16); + subdevice("lcdc")->set_pixel_update_cb(FUNC(qmquasar_state::technox_pixel_update)); +} + + +ROM_START(qmquasar) + ROM_REGION(0x20000, "program", 0) + ROM_LOAD("27c1000_v200.ic4", 0x00000, 0x20000, CRC(951363bd) SHA1(6dfb2fa362afd8da0fb764108b6263d9da45c676)) // "Version No: 2.00" + + ROM_REGION(0x40000, "samples", 0) + ROM_LOAD("27c020_v200d.ic51", 0x00000, 0x40000, CRC(ef318407) SHA1(e147413d5df2f9489c2886587ae60f6807b7dbb9)) +ROM_END + +ROM_START(technox) + ROM_REGION(0x20000, "program", 0) + ROM_LOAD("mx27c1000_v105.ic4", 0x00000, 0x20000, CRC(4d393cd9) SHA1(9ee853f1f2e88fbfc86589c4d0f91003d0ff146f)) // "Version No 1.05b" + + ROM_REGION(0x20000, "samples", 0) + ROM_LOAD("nm27c010_v105.ic51", 0x00000, 0x20000, CRC(d669570e) SHA1(0645a1b022ed25a836152933e6df32da4448f49a)) +ROM_END + +void qmquasar_state::driver_start() +{ + memory_region *rgn = memregion("program"); + u8 *rom = rgn->base(); + + for (offs_t base = 0x00000; base < rgn->bytes(); base += 0x100) + { + // Copy 256-byte block before descrambling addresses + std::vector orig(&rom[base], &rom[base + 0x100]); + + for (offs_t offset = 0; offset < 0x100; offset++) + rom[base + offset] = orig[bitswap<8>(offset, 1, 2, 3, 6, 5, 7, 1, 0) ^ 0x40 ^ ((offset & 0x11) << 3)]; + } +} + +} // anonymous namespace + +SYST(1993, qmquasar, 0, 0, quasar, qmquasar, qmquasar_state, empty_init, "Quasimidi Musikelektronik GmbH", "Quasimidi Quasar", MACHINE_IS_SKELETON) +SYST(1995, technox, 0, 0, technox, qmquasar, qmquasar_state, empty_init, "Quasimidi Musikelektronik GmbH", "TechnoX", MACHINE_IS_SKELETON) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/qmsirius.cpp mame-0.264+dfsg.1/src/mame/skeleton/qmsirius.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/qmsirius.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/qmsirius.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -56,7 +56,7 @@ void qmsirius_state::qmsirius(machine_config &config) { - P80C552(config, m_maincpu, 12'000'000); // type guessed; clock unknown + P80C552(config, m_maincpu, 12_MHz_XTAL); // PCB80C552-5 16WP m_maincpu->set_addrmap(AS_PROGRAM, &qmsirius_state::prog_map); m_maincpu->set_addrmap(AS_IO, &qmsirius_state::ext_map); @@ -70,7 +70,7 @@ PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); - hd44780_device &lcdc(HD44780(config, "lcdc", 270'000)); // TODO: clock not measured, datasheet typical clock used + hd44780_device &lcdc(HD44780(config, "lcdc", 270'000)); // HC16202NY-LY; TODO: clock not measured, datasheet typical clock used lcdc.set_lcd_size(2, 16); lcdc.set_pixel_update_cb(FUNC(qmsirius_state::lcd_pixel_update)); } diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/qtsbc.cpp mame-0.264+dfsg.1/src/mame/skeleton/qtsbc.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/qtsbc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/qtsbc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -65,11 +65,12 @@ ****************************************************************************/ #include "emu.h" + +#include "bus/rs232/rs232.h" +//#include "bus/s100/s100.h" #include "cpu/z80/z80.h" #include "machine/i8251.h" #include "machine/pit8253.h" -#include "bus/rs232/rs232.h" -//#include "bus/s100/s100.h" namespace { @@ -88,13 +89,14 @@ , m_cpu_speed(*this, "SPEED") , m_eprom(*this, "maincpu") , m_p_ram(*this, "ram") - , m_rts(true) - , m_dtr(true) { } void qtsbc(machine_config &config); - void io_map(address_map &map); - void mem_map(address_map &map); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: u8 memory_r(offs_t offset); void memory_w(offs_t offset, u8 data); @@ -103,8 +105,9 @@ void rts_loopback_w(int state); void dtr_loopback_w(int state); - virtual void machine_start() override; - virtual void machine_reset() override; + void io_map(address_map &map); + void mem_map(address_map &map); + required_device m_maincpu; required_device m_pit; required_device m_usart; @@ -115,8 +118,8 @@ required_region_ptr m_eprom; required_shared_ptr m_p_ram; bool m_power_on = false; - bool m_rts; - bool m_dtr; + s32 m_rts = 1; + s32 m_dtr = 1; }; @@ -201,7 +204,6 @@ return 0x00; // Ports 08, 10 and 80 also used for read access - return 0xff; } } @@ -234,7 +236,6 @@ else { // TODO: S-100 bus (no address mirroring) - logerror("Output %02X to %04X\n", data, offset); } } @@ -242,7 +243,7 @@ void qtsbc_state::rts_loopback_w(int state) { // Filtered through this routine to avoid infinite loops - if (state != bool(m_rts)) + if (state != m_rts) { m_rts = state; m_rs232->write_rts(m_rts); @@ -252,7 +253,7 @@ void qtsbc_state::dtr_loopback_w(int state) { // Filtered through this routine to avoid infinite loops - if (state != bool(m_dtr)) + if (state != m_dtr) { m_dtr = state; m_rs232->write_dtr(m_dtr); @@ -503,6 +504,7 @@ save_item(NAME(m_power_on)); save_item(NAME(m_rts)); + save_item(NAME(m_dtr)); } void qtsbc_state::machine_reset() diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/sterz80.cpp mame-0.264+dfsg.1/src/mame/skeleton/sterz80.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/sterz80.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/sterz80.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,204 @@ +// license:BSD-3-Clause +// copyright-holders: + +/******************************************************************* +Tong Zi Maque +Ster, 2003 (might be incorrect?) +Hardware info By Guru +--------------------- + +No PCB number +"MADE IN SPIDER" on some ROMs and spider web logo on PCB +MADE IN TAIWAN 2003 +|--------------------------------------| +|BATT 62256 Z80-PROG.U2 | +| 62256 15MHz Z80 |-| +| DS12B887.U12 | +|GFX1.U6 13.560MHz | +| | +| GFX2.U5 M| +| |--------| TLP620-4 A| +| |ALTERA | TLP620-4 H| +| |EPM7256 | |--------| J| +| |SQC208 | |ALTERA | O| +| |--------| |EPM7192 | N| +| |SQC160 | G| +| |--------| | +| U6295 93C46.U11 | +|78L05 29F002.U9 BUTTON TLP620-4 | +|uPC1241H T518A TLP620-4 | +| VOL |-| +|-| 10WAY |-----| 22WAY | + |---------| |--------------------| +Notes: + Z80 - Zilog Z84C0008 Z80 CPU. Clock 13.560MHz + U6295 - OKI M6295. Clock 1.13MHz [13.560/12]. Pin 7 HIGH. + 62256 - 32kB x8-bit SRAM (the one nearest to the Z80 is battery-backed) + BUTTON - Reset? Test? + TLP620-4 - Toshiba TLP620-4 Photocoupler. Package contains 4 driver/receiver pairs. + EMP7256 - Altera Max 7000-Series EPM7256SQC208 Programmable Logic Device + EMP7192 - Altera Max 7000-Series EPM7192SQC160 Programmable Logic Device + uPC1241H - NEC uPC1241H Mono Audio Power Amp + T518A - PST518A System Reset IC + 78L05 - 5V Regulator in TO92 package + U5/U6 - 27C160 EPROM (graphics) + 93C46.U11 - Atmel AT93C46 EEPROM (128 bytes) (for game settings or high scores?) + Z80-PROG.U2 - Winbond W29EE011 EEPROM (Z80 program). The databus on this ROM connects to the EPM7192 and the Z80 databus is also connected + to the EPM7192 on different pins. Additionally there's no valid Z80 code and no plain text in the ROM. This all leads to it + being highly likely that the program is encrypted. + 29F002 - AMD AM29F002 PLCC32 (surface-mounted) EEPROM. This is connected to the OKI chip and holds the audio samples. +DS12B887.U12 - Dallas DS12B887 Real Time Clock Module. This looks suspiciously like it's used for protection data? The PCB contains a battery + (for game settings or high scores?) and a 93C46 EEPROM (for game settings or high scores?). No other data needs to be sotred + anywhere. The DS12B887 is connected to the EPM7192 chip. It's possible it might just be for time/bookkeeping. The chip + (dated 9614) is dumped but I'd be surprised if the battery inside was still alive and the data is good, although the data isn't + just garbage and reads the same each time so by some miracle it might be ok. + The first 14 bytes are clock and control registers. The remaining space is general-purpose battery-backed RAM. These same chips + were used often in PCs around the 286/386/486 era to store the CMOS data. The RAM can technically hold anything, maybe even + a decryption key.... + +*******************************************************************/ + + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "machine/ds128x.h" +#include "machine/eepromser.h" +#include "sound/okim6295.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" +#include "tilemap.h" + + +namespace { + +class sterz80_state : public driver_device +{ +public: + sterz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void tongzi(machine_config &config) ATTR_COLD; + + void init_tongzi() ATTR_COLD; + +private: + required_device m_maincpu; + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void program_map(address_map &map) ATTR_COLD; + void io_map(address_map &map) ATTR_COLD; +}; + + +uint32_t sterz80_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(rgb_t::black(), cliprect); + + return 0; +} + + +void sterz80_state::program_map(address_map &map) +{ + map(0x0000, 0xffff).rom(); +} + +void sterz80_state::io_map(address_map &map) +{ + map.global_mask(0xff); + map.unmap_value_high(); +} + + +static INPUT_PORTS_START( tongzi ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + +void sterz80_state::tongzi(machine_config &config) +{ + // basic machine hardware + Z80(config, m_maincpu, 13.560_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &sterz80_state::program_map); + m_maincpu->set_addrmap(AS_IO, &sterz80_state::io_map); + // m_maincpu->set_vblank_int("screen", FUNC(sterz80_state::irq0_line_hold)); + + EEPROM_93C46_8BIT(config, "eeprom"); + + DS12885(config, "rtc", 32.768_kHz_XTAL); // TODO: should be DS12B887 + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: verify everything once emulation works + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(64*8, 32*8); + screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1); + screen.set_screen_update(FUNC(sterz80_state::screen_update)); + + PALETTE(config, "palette").set_entries(0x100); // TODO + + // sound hardware + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, "oki", 13.560_MHz_XTAL / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); +} + + +ROM_START( tongzi ) + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD( "3.u2", 0x00000, 0x20000, CRC(8f394f91) SHA1(e49c682cb819885334c1f25d5221e3f59c21a7e2) ) // encrypted + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "1.u6", 0x000000, 0x200000, CRC(e885dcc9) SHA1(ea4a72eec7b65cb668c5abb64347426192bd0f86) ) + ROM_LOAD( "2.u5", 0x200000, 0x200000, CRC(a7c11185) SHA1(96c9479802db0594845b2b282553c73406b84bb0) ) + + ROM_REGION( 0x80, "eeprom", 0 ) + ROM_LOAD( "93c46.u11", 0x00, 0x80, CRC(bc385e5a) SHA1(b6a2c02e3b558aff2fb2a3b84ea307ad0996a70c) ) + + ROM_REGION( 0x80, "rtc", 0 ) + ROM_LOAD( "ds12887.u12", 0x00, 0x80, CRC(520e6efb) SHA1(f4e59ac6a519d310e8362fd088f50c7ee7f970e1) ) + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "am29f002.u9", 0x00000, 0x40000, CRC(4bbd8cfa) SHA1(690d7a98764162b0771629c02fd3c488761d8ec0) ) // encrypted +ROM_END + + +void sterz80_state::init_tongzi() +{ + // decrypt main CPU ROM + // TODO + // the encryption seems to be based on address-determined XORs and data bitswaps. At a first glance the XORs seem to be chosen + // by bits 0, 1, 4, 5, 6 and 7 of the address, the data bitswaps by bits 0 and 1 of the address. + + // decrypt M6295 ROM + // TODO +} + +} // anonymous namespace + + +GAME( 2003, tongzi, 0, tongzi, tongzi, sterz80_state, init_tongzi, ROT0, "Ster", "Tong Zi Maque", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/ticz80.cpp mame-0.264+dfsg.1/src/mame/skeleton/ticz80.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/ticz80.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/ticz80.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,226 @@ +// license:BSD-3-Clause +// copyright-holders: + +/******************************************************************* +Bao Qing Tian, TIC, 1995 +Hardware Info by Guru +--------------------- + +no number (bootleg-like so probably a rip-off of something else) +|-------------------------------------------------| +| uPC1241H VOL1 VOL2 6606 TIC01 | +| 4558 4558 | +| 95123 3.579545MHz | +|-| 2018 8| + | 95101 SCAP L| +|-| 2018 I| +| 6264 N| +|1 Z8400A E| +|8 |---------| R| +|W | | |------| TIC2-2 | +|A | 95124 | |PLCC68| | +|Y | | |ALTERA| TIC03 | +|-| SW4 | | |------| |-| + | |---------| 21.47727MHz T518B | +|-| SW3 TIC04 |-| +| HM53462 HM53462 |----| | +|10 SW2 HM53462 HM53462 |TK101 TIC05 10| +|WAY HM53462 HM53462 |----| WAY| +| | +|-| SW1 JAMMA |--| TIC06 | + |------------------------| |-------------------| +Notes: + Z8400A - Z80A CPU. Clock 5.3693175MHz [21.47727/4] + 6606 - Equivalent to OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock input 1.342329375MHz [21.47727/16]. Pin 7 HIGH + 95123 - DIP18 IC. Could be equivalent to Yamaha YM2413 OPLL FM Synthesis Sound Chip. Clock input 3.579545MHz + 95101 - Equivalent to AY-3-8910. Clock input 1.342329375MHz [21.47727/16] + 95124 - Custom Chip (video) + TK101 - Custom Chip (I/O?) + 2018 - 2kB x8-bit SRAM + 6264 - 8kB x8-bit SRAM (battery-backed) + HM53462 - Hitachi HM53462 Multi-Port RAM; 64k-word x4-bit DRAM and 256-word x4-bit Serial Access RAM + Seems to be the same type of Multi-Port RAM used on Mortal Kombat. + SW1-4 - 8-position DIP Switch + uPC1241H - NEC uPC1241H Audio Power Amp + VOL1 - Music Volume Pot + VOL2 - Voice Volume Pot + 4558 - Dual Operational Amplifier + PLCC68 - Unknown PLCC68 IC. Altera logo partially visible so some kind of Altera CPLD + T518B - Mitsumi PST518B Master Reset IC (TO92) + SCAP - 5.5V 0.1F Supercap + TIC01 - 27C2001 EPROM (oki samples) + TIC2-2 - 27C2001 EPROM (main program) + TIC03-06 - 27C4001 OTP EPROM (gfx) + + +TODO: This is almost surely bootlegged hardware. Move to appropriate + driver when identified. +*******************************************************************/ + + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "sound/ay8910.h" +#include "sound/okim6295.h" +#include "sound/ymopl.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" +#include "tilemap.h" + + +namespace { + +class ticz80_state : public driver_device +{ +public: + ticz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void baoqingt(machine_config &config) ATTR_COLD;; + +private: + required_device m_maincpu; + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + void program_map(address_map &map) ATTR_COLD; + void io_map(address_map &map) ATTR_COLD; +}; + + +uint32_t ticz80_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(rgb_t::black(), cliprect); + + return 0; +} + + +void ticz80_state::program_map(address_map &map) +{ + map(0x0000, 0x5fff).rom(); + map(0x6000, 0x6fff).ram(); +} + +void ticz80_state::io_map(address_map &map) +{ + map.global_mask(0xff); + map.unmap_value_high(); +} + + +static INPUT_PORTS_START( baoqingt ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW1") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8") + + PORT_START("DSW2") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8") + + PORT_START("DSW3") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW3:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW3:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW3:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW3:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW3:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW3:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW3:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW3:8") + + PORT_START("DSW4") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW4:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW4:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW4:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW4:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW4:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW4:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW4:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW4:8") +INPUT_PORTS_END + + +void ticz80_state::baoqingt(machine_config &config) +{ + // basic machine hardware + Z80(config, m_maincpu, 21.477272_MHz_XTAL / 4); + m_maincpu->set_addrmap(AS_PROGRAM, &ticz80_state::program_map); + m_maincpu->set_addrmap(AS_IO, &ticz80_state::io_map); + // m_maincpu->set_vblank_int("screen", FUNC(ticz80_state::irq0_line_hold)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: verify everything once emulation works + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(64*8, 32*8); + screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1); + screen.set_screen_update(FUNC(ticz80_state::screen_update)); + + PALETTE(config, "palette").set_entries(0x100); // TODO + + // sound hardware + SPEAKER(config, "mono").front_center(); + + YM2413(config, "ymsnd", 3.579545_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.5); + + AY8910(config, "ay", 21.477272_MHz_XTAL / 16).add_route(ALL_OUTPUTS, "mono", 0.5); + + OKIM6295(config, "oki", 21.477272_MHz_XTAL / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5); +} + + +ROM_START( baoqingt ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD( "tic2-2.u4", 0x00000, 0x40000, CRC(a4d16608) SHA1(254aae41284fae0eeda6ab7f72ec907cd9a5c7e2) ) + + ROM_REGION( 0x200000, "gfx", 0 ) + ROM_LOAD( "tic03.u41", 0x000000, 0x80000, CRC(00c9faf2) SHA1(4eaebfc9506d7e3925e43f44c0d396c1ba38a214) ) + ROM_LOAD( "tic04.u42", 0x080000, 0x80000, CRC(cb8f0831) SHA1(122da594df6b025f96eb30eb0edcdef2c0f59556) ) + ROM_LOAD( "tic05.u43", 0x100000, 0x80000, CRC(5736a700) SHA1(b61e011858a3ee91fd69d49450b48e1d157cb11d) ) + ROM_LOAD( "tic06.u44", 0x180000, 0x80000, CRC(a093594e) SHA1(56931c1014a862fa4db2d32eb97deda20e41d92f) ) + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "tic01.u9", 0x00000, 0x40000, CRC(b16b5dbf) SHA1(0896bb8a32c9a2d9645ce40653549b4ec9ce01a4) ) +ROM_END + +} // anonymous namespace + + +GAME( 1995, baoqingt, 0, baoqingt, baoqingt, ticz80_state, empty_init, ROT0, "TIC", "Bao Qing Tian", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/vp415.cpp mame-0.264+dfsg.1/src/mame/skeleton/vp415.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/vp415.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/vp415.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -421,7 +421,7 @@ void vp415_state::z80_io_map(address_map &map) { map.global_mask(0xff); - map(0x00, 0x0f).rw(SCSI_TAG, FUNC(ncr5385_device::read), FUNC(ncr5385_device::write)); + map(0x00, 0x0f).m(SCSI_TAG, FUNC(ncr5385_device::map)); // 0x20, 0x21: Connected to A0 + D0..D7 of SLAVE i8041 map(0x34, 0x34).w(FUNC(vp415_state::sel34_w)); map(0x37, 0x37).r(FUNC(vp415_state::sel37_r)); diff -Nru mame-0.263+dfsg.1/src/mame/skeleton/vp60.cpp mame-0.264+dfsg.1/src/mame/skeleton/vp60.cpp --- mame-0.263+dfsg.1/src/mame/skeleton/vp60.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/skeleton/vp60.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: -/*********************************************************************************************************************************** - -Skeleton driver for ADDS Viewpoint 60 terminal. -No significant progress can be made until the 8051 has its internal ROM dumped. - -************************************************************************************************************************************/ - -#include "emu.h" -#include "cpu/mcs48/mcs48.h" -#include "cpu/mcs51/mcs51.h" -//#include "machine/er2055.h" -#include "video/i8275.h" -#include "screen.h" - - -namespace { - -class vp60_state : public driver_device -{ -public: - vp60_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_crtc(*this, "crtc") - , m_p_chargen(*this, "chargen") - { } - - void vp60(machine_config &config); - -private: - I8275_DRAW_CHARACTER_MEMBER(draw_character); - u8 crtc_r(offs_t offset); - void crtc_w(offs_t offset, u8 data); - - void io_map(address_map &map); - void kbd_map(address_map &map); - void mem_map(address_map &map); - - required_device m_maincpu; - required_device m_crtc; - required_region_ptr m_p_chargen; -}; - -I8275_DRAW_CHARACTER_MEMBER(vp60_state::draw_character) -{ -} - -u8 vp60_state::crtc_r(offs_t offset) -{ - return m_crtc->read(offset >> 8); -} - -void vp60_state::crtc_w(offs_t offset, u8 data) -{ - m_crtc->write(offset >> 8, data); -} - -void vp60_state::mem_map(address_map &map) -{ - map(0x0000, 0x2fff).rom().region("maincpu", 0); -} - -void vp60_state::io_map(address_map &map) -{ - map(0x8000, 0x87ff).ram(); - map(0xc000, 0xc000).select(0x100).mirror(0xff).rw(FUNC(vp60_state::crtc_r), FUNC(vp60_state::crtc_w)); -} - -void vp60_state::kbd_map(address_map &map) -{ - map(0x000, 0x3ff).rom().region("keyboard", 0); -} - -static INPUT_PORTS_START( vp60 ) -INPUT_PORTS_END - -void vp60_state::vp60(machine_config &config) -{ - I8051(config, m_maincpu, 10.92_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &vp60_state::mem_map); - m_maincpu->set_addrmap(AS_IO, &vp60_state::io_map); - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(25.92_MHz_XTAL, 1600, 0, 1280, 270, 0, 250); - //screen.set_raw(25.92_MHz_XTAL, 1632, 0, 1280, 319, 0, 275); - screen.set_screen_update("crtc", FUNC(i8275_device::screen_update)); - - I8275(config, m_crtc, 25.92_MHz_XTAL / 16); - m_crtc->set_character_width(16); - m_crtc->set_display_callback(FUNC(vp60_state::draw_character)); - m_crtc->set_screen("screen"); - - i8035_device &kbdcpu(I8035(config, "kbdcpu", 3.579545_MHz_XTAL)); // 48-300-010 XTAL - kbdcpu.set_addrmap(AS_PROGRAM, &vp60_state::kbd_map); -} - - -/************************************************************************************************************** - -ADDS Viewpoint 60. -Chips: P8051, P8275, EAROM ER-2055, HM6116P-4 -Crystals: 25.92, 10.920 -Keyboard: INS8035N-6, crystal marked 48-300-010. - -***************************************************************************************************************/ - -ROM_START( vp60 ) - ROM_REGION(0x4000, "maincpu", ROMREGION_ERASE00) - ROM_LOAD( "p8051.ub1", 0x0000, 0x1000, NO_DUMP ) // internal ROM not dumped - ROM_LOAD( "pgm.uc1", 0x2000, 0x1000, CRC(714ca569) SHA1(405424369fd5458e02c845c104b2cb386bd857d2) ) - ROM_CONTINUE( 0x1000, 0x1000 ) - // Stubs filling in for missing code - ROM_FILL( 0x0000, 1, 0x02 ) - ROM_FILL( 0x0001, 1, 0x10 ) - ROM_FILL( 0x0002, 1, 0x09 ) - ROM_FILL( 0x005d, 1, 0x02 ) - ROM_FILL( 0x005e, 1, 0x27 ) - ROM_FILL( 0x005f, 1, 0x2e ) - ROM_FILL( 0x0100, 1, 0x22 ) - ROM_FILL( 0x0500, 1, 0x22 ) - ROM_FILL( 0x0600, 1, 0x22 ) - ROM_FILL( 0x0800, 1, 0x22 ) - - ROM_REGION(0x1000, "chargen", 0) - ROM_LOAD( "font.uc4", 0x0000, 0x1000, CRC(3c4d39c0) SHA1(9503c0d5a76e8073c94c86be57bcb312641f6cc4) ) - - ROM_REGION(0x400, "keyboard", 0) - ROM_LOAD( "195.kbd", 0x0000, 0x0400, CRC(14885da3) SHA1(3b06f658af1a62b28e62d8b3a557b74169917a12) ) -ROM_END - -} // anonymous namespace - - -COMP( 1982, vp60, 0, 0, vp60, vp60, vp60_state, empty_init, "ADDS", "Viewpoint 60", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/snk/hng64.cpp mame-0.264+dfsg.1/src/mame/snk/hng64.cpp --- mame-0.263+dfsg.1/src/mame/snk/hng64.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/snk/hng64.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -462,7 +462,7 @@ Games that use the LVS-DG1 cart: Road's Edge / Round Trip RV Xtreme Rally / Off Beat Racer! Beast Busters: Second Nightmare - Samurai Shodown 64 / Samurai Spirits / Pae Wang Jeon Seol 64 + Samurai Shodown 64 / Samurai Spirits / Paewang Jeonseol 64 Games that use the LVS-DG2 cart: Fatal Fury: Wild Ambition / Garou Densetsu: Wild Ambition Buriki One: World Grapple Tournament '99 in Tokyo diff -Nru mame-0.263+dfsg.1/src/mame/snk/mainsnk.cpp mame-0.264+dfsg.1/src/mame/snk/mainsnk.cpp --- mame-0.263+dfsg.1/src/mame/snk/mainsnk.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/snk/mainsnk.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -177,8 +177,6 @@ }; -// video - void mainsnk_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -344,8 +342,6 @@ } -// machine - uint8_t mainsnk_state::sound_ack_r() { m_audiocpu->set_input_line(0, CLEAR_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/snk/munchmo.cpp mame-0.264+dfsg.1/src/mame/snk/munchmo.cpp --- mame-0.263+dfsg.1/src/mame/snk/munchmo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/snk/munchmo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,8 +119,6 @@ }; -// video - void munchmo_state::palette(palette_device &palette) const { u8 const *const color_prom = memregion("proms")->base(); @@ -269,8 +267,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/snk/ngp.cpp mame-0.264+dfsg.1/src/mame/snk/ngp.cpp --- mame-0.263+dfsg.1/src/mame/snk/ngp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/snk/ngp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -805,8 +805,8 @@ bool ngp_state::nvram_read(util::read_stream &file) { - size_t actual; - if (!file.read(m_mainram, 0x3000, actual) && actual == 0x3000) + auto const [err, actual] = read(file, m_mainram, 0x3000); + if (!err && (actual == 0x3000)) { m_nvram_loaded = true; return true; @@ -817,8 +817,8 @@ bool ngp_state::nvram_write(util::write_stream &file) { - size_t actual; - return !file.write(m_mainram, 0x3000, actual) && actual == 0x3000; + auto const [err, actual] = write(file, m_mainram, 0x3000); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/sony/psx.cpp mame-0.264+dfsg.1/src/mame/sony/psx.cpp --- mame-0.263+dfsg.1/src/mame/sony/psx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sony/psx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -42,7 +42,8 @@ m_maincpu(*this, "maincpu"), m_ram(*this, "maincpu:ram"), m_parallel(*this, "parallel"), - m_psxcd(*this, "psxcd") + m_psxcd(*this, "psxcd"), + m_cd_softlist(*this, "cd_list") { } @@ -71,6 +72,7 @@ required_device m_parallel; required_device m_psxcd; + required_device m_cd_softlist; }; @@ -531,7 +533,7 @@ subdevice("maincpu:dma")->install_read_handler(3, psxdma_device::read_delegate(&psx1_state::cd_dma_read, this)); subdevice("maincpu:dma")->install_write_handler(3, psxdma_device::write_delegate(&psx1_state::cd_dma_write, this)); - SOFTWARE_LIST(config, "cd_list").set_original("psx"); + SOFTWARE_LIST(config, m_cd_softlist).set_original("psx"); } void psx1_state::psj(machine_config &config) @@ -542,12 +544,17 @@ CXD8561Q(config, "gpu", XTAL(53'693'175), 0x100000, m_maincpu.target()).set_screen("screen"); psx_base(config); + + m_cd_softlist->set_filter("NTSC-J"); } void psx1_state::psu(machine_config &config) { psj(config); + HD63705Z0(config, "subcpu", 4166667).set_addrmap(AS_PROGRAM, &psx1_state::subcpu_map); // FIXME: actually MC68HC05G6 + + m_cd_softlist->set_filter("NTSC-U"); } void psx1_state::pse(machine_config &config) @@ -558,6 +565,8 @@ CXD8561Q(config, "gpu", XTAL(53'693'175), 0x100000, m_maincpu.target()).set_screen("screen"); psx_base(config); + + m_cd_softlist->set_filter("PAL-E"); } ROM_START( psj ) diff -Nru mame-0.263+dfsg.1/src/mame/subsino/subsino.cpp mame-0.264+dfsg.1/src/mame/subsino/subsino.cpp --- mame-0.263+dfsg.1/src/mame/subsino/subsino.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/subsino/subsino.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -3456,6 +3456,40 @@ ROM_LOAD( "palce16v8h.u35", 0x00000, 0x00117, NO_DUMP ) ROM_END +/* Korean title: 뉴 동물 동물 + PCB silkscreened "V 98.03.18". Four banks of eight DIP switches, unpopulated socket (SW5) for reset switch. + Hardware: K-664 + K-666, HD647180X0CP8L, QL8X12B-XPL68C, 12.000 MHz xtal. + Video from the real hardware: https://youtu.be/VtPV3DonIsY */ +ROM_START( ndongmul ) + ROM_REGION( 0x04000, "maincpu", 0 ) + ROM_LOAD( "hd647180.bin", 0x00000, 0x04000, NO_DUMP ) // HD647180X0CP8L + HD647180X_FAKE_INTERNAL_ROM + + ROM_REGION( 0x20000, "program", 0 ) + ROM_LOAD( "tms27c010a.u26", 0x00000, 0x20000, CRC(cf30ed7e) SHA1(138bbfa252769d19b976906a057e54e41135ebe7) ) + + ROM_REGION( 0x40000, "tilemap", 0 ) + ROM_LOAD( "m27512.u24", 0x00000, 0x10000, CRC(c3a4460c) SHA1(a8c663354faded0012e8fc18d37fdbe76e301fc1) ) + ROM_LOAD( "nm27c512q.u24a", 0x10000, 0x10000, CRC(e86f4432) SHA1(d545087561c93690438affea8994da1e6e3ce8af) ) + ROM_LOAD( "d27c512.u25", 0x20000, 0x10000, CRC(9ca948c1) SHA1(bf407820b10bea1726e00786892188e3dc07018f) ) + ROM_LOAD( "m27c512.u25a", 0x30000, 0x10000, CRC(1b943b64) SHA1(518c0e18bb942c8756364d60d9390e02e79e94f4) ) + + ROM_REGION( 0x20000, "reels", 0 ) + ROM_LOAD( "tms27c512.u29", 0x00000, 0x10000, BAD_DUMP CRC(c271fb5f) SHA1(980ab3f14b84dcb1802519047b6afdf0671259d2) ) // Bitrotten, address 0x00410 sometimes reads as 0002 and others as 0003 + ROM_LOAD( "d27512.u30", 0x10000, 0x10000, CRC(55ddc00a) SHA1(8d6287f22a73792a438214098451809604186cb0) ) + + ROM_REGION( 0x00300, "proms", 0 ) + ROM_LOAD( "n82s129an.u1", 0x00000, 0x00100, CRC(69af17fc) SHA1(38546f5665cf731195ac384aca182c56884333f0) ) + ROM_LOAD( "n82s129an.u2", 0x00100, 0x00100, CRC(4b5f288a) SHA1(b6b9f9067afe93bd13ea17311484e2a2af01a0ed) ) + ROM_LOAD( "n82s129an.u3", 0x00200, 0x00100, CRC(a1c0d069) SHA1(794df68451525901ebd5895feb26fcda2c517c3f) ) + + ROM_REGION( 0x00045c, "plds", 0 ) + ROM_LOAD( "palce16v8h.u27", 0x00000, 0x00117, CRC(bf7e1812) SHA1(f299fda423fce9f8ffd4df07e315bea3662479b4) ) + ROM_LOAD( "palce16v8h.u42", 0x00117, 0x00117, CRC(0cf55cec) SHA1(845395ca0587627331b9ac48777f7cb6b54b9401) ) + ROM_LOAD( "palce16v8h.u9", 0x0022e, 0x00117, CRC(8272668f) SHA1(9037f0d9c7625d05d2087e6f2d159dece934a945) ) + ROM_LOAD( "palce16v8h.u31", 0x00345, 0x00117, CRC(c40859b3) SHA1(e25e1c4311deaa174c8a7e015e55a1aecd83005e) ) +ROM_END + /*************************************************************************** Cross Bingo @@ -4358,11 +4392,13 @@ GAMEL( 1993, newhunterc, tisub, newhunterb, tisub, subsino_state, init_newhunterc, ROT0, "bootleg", "New HUNTer (bootleg, set 2)", MACHINE_NOT_WORKING, layout_tisubb ) // 1989 on screen, but "Copyright 1993 SubSino Corp. Taipei, Taiwan." on program ROM GAMEL( 1993, newhunterd, tisub, newhunterb, tisub, subsino_state, init_newhunterc, ROT0, "bootleg", "New HUNTer (bootleg, set 3)", MACHINE_NOT_WORKING, layout_tisubb ) +GAMEL( 1998, ndongmul, 0, newhunterb, tisub, subsino_state, init_newhunterc, ROT0, "Hyoja Game", "New DongmulDongmul", MACHINE_NOT_WORKING, layout_tisubb ) + GAMEL( 1991, crsbingo, 0, crsbingo, crsbingo, subsino_state, init_crsbingo, ROT0, "Subsino", "Poker Carnival", 0, layout_crsbingo ) -GAMEL( 1994, dinofmly, 0, dinofmly, sharkpy, subsino_state, empty_init, ROT0, "Subsino", "Dino Family", MACHINE_NOT_WORKING, layout_sharkpy ) // stops with 'error password' message during boot -GAMEL( 1995, dinofmlya, dinofmly,dinofmly, sharkpy, subsino_state, empty_init, ROT0, "Tangasoft", "Dino Family (Portuguese, Tangasoft license)", MACHINE_NOT_WORKING, layout_sharkpy ) // stops with 'error password' message during boot +GAMEL( 1994, dinofmly, 0, dinofmly, sharkpy, subsino_state, empty_init, ROT0, "Subsino", "Dino Family", MACHINE_NOT_WORKING, layout_sharkpy ) // stops with 'error password' message during boot +GAMEL( 1995, dinofmlya, dinofmly,dinofmly, sharkpy, subsino_state, empty_init, ROT0, "Tangasoft", "Dino Family (Portuguese, Tangasoft license)", MACHINE_NOT_WORKING, layout_sharkpy ) // stops with 'error password' message during boot GAMEL( 1995, stbsub, 0, stbsub, stbsub, subsino_state, init_stbsub, ROT0, "American Alpha", "Treasure Bonus (Subsino, v1.6)", 0, layout_stisub ) // board CPU module marked 'Super Treasure Island' (alt title?) GAMEL( 1995, stisub, stbsub, stbsub, stbsub, subsino_state, init_stisub, ROT0, "Subsino", "Super Treasure Island (Italy, v1.6)", 0, layout_stisub ) diff -Nru mame-0.263+dfsg.1/src/mame/suna/goindol.cpp mame-0.264+dfsg.1/src/mame/suna/goindol.cpp --- mame-0.263+dfsg.1/src/mame/suna/goindol.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/suna/goindol.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -110,8 +110,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -229,8 +227,6 @@ } -// machine - void goindol_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data & 0x03); diff -Nru mame-0.263+dfsg.1/src/mame/sunelectronics/arabian.cpp mame-0.264+dfsg.1/src/mame/sunelectronics/arabian.cpp --- mame-0.263+dfsg.1/src/mame/sunelectronics/arabian.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sunelectronics/arabian.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -127,8 +127,6 @@ }; -// video - /************************************* * * Color PROM conversion @@ -491,8 +489,6 @@ } -// machine - /************************************* * * Audio chip output ports diff -Nru mame-0.263+dfsg.1/src/mame/sunelectronics/ikki.cpp mame-0.264+dfsg.1/src/mame/sunelectronics/ikki.cpp --- mame-0.263+dfsg.1/src/mame/sunelectronics/ikki.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/sunelectronics/ikki.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -82,8 +82,6 @@ }; -// video - void ikki_state::palette(palette_device &palette) { const uint8_t *color_prom = memregion("proms")->base(); @@ -273,8 +271,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/taito/2mindril.cpp mame-0.264+dfsg.1/src/mame/taito/2mindril.cpp --- mame-0.263+dfsg.1/src/mame/taito/2mindril.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/2mindril.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -405,6 +405,25 @@ ROM_LOAD ( "d58-10.ic29", 0x000000, 0x200000, CRC(74c87e08) SHA1(f39b3a64f8338ccf5ca6eb76cee92a10fe0aad8f) ) ROM_END +ROM_START( 2mindrila ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "d58-17.ic11", 0x00000, 0x40000, CRC(3abc3e2c) SHA1(ee70c9fc20bf31a427384230672110895eeb0b90) ) // Ver 2.2A 1993/10/18 03:20:00 + ROM_LOAD16_BYTE( "d58-16.ic9", 0x00001, 0x40000, CRC(a82101dd) SHA1(4eacac76fc47294f28af65e2a02d7c279bd52f2d) ) // Program ROMs have asterisks on the labels, "16*" and "17*" + + ROM_REGION( 0x200000, "ymsnd:adpcma", 0 ) /* Samples */ + ROM_LOAD( "d58-11.ic31", 0x000000, 0x200000, CRC(dc26d58d) SHA1(cffb18667da18f5367b02af85a2f7674dd61ae97) ) + + ROM_REGION( 0x400000, "sprites", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "sprites_hi", ROMREGION_ERASE00 ) + + ROM_REGION( 0x400000, "tilemap", 0 ) + ROM_LOAD32_WORD( "d58-08.ic27", 0x000000, 0x200000, CRC(9f5a3f52) SHA1(7b696bd823819965b974c853cebc1660750db61e) ) + ROM_LOAD32_WORD( "d58-09.ic28", 0x000002, 0x200000, CRC(d8f6a86a) SHA1(d6b2ec309e21064574ee63e025ae4716b1982a98) ) + + ROM_REGION( 0x200000, "tilemap_hi", 0 ) + ROM_LOAD ( "d58-10.ic29", 0x000000, 0x200000, CRC(74c87e08) SHA1(f39b3a64f8338ccf5ca6eb76cee92a10fe0aad8f) ) +ROM_END + void _2mindril_state::init_drill() { m_game = TMDRILL; @@ -414,5 +433,6 @@ } // anonymous namespace -// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS -GAME( 1993, 2mindril, 0, drill, drill, _2mindril_state, init_drill, ROT0, "Taito America Corporation", "Two Minute Drill (Ver 2.93A 1994/02/16)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_MECHANICAL) +// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS +GAME( 1993, 2mindril, 0, drill, drill, _2mindril_state, init_drill, ROT0, "Taito America Corporation", "Two Minute Drill (Ver 2.93A 1994/02/16)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_MECHANICAL) +GAME( 1993, 2mindrila, 2mindril, drill, drill, _2mindril_state, init_drill, ROT0, "Taito America Corporation", "Two Minute Drill (Ver 2.2A 1993/10/18)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_MECHANICAL) diff -Nru mame-0.263+dfsg.1/src/mame/taito/ashnojoe.cpp mame-0.264+dfsg.1/src/mame/taito/ashnojoe.cpp --- mame-0.263+dfsg.1/src/mame/taito/ashnojoe.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/ashnojoe.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -157,8 +157,6 @@ }; -// video - TILE_GET_INFO_MEMBER(ashnojoe_state::get_tile_info_highest) { const int code = m_tileram[0][tile_index]; @@ -315,8 +313,6 @@ } -// machine - u16 ashnojoe_state::fake_4a00a_r() { /* If it returns 1 there's no sound. Is it used to sync the game and sound? diff -Nru mame-0.263+dfsg.1/src/mame/taito/bigevglf.cpp mame-0.264+dfsg.1/src/mame/taito/bigevglf.cpp --- mame-0.263+dfsg.1/src/mame/taito/bigevglf.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/bigevglf.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,8 +168,6 @@ }; -// video - void bigevglf_state::palette_w(offs_t offset, uint8_t data) { m_paletteram[offset] = data; @@ -242,8 +240,6 @@ } -// machine - void bigevglf_state::banking_w(uint8_t data) { /* d0-d3 connect to A11-A14 of the ROMs (via ls273 latch) diff -Nru mame-0.263+dfsg.1/src/mame/taito/buggychl.cpp mame-0.264+dfsg.1/src/mame/taito/buggychl.cpp --- mame-0.263+dfsg.1/src/mame/taito/buggychl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/buggychl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -210,8 +210,6 @@ }; -// video - void buggychl_state::palette(palette_device &palette) const { // arbitrary blue shading for the sky, estimation @@ -431,8 +429,6 @@ } -// machine - void buggychl_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data & 0x07); // shall we check if data & 7 < # banks? diff -Nru mame-0.263+dfsg.1/src/mame/taito/chaknpop.cpp mame-0.264+dfsg.1/src/mame/taito/chaknpop.cpp --- mame-0.263+dfsg.1/src/mame/taito/chaknpop.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/chaknpop.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -220,8 +220,6 @@ }; -// video - /*************************************************************************** palette decode ***************************************************************************/ @@ -441,8 +439,6 @@ } -// machine - /*************************************************************************** Memory Handler(s) diff -Nru mame-0.263+dfsg.1/src/mame/taito/exzisus.cpp mame-0.264+dfsg.1/src/mame/taito/exzisus.cpp --- mame-0.263+dfsg.1/src/mame/taito/exzisus.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/exzisus.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -93,8 +93,6 @@ }; -// video - /*************************************************************************** Video hardware of this hardware is almost similar with "mexico86". So, @@ -188,8 +186,6 @@ } -// machine - /*************************************************************************** Memory Handler(s) diff -Nru mame-0.263+dfsg.1/src/mame/taito/fgoal.cpp mame-0.264+dfsg.1/src/mame/taito/fgoal.cpp --- mame-0.263+dfsg.1/src/mame/taito/fgoal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/fgoal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - void fgoal_state::color_w(uint8_t data) { m_current_color = data & 3; @@ -221,8 +219,6 @@ } -// machine - int fgoal_state::intensity(int bits) { int v = 0; diff -Nru mame-0.263+dfsg.1/src/mame/taito/groundfx.cpp mame-0.264+dfsg.1/src/mame/taito/groundfx.cpp --- mame-0.263+dfsg.1/src/mame/taito/groundfx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/groundfx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,8 +145,6 @@ }; -// video - /******************************************************************/ void groundfx_state::video_start() @@ -408,8 +406,6 @@ } -// machine - /********************************************************** GAME INPUTS **********************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/taito/gunbustr.cpp mame-0.264+dfsg.1/src/mame/taito/gunbustr.cpp --- mame-0.263+dfsg.1/src/mame/taito/gunbustr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/gunbustr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -145,8 +145,6 @@ }; -// video - /************************************************************/ void gunbustr_state::video_start() @@ -377,8 +375,6 @@ } -// machine - /*********************************************************************/ TIMER_CALLBACK_MEMBER(gunbustr_state::trigger_irq5) diff -Nru mame-0.263+dfsg.1/src/mame/taito/haplucky.cpp mame-0.264+dfsg.1/src/mame/taito/haplucky.cpp --- mame-0.263+dfsg.1/src/mame/taito/haplucky.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/haplucky.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,186 @@ +// license:BSD-3-Clause +// copyright-holders: + +/* + Happy Lucky! (c) 1985 Taito + Video lottery machine (as the titles screen says) + + J1100059A K1100139A CPU BOARD + JII00060A K1100140A VIDEO BOARD + + Main components (CPU BOARD): + + 2 x Z8400APS + 1 x DQ52B13H-250 (2 KB parallel EEPROM, blank on this PCB) + 1 x PC010SA + 1 x M5L8255AP-5 + 1 x YM2149F + 1 x 8 MHz XTAL + 1 x 8-DIP switch bank + + Main components (VIDEO BOARD): + 1 x 24 MHz XTAL + lots of TTLs and RAMs + + Possibly missing a ROM board. +*/ + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "sound/ay8910.h" +#include "sound/dac.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + + +namespace { + +class haplucky_state : public driver_device +{ +public: + haplucky_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void haplucky(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + + uint8_t m_sound_data = 0; + uint8_t m_sound_status = 0x0f; + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void main_map(address_map &map); + void sound_map(address_map &map); + void sound_io_map(address_map &map); +}; + + +uint32_t haplucky_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + + +void haplucky_state::machine_start() +{ + save_item(NAME(m_sound_data)); + save_item(NAME(m_sound_status)); +} + +void haplucky_state::main_map(address_map &map) // TODO: verify everything +{ + map(0x0000, 0x7fff).rom().region("maincpu", 0); // TODO: There's only a 0x4000 ROM, but calls past it. Missing ROM board? + map(0xe000, 0xe7ff).ram(); + map(0xf800, 0xffff).ram(); +} + +void haplucky_state::sound_map(address_map &map) // TODO: verify everything, but program is almost identical to the Super Dead Heat sub CPU one +{ + map(0x0000, 0xdfff).rom().region("audiocpu", 0); + map(0x8000, 0x8000).w("dac", FUNC(dac_byte_interface::write)); + map(0xf800, 0xffff).ram(); +} + +void haplucky_state::sound_io_map(address_map &map) // TODO: verify everything, but program is almost identical to the Super Dead Heat sub CPU one +{ + map.global_mask(0xff); + map(0xff, 0xff).lr8(NAME([this] () -> uint8_t { return m_sound_data; })).lw8(NAME([this] (uint8_t data) { m_sound_status = 0; })); +} + +static INPUT_PORTS_START( haplucky ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW1") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8") +INPUT_PORTS_END + + +void haplucky_state::haplucky(machine_config &config) +{ + // basic machine hardware + Z80(config, m_maincpu, 8_MHz_XTAL / 2); // divider not verified + m_maincpu->set_addrmap(AS_PROGRAM, &haplucky_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(haplucky_state::irq0_line_hold)); + + z80_device &audiocpu(Z80(config, "audiocpu", 8_MHz_XTAL / 2)); // divider not verified + audiocpu.set_addrmap(AS_PROGRAM, &haplucky_state::sound_map); + audiocpu.set_addrmap(AS_IO, &haplucky_state::sound_io_map); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: everything to be verified + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(32*8, 32*8); + screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); + screen.set_screen_update(FUNC(haplucky_state::screen_update)); + screen.set_palette("palette"); + + PALETTE(config, "palette").set_entries(0x800); // TODO: entries to be verified + + // sound hardware + SPEAKER(config, "mono").front_center(); + + ym2149_device &ymsnd(YM2149(config, "ymsnd", 8_MHz_XTAL / 8)); // divider not verified + ymsnd.port_a_read_callback().set([this] () { logerror("%s: PA read\n", machine().describe_context()); return u8(0xff); }); + ymsnd.port_a_write_callback().set([this] (u8 data) { logerror("%s: PA write %02X\n", machine().describe_context(), data); }); + ymsnd.port_b_read_callback().set([this] () { logerror("%s: PB read\n", machine().describe_context()); return u8(0xff); }); + ymsnd.port_b_write_callback().set([this] (u8 data) { logerror("%s: PB write %02X\n", machine().describe_context(), data); }); + ymsnd.add_route(ALL_OUTPUTS, "mono", 0.5); // divider not verified + + DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.5); // DAC type not verified +} + + +ROM_START( haplucky ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "a58-01-1.ic24", 0x0000, 0x4000, CRC(6bddc224) SHA1(fb3783b4b97c1f9b454e5b8301897d8cfcc0b7b7) ) // MBM27128-25 on CPU board + ROM_FILL( 0x400f, 0x01, 0xc9 ) // code jumps here early, return for now + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "a58-02.ic5", 0x0000, 0x8000, CRC(cfffcffb) SHA1(4808930f6b8cc105d39ffef1525defbc25bd43f4) ) // MBM27256-25 on CPU board + ROM_LOAD( "a58-03.ic6", 0x8000, 0x8000, CRC(470887e4) SHA1(69d9f907816c8c1b39b7c432b4196d04fcd7e365) ) // MBM27256-25 on CPU board + + ROM_REGION( 0x400, "plds", 0 ) + ROM_LOAD( "a40-09.ic26", 0x000, 0x104, CRC(733d1242) SHA1(3f99940f0c49023cbbd308eacfb5b102a52a68d2) ) // PAL16L8ACN, on video board + ROM_LOAD( "a58-04.ic13", 0x200, 0x104, CRC(cbbe4e50) SHA1(a7b8e23f7d34b0f4b462cffc47a0c0a3d5611d31) ) // PAL16L8ACN, on CPU board +ROM_END + +} // anonymous namespace + + +GAME( 1985, haplucky, 0, haplucky, haplucky, haplucky_state, empty_init, ROT0, "Taito Corporation", "Happy Lucky!", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/taito/invqix.cpp mame-0.264+dfsg.1/src/mame/taito/invqix.cpp --- mame-0.263+dfsg.1/src/mame/taito/invqix.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/invqix.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -147,14 +147,14 @@ private: uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint16_t port3_r(); - void port3_w(uint16_t data); - uint16_t port5_r(); - void port5_w(uint16_t data); - uint16_t port6_r(); - void port6_w(uint16_t data); - uint16_t porta_r(); - uint16_t portg_r(); + uint8_t port3_r(); + void port3_w(uint8_t data); + uint8_t port5_r(); + void port5_w(uint8_t data); + uint8_t port6_r(); + void port6_w(uint8_t data); + uint8_t porta_r(); + uint8_t portg_r(); void vctl_w(uint16_t data); @@ -228,42 +228,42 @@ return 0; } -uint16_t invqix_state::port3_r() +uint8_t invqix_state::port3_r() { return (m_eeprom->do_read() << 5) | 0x03; } -void invqix_state::port3_w(uint16_t data) +void invqix_state::port3_w(uint8_t data) { m_eeprom->cs_write((data >> 2) & 1); m_eeprom->di_write((data >> 4) & 1); m_eeprom->clk_write((data >> 3) & 1); } -uint16_t invqix_state::port5_r() +uint8_t invqix_state::port5_r() { return 0; } -void invqix_state::port5_w(uint16_t data) +void invqix_state::port5_w(uint8_t data) { } -uint16_t invqix_state::port6_r() +uint8_t invqix_state::port6_r() { return 0; } -void invqix_state::port6_w(uint16_t data) +void invqix_state::port6_w(uint8_t data) { } -uint16_t invqix_state::porta_r() +uint8_t invqix_state::porta_r() { return 0xf0; } -uint16_t invqix_state::portg_r() +uint8_t invqix_state::portg_r() { return 0; } diff -Nru mame-0.263+dfsg.1/src/mame/taito/ksayakyu.cpp mame-0.264+dfsg.1/src/mame/taito/ksayakyu.cpp --- mame-0.263+dfsg.1/src/mame/taito/ksayakyu.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/ksayakyu.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -142,8 +142,6 @@ }; -// video - void ksayakyu_state::videoram_w(offs_t offset, uint8_t data) { m_videoram[offset]=data; @@ -273,8 +271,6 @@ return 0; } -// machine - void ksayakyu_state::bank_select_w(uint8_t data) { /* diff -Nru mame-0.263+dfsg.1/src/mame/taito/msisaac.cpp mame-0.264+dfsg.1/src/mame/taito/msisaac.cpp --- mame-0.263+dfsg.1/src/mame/taito/msisaac.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/msisaac.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -140,8 +140,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -355,8 +353,6 @@ } -// machine - TIMER_CALLBACK_MEMBER(msisaac_state::nmi_callback) { if (m_sound_nmi_enable) diff -Nru mame-0.263+dfsg.1/src/mame/taito/pitnrun.cpp mame-0.264+dfsg.1/src/mame/taito/pitnrun.cpp --- mame-0.263+dfsg.1/src/mame/taito/pitnrun.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/pitnrun.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -207,8 +207,6 @@ }; -// video - /*************************************************************************** - BG layer 32x128 , 8x8 tiles 4bpp , 2 palettes (2nd is black ) @@ -611,8 +609,6 @@ } -// machine - void pitnrun_state::machine_start() { save_item(NAME(m_nmi)); diff -Nru mame-0.263+dfsg.1/src/mame/taito/rbisland.cpp mame-0.264+dfsg.1/src/mame/taito/rbisland.cpp --- mame-0.263+dfsg.1/src/mame/taito/rbisland.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/rbisland.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -425,8 +425,6 @@ }; -// video - /***************************************************************************/ void rbisland_state::colpri_cb(uint32_t &sprite_colbank, uint32_t &pri_mask, uint16_t sprite_ctrl) @@ -523,8 +521,6 @@ } -// machine - /*************************************************************************** MEMORY STRUCTURES ***************************************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/taito/retofinv.cpp mame-0.264+dfsg.1/src/mame/taito/retofinv.cpp --- mame-0.263+dfsg.1/src/mame/taito/retofinv.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/retofinv.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -221,8 +221,6 @@ }; -// video - void retofinv_state::palette(palette_device &palette) const { uint8_t const *const palette_prom = memregion("palette")->base(); @@ -460,8 +458,6 @@ } -// machine - void retofinv_state::machine_start() { save_item(NAME(m_main_irq_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/taito/rollrace.cpp mame-0.264+dfsg.1/src/mame/taito/rollrace.cpp --- mame-0.263+dfsg.1/src/mame/taito/rollrace.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/rollrace.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,8 +116,6 @@ }; -// video - TILE_GET_INFO_MEMBER(rollrace_state::get_fg_tile_info) { int const code = m_videoram[tile_index]; @@ -317,8 +315,6 @@ } -// machine - void rollrace_state::machine_start() { save_item(NAME(m_bkgpage)); diff -Nru mame-0.263+dfsg.1/src/mame/taito/ssrj.cpp mame-0.264+dfsg.1/src/mame/taito/ssrj.cpp --- mame-0.263+dfsg.1/src/mame/taito/ssrj.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/ssrj.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -93,8 +93,6 @@ }; -// video - template void ssrj_state::vram_w(offs_t offset, uint8_t data) @@ -338,8 +336,6 @@ } -// machine - void ssrj_state::machine_start() { save_item(NAME(m_oldport)); diff -Nru mame-0.263+dfsg.1/src/mame/taito/taito_h.cpp mame-0.264+dfsg.1/src/mame/taito/taito_h.cpp --- mame-0.263+dfsg.1/src/mame/taito/taito_h.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/taito_h.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -29,8 +29,8 @@ Chips : TC0070RGB (RGB/Video Mixer) TC0220IOC (Input) TC0140SYT (Sound communication) - TC0130LNB (???) - TC0160ROM (???) + TC0130LNB (Graphics Data and palette addressing related) + TC0160ROM (Graphics ROM addressing related) TC0080VCO (Tilemap & Motion Object Gen) name irq resolution tx-layer tc0220ioc @@ -52,6 +52,11 @@ - Sprite zoom is a bit wrong. - Title screen of dynamite league is wrong a bit, which is mentioned by Yasuhiro Ogawa. + - Flip screen doesn't work on background layers: + * 'syvalion': title screen doesn't show up. Also BG tiles are not shown in their proper locations during gameplay + * 'dleague' : title screen doesn't show up. Playfield is not completely shown during gameplay + * 'recordbr': Taito logo doesn't show up during attract mode. Backgrounds don't show up during gameplay + * 'tetristh': title screen doesn't show up. Backgrounds don't show up during gameplay Stephh's notes (based on the game M68000 code and some tests) : @@ -67,8 +72,13 @@ * 0x0002 (World) uses TAITO_COINAGE_WORLD - Notice screen only if region = 0x0000 - Text is always in Japanese regardless of the region ! - - DSW bit 6 has an unknown effect because of a write to unmapped 0x430000.w - (see code at 0x002af8). Another write to this address is done at 0x002a96. + - DSW bit 6 is used to configure TC0160ROM addressing mode to use 1MB JEDEC ROM pinout or 1MB Non-JEDEC 28-pin Mask ROM pinout. + Main difference between pinouts is the A16 address line and /OE input line are "swapped". + Enabling or disabling this switch causes different writes to 0x430000.w address, so looks like it's mapped + to a control register on TC0160ROM, which is involved in GFX ROM addressing. + It writes a 0x2eea value on that address at initializing HW time, only when it's ON (see code at 0x002af8). + Another write to this address is done at 0x002a96 with a 0x27ea value (default value?), always at boot up. + It's set to "always ON" at the operator manual, because all known PCBs use the 28-pin Mask ROM for GFX data. 2) 'recordbr' and 'gogold' @@ -216,6 +226,7 @@ map(0x300001, 0x300001).w("tc0140syt", FUNC(tc0140syt_device::master_port_w)); map(0x300003, 0x300003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w)); map(0x400000, 0x420fff).rw(m_tc0080vco, FUNC(tc0080vco_device::word_r), FUNC(tc0080vco_device::word_w)); + map(0x430000, 0x430001).nopr(); // ?? writes a byte at start up. TC0160ROM addressing mode? map(0x500800, 0x500fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } @@ -228,6 +239,7 @@ map(0x300001, 0x300001).w("tc0140syt", FUNC(tc0140syt_device::master_port_w)); map(0x300003, 0x300003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w)); map(0x400000, 0x420fff).rw(m_tc0080vco, FUNC(tc0080vco_device::word_r), FUNC(tc0080vco_device::word_w)); + map(0x430000, 0x430001).nopr(); // ?? writes a byte at start up. TC0160ROM addressing mode? map(0x500800, 0x500fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } @@ -240,6 +252,7 @@ map(0x200003, 0x200003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w)); map(0x300000, 0x300003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::read), FUNC(tc0040ioc_device::write)).umask16(0x00ff); map(0x400000, 0x420fff).rw(m_tc0080vco, FUNC(tc0080vco_device::word_r), FUNC(tc0080vco_device::word_w)); + map(0x430000, 0x430001).nopr(); // ?? writes a byte at start up. TC0160ROM addressing mode? map(0x500800, 0x500fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } @@ -253,6 +266,7 @@ map(0x300003, 0x300003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w)); map(0x400000, 0x420fff).rw(m_tc0080vco, FUNC(tc0080vco_device::word_r), FUNC(tc0080vco_device::word_w)); map(0x500800, 0x500fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0x430000, 0x430001).nopr(); // ?? writes a byte at start up. TC0160ROM addressing mode? map(0x600000, 0x600001).nopw(); // ?? writes zero once per frame } @@ -288,19 +302,19 @@ /* 0x200000 (port 1) -> 0x102843.b (-$57bd,A5) */ PORT_START("DSWB") TAITO_DIFFICULTY_LOC(SW2) - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x08, "1000k" ) PORT_DIPSETTING( 0x0c, "1500k" ) PORT_DIPSETTING( 0x04, "2000k" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x10, "5" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") /* code at 0x002af8 - see notes */ - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "Graphics ROM Addressing Mode" ) PORT_DIPLOCATION("SW2:7") /* Has no effect in emulation, see notes */ + PORT_DIPSETTING( 0x40, "JEDEC" ) /* Pin 2 = A16, Pin 24 = /OE */ + PORT_DIPSETTING( 0x00, "Non-JEDEC" ) /* Pin 2 = /OE, Pin 24 = A16 */ PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) /* Listed as "Unused" */ PORT_START("IN0") @@ -349,19 +363,19 @@ /* 0x200000 (port 1) -> 0x102843.b (-$57bd,A5) */ PORT_START("DSWB") TAITO_DIFFICULTY_LOC(SW2) - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x08, "1000k" ) PORT_DIPSETTING( 0x0c, "1500k" ) PORT_DIPSETTING( 0x04, "2000k" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x10, "5" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") /* code at 0x002af8 - see notes */ - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "Graphics ROM Addressing Mode" ) PORT_DIPLOCATION("SW2:7") /* Has no effect in emulation, see notes */ + PORT_DIPSETTING( 0x40, "JEDEC" ) /* Pin 2 = A16, Pin 24 = /OE */ + PORT_DIPSETTING( 0x00, "Non-JEDEC" ) /* Pin 2 = /OE, Pin 24 = A16 */ PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW2:8" ) /* Listed as "Unused" */ PORT_START("IN0") @@ -1012,10 +1026,10 @@ // YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME FLAGS -GAME( 1988, syvalion, 0, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, syvalionp, syvalion, syvalion, syvalionp, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (World, prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, syvalionu, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito America Corporation", "Syvalion (US, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, syvalionw, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation Japan", "Syvalion (World, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, syvalion, 0, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) +GAME( 1988, syvalionp, syvalion, syvalion, syvalionp, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (World, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) +GAME( 1988, syvalionu, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito America Corporation", "Syvalion (US, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) +GAME( 1988, syvalionw, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation Japan", "Syvalion (World, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) GAME( 1988, recordbr, 0, recordbr, recordbr, taitoh_state, empty_init, ROT0, "Taito Corporation Japan", "Recordbreaker (World)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, gogold, recordbr, recordbr, gogold, taitoh_state, empty_init, ROT0, "Taito Corporation", "Go For The Gold (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, tetristh, tetris, tetristh, tetristh, taitoh_state, empty_init, ROT0, "Sega", "Tetris (Japan, Taito H-System)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/taito/taitottl.cpp mame-0.264+dfsg.1/src/mame/taito/taitottl.cpp --- mame-0.263+dfsg.1/src/mame/taito/taitottl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/taitottl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -441,12 +441,12 @@ } // anonymous namespace -GAME( 1977, fisco400, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Cisco/Fisco 400 [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, gunman, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Gunman [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, missilex, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Missile-X [TTL]", MACHINE_IS_SKELETON ) -GAME( 1977, ttblock, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "T.T Block [TTL]", MACHINE_IS_SKELETON ) -GAME( 1978, ttsracec, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "T.T. Speed Race CL [TTL]", MACHINE_IS_SKELETON ) -GAME( 1979, zzblock, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Zun Zun Block [TTL]", MACHINE_IS_SKELETON ) +GAME( 1977, fisco400, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Cisco/Fisco 400", MACHINE_IS_SKELETON ) +GAME( 1977, gunman, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Gunman", MACHINE_IS_SKELETON ) +GAME( 1977, missilex, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Missile-X", MACHINE_IS_SKELETON ) +GAME( 1977, ttblock, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "T.T Block", MACHINE_IS_SKELETON ) +GAME( 1978, ttsracec, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "T.T. Speed Race CL", MACHINE_IS_SKELETON ) +GAME( 1979, zzblock, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Taito", "Zun Zun Block", MACHINE_IS_SKELETON ) // Not from Taito -GAME( 1978, srdchamp, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Model Racing", "Super Road Champions [TTL]", MACHINE_IS_SKELETON ) +GAME( 1978, srdchamp, 0, taitottl, 0, taitottl_state, empty_init, ROT0, "Model Racing", "Super Road Champions", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/taito/topspeed.cpp mame-0.264+dfsg.1/src/mame/taito/topspeed.cpp --- mame-0.263+dfsg.1/src/mame/taito/topspeed.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/topspeed.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -274,8 +274,6 @@ }; -// video - /**************************************************************************** NOTES @@ -555,8 +553,6 @@ } -// machine - /********************************************************** CPU CONTROL **********************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/taito/warriorb.cpp mame-0.264+dfsg.1/src/mame/taito/warriorb.cpp --- mame-0.263+dfsg.1/src/mame/taito/warriorb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/taito/warriorb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -235,8 +235,6 @@ }; -// video - /************************************************************ SPRITE DRAW ROUTINE ************************************************************/ @@ -338,8 +336,6 @@ return 0; } -// machine - void warriorb_state::coin_control_w(u8 data) { machine().bookkeeping().coin_lockout_w(0, ~data & 0x01); diff -Nru mame-0.263+dfsg.1/src/mame/tch/speedspn.cpp mame-0.264+dfsg.1/src/mame/tch/speedspn.cpp --- mame-0.263+dfsg.1/src/mame/tch/speedspn.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tch/speedspn.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -135,8 +135,6 @@ void sound_map(address_map &map); }; -// video - TILE_GET_INFO_MEMBER(speedspn_state::get_tile_info) { int const code = m_tileram[tile_index * 2 + 1] | (m_tileram[tile_index * 2] << 8); @@ -227,8 +225,6 @@ } -// machine - uint8_t speedspn_state::irq_ack_r() { // I think this simply acknowledges the IRQ #0, it's read within the handler and the diff -Nru mame-0.263+dfsg.1/src/mame/tecfri/holeland.cpp mame-0.264+dfsg.1/src/mame/tecfri/holeland.cpp --- mame-0.263+dfsg.1/src/mame/tecfri/holeland.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecfri/holeland.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,6 @@ void prg_map(address_map &map); }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -300,8 +298,6 @@ } -// machine - void base_state::coin_counter_w(int state) { machine().bookkeeping().coin_counter_w(0, state); diff -Nru mame-0.263+dfsg.1/src/mame/tecfri/sauro.cpp mame-0.264+dfsg.1/src/mame/tecfri/sauro.cpp --- mame-0.263+dfsg.1/src/mame/tecfri/sauro.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecfri/sauro.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -245,8 +245,6 @@ }; -// video - // General void base_state::bg_videoram_w(offs_t offset, uint8_t data) @@ -465,8 +463,6 @@ } -// machine - void base_state::machine_start() { save_item(NAME(m_irq_enable)); diff -Nru mame-0.263+dfsg.1/src/mame/tecfri/speedbal.cpp mame-0.264+dfsg.1/src/mame/tecfri/speedbal.cpp --- mame-0.263+dfsg.1/src/mame/tecfri/speedbal.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecfri/speedbal.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -114,8 +114,6 @@ }; -// video - TILE_GET_INFO_MEMBER(speedbal_state::get_tile_info_bg) { int const code = m_background_videoram[tile_index * 2] + ((m_background_videoram[tile_index * 2 + 1] & 0x30) << 4); @@ -235,8 +233,6 @@ } -// machine - void speedbal_state::machine_start() { m_digits.resolve(); diff -Nru mame-0.263+dfsg.1/src/mame/technos/battlane.cpp mame-0.264+dfsg.1/src/mame/technos/battlane.cpp --- mame-0.263+dfsg.1/src/mame/technos/battlane.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/battlane.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -80,8 +80,6 @@ }; -// video - void battlane_state::palette_w(offs_t offset, uint8_t data) { int bit0, bit1, bit2; @@ -300,8 +298,6 @@ } -// machine - /************************************* * * Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/technos/blockout.cpp mame-0.264+dfsg.1/src/mame/technos/blockout.cpp --- mame-0.263+dfsg.1/src/mame/technos/blockout.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/blockout.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -135,8 +135,6 @@ }; -// video - rgb_t blockout_state::xBGR_444(u32 raw) { // red component @@ -231,8 +229,6 @@ } -// machine - void blockout_state::irq6_ack_w(uint16_t data) { m_maincpu->set_input_line(6, CLEAR_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/technos/bogeyman.cpp mame-0.264+dfsg.1/src/mame/technos/bogeyman.cpp --- mame-0.263+dfsg.1/src/mame/technos/bogeyman.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/bogeyman.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -88,8 +88,6 @@ }; -// video - void bogeyman_state::palette(palette_device &palette) const { uint8_t const *color_prom = memregion("proms")->base(); @@ -216,8 +214,6 @@ } -// machine - // Read/Write Handlers // Sound section is copied from Mysterious Stones driver by Nicola, Mike, Brad diff -Nru mame-0.263+dfsg.1/src/mame/technos/dogfgt.cpp mame-0.264+dfsg.1/src/mame/technos/dogfgt.cpp --- mame-0.263+dfsg.1/src/mame/technos/dogfgt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/dogfgt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -322,8 +320,6 @@ } -// machine - void dogfgt_state::subirqtrigger_w(uint8_t data) { // bit 0 used but unknown diff -Nru mame-0.263+dfsg.1/src/mame/technos/matmania.cpp mame-0.264+dfsg.1/src/mame/technos/matmania.cpp --- mame-0.263+dfsg.1/src/mame/technos/matmania.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/matmania.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -119,8 +119,6 @@ void sound_map(address_map &map); }; -// video - /*************************************************************************** There are only a few differences between the video hardware of Mysterious @@ -377,8 +375,6 @@ } -// machine - /************************************* * * Misc Memory handlers diff -Nru mame-0.263+dfsg.1/src/mame/technos/mystston.cpp mame-0.264+dfsg.1/src/mame/technos/mystston.cpp --- mame-0.263+dfsg.1/src/mame/technos/mystston.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/mystston.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - /*************************************************************************** There are only a few differences between the video hardware of Mysterious @@ -367,8 +365,6 @@ GFXDECODE_END -// machine - /************************************* * * Interrupt system diff -Nru mame-0.263+dfsg.1/src/mame/technos/spdodgeb.cpp mame-0.264+dfsg.1/src/mame/technos/spdodgeb.cpp --- mame-0.263+dfsg.1/src/mame/technos/spdodgeb.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/spdodgeb.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -122,8 +122,6 @@ }; -// video - void spdodgeb_state::palette(palette_device &palette) const { @@ -327,8 +325,6 @@ return 0; } -// machine - void spdodgeb_state::adpcm_w(offs_t offset, uint8_t data) { int chip = offset & 1; diff -Nru mame-0.263+dfsg.1/src/mame/technos/ssozumo.cpp mame-0.264+dfsg.1/src/mame/technos/ssozumo.cpp --- mame-0.263+dfsg.1/src/mame/technos/ssozumo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/ssozumo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -86,8 +86,6 @@ }; -// video - /**************************************************************************/ void ssozumo_state::palette(palette_device &palette) const @@ -246,8 +244,6 @@ } -// machine - void ssozumo_state::machine_start() { save_item(NAME(m_sound_nmi_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/technos/tagteam.cpp mame-0.264+dfsg.1/src/mame/technos/tagteam.cpp --- mame-0.263+dfsg.1/src/mame/technos/tagteam.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/tagteam.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - // TODO: fix or confirm resnet implementation // schematics say emitter circuit with 47 ohm pullup and 470 ohm pulldown but this results in a bad palette static const res_net_info tagteam_net_info = @@ -277,8 +275,6 @@ } -// machine - void tagteam_state::machine_start() { save_item(NAME(m_sound_nmi_mask)); diff -Nru mame-0.263+dfsg.1/src/mame/technos/vball.cpp mame-0.264+dfsg.1/src/mame/technos/vball.cpp --- mame-0.263+dfsg.1/src/mame/technos/vball.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/technos/vball.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -175,8 +175,6 @@ }; -// video - /*************************************************************************** Video Hardware for Championship V'ball by Paul Hampson @@ -321,8 +319,6 @@ } -// machine - // Based on ddragon driver inline int vball_state::scanline_to_vcount(int scanline) { diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/lvcards.cpp mame-0.264+dfsg.1/src/mame/tecmo/lvcards.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/lvcards.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/lvcards.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -160,8 +160,6 @@ }; -// video - void lvcards_state::palette(palette_device &palette) const //Ever so slightly different, but different enough. { const uint8_t *color_prom = memregion("proms")->base(); @@ -232,8 +230,6 @@ } -// machine - void lvpoker_state::machine_start() { lvcards_state::machine_start(); @@ -840,5 +836,5 @@ GAME( 1985, lvcards, 0, lvcards, lvcards, lvcards_state, empty_init, ROT0, "Tehkan", "Lovely Cards", MACHINE_SUPPORTS_SAVE ) GAME( 1985, lvcardsa, lvcards, lvcardsa, lvcards, lvcards_state, init_lvcardsa, ROT0, "Tehkan", "Lovely Cards (encrypted)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, lvpoker, lvcards, lvpoker, lvpoker, lvpoker_state, empty_init, ROT0, "Tehkan", "Lovely Poker [BET]", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, lvpoker, lvcards, lvpoker, lvpoker, lvpoker_state, empty_init, ROT0, "Tehkan", "Lovely Poker", MACHINE_SUPPORTS_SAVE ) GAME( 1985, ponttehk, 0, ponttehk, ponttehk, lvpoker_state, empty_init, ROT0, "Tehkan", "Pontoon (Tehkan)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/pbaction.cpp mame-0.264+dfsg.1/src/mame/tecmo/pbaction.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/pbaction.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/pbaction.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -236,8 +236,6 @@ }; -// video - template void pbaction_state::videoram_w(offs_t offset, uint8_t data) { @@ -347,8 +345,6 @@ } -// machine - void pbaction_state::sh_command_w(uint8_t data) { m_soundlatch->write(data); diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/solomon.cpp mame-0.264+dfsg.1/src/mame/tecmo/solomon.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/solomon.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/solomon.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -77,8 +77,6 @@ }; -// video - template void solomon_state::videoram_w(offs_t offset, uint8_t data) { @@ -168,8 +166,6 @@ } -// machine - void solomon_state::sh_command_w(uint8_t data) { m_soundlatch->write(data); diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/spbactn.cpp mame-0.264+dfsg.1/src/mame/tecmo/spbactn.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/spbactn.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/spbactn.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -271,8 +271,6 @@ }; -// video - void spbactn_state::bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_bgvideoram[offset]); @@ -406,8 +404,6 @@ return 0; } -// machine - void spbactn_state::main_irq_ack_w(uint16_t data) { m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE); diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/tbowl.cpp mame-0.264+dfsg.1/src/mame/tecmo/tbowl.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/tbowl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/tbowl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -111,8 +111,6 @@ }; -// video - // Foreground Layer (tx) Tilemap TILE_GET_INFO_MEMBER(tbowl_state::get_tx_tile_info) @@ -227,8 +225,6 @@ } -// machine - void tbowl_state::coincounter_w(uint8_t data) { machine().bookkeeping().coin_counter_w(0, data & 1); diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/tecmo.cpp mame-0.264+dfsg.1/src/mame/tecmo/tecmo.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/tecmo.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/tecmo.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -524,9 +524,9 @@ PORT_DIPSETTING( 0x02, "200000 500000" ) PORT_DIPSETTING( 0x03, "100000" ) PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:!5,!6") - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Harder ) ) PORT_DIPSETTING( 0x30, DEF_STR( Hardest ) ) PORT_DIPNAME( 0x40, 0x00, "2P Can Start Anytime" ) PORT_DIPLOCATION("SW2:!7") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) @@ -590,9 +590,9 @@ PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x02, "5" ) PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:!3,!4") - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Harder ) ) PORT_DIPSETTING( 0x0c, DEF_STR( Hardest ) ) PORT_DIPNAME( 0x70, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!5,!6,!7") PORT_DIPSETTING( 0x00, "50000 200000" ) diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/tecmo16.cpp mame-0.264+dfsg.1/src/mame/tecmo/tecmo16.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/tecmo16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/tecmo16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -135,8 +135,6 @@ }; -// video - // Based on sprite drivers from tehkan/wc90.cpp by Ernesto Corvi (ernesto@imagina.com) @@ -344,8 +342,6 @@ } -// machine - /******************************************************************************/ diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/wc90.cpp mame-0.264+dfsg.1/src/mame/tecmo/wc90.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/wc90.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/wc90.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -146,8 +146,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -303,8 +301,6 @@ } -// machine - void wc90_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data >> 3); diff -Nru mame-0.263+dfsg.1/src/mame/tecmo/wc90b.cpp mame-0.264+dfsg.1/src/mame/tecmo/wc90b.cpp --- mame-0.263+dfsg.1/src/mame/tecmo/wc90b.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tecmo/wc90b.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -205,8 +205,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -414,8 +412,6 @@ } -// machine - void wc90b_state::bankswitch_w(uint8_t data) { m_mainbank->set_entry(data >> 3); diff -Nru mame-0.263+dfsg.1/src/mame/tektronix/tek440x.cpp mame-0.264+dfsg.1/src/mame/tektronix/tek440x.cpp --- mame-0.263+dfsg.1/src/mame/tektronix/tek440x.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tektronix/tek440x.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -42,22 +42,29 @@ ***************************************************************************/ #include "emu.h" + +#include "tek410x_kbd.h" +#include "tek_msu_fdc.h" + +#include "bus/nscsi/hd.h" #include "bus/rs232/rs232.h" #include "cpu/m68000/m68010.h" -#include "cpu/m68000/m68020.h" -#include "cpu/m6502/m6502.h" #include "machine/am9513.h" #include "machine/bankdev.h" -#include "machine/mos6551.h" // debug tty +#include "machine/input_merger.h" #include "machine/mc146818.h" #include "machine/mc68681.h" +#include "machine/mos6551.h" // debug tty #include "machine/ncr5385.h" -#include "tek410x_kbd.h" +#include "machine/ns32081.h" +#include "machine/nscsi_bus.h" #include "sound/sn76496.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" +#include "logmacro.h" namespace { @@ -67,11 +74,13 @@ tek440x_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_fdccpu(*this, "fdccpu"), m_vm(*this, "vm"), m_duart(*this, "duart"), m_keyboard(*this, "keyboard"), m_snsnd(*this, "snsnd"), + m_rtc(*this, "rtc"), + m_scsi(*this, "scsi:7:ncr5385"), + m_vint(*this, "vint"), m_prom(*this, "maincpu"), m_mainram(*this, "mainram"), m_vram(*this, "vram"), @@ -107,14 +116,16 @@ void logical_map(address_map &map); void physical_map(address_map &map); - void fdccpu_map(address_map &map); required_device m_maincpu; - required_device m_fdccpu; required_device m_vm; required_device m_duart; required_device m_keyboard; required_device m_snsnd; + required_device m_rtc; + required_device m_scsi; + required_device m_vint; + required_region_ptr m_prom; required_shared_ptr m_mainram; required_shared_ptr m_vram; @@ -159,6 +170,7 @@ diag_w(0); m_keyboard->kdo_w(1); mapcntl_w(0); + m_vint->in_w<1>(0); } @@ -311,29 +323,48 @@ { map(0x000000, 0x1fffff).ram().share("mainram"); map(0x600000, 0x61ffff).ram().share("vram"); + + // 700000-71ffff spare 0 + // 720000-73ffff spare 1 map(0x740000, 0x747fff).rom().mirror(0x8000).region("maincpu", 0); map(0x760000, 0x760fff).ram().mirror(0xf000); // debug RAM + + // 780000-79ffff processor board I/O map(0x780000, 0x780000).rw(FUNC(tek440x_state::mapcntl_r), FUNC(tek440x_state::mapcntl_w)); // 782000-783fff: video address registers // 784000-785fff: video control registers + map(0x784000, 0x784000).lw8( + [this](u8 data) + { + m_vint->in_w<0>(BIT(data, 6)); + }, "vcbpr_w"); + // 786000-787fff: spare map(0x788000, 0x788000).w(FUNC(tek440x_state::sound_w)); // 78a000-78bfff: NS32081 FPU map(0x78c000, 0x78c007).rw("aica", FUNC(mos6551_device::read), FUNC(mos6551_device::write)).umask16(0xff00); + // 78e000-78ffff: spare + + // 7a0000-7bffff peripheral board I/O + // 7a0000-7affff: reserved map(0x7b0000, 0x7b0000).w(FUNC(tek440x_state::diag_w)); - // 7b1000-7b2fff: diagnostic registers + // 7b1000-7b1fff: diagnostic registers // 7b2000-7b3fff: Centronics printer data map(0x7b4000, 0x7b401f).rw(m_duart, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0xff00); // 7b6000-7b7fff: Mouse map(0x7b8000, 0x7b8003).mirror(0x100).rw("timer", FUNC(am9513_device::read16), FUNC(am9513_device::write16)); // 7ba000-7bbfff: MC146818 RTC - // 7bc000-7bdfff: SCSI bus address registers - map(0x7be000, 0x7be01f).mirror(0x1fe0).rw("scsic", FUNC(ncr5385_device::read), FUNC(ncr5385_device::write)).umask16(0xff00).cswidth(16); -} + map(0x7bc000, 0x7bc000).lw8( + [this](u8 data) + { + m_scsi->set_own_id(data & 7); -void tek440x_state::fdccpu_map(address_map &map) -{ - map(0x0000, 0x1000).ram(); - map(0xf000, 0xffff).rom().region("fdccpu", 0); + // TODO: bit 7 -> SCSI bus reset + LOG("scsi bus reset %d\n", BIT(data, 7)); + }, "scsi_addr"); // 7bc000-7bdfff: SCSI bus address registers + map(0x7be000, 0x7be01f).m(m_scsi, FUNC(ncr5385_device::map)).umask16(0xff00); //.mirror(0x1fe0) .cswidth(16); + + // 7c0000-7fffff EPROM application space + map(0x7c0000, 0x7fffff).nopr(); } /************************************* @@ -351,6 +382,21 @@ * *************************************/ +static void scsi_devices(device_slot_interface &device) +{ + device.option_add("harddisk", NSCSI_HARDDISK); + device.option_add("tek_msu_fdc", TEK_MSU_FDC); +} + +// interrupts +// 7 debug +// 6 vsync +// 5 uart +// 4 spare +// 3 scsi +// 2 dma (network?) +// 1 timer/printer + void tek440x_state::tek4404(machine_config &config) { /* basic machine hardware */ @@ -363,8 +409,8 @@ m_vm->set_addr_width(23); m_vm->set_endianness(ENDIANNESS_BIG); - M6502(config, m_fdccpu, 16_MHz_XTAL / 8); - m_fdccpu->set_addrmap(AS_PROGRAM, &tek440x_state::fdccpu_map); + INPUT_MERGER_ALL_HIGH(config, m_vint); + m_vint->output_handler().set_inputline(m_maincpu, M68K_IRQ_6); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -372,6 +418,7 @@ screen.set_raw(25.2_MHz_XTAL, 800, 0, 640, 525, 0, 480); // 31.5 kHz horizontal (guessed), 60 Hz vertical screen.set_screen_update(FUNC(tek440x_state::screen_update)); screen.set_palette("palette"); + screen.screen_vblank().set(m_vint, FUNC(input_merger_all_high_device::in_w<1>)); PALETTE(config, "palette", palette_device::MONOCHROME); mos6551_device &aica(MOS6551(config, "aica", 40_MHz_XTAL / 4 / 10)); @@ -379,7 +426,7 @@ aica.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); aica.irq_handler().set_inputline(m_maincpu, M68K_IRQ_7); - MC68681(config, m_duart, 3.6864_MHz_XTAL); + MC68681(config, m_duart, 14.7456_MHz_XTAL / 4); m_duart->irq_cb().set_inputline(m_maincpu, M68K_IRQ_5); // auto-vectored m_duart->outport_cb().set(FUNC(tek440x_state::kb_rclamp_w)).bit(4); m_duart->outport_cb().append(m_keyboard, FUNC(tek410x_keyboard_device::reset_w)).bit(3); @@ -391,9 +438,25 @@ AM9513(config, "timer", 40_MHz_XTAL / 4 / 10); // from CPU E output - //MC146818(config, "calendar", 32.768_MHz_XTAL); + MC146818(config, m_rtc, 32.768_MHz_XTAL); - NCR5385(config, "scsic", 40_MHz_XTAL / 4).irq().set_inputline(m_maincpu, M68K_IRQ_3); + NSCSI_BUS(config, "scsi"); + // hard disk is a Micropolis 1304 (https://www.micropolis.com/support/hard-drives/1304) + // with a Xebec 1401 SASI adapter inside the Mass Storage Unit + NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, "tek_msu_fdc"); + NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5385", NCR5385).clock(40_MHz_XTAL / 4).machine_config( + [this](device_t *device) + { + ncr5385_device &adapter = downcast(*device); + + adapter.irq().set_inputline(m_maincpu, M68K_IRQ_3); + }); rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); rs232.rxd_handler().set("aica", FUNC(mos6551_device::write_rxd)); @@ -419,9 +482,6 @@ ROM_LOAD16_BYTE( "tek_u158.bin", 0x000000, 0x004000, CRC(9939e660) SHA1(66b4309e93e4ff20c1295dc2ec2a8d6389b2578c) ) ROM_LOAD16_BYTE( "tek_u163.bin", 0x000001, 0x004000, CRC(a82dcbb1) SHA1(a7e4545e9ea57619faacc1556fa346b18f870084) ) - ROM_REGION( 0x1000, "fdccpu", 0 ) - ROM_LOAD( "tek_u130.bin", 0x000000, 0x001000, CRC(2c11a3f1) SHA1(b29b3705692d50f15f7e8bbba12a24c69817d52e) ) - ROM_REGION( 0x2000, "scsimfm", 0 ) ROM_LOAD( "scsi_mfm.bin", 0x000000, 0x002000, CRC(b4293435) SHA1(5e2b96c19c4f5c63a5afa2de504d29fe64a4c908) ) ROM_END diff -Nru mame-0.263+dfsg.1/src/mame/tektronix/tek_msu_fdc.cpp mame-0.264+dfsg.1/src/mame/tektronix/tek_msu_fdc.cpp --- mame-0.263+dfsg.1/src/mame/tektronix/tek_msu_fdc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tektronix/tek_msu_fdc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,231 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +/* + * Tektronix 4404 Mass Storage Unit + * + * The MSU contains a 5 1/4" floppy drive, a 40MB hard disk and controllers + * which implement the SASI protocol to communicate with the host system. This + * device emulates the floppy disk portion, which consists of a 6502 CPU, EPROM, + * RAM and a μPD765-compatible floppy drive controller chip. SASI signals are + * directly controlled by the CPU using discrete logic. + * + * Sources: + * - 4404 Artificial Intelligence System, Component-Level Service Manual, Part No. 070-5610-01, Product Group 07, June 1987, Tektronix + * + * TODO: + * - decode address 0x0806 + */ + +#include "emu.h" +#include "tek_msu_fdc.h" + +//#define VERBOSE (LOG_GENERAL) +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(TEK_MSU_FDC, tek_msu_fdc_device, "tek_msu_fdc", "Tektronix 4404 Mass Storage Unit Floppy Drive Controller") + +tek_msu_fdc_device::tek_msu_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nscsi_device(mconfig, TEK_MSU_FDC, tag, owner, clock) + , nscsi_slot_card_interface(mconfig, *this, DEVICE_SELF) + , m_cpu(*this, "cpu") + , m_fdc(*this, "fdc") + , m_fdd(*this, "fdc:0") +{ +} + +void tek_msu_fdc_device::device_start() +{ + nscsi_device::device_start(); + + save_item(NAME(m_minisel)); + + m_motor = timer_alloc(FUNC(tek_msu_fdc_device::motor), this); +} + +void tek_msu_fdc_device::device_reset() +{ + nscsi_device::device_reset(); + + // monitor SCSI reset + scsi_bus->ctrl_wait(scsi_refid, S_RST, S_RST); + + m_minisel = true; +} + +void tek_msu_fdc_device::scsi_ctrl_changed() +{ + bool const reset = scsi_bus->ctrl_r() & S_RST; + + LOG("scsi reset %d\n", reset); + + if (reset) + { + // release the SCSI bus + scsi_bus->data_w(scsi_refid, 0); + scsi_bus->ctrl_w(scsi_refid, 0, S_REQ | S_BSY | S_MSG | S_CTL | S_INP); + + m_minisel = true; + } + + m_cpu->set_input_line(INPUT_LINE_RESET, reset); + m_fdc->reset_w(reset); +} + +void tek_msu_fdc_device::mem_map(address_map &map) +{ + map(0x0000, 0x07ff).ram(); + + map(0x0800, 0x0800).rw(FUNC(tek_msu_fdc_device::status_r), FUNC(tek_msu_fdc_device::control_w)); + map(0x0801, 0x0801).rw(FUNC(tek_msu_fdc_device::data_r), FUNC(tek_msu_fdc_device::data_w)); + + map(0x0803, 0x0803).lw8([this](u8 data) { m_fdc->tc_w(1); m_fdc->tc_w(0); }, "tc_w"); + map(0x0804, 0x0805).rw(FUNC(tek_msu_fdc_device::fdc_r), FUNC(tek_msu_fdc_device::fdc_w)); + + // TODO: how does this decode? + map(0x0806, 0x0806).nopw(); + + map(0xf000, 0xffff).rom().region("cpu", 0); +} + +static void fdd_devices(device_slot_interface &device) +{ + device.option_add("525dd", FLOPPY_525_DD); +} + +void tek_msu_fdc_device::device_add_mconfig(machine_config &config) +{ + M6502(config, m_cpu, 16_MHz_XTAL / 4); + m_cpu->set_addrmap(AS_PROGRAM, &tek_msu_fdc_device::mem_map); + + I8272A(config, m_fdc, 16_MHz_XTAL / 4, false); + m_fdc->intrq_wr_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); + // drive selection (US) outputs are decoded, inverted and fed back to the + // RDY input via a jumper block; units 0 and 1 are connected by default, + // even though the unit has only a single 5 1/4" drive fitted + m_fdc->us_wr_callback().set([this](u8 data) { m_fdc->ready_w(data > 1); }); + + FLOPPY_CONNECTOR(config, m_fdd, fdd_devices, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true); +} + +ROM_START(tek_msu_fdc) + ROM_REGION(0x1000, "cpu", 0) + // Tektronix 1985 + // 160-2149-02 + // U-130 V1.2 + ROM_LOAD("160_2149_02__u_130_v1.2.u130", 0x000000, 0x001000, CRC(2c11a3f1) SHA1(b29b3705692d50f15f7e8bbba12a24c69817d52e)) +ROM_END + +const tiny_rom_entry *tek_msu_fdc_device::device_rom_region() const +{ + return ROM_NAME(tek_msu_fdc); +} + +u8 tek_msu_fdc_device::status_r() +{ + u32 const ctrl = scsi_bus->ctrl_r(); + + // bit function + // 7 SCSI ACK + // 6 SCSI ATN + // 5 SCSI SEL + // 4 SCSI BSY + // 3 MUTS (floppy spin-up delay?) + // 2 ID2 + // 1 ID1 + // 0 ID0 + + u8 const data = + ((ctrl & S_ACK) ? 0x80 : 0) | + ((ctrl & S_ATN) ? 0x40 : 0) | + ((ctrl & S_SEL) ? 0x20 : 0) | + ((ctrl & S_BSY) ? 0x10 : 0) | + (m_motor->elapsed() > attotime::from_msec(500) ? 0x08 : 0) | + scsi_id; + + return data; +} + +u8 tek_msu_fdc_device::data_r() +{ + return scsi_bus->data_r(); +} + +void tek_msu_fdc_device::control_w(u8 data) +{ + LOG("control_w 0x%02x (%s)\n", data, machine().describe_context()); + + u32 ctrl = 0; + + // bit function + // 7 SCSI REQ + // 6 SCSI I/O + // 5 SCSI C/D + // 4 SCSI MSG + // 3 SCSI BSY + // 2 ENABLE + // 1 N/C + // 0 MINISEL + + // bit 2 enables output + if (BIT(data, 2)) + ctrl = + (BIT(data, 7) ? S_REQ : 0) | + (BIT(data, 6) ? S_INP : 0) | + (BIT(data, 5) ? S_CTL : 0) | + (BIT(data, 4) ? S_MSG : 0) | + (BIT(data, 3) ? S_BSY : 0); + + scsi_bus->ctrl_w(scsi_refid, ctrl, S_REQ | S_BSY | S_MSG | S_CTL | S_INP); + + // bit 0 is motor enable (active low) + m_minisel = !BIT(data, 0); + + if (!m_minisel) + motor(m_minisel); +} + +void tek_msu_fdc_device::data_w(u8 data) +{ + scsi_bus->data_w(scsi_refid, data); +} + +u8 tek_msu_fdc_device::fdc_r(offs_t offset) +{ + if (!machine().side_effects_disabled()) + { + if (m_minisel) + motor(1); + + return offset ? m_fdc->fifo_r() : m_fdc->msr_r(); + } + else + return 0; +} + +void tek_msu_fdc_device::fdc_w(offs_t offset, u8 data) +{ + if (m_minisel) + motor(1); + + if (offset) + m_fdc->fifo_w(data); +} + +void tek_msu_fdc_device::motor(int param) +{ + floppy_image_device *fid = m_fdd->get_device(); + + if (fid && fid->mon_r() == param) + { + LOG("motor %s\n", param ? "on" : "off"); + + fid->mon_w(!param); + } + + // restart or reset motor off timer + if (param) + m_motor->adjust(attotime::from_msec(2000)); + else + m_motor->adjust(attotime::never); +} diff -Nru mame-0.263+dfsg.1/src/mame/tektronix/tek_msu_fdc.h mame-0.264+dfsg.1/src/mame/tektronix/tek_msu_fdc.h --- mame-0.263+dfsg.1/src/mame/tektronix/tek_msu_fdc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tektronix/tek_msu_fdc.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,52 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +#ifndef MAME_TEKTRONIX_TEK_MSU_FDC_H +#define MAME_TEKTRONIX_TEK_MSU_FDC_H + +#pragma once + +#include "cpu/m6502/m6502.h" +#include "imagedev/floppy.h" +#include "machine/nscsi_bus.h" +#include "machine/upd765.h" + +class tek_msu_fdc_device + : public nscsi_device + , public nscsi_slot_card_interface +{ +public: + tek_msu_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual void scsi_ctrl_changed() override; + +private: + void mem_map(address_map &map); + + u8 status_r(); + u8 data_r(); + void control_w(u8 data); + void data_w(u8 data); + + u8 fdc_r(offs_t offset); + void fdc_w(offs_t offset, u8 data); + void motor(int param); + + required_device m_cpu; + required_device m_fdc; + required_device m_fdd; + + emu_timer *m_motor; + + bool m_minisel; +}; + +DECLARE_DEVICE_TYPE(TEK_MSU_FDC, tek_msu_fdc_device) + +#endif // MAME_TEKTRONIX_TEK_MSU_FDC_H diff -Nru mame-0.263+dfsg.1/src/mame/tektronix/tekigw.cpp mame-0.264+dfsg.1/src/mame/tektronix/tekigw.cpp --- mame-0.263+dfsg.1/src/mame/tektronix/tekigw.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tektronix/tekigw.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -9,15 +9,44 @@ * - https://archive.org/details/tektronix_Tektronix_1985 * * TODO: - * - am9516 dma controller * - slots and cards * - gpib devices * - graphics and keyboard */ /* - * WIP + * tek4132 * - novram chip select not asserted when trying to read ethernet mac address? * - aborts to firmware monitor on second serial port after failing to boot + * - hangs during UTek boot + * +booting /vmunix + RSA - RS-232 ports + RSADMA - RS-232 DMA + SCSI - SCSI interface + lna0: Ethernet= 8:0:11:0:0:f7 Ip=[42.128.0.1] + LNA - Local Area Network + CEPWR - Soft Power switch + end configure + Tektronix - UTek STRATOSIIW2.3 #1.25 Thu Oct 23 16:56:50 PDT 1986 + + real mem = 1024k + firstaddr = 0x3fda8 + firstaddr = 0x78600 + avail mem = 531456 + using 51 buffers containing 104448 bytes of memory + inittodr: clock has gone backward, file system time used + file system time = 2eab0645 + clock = 5bb2d3 + */ +/* + * tek6130 + * "Invalid menu file. Dropping into shell.\n" - string at d789 + * accessed by printf at 7b82 + * message set at a6b0 + * +Booting from disk +Invalid menu file. Dropping into shell. +diags> */ #include "emu.h" @@ -27,12 +56,12 @@ #include "machine/ram.h" // various hardware -//#include "machine/am9516a.h" +#include "machine/am9516.h" #include "machine/am9517a.h" #include "machine/eepromser.h" #include "machine/i82586.h" #include "machine/mm58167.h" -//#include "machine/ncr5385.h" +#include "machine/ncr5385.h" #include "machine/ns32081.h" #include "machine/ns32082.h" #include "machine/ns32202.h" @@ -75,7 +104,7 @@ , m_serial(*this, "port%u", 0U) , m_rtc(*this, "rtc") , m_nov(*this, "nov%u", 0U) - //, m_dma(*this, "dma") + , m_dma(*this, "dma") , m_lan(*this, "lan") , m_led(*this, "led") { @@ -90,6 +119,7 @@ // address maps template void cpu_map(address_map &map); + void dma_map(address_map &map); // computer board control registers u8 nov_r() { return m_nmr; } @@ -114,7 +144,7 @@ required_device_array m_serial; required_device m_rtc; optional_device_array m_nov; - //required_device m_dma; + required_device m_dma; required_device m_lan; output_finder<> m_led; @@ -173,7 +203,7 @@ template T buf_r(); template void buf_w(T data); - u32 screen_update(screen_device& screen, bitmap_rgb32& bitmap, rectangle const& cliprect) { return 0; } + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) { return 0; } required_device m_gpib; required_device m_fdc; @@ -198,7 +228,7 @@ tek4132_state(machine_config const &mconfig, device_type type, char const *tag) : tekigw_state_base(mconfig, type, tag) , m_scsibus(*this, "scsi") - //, m_scsi(*this, "scsi:7:ncr5385") + , m_scsi(*this, "scsi:7:ncr5385") , m_sdma(*this, "sdma") , m_sirq(*this, "sirq") { @@ -218,7 +248,7 @@ private: required_device m_scsibus; - //required_device m_scsi; + required_device m_scsi; required_device m_sdma; required_device m_sirq; @@ -243,6 +273,10 @@ { nov_w(0); scr_w(0); + + m_icu->g_w<0>(1); // mmu present + m_icu->g_w<7>(1); // fpu present + m_icu->ir_w<12>(0); } void tek6100_state::machine_start() @@ -263,16 +297,6 @@ hcr_w(0); fcr_w(0); - - m_icu->ir_w<0>(1); // mmu present - m_icu->ir_w<3>(1); - m_icu->ir_w<4>(1); - m_icu->ir_w<5>(1); - m_icu->ir_w<6>(1); - m_icu->ir_w<7>(1); - m_icu->ir_w<8>(1); - m_icu->ir_w<9>(1); - m_icu->ir_w<14>(1); // fpu present } void tekigw_state_base::common_init() @@ -342,6 +366,8 @@ void tekigw_state_base::scr_w(u8 data) { + LOG("scr_w 0x%02x (%s)\n", data, machine().describe_context()); + if (!(m_scr & SCR_RAME) && (data & SCR_RAME)) m_cpu->space(0).install_ram(0, m_ram->mask(), m_ram->pointer()); @@ -556,6 +582,7 @@ map(0xfff00a, 0xfff00b).lr16([this]() { return m_per; }, "per_r"); map(0xfff00c, 0xfff00c).rw(FUNC(tekigw_state_base::scr_r), FUNC(tekigw_state_base::scr_w)); map(0xfff00e, 0xfff00e).r(FUNC(tekigw_state_base::ssr_r)); + map(0xfff00f, 0xfff00f).lr8([]() { return 7; }, "mem_size"); // code at 804703 uses this to size memory map(0xfff800, 0xfff83f).rw(m_rtc, FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0xff); map(0xfffa00, 0xfffa07).rw(m_scc, FUNC(z80scc_device::ab_dc_r), FUNC(z80scc_device::ab_dc_w)).umask16(0xff); @@ -580,7 +607,7 @@ // 7 for CPU, but diagnostic expects F; maybe 4132 is different? m_buserror->adjust(attotime::from_ticks(10, m_cpu->clock()), 0x7); - return 0; // space.unmap(); + return space.unmap(); }, "buserror"); // expansion I/O map(0xff0000, 0xff7fff).rw(FUNC(tek6100_state::buf_r), FUNC(tek6100_state::buf_w)); @@ -641,13 +668,16 @@ template void tek4132_state::cpu_map(address_map &map) { map(0x000000, 0xffffff).lr8( - [this](address_space &space) + [this](address_space &space, offs_t offset) { - // FIXME: Should be 20μs according to 6100 documentation; CPU is still - // too fast, and timing may differ on 4132. Also DMACH field should be - // 7 for CPU, but diagnostic expects F; maybe 4132 is different? - m_buserror->adjust(attotime::from_ticks(50, m_cpu->clock()), 0xf); - + if (!machine().side_effects_disabled()) + { + // FIXME: Should be 20μs according to 6100 documentation; CPU is still + // too fast, and timing may differ on 4132. Also DMACH field should be + // 7 for CPU, but diagnostic expects F; maybe 4132 is different? + m_buserror->adjust(attotime::from_ticks(20, m_cpu->clock()), 0xf); + logerror("buserror 0x%06x (%s)\n", offset, machine().describe_context()); + } return space.unmap(); }, "buserror"); @@ -658,23 +688,25 @@ //map(0xfff000, 0xfff000).w(FUNC(tek6100_state::fcr_w)); // rsaa_dmaaos serial dma address offset register //map(0xfff002, 0xfff002).w(FUNC(tek6100_state::gcr_w)); // rsaa_auxlatch serial auxiliary control register + //map(0xfff008, 0xfff008).w(); // rsaa_irqreset + //map(0xfff00f, 0xfff00f).lr8([]() { return 0x7; }, "memsize"); // code at 804703 uses this to size memory map(0xfff900, 0xfff91f).rw(m_sdma, FUNC(am9517a_device::read), FUNC(am9517a_device::write)).umask16(0xff); //map(0xfffa08, 0xfffa08); // rsaa_status //map(0xfffc00, 0xfffc1f); // signature map(0xfffc20, 0xfffc3f).lw8( - [this](u8 data) + [this](offs_t offset, u8 data) { - LOG("csr_w 0x%02x (%s)\n", data, machine().describe_context()); + LOG("csr_w 0x%02x offset 0x%x (%s)\n", data, offset, machine().describe_context()); - //m_scsi->set_own_id(~data & CSR_IDENT); - //m_sirq->in_w<1>(bool(data & CSR_IENBL)); + m_scsi->set_own_id(~data & CSR_IDENT); + m_sirq->in_w<0>(bool(data & CSR_IENBL)); }, "csr_w"); - //map(0xfffc40, 0xfffc5f).m(m_scsi, FUNC(ncr5385_device::map)).umask16(0xff); - map(0xfffc60, 0xfffc61).ram(); // 9516 data - map(0xfffc62, 0xfffc63).ram(); // 9516 pointer - map(0xfffd00, 0xfffdff).ram(); // stub out 9516 + map(0xfffc40, 0xfffc5f).m(m_scsi, FUNC(ncr5385_device::map)).umask16(0xff); + map(0xfffc60, 0xfffc61).rw(m_dma, FUNC(am9516_device::data_r), FUNC(am9516_device::data_w)); + map(0xfffc62, 0xfffc63).rw(m_dma, FUNC(am9516_device::addr_r), FUNC(am9516_device::addr_w)); + //map(0xfffd00, 0xfffdff).ram(); // stub out 9516 map(0xffff00, 0xffffff).rom().region("kernel", 0xff00); } @@ -686,6 +718,24 @@ map(0x3fff00, 0x3fffff).rom().region("kernel", 0xff00); // 0xf00000-0xffffff } +void tekigw_state_base::dma_map(address_map &map) +{ + map(0x000000, 0xffffff).lrw16( + [this](offs_t offset, u16 mem_mask) + { + return (mem_mask == 0xffff) + ? m_cpu->space(0).read_word(offset << 1) + : swapendian_int16(m_cpu->space(0).read_word(offset << 1, swapendian_int16(mem_mask))); + }, "dma_r", + [this](offs_t offset, u16 data, u16 mem_mask) + { + if (mem_mask == 0xffff) + m_cpu->space(0).write_word(offset << 1, data, mem_mask); + else + m_cpu->space(0).write_word(offset << 1, swapendian_int16(data), swapendian_int16(mem_mask)); + }, "dma_w"); +} + void tekigw_state_base::common_config(machine_config &config) { NS32016(config, m_cpu, 20_MHz_XTAL / 2); @@ -722,13 +772,27 @@ m_scc->out_rtsb_callback().set(m_serial[1], FUNC(rs232_port_device::write_rts)); m_scc->out_txdb_callback().set(m_serial[1], FUNC(rs232_port_device::write_txd)); + /* + * non-volatile memory: xx yy mm mm mm mm mm mm ii ii ii ii + * + * where (bit order reversed): + * xx yy - checksum? + * mm - mac address + * ii - IP address + */ MM58167(config, m_rtc, 32.768_kHz_XTAL); EEPROM_X24C44_16BIT(config, m_nov[0]); // X2443P m_nov[0]->do_callback().set(FUNC(tekigw_state_base::nov_do)); + AM9516(config, m_dma, 16_MHz_XTAL / 4); // TODO: 4132 has Am9516A-8 + m_dma->set_addrmap(am9516_device::SYSTEM_MEM, &tekigw_state_base::dma_map); + m_dma->set_addrmap(am9516_device::NORMAL_MEM, &tekigw_state_base::dma_map); + + // TODO: channel B fdc + I82586(config, m_lan, 16_MHz_XTAL / 2); - m_lan->out_irq_cb().set(m_icu, FUNC(ns32202_device::ir_w<11>)).invert(); + m_lan->out_irq_cb().set(m_icu, FUNC(ns32202_device::ir_w<11>)); } void tek6100_state::tek6130(machine_config &config) @@ -736,7 +800,7 @@ tekigw_state_base::common_config(config); m_cpu->set_addrmap(0, &tek6100_state::cpu_map<0>); - m_cpu->set_addrmap(6, &tek6100_state::cpu_map<6>); + m_cpu->set_addrmap(ns32000::ST_EIM, &tek6100_state::cpu_map); m_lan->set_addrmap(0, &tek6100_state::lan_map); @@ -762,7 +826,7 @@ WD1770(config, m_fdc, 8_MHz_XTAL); // clock? m_fdc->intrq_wr_callback().set(m_icu, FUNC(ns32202_device::ir_w<13>)); - //m_fdc->drq_wr_callback().set(m_dma, FUNC(::)); + m_fdc->drq_wr_callback().set(m_dma, FUNC(am9516_device::dreq_w<1>)); FLOPPY_CONNECTOR(config, "fdc:0", "525dd", FLOPPY_525_DD, true, floppy_image_device::default_mfm_floppy_formats).enable_sound(true); WD1010(config, m_hdc, 20_MHz_XTAL / 4); @@ -848,7 +912,8 @@ tekigw_state_base::common_config(config); m_cpu->set_addrmap(0, &tek4132_state::cpu_map<0>); - m_cpu->set_addrmap(6, &tek4132_state::cpu_map<6>); + m_cpu->set_addrmap(ns32000::ST_EIM, &tek4132_state::cpu_map); + //m_cpu->set_addrmap(ns32000::ST_ODT, &tek4132_state::cpu_map); m_lan->set_addrmap(0, &tek4132_state::lan_map); @@ -874,12 +939,12 @@ * 15 software clock */ - m_rtc->irq().set(m_icu, FUNC(ns32202_device::ir_w<13>)); + m_rtc->irq().set(m_icu, FUNC(ns32202_device::ir_w<13>)).invert(); // device emulation has inverted polarity EEPROM_X24C44_16BIT(config, m_nov[1]); // X2443P m_nov[1]->do_callback().set(FUNC(tek4132_state::nov_do)); - AM9517A(config, m_sdma, 4'000'000); // clock? + AM9517A(config, m_sdma, 4'000'000); // D8237A-5 (clock?) m_sdma->dreq_active_low(); INPUT_MERGER_ALL_HIGH(config, m_sirq); @@ -893,22 +958,19 @@ NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr); -#if 1 - NSCSI_CONNECTOR(config, "scsi:7", scsi_devices, nullptr); -#else NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5385", NCR5385).clock(10'000'000).machine_config( [this](device_t *device) { ncr5385_device &adapter = downcast(*device); - //adapter.irq().set(m_sirq, FUNC(input_merger_all_high_device::in_w<0>)); + //adapter.irq().set(m_sirq, FUNC(input_merger_all_high_device::in_w<1>)); adapter.irq().set(m_icu, FUNC(ns32202_device::ir_w<4>)); - //adapter.drq_handler_cb().set(m_mct_adr, FUNC(mct_adr_device::drq<0>)); + adapter.dreq().set(m_dma, FUNC(am9516_device::dreq_w<0>)).invert(); - //subdevice(":mct_adr")->dma_r_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_r)); - //subdevice(":mct_adr")->dma_w_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_w)); }); -#endif + + m_dma->flyby_byte_r<0>().set(":scsi:7:ncr5385", FUNC(ncr5385_device::dma_r)); + m_dma->flyby_byte_w<0>().set(":scsi:7:ncr5385", FUNC(ncr5385_device::dma_w)); } static INPUT_PORTS_START(tekigw) diff -Nru mame-0.263+dfsg.1/src/mame/thepit/timelimt.cpp mame-0.264+dfsg.1/src/mame/thepit/timelimt.cpp --- mame-0.263+dfsg.1/src/mame/thepit/timelimt.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/thepit/timelimt.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -96,8 +96,6 @@ }; -// video - /*************************************************************************** @@ -254,8 +252,6 @@ } -// machine - /***************************************************************************/ void timelimt_state::machine_start() diff -Nru mame-0.263+dfsg.1/src/mame/ti/snspellc.cpp mame-0.264+dfsg.1/src/mame/ti/snspellc.cpp --- mame-0.263+dfsg.1/src/mame/ti/snspellc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ti/snspellc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -601,56 +601,56 @@ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Grid 1-3") PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 2-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 2-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 2-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 2-3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 2-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 2-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Grid 2-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 2-3") PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 3-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 3-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 3-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 3-3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 3-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 3-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 3-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 3-3") PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Grid 4-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 4-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 4-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 4-3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 4-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 4-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("Grid 4-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 4-3") PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 5-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 5-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 5-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 5-3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 5-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 5-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 5-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 5-3") PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 5-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Grid 6-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 5-5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 5-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 6-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 5-5") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // overlay code PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 3-5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 2-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 4-5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 3-5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Grid 2-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Grid 4-5") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Grid 1-5") PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 3-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 2-6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Grid 4-6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 3-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Grid 2-6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Grid 4-6") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Grid 1-6") PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Grid 6-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Grid 6-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Grid 6-3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 6-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 6-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 6-3") PORT_START("IN.9") // Vss PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tntell_state, power_on, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tntell_state, power_on, 0) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END diff -Nru mame-0.263+dfsg.1/src/mame/tigertel/docg3.cpp mame-0.264+dfsg.1/src/mame/tigertel/docg3.cpp --- mame-0.263+dfsg.1/src/mame/tigertel/docg3.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tigertel/docg3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -823,11 +823,18 @@ bool diskonchip_g3_device::nvram_read(util::read_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.read(m_data[0].get(), m_data_size[0], actual) && actual == m_data_size[0]; - result = result && !file.read(m_data[1].get(), m_data_size[1], actual) && actual == m_data_size[1]; - result = result && !file.read(m_data[2].get(), m_data_size[2], actual) && actual == m_data_size[2]; - return result; + std::tie(err, actual) = read(file, m_data[0].get(), m_data_size[0]); + if (err || (actual != m_data_size[0])) + return false; + std::tie(err, actual) = read(file, m_data[1].get(), m_data_size[1]); + if (err || (actual != m_data_size[1])) + return false; + std::tie(err, actual) = read(file, m_data[2].get(), m_data_size[2]); + if (err || (actual != m_data_size[2])) + return false; + return true; } //------------------------------------------------- @@ -837,9 +844,12 @@ bool diskonchip_g3_device::nvram_write(util::write_stream &file) { + std::error_condition err; size_t actual; - bool result = !file.write(m_data[0].get(), m_data_size[0], actual) && actual == m_data_size[0]; - result = result && !file.write(m_data[1].get(), m_data_size[1], actual) && actual == m_data_size[1]; - result = result && !file.write(m_data[2].get(), m_data_size[2], actual) && actual == m_data_size[2]; - return result; + std::tie(err, actual) = write(file, m_data[0].get(), m_data_size[0]); + if (!err) + std::tie(err, actual) = write(file, m_data[1].get(), m_data_size[1]); + if (!err) + std::tie(err, actual) = write(file, m_data[2].get(), m_data_size[2]); + return !err; } diff -Nru mame-0.263+dfsg.1/src/mame/toaplan/slapfght_ms.cpp mame-0.264+dfsg.1/src/mame/toaplan/slapfght_ms.cpp --- mame-0.263+dfsg.1/src/mame/toaplan/slapfght_ms.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/toaplan/slapfght_ms.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -102,8 +102,6 @@ }; -// video - TILE_GET_INFO_MEMBER(slapfght_ms_state::get_pf1_tile_info) { int tile = m_videoram[tile_index] | ((m_colorram[tile_index] & 0x0f) << 8); @@ -204,8 +202,6 @@ } -// machine - void slapfght_ms_state::vblank_irq(int state) { if (state && m_main_irq_enabled) diff -Nru mame-0.263+dfsg.1/src/mame/toaplan/toaplan2.cpp mame-0.264+dfsg.1/src/mame/toaplan/toaplan2.cpp --- mame-0.263+dfsg.1/src/mame/toaplan/toaplan2.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/toaplan/toaplan2.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -6469,20 +6469,20 @@ GAME( 1993, enmadaio, 0, enmadaio, enmadaio, toaplan2_state, init_enmadaio, ROT0, "Toaplan / Taito", "Enma Daio (Japan)", 0 ) // TP-031 // region is in eeprom (and also requires correct return value from a v25 mapped address??) -GAME( 1992, fixeight, 0, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Europe)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightk, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Korea)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeighth, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Hong Kong)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeighttw, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Taiwan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeighta, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Southeast Asia)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightu, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (USA)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightj, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight - Jigoku no Eiyuu Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Europe, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightkt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Korea, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightht, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Hong Kong, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeighttwt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Taiwan, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightat, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Southeast Asia, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightut, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (USA, Taito license)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, fixeightjt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight - Jigoku no Eiyuu Densetsu (Japan, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeight, 0, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Europe)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightk, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Korea)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeighth, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Hong Kong)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeighttw, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Taiwan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeighta, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (Southeast Asia)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightu, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight (USA)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightj, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan", "FixEight - Jigoku no Eiyuu Densetsu (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Europe, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightkt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Korea, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightht, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Hong Kong, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeighttwt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Taiwan, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightat, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (Southeast Asia, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightut, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight (USA, Taito license)", MACHINE_SUPPORTS_SAVE ) +GAME( 1992, fixeightjt, fixeight, fixeight, fixeight, truxton2_state, init_fixeight, ROT270, "Toaplan (Taito license)", "FixEight - Jigoku no Eiyuu Densetsu (Japan, Taito license)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, fixeightbl, fixeight, fixeightbl, fixeightbl, truxton2_state, init_fixeightbl, ROT270, "bootleg", "FixEight (Korea, bootleg)", MACHINE_SUPPORTS_SAVE ) @@ -6508,7 +6508,7 @@ GAME( 1994, snowbro2b3, snowbro2, snowbro2b3, snowbro2b3, toaplan2_state, empty_init, ROT0, "bootleg", "Snow Bros. 2 - With New Elves / Otenki Paradise (bootleg, set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // GFX offsets not 100% correct GAME( 1993, sstriker, 0, mahoudai, sstriker, truxton2_state, empty_init, ROT270, "Raizing", "Sorcer Striker", MACHINE_SUPPORTS_SAVE ) // verified on two different PCBs -GAME( 1993, sstrikerk, sstriker, mahoudai, sstrikerk, truxton2_state, empty_init, ROT270, "Raizing (Unite Trading license)", "Sorcer Striker (Korea)" , MACHINE_SUPPORTS_SAVE ) // Although the region jumper is functional, it's a Korean board / version +GAME( 1993, sstrikerk, sstriker, mahoudai, sstrikerk, truxton2_state, empty_init, ROT270, "Raizing (Unite Trading license)", "Sorcer Striker (Korea)", MACHINE_SUPPORTS_SAVE ) // Although the region jumper is functional, it's a Korean board / version GAME( 1993, mahoudai, sstriker, mahoudai, mahoudai, truxton2_state, empty_init, ROT270, "Raizing (Able license)", "Mahou Daisakusen (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, kingdmgp, 0, shippumd, kingdmgp, truxton2_state, empty_init, ROT270, "Raizing / Eighting", "Kingdom Grandprix", MACHINE_SUPPORTS_SAVE ) // from Korean board, missing letters on credits screen but this is correct @@ -6519,8 +6519,8 @@ GAME( 1996, bgareggahk, bgaregga, bgaregga, bgareggahk, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga (Austria / Hong Kong) (Sat Feb 3 1996)", MACHINE_SUPPORTS_SAVE ) GAME( 1996, bgareggatw, bgaregga, bgaregga, bgareggatw, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga (Taiwan / Germany) (Thu Feb 1 1996)", MACHINE_SUPPORTS_SAVE ) GAME( 1996, bgareggak, bgaregga, bgaregga, bgareggak, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga (Korea / Greece) (Wed Feb 7 1996)", MACHINE_SUPPORTS_SAVE ) -GAME( 1996, bgaregganv, bgaregga, bgaregga, bgareggahk, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - New Version (Austria / Hong Kong) (Sat Mar 2 1996)" , MACHINE_SUPPORTS_SAVE ) // displays New Version only when set to HK -GAME( 1996, bgareggat2, bgaregga, bgaregga, bgaregga, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - Type 2 (Europe / USA / Japan / Asia) (Sat Mar 2 1996)" , MACHINE_SUPPORTS_SAVE ) // displays Type 2 only when set to Europe +GAME( 1996, bgaregganv, bgaregga, bgaregga, bgareggahk, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - New Version (Austria / Hong Kong) (Sat Mar 2 1996)", MACHINE_SUPPORTS_SAVE ) // displays New Version only when set to HK +GAME( 1996, bgareggat2, bgaregga, bgaregga, bgaregga, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - Type 2 (Europe / USA / Japan / Asia) (Sat Mar 2 1996)", MACHINE_SUPPORTS_SAVE ) // displays Type 2 only when set to Europe GAME( 1996, bgareggacn, bgaregga, bgaregga, bgareggacn, truxton2_state, init_bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - Type 2 (Denmark / China) (Tue Apr 2 1996)", MACHINE_SUPPORTS_SAVE ) // displays Type 2 only when set to Denmark GAME( 1998, bgareggabl, bgaregga, bgareggabl, bgareggabl, truxton2_state, init_bgaregga, ROT270, "bootleg (Melody)", "1945 Er Dai / 1945 Part-2 (Chinese hack of Battle Garegga)", MACHINE_SUPPORTS_SAVE ) // based on Thu Feb 1 1996 set, Region hardcoded to China GAME( 1997, bgareggabla, bgaregga, bgareggabl, bgareggabl, truxton2_state, init_bgaregga, ROT270, "bootleg (Melody)", "Leishen Chuan / Thunder Deity Biography (Chinese hack of Battle Garegga)", MACHINE_SUPPORTS_SAVE ) // based on Thu Feb 1 1996 set, Region hardcoded to Asia diff -Nru mame-0.263+dfsg.1/src/mame/trs/gime.cpp mame-0.264+dfsg.1/src/mame/trs/gime.cpp --- mame-0.263+dfsg.1/src/mame/trs/gime.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/trs/gime.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -587,14 +587,11 @@ is_read_only = false; } - // compensate for offset - memory += offset; - // set the banks if (memory) { - read_bank->set_base(memory); - write_bank->set_base(is_read_only ? m_dummy_bank : memory); + read_bank->set_base(memory + offset); + write_bank->set_base(is_read_only ? m_dummy_bank : memory + offset); } else { diff -Nru mame-0.263+dfsg.1/src/mame/trs/trs80_quik.cpp mame-0.264+dfsg.1/src/mame/trs/trs80_quik.cpp --- mame-0.263+dfsg.1/src/mame/trs/trs80_quik.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/trs/trs80_quik.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -11,6 +11,8 @@ #include "cpu/z80/z80.h" +#include + #define VERBOSE 1 #include "logmacro.h" @@ -65,10 +67,10 @@ size_t actual; while (true) { - err = file.read(&type, 1, actual); + std::tie(err, actual) = read(file, &type, 1); if (actual != 1) break; - err = file.read(&length, 1, actual); + std::tie(err, actual) = read(file, &length, 1); if (actual != 1) break; @@ -78,7 +80,7 @@ { length -= 2; u16 block_length = length ? length : 256; - err = file.read(&addr, 2, actual); + std::tie(err, actual) = read(file, &addr, 2); if (actual != 2) { logerror("/CMD error reading address of data block\n"); @@ -93,7 +95,7 @@ image_error::INVALIDIMAGE, util::string_format("Object code block at address %04x is outside RAM", address)); } - err = file.read(ptr, block_length, actual); + std::tie(err, actual) = read(file, ptr, block_length); if (actual != block_length) { logerror("/CMD error reading data block at address %04x\n", address); @@ -104,7 +106,7 @@ case CMD_TYPE_TRANSFER_ADDRESS: // 02 - go address { - err = file.read(&addr, 2, actual); + std::tie(err, actual) = read(file, &addr, 2); if (actual != 2) { logerror("/CMD error reading transfer address\n"); @@ -117,7 +119,7 @@ return std::make_pair(std::error_condition(), std::string()); case CMD_TYPE_LOAD_MODULE_HEADER: // 05 - name - err = file.read(&data, length, actual); + std::tie(err, actual) = read(file, &data, length); if (actual != length) { logerror("/CMD error reading block type %02x\n", type); @@ -126,7 +128,7 @@ LOG("/CMD load module header '%s'\n", data); break; - case CMD_TYPE_COPYRIGHT_BLOCK: // 1F - copyright info err = file.read(&data, length, actual); + case CMD_TYPE_COPYRIGHT_BLOCK: // 1F - copyright info std::tie(err, actual) = read(file, &data, length); if (actual != length) { logerror("/CMD error reading block type %02x\n", type); @@ -136,7 +138,7 @@ break; default: - err = file.read(&data, length, actual); + std::tie(err, actual) = read(file, &data, length); if (actual != length) { logerror("/CMD error reading block type %02x\n", type); diff -Nru mame-0.263+dfsg.1/src/mame/tryom/chess.cpp mame-0.264+dfsg.1/src/mame/tryom/chess.cpp --- mame-0.263+dfsg.1/src/mame/tryom/chess.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tryom/chess.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -58,7 +58,7 @@ required_device m_maincpu; required_device m_psu; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<5> m_inputs; std::unique_ptr m_ram; diff -Nru mame-0.263+dfsg.1/src/mame/tryom/omar.cpp mame-0.264+dfsg.1/src/mame/tryom/omar.cpp --- mame-0.263+dfsg.1/src/mame/tryom/omar.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tryom/omar.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -67,7 +67,7 @@ required_device m_maincpu; required_device m_psu; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<5> m_inputs; u8 m_inp_mux = 0; @@ -90,6 +90,7 @@ save_item(NAME(m_inp_mux)); } + // Omar II class omar2_state : public omar_state diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/elan_eu3a05.cpp mame-0.264+dfsg.1/src/mame/tvgames/elan_eu3a05.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/elan_eu3a05.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/elan_eu3a05.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -956,6 +956,13 @@ ROM_RELOAD(0x300000,0x100000) ROM_END +ROM_START( pvmil8 ) + ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "millionare_8bit.bin", 0x000000, 0x200000, CRC(8934a8d6) SHA1(24681e06d02f1567a57b84ec1c6f0a23a5f308ac) ) + ROM_RELOAD(0x200000,0x200000) +ROM_END + + ROM_START( pvmilfin ) ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "fwwtbam.bin", 0x000000, 0x200000, CRC(2cfef9ab) SHA1(b64f55e36b59790a310ae33154774ac613b5d49f) ) @@ -1027,8 +1034,11 @@ CONS( 200?, carlecfg, 0, 0, elan_sudoku, carlecfg, elan_eu3a05_state, empty_init, "Excalibur Electronics Inc", "Carl Edwards' Chase For Glory", MACHINE_NOT_WORKING ) +// this is in very similar packaging to the 'pvmil' game in tvgames/spg2xx_playvision.cpp, and the casing is identical +// however this is from a year earlier, and there is a subtle difference in the otherwise identical text on the back of the box, mentioning that it uses an 8-bit processor, where the other box states 16-bit +CONS( 2005, pvmil8, 0, 0, elan_pvmilfin, sudoku, elan_eu3a05_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK, 8-bit version)", MACHINE_NOT_WORKING ) // see https://millionaire.fandom.com/wiki/Haluatko_miljon%C3%A4%C3%A4riksi%3F_(Play_Vision_game) -CONS( 2006, pvmilfin, 0, 0, elan_pvmilfin, sudoku, elan_eu3a05_state, empty_init, "Play Vision", u8"Haluatko miljonääriksi? (Finland)", MACHINE_NOT_WORKING ) +CONS( 2005, pvmilfin, pvmil8, 0, elan_pvmilfin, sudoku, elan_eu3a05_state, empty_init, "Play Vision", u8"Haluatko miljonääriksi? (Finland)", MACHINE_NOT_WORKING ) CONS( 2005, pvwwcas, 0, 0, pvwwcas, sudoku, elan_eu3a05_pvwwcas_state, init_pvwwcas, "Play Vision / Taikee / V-Tac", "Worldwide Casino Tour 12-in-1", MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/elan_eu3a14.cpp mame-0.264+dfsg.1/src/mame/tvgames/elan_eu3a14.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/elan_eu3a14.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/elan_eu3a14.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -251,6 +251,18 @@ } +static INPUT_PORTS_START( eu3a14 ) + PORT_START("IN0") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + + static INPUT_PORTS_START( rad_gtg ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) @@ -829,56 +841,136 @@ ROM_START( rad_gtg ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "goldentee.bin", 0x000000, 0x400000, CRC(2d6cdb85) SHA1(ce6ed39d692ff16ea407f39c37b6e731f952b9d5) ) ROM_END ROM_START( rad_rsg ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "realswinggolf.bin", 0x000000, 0x400000, CRC(89e5b6a6) SHA1(0b14aa84d7e7ae7190cd64e3eb125de2104342bc) ) ROM_END ROM_START( rad_rsgp ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "realswinggolf.bin", 0x000000, 0x400000, CRC(89e5b6a6) SHA1(0b14aa84d7e7ae7190cd64e3eb125de2104342bc) ) ROM_END ROM_START( rad_foot ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "connectvfootball.bin", 0x000000, 0x400000, CRC(00ac4fc0) SHA1(2b60ae5c6bc7e9ef7cdbd3f6a0a0657ed3ab5afe) ) ROM_END ROM_START( rad_bb3 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "baseball3.bin", 0x000000, 0x400000, CRC(af86aab0) SHA1(5fed48a295f045ca839f87b0f9b78ecc51104cdc) ) ROM_END ROM_START( rad_bb3p ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "baseball3.bin", 0x000000, 0x400000, CRC(af86aab0) SHA1(5fed48a295f045ca839f87b0f9b78ecc51104cdc) ) ROM_END ROM_START( rad_hnt3 ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "huntin3.bin", 0x000000, 0x400000, CRC(c8e3e40b) SHA1(81eb16ac5ab6d93525fcfadbc6703b2811d7de7f) ) ROM_END ROM_START( rad_hnt3p ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "huntin3.bin", 0x000000, 0x400000, CRC(c8e3e40b) SHA1(81eb16ac5ab6d93525fcfadbc6703b2811d7de7f) ) ROM_END ROM_START( rad_bask ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) ) ROM_END ROM_START( rad_baskp ) - ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) ) ROM_END +/* + + The Interactive M.A.G. Motion Activated Gear titles use globtops with an unusual square pinout + for the main ROM + + 10 01 + +------\ +11| |48 + | | + | | +24+------+35 + 25 34 + + +01 | A10 +02 | A09 +03 | A08 +04 | A19 +05 | A21 +06 | A20 +07 | A18 +08 | A17 +09 | A07 +10 | A06 +11 | A05 +12 | A04 +13 | A00 +14 | A01 +15 | A02 +16 | A03 +17 | /CE +18 | N/C +19 | D08 +20 | D00 +21 | N/C +22 | N/C +23 | D01 +24 | D09 +25 | D02 +26 | D10 +27 | D03 +28 | D11 +29 | N/C +30 | VCC +31 | VCC +32 | D04 +33 | D12 +34 | D05 +35 | D13 +36 | D06 +37 | D15 +38 | GND +39 | D07 +40 | D14 +41 | GND +42 | VCC +43 | A13 +44 | A14 +45 | A16 +46 | A15 +47 | A12 +48 | A11 + +*/ + +ROM_START( tsbuzz ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "toystory_buzz.bin", 0x000000, 0x800000, CRC(8d727ed4) SHA1(228e1d788cdbaf251e15dba01b6c71e82197ea28) ) +ROM_END + +ROM_START( batvgc ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "batvgc.bin", 0x000000, 0x800000, CRC(513a5625) SHA1(d8db60818a4452e665c312b8b93642d8b2b33c8f) ) +ROM_END + +ROM_START( spidtt ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mag_spidtt", 0x000000, 0x800000, CRC(05de01de) SHA1(f2891d6e743abdd7bb50d0bb84701b18225a0a7a) ) +ROM_END + } // anonymous namespace @@ -899,3 +991,12 @@ CONS( 2005, rad_bask, 0, 0, radica_eu3a14_altrambase, radica_bask, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Play TV Basketball", MACHINE_NOT_WORKING ) CONS( 2005, rad_baskp,rad_bask, 0, radica_eu3a14p_altrambase, radica_bask, elan_eu3a14_state, empty_init, "Radica / FarSight Studios", "Connectv Basketball", MACHINE_NOT_WORKING ) + +CONS( 200?, tsbuzz, 0, 0, radica_eu3a14, eu3a14, elan_eu3a14_state, empty_init, "Thinkway Toys", "Interactive M.A.G. Motion Activated Gear: Toy Story and Beyond! Buzz Lightyear Galactic Adventure", MACHINE_NOT_WORKING ) +CONS( 200?, batvgc, 0, 0, radica_eu3a14, eu3a14, elan_eu3a14_state, empty_init, "Thinkway Toys", "Interactive M.A.G. Motion Activated Gear: The Batman - Villains of Gotham City", MACHINE_NOT_WORKING ) +CONS( 200?, spidtt, 0, 0, radica_eu3a14, eu3a14, elan_eu3a14_state, empty_init, "Thinkway Toys", "Interactive M.A.G. Motion Activated Gear: Spider-Man - Triple Threat", MACHINE_NOT_WORKING ) + +// the following Thinkway Toys 'MAG' products likely also fit here +// MAG: Teen Titans Arena Showdown +// MAG: Superman Fight for Metropolis +// MAG: Disney Pixar Cars I Am Speed diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/generalplus_gpl16250_rom.cpp mame-0.264+dfsg.1/src/mame/tvgames/generalplus_gpl16250_rom.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/generalplus_gpl16250_rom.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/generalplus_gpl16250_rom.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -412,6 +412,15 @@ ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428) ) ROM_END +ROM_START( smartfpf ) + //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) + //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) + + ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00) + ROM_LOAD16_WORD_SWAP("smartfitpark_fr.bin", 0x000000, 0x800000, CRC(e6d3ba29) SHA1(14e4632997318329be3291f2c4e62f088181f3c8) ) +ROM_END + + ROM_START( gormiti ) //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) @@ -611,6 +620,7 @@ // the JAKKS ones of these seem to be known as 'Generalplus GPAC500' hardware? CONS(2009, smartfp, 0, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (UK)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) CONS(2009, smartfps, smartfp, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) +CONS(2009, smartfpf, smartfp, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (France)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // boxart simply has 'Smart Fit' // These are ports of the 'Family Sport' games to GPL16250 type hardware, but they don't seem to use many unSP 2.0 instructions. // The menu style is close to 'm505neo' but the game selection is closer to 'dnv200fs' (but without the Sports titles removed, and with a few other extras not found on that unit) diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/spg29x.cpp mame-0.264+dfsg.1/src/mame/tvgames/spg29x.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/spg29x.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/spg29x.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -438,9 +438,9 @@ { const uint32_t length = image.length(); - std::unique_ptr ptr; - if (image.fread(ptr, length) != length) - return std::make_pair(image_error::UNSPECIFIED, std::string()); + auto [err, ptr, actual] = read(image.image_core_file(), length); + if (err || (actual != length)) + return std::make_pair(err ? err : std::errc::io_error, std::string()); auto &space = m_maincpu->space(AS_PROGRAM); for (uint32_t i = 0; i < length; i++) diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/spg2xx.cpp mame-0.264+dfsg.1/src/mame/tvgames/spg2xx.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/spg2xx.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/spg2xx.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -325,6 +325,14 @@ } +void spg2xx_game_lexiart_state::mem_map_lexiart(address_map &map) +{ + map(0x000000, 0x3fffff).bankr("cartbank"); + map(0x3f0000, 0x3f7fff).ram(); // 2 * 32Kb RAMs on PCB +} + + + static INPUT_PORTS_START( spg2xx ) // base structure for easy debugging / figuring out of inputs PORT_START("P1") PORT_DIPNAME( 0x0001, 0x0001, "P1:0001" ) @@ -477,6 +485,15 @@ PORT_DIPSETTING( 0x8000, "8000" ) INPUT_PORTS_END +static INPUT_PORTS_START( lexiart ) + PORT_INCLUDE( spg2xx ) + + PORT_MODIFY("P1") + PORT_DIPNAME( 0x0100, 0x0000, "Battery State" ) + PORT_DIPSETTING( 0x0000, "Ok" ) + PORT_DIPSETTING( 0x0100, "Low" ) +INPUT_PORTS_END + static INPUT_PORTS_START( itvphone ) // hold 8 and ENTER for Diagnostics mode PORT_START("P1") // note, the physical inputs are in 'phone' order, so 1 is top left, not bottom left like a PC Keypad PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 1") PORT_CODE(KEYCODE_1_PAD) @@ -742,6 +759,22 @@ PORT_BIT( 0xfffe, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +static INPUT_PORTS_START( doyousud ) + PORT_INCLUDE( spg2xx ) + + PORT_MODIFY("P1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Menu") + // is the on/off button visible at 0020? + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Higher / Up") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Pencil") + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Lower / Down") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Ok") + +INPUT_PORTS_END CUSTOM_INPUT_MEMBER(spg2xx_game_fordrace_state::wheel_r) @@ -1745,6 +1778,17 @@ m_maincpu->portc_in().set(FUNC(spg2xx_game_wfcentro_state::base_portc_r)); } +void spg2xx_game_lexiart_state::lexiart(machine_config &config) +{ + SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen); + m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_lexiart_state::mem_map_lexiart); + + spg2xx_base(config); + + m_maincpu->porta_in().set(FUNC(spg2xx_game_lexiart_state::base_porta_r)); + m_maincpu->portb_in().set(FUNC(spg2xx_game_lexiart_state::base_portb_r)); + m_maincpu->portc_in().set(FUNC(spg2xx_game_lexiart_state::base_portc_r)); +} void spg2xx_game_senwfit_state::portc_w(offs_t offset, uint16_t data, uint16_t mem_mask) @@ -2120,6 +2164,11 @@ ROM_LOAD16_WORD_SWAP( "doraglobe.bin", 0x000000, 0x800000, CRC(6f454c50) SHA1(201e2de3d90abe017a8dc141613cbf6383423d13) ) ROM_END +ROM_START( doraglobf ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "doraglobefrance.bin", 0x000000, 0x800000, CRC(7124edc1) SHA1(b144fc1f13a28299ef14f1d01f7acd2677e4ebb9) ) +ROM_END + ROM_START( doraglobg ) ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "doraglobegerman.bin", 0x000000, 0x800000, CRC(538aa197) SHA1(e97e0641df04074a0e45d02cecb43fbec91a4ce6) ) @@ -2140,6 +2189,11 @@ ROM_LOAD16_WORD_SWAP( "winfuncentro.bin", 0x000000, 0x800000, CRC(fd6ad052) SHA1(78af844729bf4843dc70531349e38a8c25caf748) ) ROM_END +ROM_START( lexiart ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "lexibookartstudio.u3", 0x000000, 0x800000, CRC(fc417abb) SHA1(c0a18a2cf11c47086722f0ec88410614fed7c6f7) ) +ROM_END + ROM_START( tiktokmm ) ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "webcamthingy.bin", 0x000000, 0x800000, CRC(54c0d4a9) SHA1(709ee607ca447baa6f7e686268df1998372fe617) ) @@ -2155,6 +2209,14 @@ ROM_LOAD16_WORD_SWAP( "hotwheels.bin", 0x000000, 0x400000, CRC(f3520b74) SHA1(02a53558d68cf3640a9ab09514cd6cebff8b30af) ) ROM_END +ROM_START( doyousud ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "doyousudoku.bin", 0x000000, 0x100000, CRC(83cafebb) SHA1(a84c7191bc6b0d321415af0b7d2dd69e52c134a1) ) + + ROM_REGION( 0x800, "eeprom", ROMREGION_ERASE00 ) // probably just used for saving puzzle progress + ROM_LOAD( "at24c16a.u3", 0x000, 0x800, CRC(414ea94d) SHA1(8565a66fd0228104c64a169cdb20715e7b23cfaf) ) +ROM_END + void spg2xx_game_state::init_crc() { @@ -2278,8 +2340,9 @@ CONS( 2006, doraphonf, doraphon, 0, doraphonep,doraphonep,spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Explorer Phone / L'anniversaire de Babouche (France)", MACHINE_IMPERFECT_SOUND ) // This was from a 'cost reduced' unit with the 'non-TV' mode switch and internal speaker removed, however it looks like the code was not disabled or removed as the mode is fully functional. // The ZC-Infinity video for this on YouTube shows the map scrolling to center the continent, there doesn't appear to be an input for this, different revision? -// Dutch and French localized versions also exists, which again must be different code +// a Dutch localized version also exists, which again must be different code CONS( 2007, doraglob, 0, 0, doraphone, doraglobe, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Adventure Globe", MACHINE_IMPERFECT_SOUND ) +CONS( 2007, doraglobf, doraglob, 0, doraphone, doraglobe, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Globe-Trotter (France)", MACHINE_IMPERFECT_SOUND ) CONS( 2007, doraglobg, doraglob, 0, doraphone, doraglobe, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Doras Abenteuer-Globus (Germany)", MACHINE_IMPERFECT_SOUND ) @@ -2317,5 +2380,10 @@ CONS( 200?, wfcentro, 0, 0, wfcentro, spg2xx, spg2xx_game_wfcentro_state, empty_init, "WinFun", "Centro TV de Diseno Artistico (Spain)", MACHINE_NOT_WORKING ) +CONS( 200?, lexiart, 0, 0, lexiart, lexiart, spg2xx_game_lexiart_state, empty_init, "Lexibook", "Lexibook Junior My 1st Drawing Studio", MACHINE_NOT_WORKING ) + // set 2862 to 0003 (irq enable) when it stalls on boot to show something (doesn't turn on IRQs again otherwise?) needs camera emulating -CONS( 200?, tiktokmm, 0, 0, spg2xx, spg2xx, spg2xx_game_wfcentro_state, empty_init, "TikTokTech Ltd. / 3T Games / Senario", "Moving Music (MM-TV110)", MACHINE_NOT_WORKING ) +CONS( 200?, tiktokmm, 0, 0, spg2xx, spg2xx, spg2xx_game_wfcentro_state, empty_init, "TikTokTech Ltd. / 3T Games / Senario", "Moving Music (MM-TV110)", MACHINE_NOT_WORKING ) + +CONS( 2005, doyousud, 0, 0, spg2xx, doyousud, spg2xx_game_state, empty_init, "SDW Games", "Sudoku: Do You Sudoku?", MACHINE_NOT_WORKING ) + diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/spg2xx.h mame-0.264+dfsg.1/src/mame/tvgames/spg2xx.h --- mame-0.263+dfsg.1/src/mame/tvgames/spg2xx.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/spg2xx.h 2024-03-25 14:00:46.000000000 +0000 @@ -297,6 +297,24 @@ void mem_map_wfcentro(address_map& map); }; + +class spg2xx_game_lexiart_state : public spg2xx_game_state +{ +public: + spg2xx_game_lexiart_state(const machine_config &mconfig, device_type type, const char *tag) : + spg2xx_game_state(mconfig, type, tag) + { } + + void lexiart(machine_config &config); + +protected: + +private: + + void mem_map_lexiart(address_map& map); +}; + + class spg2xx_game_ordentv_state : public spg2xx_game_state { public: diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/spg2xx_playvision.cpp mame-0.264+dfsg.1/src/mame/tvgames/spg2xx_playvision.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/spg2xx_playvision.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/spg2xx_playvision.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -233,4 +233,5 @@ } // anonymous namespace -CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +// see note for the pvmil8 set in tvgames/elan_eu3a05.cpp +CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK, 16-bit version)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/xavix.cpp mame-0.264+dfsg.1/src/mame/tvgames/xavix.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/xavix.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/xavix.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -545,8 +545,6 @@ - - static INPUT_PORTS_START( tomcpin ) PORT_INCLUDE(xavix_i2c) @@ -564,6 +562,28 @@ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. INPUT_PORTS_END + +static INPUT_PORTS_START( tomplc ) + PORT_INCLUDE(xavix_i2c) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Doors / Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Wipers / Back") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Headlights / Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Horn / Select") + + // this is the up/down handle on the left (pull towards player to increase power) + PORT_BIT( 0x30, 0x00, IPT_POSITIONAL_V ) PORT_POSITIONS(3) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) PORT_FULL_TURN_COUNT(3) PORT_NAME("Power") + + PORT_MODIFY("IN1") + // this is the rotary lever (move anti-clockwise to the right to apply brakes) + PORT_BIT( 0x03, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(3) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) PORT_FULL_TURN_COUNT(3) PORT_NAME("Brake") + + // are you expected to say something when this is held? game makes a crackle and doesn't act like you said anything + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Speak") +INPUT_PORTS_END + + static INPUT_PORTS_START( ltv_tam ) PORT_INCLUDE(xavix_i2c) @@ -1178,6 +1198,18 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) INPUT_PORTS_END +static INPUT_PORTS_START( epo_tfp2 ) + PORT_INCLUDE(xavix_i2c) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Player 1 Left / Red") PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 1 Right / Blue") PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Player 1 Start / Orange") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Player 2 Left / Green") PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 2 Right / Pink") PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Player 2 Start / Blue") +INPUT_PORTS_END + static INPUT_PORTS_START( has_wamg ) PORT_INCLUDE(xavix) @@ -1294,7 +1326,28 @@ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( tcarnavi ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Accelerate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Brake") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Siren / Transform?") // turns you into a police car? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Reverse") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Key") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Dashboard Power?") PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Steer Left") // steering is digital? + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Steer Right") + + PORT_MODIFY("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Lights") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Horn") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Wipers") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Menu") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. INPUT_PORTS_END @@ -1418,6 +1471,17 @@ I2C_24C02(config, "i2cmem", 0); } +void xavix_i2c_state::xavix_i2c_24c02_43mhz(machine_config &config) +{ + xavix_i2c_24c02(config); + + // tomplc crashes when you start the game at regular clock speeds + // this could indicate that it's actually one of the newer chips + // even if extra opcodes are not being used. + m_maincpu->set_clock(MAIN_CLOCK * 2); +} + + void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) { xavix(config); @@ -1993,6 +2057,16 @@ ROM_LOAD( "sammyslotunit.bin", 0x000000, 0x200000, CRC(2ba6f3ab) SHA1(1c7fc0c85d817db1550d40c0258f424770e0bd81) ) ROM_END +ROM_START( epo_tfp2 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "funpark2.u1", 0x000000, 0x400000, CRC(97ad5183) SHA1(77310b42d0a015838a1cef4eb5e74cc8335284d1) ) +ROM_END + +ROM_START( epo_tenn ) + ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) + ROM_LOAD("excitetennis.u4", 0x000000, 0x100000, CRC(10b0e1dd) SHA1(ba438201434f2b51792b119a3e3d07cc3e53b89a) ) + ROM_LOAD("excitetennis.u2", 0x400000, 0x200000, CRC(6c2cdc90) SHA1(3c5b391e5e7b4a9a73038ef619df564143724437) ) +ROM_END @@ -2067,36 +2141,38 @@ CONS( 2002, epo_esdx, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +// interrupt issues after the title screen cause it to hang +CONS( 2002, epo_tenn, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Tennis (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) CONS( 2000, epo_eppk, epo_epp, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD / Sonokong", "Real Ping Pong (Korea)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // Excite Ping Pong 2 is from 2003 -CONS( 2006, epo_epp3, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Challenge Ai-chan! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2006, epo_epp3, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Challenge Ai-chan! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, epo_guru, 0, 0, xavix_guru, epo_guru, xavix_guru_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, epo_guru, 0, 0, xavix_guru, epo_guru, xavix_guru_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Wakuwaku Kuukihou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? -CONS( 200?, has_wamg, 0, 0, xavix, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, has_wamg, 0, 0, xavix, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) CONS( 2002, tak_geig, 0, 0, xavix_nv, tak_geig, xavix_state, init_xavix, "Takara / SSD Company LTD", "Geigeki Go Go Shooting (Japan)", MACHINE_IMPERFECT_SOUND ) // was also distributed by Atlus as an arcade cabinet in 2005, ROM almost certainly different (this one will auto-power off after inactivity, an arcade wouldn't do that) CONS( 2003, jarajal, 0, 0, xavix_nv, jarajal, xavix_state, init_xavix, "Takara / SSD Company LTD", "Jara-Ja Land (Japan, home version)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2003, tcarnavi, 0, 0, xavix_nv, jarajal, xavix_state, init_xavix, "Tomy / SSD Company LTD", "Tomica Carnavi Drive (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, tcarnavi, 0, 0, xavix_nv, tcarnavi, xavix_state, init_xavix, "Tomy / SSD Company LTD", "Tomica Carnavi Drive (Japan)", MACHINE_IMPERFECT_SOUND ) CONS( 2003, tomcpin, 0, 0, xavix_i2c_24c08, tomcpin, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Champiyon Pinball (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, tomplc, 0, 0, xavix_i2c_24c02, tomcpin, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Nihon Isshuu - Boku wa Plarail Untenshi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, tomplc, 0, 0, xavix_i2c_24c02_43mhz,tomplc,xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Nihon Isshuu - Boku wa Plarail Untenshi (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2001, gungunad, 0, 0, xavix_nv, xavix, xavix_state, init_xavix, "Takara / SSD Company LTD", "Gun Gun Adventure (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* Music titles: Emulation note: - SEEPROM write appears to work (save NVRAM file looks valid) but game fails to read it back properly, fails backup data checksum, and blanks it again. Timers might not be 100%, PAL stuff uses different ways to do timing. */ CONS( 2000, ekara, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD / Hasbro", "e-kara (US?, NTSC, set 1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows "Please insert a cartridge before turn it on" without cart @@ -2131,3 +2207,5 @@ CONS( 2006, ltv_tam, 0, 0, xavix_i2c_24lc04_tam, ltv_tam,xavix_i2c_ltv_tam_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Chou Ninki Spot! Korogashi-Houdai Tamagotchi Resort (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) CONS( 2008, hikara, 0, 0, xavix_cart_hikara, hikara, xavix_hikara_state, init_xavix, "Takara Tomy / SSD Company LTD", "Hi-kara (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) + +CONS( 2003, epo_tfp2, 0, 0, xavix_i2c_24c08, epo_tfp2, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park 2 (Japan)", MACHINE_IMPERFECT_SOUND) // uses in24lc08b diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/xavix.h mame-0.264+dfsg.1/src/mame/tvgames/xavix.h --- mame-0.263+dfsg.1/src/mame/tvgames/xavix.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/xavix.h 2024-03-25 14:00:46.000000000 +0000 @@ -615,6 +615,7 @@ void xavix_i2c_24lc04(machine_config &config); void xavix_i2c_24c02(machine_config &config); + void xavix_i2c_24c02_43mhz(machine_config &config); void xavix_i2c_24c08(machine_config &config); void xavix2000_i2c_24c08(machine_config &config); diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/xavix_2000.cpp mame-0.264+dfsg.1/src/mame/tvgames/xavix_2000.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/xavix_2000.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/xavix_2000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -286,5 +286,5 @@ CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_IMPERFECT_SOUND ) CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c08, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -// hangs after starting a game, or after quite a long time in attract mode (first problem could be bad save data read with the eeprom code, 2nd problem might just be how it is, ends up in a dead loop, not executing invalid code, idle timeout / battery saver) -CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Bandai / SSD Company LTD", "One Piece Punch Battle (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +// hangs after starting a game, check why +CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play One Piece Punch Battle (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/xavix_2002.cpp mame-0.264+dfsg.1/src/mame/tvgames/xavix_2002.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/xavix_2002.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/xavix_2002.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -591,7 +591,7 @@ // some DIS games run on XaviX 2 instead, see xavix2.cpp for Domyos Fitness Adventure and Domyos Bike Concept -CONS( 2005, mrangbat, 0, 0, xavix2002_i2c_mrangbat, mrangbat, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Mahou Taiketsu Magiranger - Magimat de Dance & Battle (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, mrangbat, 0, 0, xavix2002_i2c_mrangbat, mrangbat, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Mahou Taiketsu Magiranger - Magimat de Dance & Battle (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2004, epo_tfit, 0, 0, xavix2002_i2c_24c04, epo_tfit, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Sports Tennis x Fitness (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // Epoch Tennis and Fitness has 24LC04 diff -Nru mame-0.263+dfsg.1/src/mame/tvgames/xavix_a.cpp mame-0.264+dfsg.1/src/mame/tvgames/xavix_a.cpp --- mame-0.263+dfsg.1/src/mame/tvgames/xavix_a.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/tvgames/xavix_a.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -116,7 +116,6 @@ void xavix_sound_device::enable_voice(int voice, bool update_only) { m_stream->update(); - int voicemembase = voice * 0x10; uint16_t freq_mode = (m_readregs_cb(voicemembase + 0x1) << 8) | (m_readregs_cb(voicemembase + 0x0)); // sample rate maybe? diff -Nru mame-0.263+dfsg.1/src/mame/unico/silkroad.cpp mame-0.264+dfsg.1/src/mame/unico/silkroad.cpp --- mame-0.263+dfsg.1/src/mame/unico/silkroad.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/unico/silkroad.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -183,8 +183,6 @@ }; -// video - /* Sprites probably need to be delayed Some scroll layers may need to be offset slightly? Check sprite colours @@ -293,8 +291,6 @@ } -// machine - void silkroad_state::okibank_w(uint8_t data) { int const bank = (data & 0x3); diff -Nru mame-0.263+dfsg.1/src/mame/unico/unianapc.cpp mame-0.264+dfsg.1/src/mame/unico/unianapc.cpp --- mame-0.263+dfsg.1/src/mame/unico/unianapc.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/unico/unianapc.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Ivan Vangelista +// copyright-holders: /* Uniana PC hardware (shared by other Korean companies) diff -Nru mame-0.263+dfsg.1/src/mame/unico/unico.cpp mame-0.264+dfsg.1/src/mame/unico/unico.cpp --- mame-0.263+dfsg.1/src/mame/unico/unico.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/unico/unico.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Luca Elia +// copyright-holders: Luca Elia + /*************************************************************************** -= Unico Games =- @@ -25,15 +26,384 @@ ***************************************************************************/ #include "emu.h" -#include "unico.h" #include "cpu/m68000/m68000.h" #include "cpu/m68000/m68020.h" #include "machine/eepromser.h" #include "sound/okim6295.h" -#include "sound/ymopm.h" #include "sound/ymopl.h" +#include "sound/ymopm.h" + +#include "emupal.h" +#include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class burglarx_state : public driver_device +{ +public: + burglarx_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_palette(*this, "palette"), + m_gfxdecode(*this, "gfxdecode"), + m_oki(*this, "oki"), + m_leds(*this, "led%u", 0U), + m_vram(*this, "vram", 0xc000, ENDIANNESS_BIG), + m_scroll(*this, "scroll", 22, ENDIANNESS_BIG), + m_spriteram(*this, "spriteram", 0x800, ENDIANNESS_BIG) + { } + + void burglarx(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void video_start() override; + + static rgb_t unico_R6G6B6X(uint32_t raw); + uint16_t vram_r(offs_t offset); + void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + uint16_t scroll_r(offs_t offset); + void scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + uint16_t spriteram_r(offs_t offset); + void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + + void okibank_w(uint8_t data); + TILE_GET_INFO_MEMBER(get_tile_info); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void program_map(address_map &map); + + required_device m_maincpu; + required_device m_palette; + required_device m_gfxdecode; + optional_device m_oki; + output_finder<2> m_leds; + +private: + memory_share_creator m_vram; + memory_share_creator m_scroll; + tilemap_t *m_tilemap[3]{}; + int m_sprites_scrolldx = 0; + int m_sprites_scrolldy = 0; + memory_share_creator m_spriteram; +}; + +class zeropnt_state : public burglarx_state +{ +public: + zeropnt_state(const machine_config &mconfig, device_type type, const char *tag) : + burglarx_state(mconfig, type, tag), + m_okibank(*this, "okibank"), + m_screen(*this, "screen"), + m_gun_axes(*this, { "Y0", "X0", "Y1", "X1" }) + { } + + void zeropnt(machine_config &config); + +protected: + virtual void machine_start() override; + + required_memory_bank m_okibank; + + required_device m_screen; + + enum { Y0, X0, Y1, X1 }; // gun axis indices + + template uint16_t gunx_msb_r(); + template uint16_t guny_msb_r(); + + void oki_map(address_map &map); + +private: + required_ioport_array<4> m_gun_axes; + + void okibank_leds_w(uint8_t data); + + void program_map(address_map &map); +}; + +class zeropnt2_state : public zeropnt_state +{ +public: + zeropnt2_state(const machine_config &mconfig, device_type type, const char *tag) : + zeropnt_state(mconfig, type, tag), + m_eeprom(*this, "eeprom") + { } + + void zeropnt2(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_eeprom; + + template uint32_t gunx_msb_r(); + template uint32_t guny_msb_r(); + void okibank(uint8_t data); + void leds_w(uint8_t data); + + void eeprom_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + + void program_map(address_map &map); +}; + + +/*************************************************************************** + +Note: if MAME_DEBUG is defined, pressing Z with: + + Q / W / E Shows Layer 0 / 1 / 2 + A Shows Sprites + + Keys can be used together! + + + [ 3 Scrolling Layers ] + + Tile Size: 16 x 16 x 8 + Layer Size (tiles): 64 x 64 + + [ 512 Sprites ] + + Sprites are made of 16 x 16 x 8 tiles. Size can vary from 1 to + 16 tiles horizontally, while their height is always 1 tile. + There seems to be 4 levels of priority (wrt layers) for each + sprite, following this simple scheme: + + [if we denote the three layers with 0-3 (0 being the backmost) + and the sprite with S] + + Sprite Priority Order (back -> front) + 0 S 0 1 2 + 1 0 S 1 2 + 2 0 1 S 2 + 3 0 1 2 S + +***************************************************************************/ + +/*************************************************************************** + + Palette + + Byte: 0 1 2 3 + Gun: R G B 0 + + 6 Bits x Gun + +***************************************************************************/ + +rgb_t burglarx_state::unico_R6G6B6X(uint32_t raw) +{ + int const red = (raw >> 24) & 0xfc; + int const green = (raw >> 16) & 0xfc; + int const blue = (raw >> 8) & 0xfc; + + return rgb_t(red | (red >> 6), green | (green >> 6), blue | (blue >> 6)); +} + +/*************************************************************************** + + Tilemaps + + Offset: Bits: Value: + + 0.w Code + 2.w fedc ba98 7--- ---- + ---- ---- -6-- ---- Flip Y + ---- ---- --5- ---- Flip X + ---- ---- ---4 3210 Color + +***************************************************************************/ + + +TILE_GET_INFO_MEMBER(burglarx_state::get_tile_info) +{ + uint16_t const *vram = (uint16_t *)tilemap.user_data(); + uint16_t const code = vram[2 * tile_index + 0]; + uint16_t const attr = vram[2 * tile_index + 1]; + tileinfo.set(1, code, attr & 0x1f, TILE_FLIPYX(attr >> 5)); +} + +uint16_t burglarx_state::vram_r(offs_t offset) { return m_vram[offset]; } + +void burglarx_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + int const tile = ((offset / 0x2000) + 1) % 3; + COMBINE_DATA(&m_vram[offset]); + m_tilemap[tile]->mark_tile_dirty((offset & 0x1fff) / 2); +} + + +uint16_t burglarx_state::scroll_r(offs_t offset) { return m_scroll[offset]; } +void burglarx_state::scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_scroll[offset]); } +uint16_t burglarx_state::spriteram_r(offs_t offset) { return m_spriteram[offset]; } +void burglarx_state::spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_spriteram[offset]); } + + +/*************************************************************************** + + + Video Hardware Init + + +***************************************************************************/ + + +void burglarx_state::video_start() +{ + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(burglarx_state::get_tile_info)), TILEMAP_SCAN_ROWS, 0x10, 0x10, 0x40, 0x40); + + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(burglarx_state::get_tile_info)), TILEMAP_SCAN_ROWS, 0x10, 0x10, 0x40, 0x40); + + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(burglarx_state::get_tile_info)), TILEMAP_SCAN_ROWS, 0x10, 0x10, 0x40, 0x40); + + m_tilemap[0]->set_user_data(&m_vram[0x8000 / 2]); + m_tilemap[1]->set_user_data(&m_vram[0x0000 / 2]); + m_tilemap[2]->set_user_data(&m_vram[0x4000 / 2]); + + m_sprites_scrolldx = -0x3f; + m_sprites_scrolldy = -0x0e; + + m_tilemap[0]->set_scrolldx(-0x32, 0); + m_tilemap[1]->set_scrolldx(-0x30, 0); + m_tilemap[2]->set_scrolldx(-0x2e, 0); + + m_tilemap[0]->set_scrolldy(-0x0f, 0); + m_tilemap[1]->set_scrolldy(-0x0f, 0); + m_tilemap[2]->set_scrolldy(-0x0f, 0); + + m_tilemap[0]->set_transparent_pen(0x00); + m_tilemap[1]->set_transparent_pen(0x00); + m_tilemap[2]->set_transparent_pen(0x00); +} + + +/*************************************************************************** + + Sprites Drawing + + + 0.w X + + 2.w Y + + 4.w Code + + 6.w fe-- ---- ---- ---- + --dc ---- ---- ---- Priority + ---- ba98 ---- ---- Number of tiles along X, minus 1 + ---- ---- 7--- ---- + ---- ---- -6-- ---- Flip Y? + ---- ---- --5- ---- Flip X + ---- ---- ---4 3210 Color + + +***************************************************************************/ + +void burglarx_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // Draw them backwards, for pdrawgfx + for (int offs = (0x800 - 8) / 2; offs >= 0 ; offs -= 8 / 2) + { + int sx = m_spriteram[offs + 0]; + int sy = m_spriteram[offs + 1]; + int code = m_spriteram[offs + 2]; + int const attr = m_spriteram[offs + 3]; + + int const flipx = attr & 0x020; + int const flipy = attr & 0x040; // not sure + + int const dimx = ((attr >> 8) & 0xf) + 1; + + int const priority = ((attr >> 12) & 0x3); + int pri_mask; + + switch (priority) + { + case 0: pri_mask = 0xfe; break; // below all + case 1: pri_mask = 0xf0; break; // above layer 0 + case 2: pri_mask = 0xfc; break; // above layer 1 + default: + case 3: pri_mask = 0x00; // above all + } + + sx += m_sprites_scrolldx; + sy += m_sprites_scrolldy; + + sx = (sx & 0x1ff) - (sx & 0x200); + sy = (sy & 0x1ff) - (sy & 0x200); + + int startx, endx, incx; + + if (flipx) { startx = sx + (dimx - 1) * 16; endx = sx - 16; incx = -16; } + else { startx = sx; endx = sx + dimx * 16; incx = +16; } + + for (int x = startx ; x != endx ; x += incx) + { + m_gfxdecode->gfx(0)->prio_transpen(bitmap, cliprect, + code++, + attr & 0x1f, + flipx, flipy, + x, sy, + screen.priority(), + pri_mask, 0x00); + } + } +} + + +/*************************************************************************** + + + Screen Drawing + + +***************************************************************************/ + +uint32_t burglarx_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int layers_ctrl = -1; + + m_tilemap[0]->set_scrollx(0, m_scroll[0x00]); + m_tilemap[0]->set_scrolly(0, m_scroll[0x01]); + + m_tilemap[1]->set_scrollx(0, m_scroll[0x05]); + m_tilemap[1]->set_scrolly(0, m_scroll[0x0a]); + + m_tilemap[2]->set_scrollx(0, m_scroll[0x04]); + m_tilemap[2]->set_scrolly(0, m_scroll[0x02]); + +#ifdef MAME_DEBUG +if ( machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) ) +{ + int msk = 0; + if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (msk != 0) layers_ctrl &= msk; +} +#endif + + // The background color is the first of the last palette + bitmap.fill(0x1f00, cliprect); + screen.priority().fill(0, cliprect); + + if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 1); + if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 2); + if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0, 4); + + // Sprites are drawn last, using pdrawgfx + if (layers_ctrl & 8) draw_sprites(screen, bitmap, cliprect); + + return 0; +} /*************************************************************************** @@ -48,30 +418,30 @@ Burglar X ***************************************************************************/ -void unico_state::burglarx_okibank_w(uint8_t data) +void burglarx_state::okibank_w(uint8_t data) { m_oki->set_rom_bank(data & 1); } -void unico_state::burglarx_map(address_map &map) +void burglarx_state::program_map(address_map &map) { - map(0x000000, 0x0fffff).rom(); // ROM - map(0xff0000, 0xffffff).ram(); // RAM + map(0x000000, 0x0fffff).rom(); + map(0xff0000, 0xffffff).ram(); map(0x800000, 0x800001).portr("INPUTS"); map(0x800018, 0x800019).portr("SYSTEM"); map(0x80001a, 0x80001b).portr("DSW1"); map(0x80001c, 0x80001d).portr("DSW2"); - map(0x800030, 0x800031).nopw(); // ? 0 - map(0x80010c, 0x800121).rw(FUNC(unico_state::scroll_r), FUNC(unico_state::scroll_w)); // Scroll - map(0x800189, 0x800189).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // Sound + map(0x800030, 0x800031).nopw(); // ? 0 + map(0x80010c, 0x800121).rw(FUNC(burglarx_state::scroll_r), FUNC(burglarx_state::scroll_w)); + map(0x800189, 0x800189).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x80018a, 0x80018a).w("ymsnd", FUNC(ym3812_device::data_w)); map(0x80018c, 0x80018c).rw("ymsnd", FUNC(ym3812_device::status_r), FUNC(ym3812_device::address_w)); - map(0x80018e, 0x80018e).w(FUNC(unico_state::burglarx_okibank_w)); // - map(0x8001e0, 0x8001e1).nopw(); // IRQ Ack - map(0x904000, 0x90ffff).rw(FUNC(unico_state::vram_r), FUNC(unico_state::vram_w)); // Layers 1, 2, 0 - map(0x920000, 0x923fff).ram(); // ? 0 - map(0x930000, 0x9307ff).rw(FUNC(unico_state::spriteram_r), FUNC(unico_state::spriteram_w)); // Sprites - map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette + map(0x80018e, 0x80018e).w(FUNC(burglarx_state::okibank_w)); + map(0x8001e0, 0x8001e1).nopw(); // IRQ Ack + map(0x904000, 0x90ffff).rw(FUNC(burglarx_state::vram_r), FUNC(burglarx_state::vram_w)); // Layers 1, 2, 0 + map(0x920000, 0x923fff).ram(); // ? 0 + map(0x930000, 0x9307ff).rw(FUNC(burglarx_state::spriteram_r), FUNC(burglarx_state::spriteram_w)); + map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } @@ -80,87 +450,69 @@ Zero Point ***************************************************************************/ -void zeropnt_state::zeropnt_okibank_leds_w(uint8_t data) +void zeropnt_state::okibank_leds_w(uint8_t data) { /* Banked sound samples. The 3rd quarter of the ROM contains garbage. Indeed, only banks 0&1 are used */ m_okibank->set_entry(data & 1); - machine().bookkeeping().coin_counter_w(0,data & 0x10); + machine().bookkeeping().coin_counter_w(0, data & 0x10); m_leds[0] = BIT(data, 3); // Start 1 m_leds[1] = BIT(data, 2); // Start 2 } -/* Light Gun - need to wiggle the input slightly otherwise fire doesn't work */ -uint16_t zeropnt_state::gunx_0_msb_r() -{ - int x=m_gun_axes[X0]->read(); - - x=x*384/256; /* On screen pixel X */ - if (x<0x160) x=0x30 + (x*0xd0/0x15f); - else x=((x-0x160) * 0x20)/0x1f; - - return ((x&0xff) ^ (m_screen->frame_number()&1))<<8; -} - -uint16_t zeropnt_state::guny_0_msb_r() +// Light Gun - need to wiggle the input slightly otherwise fire doesn't work +template +uint16_t zeropnt_state::gunx_msb_r() { - int y=m_gun_axes[Y0]->read(); + int x = m_gun_axes[Which]->read(); - y=0x18+((y*0xe0)/0xff); + x = x * 384 / 256; // On screen pixel X + if (x < 0x160) x = 0x30 + (x * 0xd0 / 0x15f); + else x = ((x - 0x160) * 0x20) / 0x1f; - return ((y&0xff) ^ (m_screen->frame_number()&1))<<8; + return ((x & 0xff) ^ (m_screen->frame_number() & 1)) << 8; } -uint16_t zeropnt_state::gunx_1_msb_r() +template +uint16_t zeropnt_state::guny_msb_r() { - int x=m_gun_axes[X1]->read(); + int y = m_gun_axes[Which]->read(); - x=x*384/256; /* On screen pixel X */ - if (x<0x160) x=0x30 + (x*0xd0/0x15f); - else x=((x-0x160) * 0x20)/0x1f; + y = 0x18 + ((y * 0xe0) / 0xff); - return ((x&0xff) ^ (m_screen->frame_number()&1))<<8; + return ((y & 0xff) ^ (m_screen->frame_number() & 1)) << 8; } -uint16_t zeropnt_state::guny_1_msb_r() +void zeropnt_state::program_map(address_map &map) { - int y=m_gun_axes[Y1]->read(); - - y=0x18+((y*0xe0)/0xff); - - return ((y&0xff) ^ (m_screen->frame_number()&1))<<8; -} - -void zeropnt_state::zeropnt_map(address_map &map) -{ - map(0x000000, 0x0fffff).rom(); // ROM - map(0xef0000, 0xefffff).ram(); // RAM - map(0x800030, 0x800031).nopw(); // ? 0 + map(0x000000, 0x0fffff).rom(); + map(0xef0000, 0xefffff).ram(); + map(0x800030, 0x800031).nopw(); // ? 0 map(0x800018, 0x800019).portr("INPUTS"); map(0x80001a, 0x80001b).portr("DSW1"); map(0x80001c, 0x80001d).portr("DSW2"); - map(0x80010c, 0x800121).rw(FUNC(zeropnt_state::scroll_r), FUNC(zeropnt_state::scroll_w)); // Scroll - map(0x800170, 0x800171).r(FUNC(zeropnt_state::guny_0_msb_r)); // Light Guns - map(0x800174, 0x800175).r(FUNC(zeropnt_state::gunx_0_msb_r)); // - map(0x800178, 0x800179).r(FUNC(zeropnt_state::guny_1_msb_r)); // - map(0x80017c, 0x80017d).r(FUNC(zeropnt_state::gunx_1_msb_r)); // - map(0x800189, 0x800189).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // Sound + map(0x80010c, 0x800121).rw(FUNC(zeropnt_state::scroll_r), FUNC(zeropnt_state::scroll_w)); + map(0x800170, 0x800171).r(FUNC(zeropnt_state::guny_msb_r)); + map(0x800174, 0x800175).r(FUNC(zeropnt_state::gunx_msb_r)); + map(0x800178, 0x800179).r(FUNC(zeropnt_state::guny_msb_r)); + map(0x80017c, 0x80017d).r(FUNC(zeropnt_state::gunx_msb_r)); + map(0x800189, 0x800189).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x80018a, 0x80018a).w("ymsnd", FUNC(ym3812_device::data_w)); map(0x80018c, 0x80018c).rw("ymsnd", FUNC(ym3812_device::status_r), FUNC(ym3812_device::address_w)); - map(0x80018e, 0x80018e).w(FUNC(zeropnt_state::zeropnt_okibank_leds_w)); // - map(0x8001e0, 0x8001e1).nopw(); // ? IRQ Ack - map(0x904000, 0x90ffff).rw(FUNC(zeropnt_state::vram_r), FUNC(zeropnt_state::vram_w)); // Layers 1, 2, 0 + map(0x80018e, 0x80018e).w(FUNC(zeropnt_state::okibank_leds_w)); + map(0x8001e0, 0x8001e1).nopw(); // ? IRQ Ack + map(0x904000, 0x90ffff).rw(FUNC(zeropnt_state::vram_r), FUNC(zeropnt_state::vram_w)); // Layers 1, 2, 0 map(0x920000, 0x923fff).ram(); // ? 0 - map(0x930000, 0x9307ff).rw(FUNC(zeropnt_state::spriteram_r), FUNC(zeropnt_state::spriteram_w)); // Sprites - map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette + map(0x930000, 0x9307ff).rw(FUNC(zeropnt_state::spriteram_r), FUNC(zeropnt_state::spriteram_w)); + map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); } -void zeropnt_state::zeropnt_oki_map(address_map &map) +void zeropnt_state::oki_map(address_map &map) { map(0x00000, 0x1ffff).rom(); - map(0x20000, 0x3ffff).bankr("okibank"); + map(0x20000, 0x3ffff).bankr(m_okibank); } @@ -168,19 +520,17 @@ Zero Point 2 ***************************************************************************/ -uint32_t zeropnt2_state::zeropnt2_gunx_0_msb_r() { return (gunx_0_msb_r()-0x0800) << 16; } -uint32_t zeropnt2_state::zeropnt2_guny_0_msb_r() { return (guny_0_msb_r()+0x0800) << 16; } -uint32_t zeropnt2_state::zeropnt2_gunx_1_msb_r() { return (gunx_1_msb_r()-0x0800) << 16; } -uint32_t zeropnt2_state::zeropnt2_guny_1_msb_r() { return (guny_1_msb_r()+0x0800) << 16; } +template uint32_t zeropnt2_state::gunx_msb_r() { return (zeropnt_state::gunx_msb_r() - 0x0800) << 16; } +template uint32_t zeropnt2_state::guny_msb_r() { return (zeropnt_state::guny_msb_r() + 0x0800) << 16; } -void zeropnt2_state::zeropnt2_okibank(uint8_t data) +void zeropnt2_state::okibank(uint8_t data) { m_okibank->set_entry((data & 3) % 4); } void zeropnt2_state::leds_w(uint8_t data) { - machine().bookkeeping().coin_counter_w(0,data & 0x01); + machine().bookkeeping().coin_counter_w(0, data & 0x01); m_leds[0] = BIT(data, 7); // Start 1 m_leds[1] = BIT(data, 6); // Start 2 } @@ -190,7 +540,7 @@ if (data & ~0xfe00000) logerror("%s - Unknown EEPROM bit written %04X\n",machine().describe_context(),data); - if ( ACCESSING_BITS_24_31 ) + if (ACCESSING_BITS_24_31) { // latch the bit m_eeprom->di_write((data & 0x04000000) >> 26); @@ -203,30 +553,30 @@ } } -void zeropnt2_state::zeropnt2_map(address_map &map) +void zeropnt2_state::program_map(address_map &map) { - map(0x000000, 0x1fffff).rom(); // ROM + map(0x000000, 0x1fffff).rom(); map(0x800018, 0x80001b).portr("SYSTEM"); - map(0x800025, 0x800025).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // Sound - map(0x800028, 0x80002f).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask32(0x00ff0000); // - map(0x800031, 0x800031).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // - map(0x800034, 0x800034).w(FUNC(zeropnt2_state::zeropnt2_okibank)); // - map(0x800039, 0x800039).w(FUNC(zeropnt2_state::leds_w)); // ? - map(0x80010c, 0x800123).rw(FUNC(zeropnt2_state::scroll_r), FUNC(zeropnt2_state::scroll_w)); // Scroll - map(0x800140, 0x800143).r(FUNC(zeropnt2_state::zeropnt2_guny_0_msb_r)); // Light Guns - map(0x800144, 0x800147).r(FUNC(zeropnt2_state::zeropnt2_gunx_0_msb_r)); // - map(0x800148, 0x80014b).r(FUNC(zeropnt2_state::zeropnt2_guny_1_msb_r)); // - map(0x80014c, 0x80014f).r(FUNC(zeropnt2_state::zeropnt2_gunx_1_msb_r)); // + map(0x800025, 0x800025).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x800028, 0x80002f).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask32(0x00ff0000); + map(0x800031, 0x800031).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x800034, 0x800034).w(FUNC(zeropnt2_state::okibank)); + map(0x800039, 0x800039).w(FUNC(zeropnt2_state::leds_w)); + map(0x80010c, 0x800123).rw(FUNC(zeropnt2_state::scroll_r), FUNC(zeropnt2_state::scroll_w)); + map(0x800140, 0x800143).r(FUNC(zeropnt2_state::guny_msb_r)); + map(0x800144, 0x800147).r(FUNC(zeropnt2_state::gunx_msb_r)); + map(0x800148, 0x80014b).r(FUNC(zeropnt2_state::guny_msb_r)); + map(0x80014c, 0x80014f).r(FUNC(zeropnt2_state::gunx_msb_r)); map(0x800150, 0x800153).portr("DSW1"); map(0x800154, 0x800157).portr("DSW2"); map(0x80015c, 0x80015f).portr("BUTTONS"); - map(0x8001e0, 0x8001e3).nopw(); // ? IRQ Ack - map(0x8001f0, 0x8001f3).w(FUNC(zeropnt2_state::eeprom_w)); // EEPROM - map(0x904000, 0x90ffff).rw(FUNC(zeropnt2_state::vram_r), FUNC(zeropnt2_state::vram_w)); // Layers 1, 2, 0 - map(0x920000, 0x923fff).ram(); // ? 0 - map(0x930000, 0x9307ff).rw(FUNC(zeropnt2_state::spriteram_r), FUNC(zeropnt2_state::spriteram_w)); // Sprites - map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette - map(0xfe0000, 0xffffff).ram(); // RAM + map(0x8001e0, 0x8001e3).nopw(); // ? IRQ Ack + map(0x8001f0, 0x8001f3).w(FUNC(zeropnt2_state::eeprom_w)); + map(0x904000, 0x90ffff).rw(FUNC(zeropnt2_state::vram_r), FUNC(zeropnt2_state::vram_w)); // Layers 1, 2, 0 + map(0x920000, 0x923fff).ram(); // ? 0 + map(0x930000, 0x9307ff).rw(FUNC(zeropnt2_state::spriteram_r), FUNC(zeropnt2_state::spriteram_w)); + map(0x940000, 0x947fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); + map(0xfe0000, 0xffffff).ram(); } @@ -243,7 +593,7 @@ ***************************************************************************/ static INPUT_PORTS_START( burglarx ) - PORT_START("INPUTS") /* $800000.w */ + PORT_START("INPUTS") // $800000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) @@ -262,7 +612,7 @@ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("SYSTEM") /* $800019.b */ + PORT_START("SYSTEM") // $800019.b PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) @@ -273,22 +623,22 @@ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW1") /* $80001a.b */ + PORT_START("DSW1") // $80001a.b PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_SERVICE( 0x0100, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Free_Play ) ) + PORT_SERVICE( 0x0100, IP_ACTIVE_LOW ) PORT_DIPLOCATION("DIP-A:1") + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DIP-A:2") PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, "Unknown 1-2" ) + PORT_DIPNAME( 0x0400, 0x0400, "Unknown A-3" ) PORT_DIPLOCATION("DIP-A:3") PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DIP-A:4") PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, "Unknown 1-4" ) + PORT_DIPNAME( 0x1000, 0x1000, "Unknown A-5" ) PORT_DIPLOCATION("DIP-A:5") PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0xe000, 0xe000, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0xe000, 0xe000, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DIP-A:6,7,8") PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x2000, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x4000, DEF_STR( 3C_1C ) ) @@ -298,25 +648,25 @@ PORT_DIPSETTING( 0xa000, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x8000, DEF_STR( 1C_4C ) ) - PORT_START("DSW2") /* $80001c.b */ + PORT_START("DSW2") // $80001c.b PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("DIP-B:1,2") PORT_DIPSETTING( 0x0200, DEF_STR( None ) ) PORT_DIPSETTING( 0x0300, "A" ) PORT_DIPSETTING( 0x0100, "B" ) PORT_DIPSETTING( 0x0000, "C" ) - PORT_DIPNAME( 0x0400, 0x0400, "Unknown 2-2" ) + PORT_DIPNAME( 0x0400, 0x0400, "Unknown B-3" ) PORT_DIPLOCATION("DIP-B:3") PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, "Energy" ) + PORT_DIPNAME( 0x0800, 0x0800, "Energy" ) PORT_DIPLOCATION("DIP-B:4") PORT_DIPSETTING( 0x0000, "2" ) PORT_DIPSETTING( 0x0800, "3" ) - PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DIP-B:5,6") PORT_DIPSETTING( 0x2000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Lives ) ) + PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Lives ) ) PORT_DIPLOCATION("DIP-B:7,8") PORT_DIPSETTING( 0x8000, "2" ) PORT_DIPSETTING( 0xc000, "3" ) PORT_DIPSETTING( 0x4000, "4" ) @@ -330,7 +680,7 @@ ***************************************************************************/ static INPUT_PORTS_START( zeropnt ) - PORT_START("INPUTS") /* $800018.w */ + PORT_START("INPUTS") // $800018.w PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_SERVICE_NO_TOGGLE( 0x0004, IP_ACTIVE_HIGH ) @@ -350,24 +700,24 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW1") /* $80001a.b */ + PORT_START("DSW1") // $80001a.b PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-A:!1") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0100, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DIP-A:!2") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0200, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-A:!3") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0400, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DIP-A:!4") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0800, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-A:!5") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x1000, DEF_STR( On ) ) - PORT_DIPNAME( 0xe000, 0x0000, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0xe000, 0x0000, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DIP-A:!6,!7,!8") PORT_DIPSETTING( 0xe000, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0xc000, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0xa000, DEF_STR( 3C_1C ) ) @@ -377,40 +727,40 @@ PORT_DIPSETTING( 0x4000, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x6000, DEF_STR( 1C_4C ) ) - PORT_START("DSW2") /* $80001c.b */ + PORT_START("DSW2") // $80001c.b PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-B:!1") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0100, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-B:!2") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0200, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-B:!3") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0400, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIP-B:!4") PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0800, DEF_STR( On ) ) - PORT_DIPNAME( 0x3000, 0x0000, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x3000, 0x0000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DIP-B:!5,!6") PORT_DIPSETTING( 0x1000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x2000, DEF_STR( Hard ) ) - PORT_DIPNAME( 0xc000, 0x0000, DEF_STR( Lives ) ) + PORT_DIPNAME( 0xc000, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("DIP-B:!7,!8") PORT_DIPSETTING( 0x4000, "2" ) PORT_DIPSETTING( 0x0000, "3" ) PORT_DIPSETTING( 0x8000, "4" ) PORT_DIPSETTING( 0xc000, "5" ) - PORT_START("Y0") /* $800170.b */ + PORT_START("Y0") // $800170.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(2) - PORT_START("X0") /* $800174.b */ + PORT_START("X0") // $800174.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(2) - PORT_START("Y1") /* $800178.b */ + PORT_START("Y1") // $800178.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(1) - PORT_START("X1") /* $80017c.b */ + PORT_START("X1") // $80017c.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(1) INPUT_PORTS_END @@ -421,7 +771,7 @@ ***************************************************************************/ static INPUT_PORTS_START( zeropnt2 ) - PORT_START("SYSTEM") /* $800019.b */ + PORT_START("SYSTEM") // $800019.b PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00010000, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x00020000, IP_ACTIVE_HIGH, IPT_COIN2 ) @@ -433,24 +783,24 @@ PORT_BIT( 0x00800000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0xff000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("DSW1") /* $80001a.b */ + PORT_START("DSW1") // $80001a.b PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_DIPNAME( 0x01000000, 0x01000000, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x01000000, 0x01000000, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DIP-A:1") PORT_DIPSETTING( 0x01000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x02000000, 0x02000000, "? Coins To Continue ?" ) - PORT_DIPSETTING( 0x00000000, "1" ) - PORT_DIPSETTING( 0x02000000, "2" ) - PORT_DIPNAME( 0x0c000000, 0x0c000000, "Gun Reloading" ) + PORT_DIPNAME( 0x02000000, 0x02000000, "1 Coin to Continue" ) PORT_DIPLOCATION("DIP-A:2") // Used when coinage is NOT 1 Coin 1 Credit + PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) ) // Must insert number of coins as per coinage setting to continue + PORT_DIPSETTING( 0x02000000, DEF_STR( On ) ) // Only 1 coin is required to continue regardless of the coinage setting + PORT_DIPNAME( 0x0c000000, 0x0c000000, "Gun Reloading" ) PORT_DIPLOCATION("DIP-A:3,4") PORT_DIPSETTING( 0x08000000, DEF_STR(No) ) PORT_DIPSETTING( 0x04000000, DEF_STR(Yes) ) PORT_DIPSETTING( 0x0c000000, "Factory Setting" ) -// PORT_DIPSETTING( 0x00000000, "unused?" ) - PORT_DIPNAME( 0x10000000, 0x10000000, DEF_STR( Language ) ) + PORT_DIPSETTING( 0x00000000, "unused?" ) + PORT_DIPNAME( 0x10000000, 0x10000000, DEF_STR( Language ) ) PORT_DIPLOCATION("DIP-A:5") PORT_DIPSETTING( 0x10000000, DEF_STR( English ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( Japanese ) ) - PORT_DIPNAME( 0xe0000000, 0xe0000000, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0xe0000000, 0xe0000000, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DIP-A:6,7,8") PORT_DIPSETTING( 0x00000000, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x20000000, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x40000000, DEF_STR( 3C_1C ) ) @@ -460,16 +810,16 @@ PORT_DIPSETTING( 0xa0000000, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x80000000, DEF_STR( 1C_4C ) ) - PORT_START("DSW2") /* $80001c.b */ + PORT_START("DSW2") // $80001c.b PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_DIPNAME( 0x01000000, 0x01000000, "Korean Language" ) + PORT_DIPNAME( 0x01000000, 0x01000000, "Korean Language" ) PORT_DIPLOCATION("DIP-B:1") PORT_DIPSETTING( 0x01000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x02000000, 0x00000000, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x02000000, 0x00000000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DIP-B:2") PORT_DIPSETTING( 0x02000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1c000000, 0x1c000000, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x1c000000, 0x1c000000, DEF_STR( Lives ) ) PORT_DIPLOCATION("DIP-B:3,4,5") PORT_DIPSETTING( 0x10000000, "2" ) PORT_DIPSETTING( 0x0c000000, "3" ) PORT_DIPSETTING( 0x1c000000, "4" ) @@ -478,16 +828,16 @@ PORT_DIPSETTING( 0x08000000, "4 (duplicate)" ) PORT_DIPSETTING( 0x04000000, "4 (duplicate)" ) PORT_DIPSETTING( 0x00000000, "4 (duplicate)" ) - PORT_DIPNAME( 0x20000000, 0x20000000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20000000, 0x20000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DIP-B:6") PORT_DIPSETTING( 0x20000000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0000000, 0xc0000000, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0xc0000000, 0xc0000000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DIP-B:7,8") PORT_DIPSETTING( 0x80000000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0xc0000000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x40000000, DEF_STR( Harder ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( Hardest ) ) - PORT_START("BUTTONS") /* $80015c.b */ + PORT_START("BUTTONS") // $80015c.b PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) @@ -497,18 +847,18 @@ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) // EEPROM + PORT_BIT( 0x80000000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) - PORT_START("Y0") /* $800140.b */ + PORT_START("Y0") // $800140.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(2) - PORT_START("X0") /* $800144.b */ + PORT_START("X0") // $800144.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(2) - PORT_START("Y1") /* $800148.b */ + PORT_START("Y1") // $800148.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(1) - PORT_START("X1") /* $80014c.b */ + PORT_START("X1") // $80014c.b PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_PLAYER(1) INPUT_PORTS_END @@ -522,7 +872,7 @@ ***************************************************************************/ -/* 16x16x8 */ +// 16x16x8 static const gfx_layout layout_16x16x8 = { 16,16, @@ -538,8 +888,8 @@ }; static GFXDECODE_START( gfx_unico ) - GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x8, 0x0, 0x20 ) // [0] Sprites - GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x8, 0x0, 0x20 ) // [1] Layers + GFXDECODE_ENTRY( "sprites", 0, layout_16x16x8, 0x0, 0x20 ) + GFXDECODE_ENTRY( "tiles", 0, layout_16x16x8, 0x0, 0x20 ) GFXDECODE_END @@ -553,7 +903,7 @@ ***************************************************************************/ -void unico_state::machine_start() +void burglarx_state::machine_start() { m_leds.resolve(); } @@ -563,34 +913,34 @@ Burglar X ***************************************************************************/ -void unico_state::burglarx(machine_config &config) +void burglarx_state::burglarx(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &unico_state::burglarx_map); - m_maincpu->set_vblank_int("screen", FUNC(unico_state::irq2_line_hold)); + // basic machine hardware + M68000(config, m_maincpu, 32_MHz_XTAL / 2); // 16MHz + m_maincpu->set_addrmap(AS_PROGRAM, &burglarx_state::program_map); + m_maincpu->set_vblank_int("screen", FUNC(burglarx_state::irq2_line_hold)); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(384, 224); screen.set_visarea(0, 384-1, 0, 224-1); - screen.set_screen_update(FUNC(unico_state::screen_update)); + screen.set_screen_update(FUNC(burglarx_state::screen_update)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico); - PALETTE(config, m_palette).set_format(4, &unico_state::unico_R6G6B6X, 8192); + PALETTE(config, m_palette).set_format(4, &burglarx_state::unico_R6G6B6X, 8192); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); /* 3.579545 MHz */ + ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181) / 4)); // 3.579545 MHz ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.40); ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.40); - OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified + OKIM6295(config, m_oki, 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80); m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80); } @@ -603,18 +953,18 @@ void zeropnt_state::machine_start() { - unico_state::machine_start(); + burglarx_state::machine_start(); m_okibank->configure_entries(0, 4, memregion("oki")->base() + 0x20000, 0x20000); } void zeropnt_state::zeropnt(machine_config &config) { - /* basic machine hardware */ - M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt_state::zeropnt_map); + // basic machine hardware + M68000(config, m_maincpu, 32_MHz_XTAL / 2); // 16MHz + m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt_state::program_map); m_maincpu->set_vblank_int("screen", FUNC(zeropnt_state::irq2_line_hold)); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -626,16 +976,16 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico); PALETTE(config, m_palette).set_format(4, &zeropnt_state::unico_R6G6B6X, 8192); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); /* 3.579545 MHz */ + ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181) / 4)); // 3.579545 MHz ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.40); ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.40); - OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified - m_oki->set_addrmap(0, &zeropnt_state::zeropnt_oki_map); + OKIM6295(config, m_oki, 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 verified + m_oki->set_addrmap(0, &zeropnt_state::oki_map); m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80); m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80); } @@ -648,20 +998,20 @@ void zeropnt2_state::machine_start() { - unico_state::machine_start(); + burglarx_state::machine_start(); m_okibank->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000); } void zeropnt2_state::zeropnt2(machine_config &config) { - /* basic machine hardware */ - M68EC020(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt2_state::zeropnt2_map); + // basic machine hardware + M68EC020(config, m_maincpu, 32_MHz_XTAL / 2); // 16MHz + m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt2_state::program_map); m_maincpu->set_vblank_int("screen", FUNC(zeropnt2_state::irq2_line_hold)); EEPROM_93C46_8BIT(config, "eeprom"); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); @@ -673,14 +1023,14 @@ GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico); PALETTE(config, m_palette).set_format(4, &zeropnt2_state::unico_R6G6B6X, 8192); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - YM2151(config, "ymsnd", XTAL(14'318'181)/4).add_route(0, "lspeaker", 0.70).add_route(1, "rspeaker", 0.70); /* 3.579545 MHz */ + YM2151(config, "ymsnd", XTAL(14'318'181) / 4).add_route(0, "lspeaker", 0.70).add_route(1, "rspeaker", 0.70); // 3.579545 MHz okim6295_device &oki1(OKIM6295(config, "oki1", 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified - oki1.set_addrmap(0, &zeropnt2_state::zeropnt_oki_map); + oki1.set_addrmap(0, &zeropnt2_state::oki_map); oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.40); oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.40); @@ -712,12 +1062,12 @@ ***************************************************************************/ ROM_START( burglarx ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "bx-rom2.pgm", 0x000000, 0x080000, CRC(f81120c8) SHA1(f0240cf9aceb755e3c920bc3bcae0a9de29fd8c1) ) ROM_LOAD16_BYTE( "bx-rom3.pgm", 0x000001, 0x080000, CRC(080b4e82) SHA1(7eb08a7ea7684297e879123ae7ddc88d7fc1b87b) ) - /* Notice the weird ROMs order? Pretty much bit scrambling */ - ROM_REGION( 0x400000, "gfx1", ROMREGION_INVERT ) /* 16x16x8 Sprites */ + // Notice the weird ROMs order? Pretty much bit scrambling + ROM_REGION( 0x400000, "sprites", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD16_BYTE( "bx-rom4", 0x000000, 0x080000, CRC(f74ce31f) SHA1(bafe247a2fdc918318ccf7b11f0406c78909dcaa) ) ROM_LOAD16_BYTE( "bx-rom10", 0x000001, 0x080000, CRC(6f56ca23) SHA1(5cfedda8d9fe4b575932a6a136d7b525d96e5454) ) ROM_LOAD16_BYTE( "bx-rom9", 0x100000, 0x080000, CRC(33f29d79) SHA1(287d8412842887af5a5c7a0f5e5736a741c3c7db) ) @@ -727,7 +1077,7 @@ ROM_LOAD16_BYTE( "bx-rom11", 0x300000, 0x080000, CRC(898d176a) SHA1(4c85948b7e639743d0f1676fdc463267f550f97c) ) ROM_LOAD16_BYTE( "bx-rom5", 0x300001, 0x080000, CRC(fdee1423) SHA1(319610435b3dea61276d412e2bf6a3f32809ae19) ) - ROM_REGION( 0x400000, "gfx2", ROMREGION_INVERT ) /* 16x16x8 Layers */ + ROM_REGION( 0x400000, "tiles", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD16_BYTE( "bx-rom14", 0x000000, 0x080000, CRC(30413373) SHA1(37bbc4d2943a32ee9f6bb268c823ffe162fe92a2) ) ROM_LOAD16_BYTE( "bx-rom18", 0x000001, 0x080000, CRC(8e7fc99f) SHA1(81141e3c9111944aae97d27e5631b11eaf6f8734) ) ROM_LOAD16_BYTE( "bx-rom19", 0x100000, 0x080000, CRC(d40eabcd) SHA1(e41d5e921a1648d6d4907f18e0256dbe3a01e9d3) ) @@ -737,7 +1087,7 @@ ROM_LOAD16_BYTE( "bx-rom13", 0x300000, 0x080000, CRC(da34bbb5) SHA1(455c2412135b89670c2ecda9fd02f4da9b891ee4) ) ROM_LOAD16_BYTE( "bx-rom16", 0x300001, 0x080000, CRC(55b28ef9) SHA1(48615d53ac955ba6aca86ad4f8b61f4d2675d840) ) - ROM_REGION( 0x80000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000, "oki", 0 ) ROM_LOAD( "bx-rom1.snd", 0x000000, 0x080000, CRC(8ae67138) SHA1(3ea44f805a1f978e0a1c1bb7f45507379b147bc0) ) // 2 x 40000 ROM_END @@ -777,67 +1127,67 @@ ***************************************************************************/ ROM_START( zeropnt ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "unico_2.rom2", 0x000000, 0x080000, CRC(1e599509) SHA1(5a562a3c85700126b95fbdf21ef8c0ddd35d9037) ) ROM_LOAD16_BYTE( "unico_3.rom3", 0x000001, 0x080000, CRC(588aeef7) SHA1(0dfa22c9e7b1fe493c16160b1ac76fa4d3bb2e68) ) - ROM_REGION( 0x800000, "gfx1", ROMREGION_INVERT ) /* 16x16x8 Sprites */ + ROM_REGION( 0x800000, "sprites", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpobj_z01.bin", 0x000000, 0x200000, CRC(1f2768a3) SHA1(75c83458afc527dda47bfbd86a8e9c5ded7a5444) ) ROM_LOAD( "unico_zpobj_z02.bin", 0x200000, 0x200000, CRC(de34f33a) SHA1(b77c7d508942176585afaeeaea2f34f60326eeb1) ) ROM_LOAD( "unico_zpobj_z03.bin", 0x400000, 0x200000, CRC(d7a657f7) SHA1(f1f9e6a01eef4d0c8c4b2e161136cc4438d770e2) ) ROM_LOAD( "unico_zpobj_z04.bin", 0x600000, 0x200000, CRC(3aec2f8d) SHA1(6fb1cfabfb0bddf688d3bfb60f7538209efbd8f1) ) - ROM_REGION( 0x800000, "gfx2", ROMREGION_INVERT ) /* 16x16x8 Layers */ + ROM_REGION( 0x800000, "tiles", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpscr_z06.bin", 0x000000, 0x200000, CRC(e1e53cf0) SHA1(b440e09f6229d486d1a8be476ac8a17adde1ff7e) ) ROM_LOAD( "unico_zpscr_z05.bin", 0x200000, 0x200000, CRC(0d7d4850) SHA1(43f87d0461fe022b68b4e57e6c9542bcd78e301b) ) ROM_LOAD( "unico_zpscr_z07.bin", 0x400000, 0x200000, CRC(bb178f32) SHA1(1354f4d90a8cec58d1f2b6809985776b309b96a8) ) ROM_LOAD( "unico_zpscr_z08.bin", 0x600000, 0x200000, CRC(672f02e5) SHA1(8e8b28a8b2293950764d453a3c385d7083eb5a57) ) - ROM_REGION( 0x80000 * 2, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000 * 2, "oki", 0 ) ROM_LOAD( "unico_1.rom1", 0x000000, 0x080000, CRC(fd2384fa) SHA1(8ae83665fe952c5d03bd62d2abb507c351cf0fb5) ) ROM_END ROM_START( zeropnta ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "unico2.rom2", 0x000000, 0x080000, CRC(285fbca3) SHA1(61f8d48388a666ed9300c0688fbf844e316b8892) ) ROM_LOAD16_BYTE( "unico3.rom3", 0x000001, 0x080000, CRC(ad7b3129) SHA1(d814b5d9336d011386aa0b316b11225e5ea799fc) ) - ROM_REGION( 0x800000, "gfx1", ROMREGION_INVERT ) /* 16x16x8 Sprites */ + ROM_REGION( 0x800000, "sprites", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpobj_z01.bin", 0x000000, 0x200000, CRC(1f2768a3) SHA1(75c83458afc527dda47bfbd86a8e9c5ded7a5444) ) ROM_LOAD( "unico_zpobj_z02.bin", 0x200000, 0x200000, CRC(de34f33a) SHA1(b77c7d508942176585afaeeaea2f34f60326eeb1) ) ROM_LOAD( "unico_zpobj_z03.bin", 0x400000, 0x200000, CRC(d7a657f7) SHA1(f1f9e6a01eef4d0c8c4b2e161136cc4438d770e2) ) ROM_LOAD( "unico_zpobj_z04.bin", 0x600000, 0x200000, CRC(3aec2f8d) SHA1(6fb1cfabfb0bddf688d3bfb60f7538209efbd8f1) ) - ROM_REGION( 0x800000, "gfx2", ROMREGION_INVERT ) /* 16x16x8 Layers */ + ROM_REGION( 0x800000, "tiles", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpscr_z06.bin", 0x000000, 0x200000, CRC(e1e53cf0) SHA1(b440e09f6229d486d1a8be476ac8a17adde1ff7e) ) ROM_LOAD( "unico_zpscr_z05.bin", 0x200000, 0x200000, CRC(0d7d4850) SHA1(43f87d0461fe022b68b4e57e6c9542bcd78e301b) ) ROM_LOAD( "unico_zpscr_z07.bin", 0x400000, 0x200000, CRC(bb178f32) SHA1(1354f4d90a8cec58d1f2b6809985776b309b96a8) ) ROM_LOAD( "unico_zpscr_z08.bin", 0x600000, 0x200000, CRC(672f02e5) SHA1(8e8b28a8b2293950764d453a3c385d7083eb5a57) ) - ROM_REGION( 0x80000 * 2, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000 * 2, "oki", 0 ) ROM_LOAD( "unico_1.rom1", 0x000000, 0x080000, CRC(fd2384fa) SHA1(8ae83665fe952c5d03bd62d2abb507c351cf0fb5) ) ROM_END ROM_START( zeropntj ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "unico_2.bin", 0x000000, 0x080000, CRC(098d9756) SHA1(c98ae2774d2eff7d0ea66887c57d4b55d6939ad8) ) ROM_LOAD16_BYTE( "unico_3.bin", 0x000001, 0x080000, CRC(58e105f3) SHA1(6069ec030d6ce11ec4b9514f366197068f1220ee) ) - ROM_REGION( 0x800000, "gfx1", ROMREGION_INVERT ) /* 16x16x8 Sprites */ + ROM_REGION( 0x800000, "sprites", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpobj_z01.bin", 0x000000, 0x200000, CRC(1f2768a3) SHA1(75c83458afc527dda47bfbd86a8e9c5ded7a5444) ) - ROM_LOAD( "unico_4.bin", 0x200000, 0x200000, CRC(529c36ee) SHA1(3c1d1b94b9cf84fd07689cd5fbfe86820bb878e6) ) /* EPROM Containing graphics data for Japanese text */ + ROM_LOAD( "unico_4.bin", 0x200000, 0x200000, CRC(529c36ee) SHA1(3c1d1b94b9cf84fd07689cd5fbfe86820bb878e6) ) // EPROM Containing graphics data for Japanese text ROM_LOAD( "unico_zpobj_z03.bin", 0x400000, 0x200000, CRC(d7a657f7) SHA1(f1f9e6a01eef4d0c8c4b2e161136cc4438d770e2) ) ROM_LOAD( "unico_zpobj_z04.bin", 0x600000, 0x200000, CRC(3aec2f8d) SHA1(6fb1cfabfb0bddf688d3bfb60f7538209efbd8f1) ) - ROM_REGION( 0x800000, "gfx2", ROMREGION_INVERT ) /* 16x16x8 Layers */ + ROM_REGION( 0x800000, "tiles", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "unico_zpscr_z06.bin", 0x000000, 0x200000, CRC(e1e53cf0) SHA1(b440e09f6229d486d1a8be476ac8a17adde1ff7e) ) ROM_LOAD( "unico_zpscr_z05.bin", 0x200000, 0x200000, CRC(0d7d4850) SHA1(43f87d0461fe022b68b4e57e6c9542bcd78e301b) ) ROM_LOAD( "unico_zpscr_z07.bin", 0x400000, 0x200000, CRC(bb178f32) SHA1(1354f4d90a8cec58d1f2b6809985776b309b96a8) ) ROM_LOAD( "unico_zpscr_z08.bin", 0x600000, 0x200000, CRC(672f02e5) SHA1(8e8b28a8b2293950764d453a3c385d7083eb5a57) ) - ROM_REGION( 0x80000 * 2, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000 * 2, "oki", 0 ) ROM_LOAD( "unico_1.rom1", 0x000000, 0x080000, CRC(fd2384fa) SHA1(8ae83665fe952c5d03bd62d2abb507c351cf0fb5) ) ROM_END @@ -1004,29 +1354,31 @@ ***************************************************************************/ ROM_START( zeropnt2 ) - ROM_REGION( 0x200000, "maincpu", 0 ) /* 68020 Code */ + ROM_REGION( 0x200000, "maincpu", 0 ) // 68020 code ROM_LOAD32_WORD_SWAP( "d16-d31.4", 0x000000, 0x100000, CRC(48314fdb) SHA1(a5bdb6a3f520587ff5e73438dc414cfdff34167b) ) ROM_LOAD32_WORD_SWAP( "d0-d15.3", 0x000002, 0x100000, CRC(5ec4151e) SHA1(f7c857bdb6a92f76f09a089b37def7e6cf24b65a) ) - ROM_REGION( 0x1000000, "gfx1", ROMREGION_INVERT ) /* 16x16x8 Sprites */ + ROM_REGION( 0x1000000, "sprites", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "db0db1zp.209", 0x000000, 0x400000, CRC(474b460c) SHA1(72104b7a00cb6d62b3cee2cfadc928669ca948c4) ) ROM_LOAD( "db2db3zp.210", 0x400000, 0x400000, CRC(0a1d0a88) SHA1(b0a6ba9eba539fff417557c9af60d408c2912491) ) ROM_LOAD( "db4db5zp.211", 0x800000, 0x400000, CRC(227169dc) SHA1(b03d8d46714e5aa3631fde7d65466334dafdc341) ) ROM_LOAD( "db6db7zp.212", 0xc00000, 0x400000, CRC(a6306cdb) SHA1(da48c5981b72b87df40602e03e56a40a24728262) ) - ROM_REGION( 0x1000000, "gfx2", ROMREGION_INVERT ) /* 16x16x8 Layers */ + ROM_REGION( 0x1000000, "tiles", ROMREGION_INVERT ) // 16x16x8 ROM_LOAD( "a0-a1zp.205", 0x000000, 0x400000, CRC(f7ca9c0e) SHA1(541139b617ff34c378a506cf88fe97234c93ee20) ) ROM_LOAD( "a2-a3zp.206", 0x400000, 0x400000, CRC(0581c8fe) SHA1(9bbffc9c758bbaba2b43a63811b725e51996268a) ) ROM_LOAD( "a4-a5zp.208", 0x800000, 0x400000, CRC(ddd091ef) SHA1(c1751aef2546a35f2fdbfeca9647a88fd3e65cdd) ) ROM_LOAD( "a6-a7zp.207", 0xc00000, 0x400000, CRC(3fd46113) SHA1(326684b92c258bde318693cd9b3a7660aed3cd6f) ) - ROM_REGION( 0x80000 * 2, "oki1", 0 ) /* Samples */ + ROM_REGION( 0x80000 * 2, "oki1", 0 ) ROM_LOAD( "uzp2-1.bin", 0x000000, 0x080000, CRC(ed0966ed) SHA1(a43b9c493f94d1fb11e1b189caaf37d3d792c730) ) - ROM_REGION( 0x40000, "oki2", 0 ) /* Samples */ + ROM_REGION( 0x40000, "oki2", 0 ) ROM_LOAD( "uzp2-2.bin", 0x000000, 0x040000, CRC(db8cb455) SHA1(6723b4018208d554bd1bf1e0640b72d2f4f47302) ) ROM_END +} // anonymous namespace + /*************************************************************************** @@ -1036,8 +1388,8 @@ ***************************************************************************/ -GAME( 1997, burglarx, 0, burglarx, burglarx, unico_state, empty_init, ROT0, "Unico", "Burglar X" , 0 ) -GAME( 1998, zeropnt, 0, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (set 1)", 0 ) -GAME( 1998, zeropnta, zeropnt, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (set 2)", 0 ) -GAME( 1998, zeropntj, zeropnt, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (Japan)", 0 ) -GAME( 1999, zeropnt2, 0, zeropnt2, zeropnt2, zeropnt2_state, empty_init, ROT0, "Unico", "Zero Point 2", 0 ) +GAME( 1997, burglarx, 0, burglarx, burglarx, burglarx_state, empty_init, ROT0, "Unico", "Burglar X" , MACHINE_SUPPORTS_SAVE ) +GAME( 1998, zeropnt, 0, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, zeropnta, zeropnt, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1998, zeropntj, zeropnt, zeropnt, zeropnt, zeropnt_state, empty_init, ROT0, "Unico", "Zero Point (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1999, zeropnt2, 0, zeropnt2, zeropnt2, zeropnt2_state, empty_init, ROT0, "Unico", "Zero Point 2", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/unico/unico.h mame-0.264+dfsg.1/src/mame/unico/unico.h --- mame-0.263+dfsg.1/src/mame/unico/unico.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/unico/unico.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia -#ifndef MAME_UNICO_UNICO_H -#define MAME_UNICO_UNICO_H - -#pragma once - -#include "sound/okim6295.h" -#include "machine/eepromser.h" -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class unico_state : public driver_device -{ -public: - unico_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_palette(*this, "palette"), - m_gfxdecode(*this, "gfxdecode"), - m_oki(*this, "oki"), - m_leds(*this, "led%u", 0U), - m_vram(*this, "vram", 0xc000, ENDIANNESS_BIG), - m_scroll(*this, "scroll", 22, ENDIANNESS_BIG), - m_spriteram(*this, "spriteram", 0x800, ENDIANNESS_BIG) - { } - - void burglarx(machine_config &config); - -protected: - static rgb_t unico_R6G6B6X(uint32_t raw); - uint16_t vram_r(offs_t offset); - void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t scroll_r(offs_t offset); - void scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t spriteram_r(offs_t offset); - void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - - void burglarx_okibank_w(uint8_t data); - TILE_GET_INFO_MEMBER(get_tile_info); - virtual void machine_start() override; - virtual void video_start() override; - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect); - - void burglarx_map(address_map &map); - - required_device m_maincpu; - required_device m_palette; - required_device m_gfxdecode; - optional_device m_oki; - output_finder<2> m_leds; - -private: - memory_share_creator m_vram; - memory_share_creator m_scroll; - tilemap_t *m_tilemap[3]{}; - int m_sprites_scrolldx = 0; - int m_sprites_scrolldy = 0; - memory_share_creator m_spriteram; -}; - -class zeropnt_state : public unico_state -{ -public: - zeropnt_state(const machine_config &mconfig, device_type type, const char *tag) : - unico_state(mconfig, type, tag), - m_okibank(*this, "okibank"), - m_screen(*this, "screen"), - m_gun_axes(*this, { "Y0", "X0", "Y1", "X1" }) - { } - - void zeropnt(machine_config &config); - -protected: - virtual void machine_start() override; - - void zeropnt_okibank_leds_w(uint8_t data); - uint16_t gunx_0_msb_r(); - uint16_t guny_0_msb_r(); - uint16_t gunx_1_msb_r(); - uint16_t guny_1_msb_r(); - - required_memory_bank m_okibank; - - required_device m_screen; - - void zeropnt_map(address_map &map); - void zeropnt_oki_map(address_map &map); - -private: - enum { Y0, X0, Y1, X1 }; // gun axis indices - - required_ioport_array<4> m_gun_axes; -}; - -class zeropnt2_state : public zeropnt_state -{ -public: - zeropnt2_state(const machine_config &mconfig, device_type type, const char *tag) : - zeropnt_state(mconfig, type, tag), - m_eeprom(*this, "eeprom") - { } - - void zeropnt2(machine_config &config); - -protected: - virtual void machine_start() override; - - uint32_t zeropnt2_gunx_0_msb_r(); - uint32_t zeropnt2_guny_0_msb_r(); - uint32_t zeropnt2_gunx_1_msb_r(); - uint32_t zeropnt2_guny_1_msb_r(); - void zeropnt2_okibank(uint8_t data); - void leds_w(uint8_t data); - - void eeprom_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - - void zeropnt2_map(address_map &map); - -private: - required_device m_eeprom; -}; - -#endif // MAME_UNICO_UNICO_H diff -Nru mame-0.263+dfsg.1/src/mame/unico/unico_v.cpp mame-0.264+dfsg.1/src/mame/unico/unico_v.cpp --- mame-0.263+dfsg.1/src/mame/unico/unico_v.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/unico/unico_v.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia -/*************************************************************************** - - -= Unico Games =- - - driver by Luca Elia (l.elia@tin.it) - - -Note: if MAME_DEBUG is defined, pressing Z with: - - Q / W / E Shows Layer 0 / 1 / 2 - A Shows Sprites - - Keys can be used together! - - - [ 3 Scrolling Layers ] - - Tile Size: 16 x 16 x 8 - Layer Size (tiles): 64 x 64 - - [ 512 Sprites ] - - Sprites are made of 16 x 16 x 8 tiles. Size can vary from 1 to - 16 tiles horizontally, while their height is always 1 tile. - There seems to be 4 levels of priority (wrt layers) for each - sprite, following this simple scheme: - - [if we denote the three layers with 0-3 (0 being the backmost) - and the sprite with S] - - Sprite Priority Order (back -> front) - 0 S 0 1 2 - 1 0 S 1 2 - 2 0 1 S 2 - 3 0 1 2 S - -***************************************************************************/ - -#include "emu.h" -#include "unico.h" - - -/*************************************************************************** - - Palette - - Byte: 0 1 2 3 - Gun: R G B 0 - - 6 Bits x Gun - -***************************************************************************/ - -rgb_t unico_state::unico_R6G6B6X(uint32_t raw) -{ - int const red = (raw >> 24) & 0xfc; - int const green = (raw >> 16) & 0xfc; - int const blue = (raw >> 8) & 0xfc; - - return rgb_t(red | (red >> 6), green | (green >> 6), blue | (blue >> 6)); -} - -/*************************************************************************** - - Tilemaps - - Offset: Bits: Value: - - 0.w Code - 2.w fedc ba98 7--- ---- - ---- ---- -6-- ---- Flip Y - ---- ---- --5- ---- Flip X - ---- ---- ---4 3210 Color - -***************************************************************************/ - - -TILE_GET_INFO_MEMBER(unico_state::get_tile_info) -{ - uint16_t *vram = (uint16_t *)tilemap.user_data(); - uint16_t code = vram[2 * tile_index + 0 ]; - uint16_t attr = vram[2 * tile_index + 1 ]; - tileinfo.set(1, code, attr & 0x1f, TILE_FLIPYX( attr >> 5 )); -} - -uint16_t unico_state::vram_r(offs_t offset) { return m_vram[offset]; } - -void unico_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - int tile = ((offset / 0x2000) + 1) % 3; - COMBINE_DATA(&m_vram[offset]); - m_tilemap[tile]->mark_tile_dirty((offset & 0x1fff)/2); -} - - -uint16_t unico_state::scroll_r(offs_t offset) { return m_scroll[offset]; } -void unico_state::scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_scroll[offset]); } -uint16_t unico_state::spriteram_r(offs_t offset) { return m_spriteram[offset]; } -void unico_state::spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { COMBINE_DATA(&m_spriteram[offset]); } - - -/*************************************************************************** - - - Video Hardware Init - - -***************************************************************************/ - - -void unico_state::video_start() -{ - m_tilemap[0] = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unico_state::get_tile_info)), TILEMAP_SCAN_ROWS, - 16,16, 0x40, 0x40); - - m_tilemap[1] = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unico_state::get_tile_info)), TILEMAP_SCAN_ROWS, - 16,16, 0x40, 0x40); - - m_tilemap[2] = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(unico_state::get_tile_info)), TILEMAP_SCAN_ROWS, - 16,16, 0x40, 0x40); - - m_tilemap[0]->set_user_data(&m_vram[0x8000/2]); - m_tilemap[1]->set_user_data(&m_vram[0x0000/2]); - m_tilemap[2]->set_user_data(&m_vram[0x4000/2]); - - m_sprites_scrolldx = -0x3f; - m_sprites_scrolldy = -0x0e; - - m_tilemap[0]->set_scrolldx(-0x32,0); - m_tilemap[1]->set_scrolldx(-0x30,0); - m_tilemap[2]->set_scrolldx(-0x2e,0); - - m_tilemap[0]->set_scrolldy(-0x0f,0); - m_tilemap[1]->set_scrolldy(-0x0f,0); - m_tilemap[2]->set_scrolldy(-0x0f,0); - - m_tilemap[0]->set_transparent_pen(0x00); - m_tilemap[1]->set_transparent_pen(0x00); - m_tilemap[2]->set_transparent_pen(0x00); -} - - -/*************************************************************************** - - Sprites Drawing - - - 0.w X - - 2.w Y - - 4.w Code - - 6.w fe-- ---- ---- ---- - --dc ---- ---- ---- Priority - ---- ba98 ---- ---- Number of tiles along X, minus 1 - ---- ---- 7--- ---- - ---- ---- -6-- ---- Flip Y? - ---- ---- --5- ---- Flip X - ---- ---- ---4 3210 Color - - -***************************************************************************/ - -void unico_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect) -{ - int offs; - - /* Draw them backwards, for pdrawgfx */ - for ( offs = (0x800-8)/2; offs >= 0 ; offs -= 8/2 ) - { - int x, startx, endx, incx; - - int sx = m_spriteram[ offs + 0 ]; - int sy = m_spriteram[ offs + 1 ]; - int code = m_spriteram[ offs + 2 ]; - int attr = m_spriteram[ offs + 3 ]; - - int flipx = attr & 0x020; - int flipy = attr & 0x040; // not sure - - int dimx = ((attr >> 8) & 0xf) + 1; - - int priority = ((attr >> 12) & 0x3); - int pri_mask; - - switch( priority ) - { - case 0: pri_mask = 0xfe; break; // below all - case 1: pri_mask = 0xf0; break; // above layer 0 - case 2: pri_mask = 0xfc; break; // above layer 1 - default: - case 3: pri_mask = 0x00; // above all - } - - sx += m_sprites_scrolldx; - sy += m_sprites_scrolldy; - - sx = (sx & 0x1ff) - (sx & 0x200); - sy = (sy & 0x1ff) - (sy & 0x200); - - if (flipx) { startx = sx+(dimx-1)*16; endx = sx-16; incx = -16; } - else { startx = sx; endx = sx+dimx*16; incx = +16; } - - for (x = startx ; x != endx ; x += incx) - { - m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect, - code++, - attr & 0x1f, - flipx, flipy, - x, sy, - screen.priority(), - pri_mask,0x00 ); - } - } -} - - -/*************************************************************************** - - - Screen Drawing - - -***************************************************************************/ - -uint32_t unico_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int layers_ctrl = -1; - - m_tilemap[0]->set_scrollx(0, m_scroll[0x00]); - m_tilemap[0]->set_scrolly(0, m_scroll[0x01]); - - m_tilemap[1]->set_scrollx(0, m_scroll[0x05]); - m_tilemap[1]->set_scrolly(0, m_scroll[0x0a]); - - m_tilemap[2]->set_scrollx(0, m_scroll[0x04]); - m_tilemap[2]->set_scrolly(0, m_scroll[0x02]); - -#ifdef MAME_DEBUG -if ( machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) ) -{ - int msk = 0; - if (machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (machine().input().code_pressed(KEYCODE_A)) msk |= 8; - if (msk != 0) layers_ctrl &= msk; -} -#endif - - /* The background color is the first of the last palette */ - bitmap.fill(0x1f00, cliprect); - screen.priority().fill(0, cliprect); - - if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0,1); - if (layers_ctrl & 2) m_tilemap[1]->draw(screen, bitmap, cliprect, 0,2); - if (layers_ctrl & 4) m_tilemap[2]->draw(screen, bitmap, cliprect, 0,4); - - /* Sprites are drawn last, using pdrawgfx */ - if (layers_ctrl & 8) draw_sprites(screen,bitmap,cliprect); - - return 0; -} diff -Nru mame-0.263+dfsg.1/src/mame/universal/cheekyms.cpp mame-0.264+dfsg.1/src/mame/universal/cheekyms.cpp --- mame-0.263+dfsg.1/src/mame/universal/cheekyms.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/universal/cheekyms.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -81,8 +81,6 @@ }; -// video - // bit 3 and 7 of the char color PROMs are used for something -- not currently emulated - thus GAME_IMPERFECT_GRAPHICS void cheekyms_state::palette(palette_device &palette) const @@ -268,8 +266,6 @@ } -// machine - INPUT_CHANGED_MEMBER(cheekyms_state::coin_inserted) { // this starts a 556 one-shot timer (and triggers a sound effect) diff -Nru mame-0.263+dfsg.1/src/mame/universal/docastle.cpp mame-0.264+dfsg.1/src/mame/universal/docastle.cpp --- mame-0.263+dfsg.1/src/mame/universal/docastle.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/universal/docastle.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -420,6 +420,15 @@ PORT_DIPSETTING( 0x00, "5" ) INPUT_PORTS_END +static INPUT_PORTS_START( runrun ) + PORT_INCLUDE( dorunrun ) + + PORT_MODIFY("DSW1") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:1") + PORT_DIPSETTING( 0x80, "1" ) + PORT_DIPSETTING( 0x00, "2" ) +INPUT_PORTS_END + static INPUT_PORTS_START( dowild ) PORT_INCLUDE( docastle ) @@ -819,6 +828,33 @@ ROM_LOAD( "dorunrun.clr", 0x0000, 0x0100, CRC(d5bab5d5) SHA1(7a465fe30b6008793d33f6e07086c89111e1e407) ) ROM_END + // Italian bootleg of dorunrunc. Main PCB + 040285C riser board. Differences are just revised number of lives and the 'Do!' and copyright drawing routines NOPed out. +ROM_START( runrun ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "electric_1.bin", 0x0000, 0x2000, CRC(9f23896b) SHA1(609103729b0d9721166ee5e50e4adab09d343f0a) ) // only different ROM + ROM_LOAD( "electric_2.bin", 0x2000, 0x2000, CRC(dbe3e7db) SHA1(168026aacce73941329a72e78423f83f7c4f0f04) ) + ROM_LOAD( "electric_3.bin", 0x4000, 0x2000, CRC(e9b8181a) SHA1(6b960c3503589e62b61f9a2af372b98c48412bc0) ) + ROM_LOAD( "electric_4.bin", 0x6000, 0x2000, CRC(a63d0b89) SHA1(d2ab3b76149e6620f1eb93a051c802b208b8d6dc) ) + + ROM_REGION( 0x10000, "slave", 0 ) + ROM_LOAD( "electric_10.bin", 0x0000, 0x4000, CRC(6dac2fa3) SHA1(cd583f379f01788ce20f611f17689105d32ef97a) ) + + ROM_REGION( 0x10000, "cpu3", 0 ) + ROM_LOAD( "bprom2.bin", 0x0000, 0x0200, BAD_DUMP CRC(2747ca77) SHA1(abc0ca05925974c4b852827605ee2f1caefb8524) ) // not dumped for this set + + ROM_REGION( 0x4000, "gfx1", 0 ) + ROM_LOAD( "electric_5.bin", 0x0000, 0x4000, CRC(e20795b7) SHA1(ae4366d2c45580f3e60ae36f81a5fc912d1eb899) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "electric_6.bin", 0x0000, 0x2000, CRC(4bb231a0) SHA1(350423a1e602e23b229095021942d4b14a4736a7) ) + ROM_LOAD( "electric_7.bin", 0x2000, 0x2000, CRC(0c08508a) SHA1(1e235a0f44207c53af2c8da631e5a8e08b231258) ) + ROM_LOAD( "electric_8.bin", 0x4000, 0x2000, CRC(79287039) SHA1(e2e3c056f35a22e48115557e10fcd172ad2f91f1) ) + ROM_LOAD( "electric_9.bin", 0x6000, 0x2000, CRC(523aa999) SHA1(1d4aa0af79a2ed7b935d4ce92d978bf738f08eb3) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "dorunrun.clr", 0x0000, 0x0100, BAD_DUMP CRC(d5bab5d5) SHA1(7a465fe30b6008793d33f6e07086c89111e1e407) ) // not dumped for this set +ROM_END + ROM_START( dorunrun ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "2764.p1", 0x0000, 0x2000, CRC(95c86f8e) SHA1(9fe44911e0aa8d4c7299472a31c401e064d63d17) ) @@ -1118,6 +1154,7 @@ GAME( 1984, dorunrun2, dorunrun, dorunrun, dorunrun, docastle_state, empty_init, ROT0, "Universal", "Do! Run Run (set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, dorunrunc, dorunrun, docastle, dorunrun, docastle_state, empty_init, ROT0, "Universal", "Do! Run Run (Do's Castle hardware, set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, dorunrunca, dorunrun, docastle, dorunrun, docastle_state, empty_init, ROT0, "Universal", "Do! Run Run (Do's Castle hardware, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, runrun, dorunrun, docastle, runrun, docastle_state, empty_init, ROT0, "bootleg", "Run Run (Do! Run Run bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, spiero, dorunrun, dorunrun, dorunrun, docastle_state, empty_init, ROT0, "Universal", "Super Pierrot (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, dowild, 0, dorunrun, dowild, docastle_state, empty_init, ROT0, "Universal", "Mr. Do's Wild Ride", MACHINE_SUPPORTS_SAVE ) GAME( 1984, jjack, 0, dorunrun, jjack, docastle_state, empty_init, ROT270, "Universal", "Jumping Jack", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/upl/mouser.cpp mame-0.264+dfsg.1/src/mame/upl/mouser.cpp --- mame-0.263+dfsg.1/src/mame/upl/mouser.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/upl/mouser.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -79,8 +79,6 @@ }; -// video - /******************************************************************************* Mouser - Video Hardware: @@ -222,8 +220,6 @@ } -// machine - // Mouser has external masking circuitry around the NMI input on the main CPU void mouser_state::nmi_enable_w(int state) { diff -Nru mame-0.263+dfsg.1/src/mame/upl/xxmissio.cpp mame-0.264+dfsg.1/src/mame/upl/xxmissio.cpp --- mame-0.263+dfsg.1/src/mame/upl/xxmissio.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/upl/xxmissio.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -89,8 +89,6 @@ }; -// video - void xxmissio_state::scroll_x_w(uint8_t data) { m_xscroll = data; @@ -227,8 +225,6 @@ } -// machine - void xxmissio_state::bank_sel_w(uint8_t data) { m_subbank->set_entry(data & 7); diff -Nru mame-0.263+dfsg.1/src/mame/ussr/debut.cpp mame-0.264+dfsg.1/src/mame/ussr/debut.cpp --- mame-0.263+dfsg.1/src/mame/ussr/debut.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ussr/debut.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -86,7 +86,7 @@ required_device m_maincpu; required_device m_board; required_device m_display; - required_device m_dac; + required_device m_dac; output_finder<4> m_out_digit; required_ioport m_inputs; @@ -209,7 +209,7 @@ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME(u8"АН (Analysis)") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME(u8"ХОД (Force Move)") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME(u8"ИНТ (Switch 1P/2P)") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME(u8"ПОЗ (Position Mode)") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME(u8"ПОЗ (Position Mode)") PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME(u8"ВФ (Select Piece)") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME(u8"ВП (Take Back)") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME(u8"УР (Level)") diff -Nru mame-0.263+dfsg.1/src/mame/ussr/im01.cpp mame-0.264+dfsg.1/src/mame/ussr/im01.cpp --- mame-0.263+dfsg.1/src/mame/ussr/im01.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/ussr/im01.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -123,7 +123,7 @@ // devices/pointers required_device m_maincpu; required_device m_display; - required_device m_dac; + required_device m_dac; required_ioport_array<6> m_inputs; u16 m_inp_mux = 0; @@ -326,7 +326,7 @@ PORT_MODIFY("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME(u8"ПХ (Hint)") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME(u8"Р (Promotion)") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME(u8"Р (Promotion)") PORT_MODIFY("IN.2") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Confirm") diff -Nru mame-0.263+dfsg.1/src/mame/valadon/tankbust.cpp mame-0.264+dfsg.1/src/mame/valadon/tankbust.cpp --- mame-0.263+dfsg.1/src/mame/valadon/tankbust.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/valadon/tankbust.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -121,8 +121,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -340,8 +338,6 @@ } -// machine - void tankbust_state::machine_start() { m_mainbank[0]->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); diff -Nru mame-0.263+dfsg.1/src/mame/venture/spcforce.cpp mame-0.264+dfsg.1/src/mame/venture/spcforce.cpp --- mame-0.263+dfsg.1/src/mame/venture/spcforce.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/venture/spcforce.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -109,8 +109,6 @@ }; -// video - uint32_t spcforce_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int const flip = flip_screen(); @@ -141,8 +139,6 @@ } -// machine - void spcforce_state::machine_start() { m_lamps.resolve(); diff -Nru mame-0.263+dfsg.1/src/mame/venture/suprridr.cpp mame-0.264+dfsg.1/src/mame/venture/suprridr.cpp --- mame-0.263+dfsg.1/src/mame/venture/suprridr.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/venture/suprridr.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -169,8 +169,6 @@ }; -// video - /************************************* * * Tilemap callbacks @@ -367,8 +365,6 @@ } -// machine - void suprridr_state::machine_start() { save_item(NAME(m_nmi_enable)); diff -Nru mame-0.263+dfsg.1/src/mame/visual/v50.cpp mame-0.264+dfsg.1/src/mame/visual/v50.cpp --- mame-0.263+dfsg.1/src/mame/visual/v50.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/v50.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,366 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual Technology Visual 50/55 + + VT52 compatible terminal + + Hardware: + - D780C (Z80) + - 2764 and 2732 EPROM + - 2x TMM314APL-1 (1k RAM) + - X2210D NOVRAM (64x4) (X2210 for REV A) + - Intel P8253-5 PIT + - D8255AC-5 PPI + - 2x D8251AC USART + - SCN2672A (SCN2672 N for REV A) + - 2673 + - TMM2016P-2 (2k VRAM) + - C68100 IC240-001R00 (character generator?) + - 17.320 MHz XTAL + + TODO: + - Screen attributes (reverse sometimes works) + - Smooth scroll + - Screen brightness control + - Most PPI connections are unknown + - AUX port + + Notes: + - PCB marked "PA015-A REV A" for R08 firmware + - PCB marked "PA015 REV B 1183" for R11 firmware + - Use TERM=vi50 and disable AUTO LF/CR in setup mode + +***************************************************************************/ + +#include "emu.h" + +#include "v50_kbd.h" + +#include "bus/rs232/rs232.h" +#include "cpu/z80/z80.h" +#include "machine/i8251.h" +#include "machine/i8255.h" +#include "machine/input_merger.h" +#include "machine/pit8253.h" +#include "machine/x2212.h" +#include "video/scn2674.h" + +#include "emupal.h" +#include "screen.h" + + +namespace { + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class visual50_state : public driver_device +{ +public: + visual50_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_novram(*this, "novram"), + m_pit(*this, "pit"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_pvtc(*this, "pvtc"), + m_usart(*this, "usart%u", 0U), + m_vram(*this, "vram"), + m_chargen(*this, "chargen") + { } + + void visual50(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_novram; + required_device m_pit; + required_device m_screen; + required_device m_palette; + required_device m_pvtc; + required_device_array m_usart; + required_shared_ptr m_vram; + required_region_ptr m_chargen; + + void mem_map(address_map &map); + void io_map(address_map &map); + void char_map(address_map &map); + + SCN2672_DRAW_CHARACTER_MEMBER(draw_character); + + void ppi_porta_w(uint8_t data); + void ppi_portb_w(uint8_t data); + void ppi_portc_w(uint8_t data); + + uint8_t recall_r(); + void recall_w(uint8_t data); + uint8_t store_r(); + void store_w(uint8_t data); +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void visual50_state::mem_map(address_map &map) +{ + map(0x0000, 0x2fff).rom().region("maincpu", 0); + map(0x8000, 0x83ff).ram(); + map(0xa000, 0xa03f).rw(m_novram, FUNC(x2210_device::read), FUNC(x2210_device::write)); + map(0xc000, 0xc000).rw(FUNC(visual50_state::recall_r), FUNC(visual50_state::recall_w)); + map(0xe000, 0xe000).rw(FUNC(visual50_state::store_r), FUNC(visual50_state::store_w)); +} + +void visual50_state::io_map(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x07).rw(m_pvtc, FUNC(scn2672_device::read), FUNC(scn2672_device::write)); + map(0x10, 0x11).rw(m_usart[0], FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x20, 0x21).rw(m_usart[1], FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x40, 0x40).r(m_pvtc, FUNC(scn2672_device::buffer_r)); + map(0x50, 0x50).w(m_pvtc, FUNC(scn2672_device::buffer_w)); + map(0x60, 0x63).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x70, 0x73).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); +} + +void visual50_state::char_map(address_map &map) +{ + map(0x000, 0x7ff).ram().share("vram"); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( visual50 ) +INPUT_PORTS_END + + +//************************************************************************** +// VIDEO EMULATION +//************************************************************************** + +SCN2672_DRAW_CHARACTER_MEMBER( visual50_state::draw_character ) +{ + uint16_t data = m_chargen[(charcode & 0x7f) << 4 | linecount]; + const pen_t *const pen = m_palette->pens(); + + if (BIT(charcode, 7)) + data = ~data; // wrong + + if (cursor) + data = ~data; + + // foreground/background colors + rgb_t fg = pen[2]; + rgb_t bg = pen[0]; + + // draw 9 pixels of the character + for (int i = 0; i < 9; i++) + bitmap.pix(y, x + i) = BIT(data, 8 - i) ? fg : bg; +} + +static const gfx_layout char_layout = +{ + 8, 12, + RGN_FRAC(1,1), + 1, + { 0 }, + { STEP8(0, 1) }, + { STEP16(0, 8) }, + 8 * 16 +}; + +static GFXDECODE_START( chars ) + GFXDECODE_ENTRY("chargen", 0, char_layout, 0, 1) +GFXDECODE_END + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void visual50_state::ppi_porta_w(uint8_t data) +{ + // 7------- unknown + // -6------ unknown + // --5----- unknown + // ---43210 brightness (0x00 = brightest, 0x1f = darkest) + + logerror("porta_w: %02x\n", data); +} + +void visual50_state::ppi_portb_w(uint8_t data) +{ + // 7------- unknown + // -6------ monitor mode + // --5----- unknown + // ---4---- reverse video + // ----3--- unknown + // -----2-- local echo + // ------1- unknown + // -------0 unknown + + logerror("portb_w: %02x\n", data); +} + +void visual50_state::ppi_portc_w(uint8_t data) +{ + // 7------- unknown + // -6------ rs232/current loop + // --5----- unknown + // ---4---- unknown, toggles + // ----3--- reverse video + // -----2-- unknown + // ------1- unknown + // -------0 unknown + + logerror("portc_w: %02x\n", data); +} + +uint8_t visual50_state::recall_r() +{ + if (!machine().side_effects_disabled()) + { + m_novram->recall(1); + m_novram->recall(0); + } + + return 0xff; +} + +void visual50_state::recall_w(uint8_t data) +{ + m_novram->recall(1); + m_novram->recall(0); +} + +uint8_t visual50_state::store_r() +{ + if (!machine().side_effects_disabled()) + { + m_novram->store(1); + m_novram->store(0); + } + + return 0xff; +} + +void visual50_state::store_w(uint8_t data) +{ + m_novram->store(1); + m_novram->store(0); +} + +void visual50_state::machine_start() +{ +} + +void visual50_state::machine_reset() +{ +} + + +//************************************************************************** +// MACHINE DEFINITIONS +//************************************************************************** + +void visual50_state::visual50(machine_config &config) +{ + Z80(config, m_maincpu, 17.320_MHz_XTAL / 8); // divider not verified + m_maincpu->set_addrmap(AS_PROGRAM, &visual50_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &visual50_state::io_map); + + INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + + X2210(config, m_novram); + + PIT8253(config, m_pit, 0); + m_pit->set_clk<0>(17.320_MHz_XTAL / 8); + m_pit->set_clk<1>(17.320_MHz_XTAL / 8); + m_pit->set_clk<2>(17.320_MHz_XTAL / 8); + m_pit->out_handler<0>().set(m_usart[0], FUNC(i8251_device::write_rxc)); // or txc? + m_pit->out_handler<1>().set(m_usart[1], FUNC(i8251_device::write_rxc)); + m_pit->out_handler<1>().append(m_usart[1], FUNC(i8251_device::write_txc)); + m_pit->out_handler<2>().set(m_usart[0], FUNC(i8251_device::write_txc)); // or rxc? + + i8255_device &ppi(I8255(config, "ppi")); + ppi.out_pa_callback().set(FUNC(visual50_state::ppi_porta_w)); + ppi.out_pb_callback().set(FUNC(visual50_state::ppi_portb_w)); + ppi.out_pc_callback().set(FUNC(visual50_state::ppi_portc_w)); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(17.320_MHz_XTAL, 900, 0, 720, 321, 0, 300); + m_screen->set_screen_update(m_pvtc, FUNC(scn2672_device::screen_update)); + + PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); + + GFXDECODE(config, "gfxdecode", m_palette, chars); + + SCN2672(config, m_pvtc, 17.320_MHz_XTAL / 9); + m_pvtc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + m_pvtc->set_screen("screen"); + m_pvtc->set_character_width(9); + m_pvtc->set_display_callback(FUNC(visual50_state::draw_character)); + m_pvtc->set_addrmap(0, &visual50_state::char_map); + + // modem port + I8251(config, m_usart[0], 17.320_MHz_XTAL / 8); // divider not verified + m_usart[0]->rxrdy_handler().set("mainirq", FUNC(input_merger_device::in_w<0>)); + m_usart[0]->txd_handler().set("modem", FUNC(rs232_port_device::write_txd)); + m_usart[0]->rts_handler().set("modem", FUNC(rs232_port_device::write_rts)); + + rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, nullptr)); + modem.rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd)); + modem.cts_handler().set(m_usart[0], FUNC(i8251_device::write_cts)); + + // keyboard + I8251(config, m_usart[1], 17.320_MHz_XTAL / 8); // divider not verified + m_usart[1]->rxrdy_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); + m_usart[1]->txd_handler().set("kbd", FUNC(v50_kbd_device::rxd_w)); + + v50_kbd_device &kbd(V50_KBD(config, "kbd")); + kbd.txd_cb().set(m_usart[1], FUNC(i8251_device::write_rxd)); + kbd.cts_cb().set(m_usart[1], FUNC(i8251_device::write_cts)); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( visual50 ) + ROM_REGION(0x3000, "maincpu", 0) + ROM_DEFAULT_BIOS("r11") + ROM_SYSTEM_BIOS(0, "r08", "Revision 0.08") + ROMX_LOAD("e244-012_r08.u2", 0x0000, 0x2000, CRC(3931796d) SHA1(1f71b977e021a2f5eb5437c4056991cc7601768b), ROM_BIOS(0)) + ROMX_LOAD("e262-055_r08.u3", 0x2000, 0x1000, CRC(20067dc0) SHA1(bf8051117876246b3c3ba88c1c750e146800ca0b), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "r11", "Revision 0.11") + ROMX_LOAD("e244-012_r11.u2", 0x0000, 0x2000, CRC(755f0722) SHA1(80b90882c52c9ddcc1cf455c9195d4e1ccda8ce8), ROM_BIOS(1)) + ROMX_LOAD("e262-055_r11.u3", 0x2000, 0x1000, CRC(90a142e8) SHA1(5f4c403b7ab09dcb3cfdc8f57f65e0a52992feed), ROM_BIOS(1)) + + ROM_REGION(0x800, "chargen", 0) + ROM_LOAD("ic240-001r00.u32", 0x000, 0x800, CRC(5041acd0) SHA1(ef3d952140c33c6cf2712463b53e8fca4a5400f4)) +ROM_END + + +} // anonymous namespace + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1983, visual50, 0, 0, visual50, visual50, visual50_state, empty_init, "Visual Technology", "Visual 50", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/visual/v50_kbd.cpp mame-0.264+dfsg.1/src/mame/visual/v50_kbd.cpp --- mame-0.263+dfsg.1/src/mame/visual/v50_kbd.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/v50_kbd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,265 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual 50 Keyboard + + Hardware: + - B125 20-08048-131 SMA3051 (hard to read) + - 48-300-007 XTAL (apparently that's 4.608 MHz) + - D2758 EPROM labeled "241" + - Buzzer + + Notes: + - Key Tronic A65-02428-001 PCB-201A + - There is an alternate version using an 8048 with embedded ROM, + part number 20-08048-161 + +***************************************************************************/ + +#include "emu.h" +#include "v50_kbd.h" + +#include "speaker.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(V50_KBD, v50_kbd_device, "v50_kbd", "Visual 50 Keyboard") + +v50_kbd_device::v50_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, V50_KBD, tag, owner, 0U), + m_mcu(*this, "mcu"), + m_buzzer(*this, "buzzer"), + m_keys(*this, "row_%x", 0U), + m_txd_cb(*this), + m_cts_cb(*this), + m_prog(true), + m_key_row(0x0f) +{ +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( firmware ) + ROM_REGION(0x400, "mcu", 0) + ROM_LOAD("241.bin", 0x000, 0x400, CRC(244ee196) SHA1(5224887097004894ab9f4876f3217f3da08801da)) +ROM_END + +const tiny_rom_entry *v50_kbd_device::device_rom_region() const +{ + return ROM_NAME( firmware ); +} + + +//************************************************************************** +// MACHINE DEFINITIONS +//************************************************************************** + +void v50_kbd_device::device_add_mconfig(machine_config &config) +{ + I8048(config, m_mcu, 4.608_MHz_XTAL); // needed for the correct baud rate + m_mcu->p1_in_cb().set(FUNC(v50_kbd_device::p1_r)); + m_mcu->p2_out_cb().set(FUNC(v50_kbd_device::p2_w)); + m_mcu->prog_out_cb().set(FUNC(v50_kbd_device::prog_w)); + + SPEAKER(config, "mono").front_center(); + + BEEP(config, m_buzzer, 786); // unknown frequency + m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.5); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( keyboard ) + PORT_START("row_0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RCONTROL) PORT_NAME("FUNCTION") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Left Shift") // or RSHIFT? + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Shift") // or LSHIFT? + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA_PAD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // 94 + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(u8"\u2193 AUX") // ↓ + + PORT_START("row_1") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Keypad .") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_NAME("Keypad 2 CP") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_NAME("Keypad 5 EL") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(u8"\u2191 F3") // ↑ + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(u8"\u2192 F2") // → + + PORT_START("row_2") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CANCEL) PORT_CHAR(UCHAR_MAMEKEY(CANCEL)) PORT_NAME("BREAK") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_NAME("Keypad 6 EP") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_NAME("Keypad 3 DL") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(u8"\u2190 F1") // ← + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // f0 + + PORT_START("row_3") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_NAME("Keypad 8 HM") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(10) PORT_NAME("LINE FEED") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_NAME("Keypad 4 EF") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_NAME("Keypad 1 IL") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // ec + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // e8 + + PORT_START("row_4") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 98 + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) // 9c + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // e4 + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // e0 + + PORT_START("row_5") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // 00 + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // dc + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // d8 + + PORT_START("row_6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // d4 + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // d0 + + PORT_START("row_7") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // cc + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // c8 + + PORT_START("row_8") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NO SCROLL") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // c4 + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_NAME("SET-UP") + + PORT_START("row_9") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + + PORT_START("row_a") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + + PORT_START("row_b") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + + PORT_START("row_c") + PORT_BIT(0xff, 0xff, IPT_UNUSED) + + PORT_START("row_d") + PORT_BIT(0xff, 0xff, IPT_UNUSED) + + PORT_START("row_e") + PORT_BIT(0xff, 0xff, IPT_UNUSED) + + PORT_START("row_f") + PORT_BIT(0xff, 0xff, IPT_UNUSED) +INPUT_PORTS_END + +ioport_constructor v50_kbd_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( keyboard ); +} + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void v50_kbd_device::device_start() +{ + // register for save states + save_item(NAME(m_prog)); + save_item(NAME(m_key_row)); +} + +void v50_kbd_device::device_reset() +{ + // always use external rom + m_mcu->set_input_line(MCS48_INPUT_EA, CLEAR_LINE); + + // signal we are connected to the host + m_cts_cb(0); +} + +void v50_kbd_device::rxd_w(int state) +{ + m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE); +} + +uint8_t v50_kbd_device::p1_r() +{ + return m_keys[m_key_row]->read(); +} + +void v50_kbd_device::p2_w(uint8_t data) +{ + m_buzzer->set_state(BIT(~data, 6)); + m_txd_cb(BIT(data, 7)); +} + +void v50_kbd_device::prog_w(int state) +{ + // set new keyboard row from p2 on transition 0->1 + if (!m_prog && bool(state)) + m_key_row = m_mcu->p2_r() & 0x0f; + + m_prog = bool(state); +} diff -Nru mame-0.263+dfsg.1/src/mame/visual/v50_kbd.h mame-0.264+dfsg.1/src/mame/visual/v50_kbd.h --- mame-0.263+dfsg.1/src/mame/visual/v50_kbd.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/v50_kbd.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,62 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual 50 Keyboard + +***************************************************************************/ + +#ifndef MAME_VISUAL_V50_KBD_H +#define MAME_VISUAL_V50_KBD_H + +#pragma once + +#include "cpu/mcs48/mcs48.h" +#include "sound/beep.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class v50_kbd_device : public device_t +{ +public: + // construction/destruction + v50_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + // callbacks + auto txd_cb() { return m_txd_cb.bind(); } + auto cts_cb() { return m_cts_cb.bind(); } + + // from host + void rxd_w(int state); + +protected: + // device_t overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; + +private: + required_device m_mcu; + required_device m_buzzer; + required_ioport_array<16> m_keys; + + devcb_write_line m_txd_cb; + devcb_write_line m_cts_cb; + + bool m_prog; + uint8_t m_key_row; + + uint8_t p1_r(); + void p2_w(uint8_t data); + void prog_w(int state); +}; + +// device type declaration +DECLARE_DEVICE_TYPE(V50_KBD, v50_kbd_device) + +#endif // MAME_VISUAL_V50_KBD_H diff -Nru mame-0.263+dfsg.1/src/mame/visual/xds.cpp mame-0.264+dfsg.1/src/mame/visual/xds.cpp --- mame-0.263+dfsg.1/src/mame/visual/xds.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/xds.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,362 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual Technology X Display Station (XDS19P) + + Hardware: + - MC68HC000P12F + - 2x 27C010L-15 EPROM on cartridge (+ 4 empty sockets) + - 32x KM44C256AP-8 / MCM514256AP80 / MT4C4256-8 (4M DRAM) + - 4x HM53461P-10 (128k VRAM) + - DS1225Y NVRAM + - AM7990PC LANCE + - MC68B45 CRTC + - SCN68681C1N40 + - MC68B50P + - 16.667 MHz XTAL, 100 MHz XTAL + - XTAL X1 3.6864 MHz (assumed, unreadable), XTAL X2 (unreadable) + - 4 position DIP switch + - Buzzer + + TODO: + - Verify and hook up irq mask + - Source and timing of clock interrupt + - What's irq1 connected to? + - Remaining DUART output/input port bits + - Real DIP switch meaning + - Buzzer + - Better screen rendering using the MC6845? + - Configurable RAM + - Mouse port loopback test + + Notes: + - PCB marked "VISUAL 55-0106-000 REV A WL3-94V1" + - The diagnostic serial loopback test passes if you attach + the "dec_loopback" slot device + - "romboot" is not possible because the sockets aren't populated. You + need to boot the system over the network instead. + +***************************************************************************/ + +#include "emu.h" + +#include "xds_kbd.h" + +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/rs232.h" +#include "cpu/m68000/m68000.h" +#include "machine/6850acia.h" +#include "machine/am79c90.h" +#include "machine/clock.h" +#include "machine/mc68681.h" +#include "machine/nvram.h" +#include "video/mc6845.h" + +#include "screen.h" + + +namespace { + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class xds_state : public driver_device +{ +public: + xds_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_screen(*this, "screen"), + m_crtc(*this, "crtc"), + m_lance(*this, "lance"), + m_duart(*this, "duart"), + m_serialport(*this, "serialport"), + m_mouseport(*this, "mouseport"), + m_acia(*this, "acia"), + m_vram(*this, "vram"), + m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG), + m_prom(*this, "prom"), + m_sw1(*this, "sw1") + { } + + void xds19p(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_screen; + required_device m_crtc; + required_device m_lance; + required_device m_duart; + required_device m_serialport; + required_device m_mouseport; + required_device m_acia; + required_shared_ptr m_vram; + memory_share_creator m_nvram; + required_memory_region m_prom; + required_ioport m_sw1; + + uint8_t m_irq_mask = 0x00; + + void mem_map(address_map &map); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + uint16_t lance_dma_r(offs_t offset, uint16_t mem_mask); + void lance_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask); + + uint8_t dip_prom_r(offs_t offset); + void output_w(uint8_t data); + uint8_t nvram_r(offs_t offset); + void nvram_w(offs_t offset, uint8_t data); + uint8_t irq_mask_r(); + void irq_mask_w(uint8_t data); +}; + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void xds_state::mem_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom().region("maincpu", 0); + map(0x200000, 0x2001ff).r(FUNC(xds_state::dip_prom_r)).umask16(0x00ff); + map(0x400000, 0x400003).rw(m_lance, FUNC(am7990_device::regs_r), FUNC(am7990_device::regs_w)); + map(0x500000, 0x500003).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0x00ff); + map(0x600000, 0x60001f).rw(m_duart, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff); + map(0x700000, 0x700001).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)).umask16(0x00ff); + map(0x700002, 0x700003).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)).umask16(0x00ff); + map(0x800000, 0xbfffff).ram(); // fixed 4M for now + map(0xc00000, 0xc00003).rw(FUNC(xds_state::irq_mask_r), FUNC(xds_state::irq_mask_w)).umask16(0xff00); + map(0xd00000, 0xd1ffff).ram().share("vram"); + map(0xe00000, 0xe03fff).ram().rw(FUNC(xds_state::nvram_r), FUNC(xds_state::nvram_w)).umask16(0xff00); +} + + +//************************************************************************** +// INPUT PORT DEFINITIONS +//************************************************************************** + +static INPUT_PORTS_START( xds ) + PORT_START("sw1") + PORT_DIPNAME( 0xf, 0x5, "Video Mode?") + PORT_DIPSETTING( 0x0, "0" ) + PORT_DIPSETTING( 0x1, "1 - 1152x904 @72" ) + PORT_DIPSETTING( 0x2, "2 - 1024x864 @72" ) + PORT_DIPSETTING( 0x3, "3" ) + PORT_DIPSETTING( 0x4, "4" ) + PORT_DIPSETTING( 0x5, "5 - 1152x904 @72" ) // this (and 1) seems to be correct for this model + PORT_DIPSETTING( 0x6, "6 - 1152x904 @66" ) + PORT_DIPSETTING( 0x7, "7 - 1024x800 @88" ) + PORT_DIPSETTING( 0x8, "8" ) + PORT_DIPSETTING( 0x9, "9" ) + PORT_DIPSETTING( 0xa, "a" ) + PORT_DIPSETTING( 0xb, "b" ) + PORT_DIPSETTING( 0xc, "c" ) + PORT_DIPSETTING( 0xd, "d" ) + PORT_DIPSETTING( 0xe, "e" ) + PORT_DIPSETTING( 0xf, "f" ) +INPUT_PORTS_END + + +//************************************************************************** +// VIDEO EMULATION +//************************************************************************** + +uint32_t xds_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + for (unsigned y = 0; y < 904; y++) + { + uint32_t *line = &bitmap.pix(y); + + for (unsigned x = 0; x < 1152 / 16; x++) + { + uint16_t data = m_vram[y * (1152 / 16) + x]; + + for (unsigned b = 0; b < 16; b++) + *line++ = BIT(data, 15 - b) ? rgb_t::white() : rgb_t::black(); + } + } + + return 0; +} + + +//************************************************************************** +// NETWORK +//************************************************************************** + +uint16_t xds_state::lance_dma_r(offs_t offset, uint16_t mem_mask) +{ + return m_maincpu->space(AS_PROGRAM).read_word(offset, mem_mask); +} + +void xds_state::lance_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + m_maincpu->space(AS_PROGRAM).write_word(offset, data, mem_mask); +} + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +uint8_t xds_state::dip_prom_r(offs_t offset) +{ + uint8_t data = 0; + + data |= (m_sw1->read() & 0xf) << 4; + data |= (m_prom->as_u8(offset) & 0xf); + + return data; +} + +void xds_state::output_w(uint8_t data) +{ + // 76------ unknown + // --5----- serial port spds + // ---4---- unknown + // ----3--- toggles at a rate of 32 hz + // -----2-- unknown + // ------1- serial rts + // -------0 serial dtr + + // maybe, but gives ~80 instead of ~100 in the clocktest diagnostic + if (BIT(data, 3)) + m_maincpu->pulse_input_line(2, attotime::from_usec(1)); + + m_serialport->write_dtr(BIT(~data, 0)); + m_serialport->write_rts(BIT(data, 1)); + m_serialport->write_spds(BIT(~data, 5)); +} + +uint8_t xds_state::nvram_r(offs_t offset) +{ + return m_nvram[offset]; +} + +void xds_state::nvram_w(offs_t offset, uint8_t data) +{ + m_nvram[offset] = data; +} + +uint8_t xds_state::irq_mask_r() +{ + return m_irq_mask; +} + +void xds_state::irq_mask_w(uint8_t data) +{ + logerror("irq_mask_w: %02x\n", data); + m_irq_mask = data; +} + +void xds_state::machine_start() +{ + // register for save states + save_item(NAME(m_irq_mask)); +} + +void xds_state::machine_reset() +{ +} + + +//************************************************************************** +// MACHINE DEFINTIONS +//************************************************************************** + +static void mouse_devices(device_slot_interface &device) +{ + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); +} + +void xds_state::xds19p(machine_config &config) +{ + M68000(config, m_maincpu, 16.667_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &xds_state::mem_map); + + NVRAM(config, "nvram"); + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(100_MHz_XTAL, 1472, 0, 1152, 941, 0, 904); + m_screen->set_screen_update(FUNC(xds_state::screen_update)); + + MC6845(config, m_crtc, 100_MHz_XTAL / 64); + m_crtc->set_screen("screen"); + m_crtc->set_show_border_area(false); + m_crtc->set_char_width(64); + + AM7990(config, m_lance, 0); + m_lance->intr_out().set_inputline(m_maincpu, 5).invert(); + m_lance->dma_in().set(FUNC(xds_state::lance_dma_r)); + m_lance->dma_out().set(FUNC(xds_state::lance_dma_w)); + + MC68681(config, m_duart, 3.6864_MHz_XTAL); // xtal unreadable + m_duart->irq_cb().set_inputline(m_maincpu, 4); + m_duart->outport_cb().set(FUNC(xds_state::output_w)); + m_duart->a_tx_cb().set(m_mouseport, FUNC(rs232_port_device::write_txd)); + m_duart->b_tx_cb().set(m_serialport, FUNC(rs232_port_device::write_txd)); + + RS232_PORT(config, m_mouseport, mouse_devices, "msystems_mouse"); + m_mouseport->rxd_handler().set(m_duart, FUNC(mc68681_device::rx_a_w)); + m_mouseport->dsr_handler().set(m_duart, FUNC(mc68681_device::ip4_w)); + + RS232_PORT(config, m_serialport, default_rs232_devices, nullptr); + m_serialport->rxd_handler().set(m_duart, FUNC(mc68681_device::rx_b_w)); + m_serialport->dsr_handler().set(m_duart, FUNC(mc68681_device::ip0_w)); + m_serialport->cts_handler().set(m_duart, FUNC(mc68681_device::ip1_w)); + m_serialport->dcd_handler().set(m_duart, FUNC(mc68681_device::ip2_w)); + m_serialport->si_handler().set(m_duart, FUNC(mc68681_device::ip5_w)); + + ACIA6850(config, m_acia, 0); + m_acia->irq_handler().set_inputline(m_maincpu, 3); + m_acia->txd_handler().set("kbd", FUNC(xds_kbd_hle_device::rx_w)); + + // probably clocked externally instead + clock_device &acia_clock(CLOCK(config, "acia_clock", 1200 * 16)); + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_rxc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_txc)); + + // keyboard + xds_kbd_hle_device &kbd(XDS_KBD_HLE(config, "kbd")); + kbd.tx_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + kbd.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( xds19p ) + ROM_REGION16_BE(0x40000, "maincpu", 0) + ROM_LOAD16_BYTE("boot_30.e6", 0x00000, 0x20000, CRC(32449da2) SHA1(e1bc41987fb9c7da5b7fed5d6714c3451be4438c)) + ROM_LOAD16_BYTE("boot_30.e15", 0x00001, 0x20000, CRC(a577087f) SHA1(2fe9d4d49fd6e8ecd230f8097f7004238afbb626)) + + ROM_REGION(0x100, "prom", 0) + ROM_LOAD("1837.e06d", 0x000, 0x100, CRC(b5d9f883) SHA1(28303155c515ac2638a06123fbf7e55f89dd2af9)) + + // not a real rom, this file needs to be provided by a tftp server to the system to boot + ROM_REGION(1045320, "tftp", 0) + ROM_LOAD("x15-3.1l", 0, 1045320, CRC(5de8fdf1) SHA1(4203ffbba775a8c4a1b827621d116ba00839f91a)) +ROM_END + + +} // anonymous namespace + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1990, xds19p, 0, 0, xds19p, xds, xds_state, empty_init, "Visual Technology", "XDS-19P", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/visual/xds_kbd.cpp mame-0.264+dfsg.1/src/mame/visual/xds_kbd.cpp --- mame-0.263+dfsg.1/src/mame/visual/xds_kbd.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/xds_kbd.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,295 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual X Display Station Keyboard (HLE) + + TODO: + - Map unknown keys + + Notes: + - Everything here is guessed, no picture of the keyboard available + - Possibly identical to the Visual 220 keyboard + +***************************************************************************/ + +#include "emu.h" +#include "xds_kbd.h" +#include "machine/keyboard.ipp" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(XDS_KBD_HLE, xds_kbd_hle_device, "xds_kbd_hle", "XDS Keyboard (HLE)") + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +static INPUT_PORTS_START( keyboard ) + PORT_START("row_0") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 00 */ PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 01 */ PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 02 */ PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 03 */ PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 04 */ PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 05 */ PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 06 */ PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 07 */ PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 08 */ PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 09 */ PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0a */ PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0b */ PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0c */ PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0d */ PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0e */ PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 0f */ PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + + PORT_START("row_1") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 10 */ PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 11 */ PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 12 */ PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 13 */ PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 14 */ PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 15 */ PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 16 */ PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 17 */ PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 18 */ PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 19 */ PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1a */ PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1b */ PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1c */ PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1d */ PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1e */ PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 1f */ PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + + PORT_START("row_2") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 20 */ PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 21 */ PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 22 */ PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 23 */ PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 24 */ PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 25 */ PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 26 */ PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 27 */ PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 28 */ PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 29 */ PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2a */ PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2b */ PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2c */ PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('<') PORT_CHAR('>') + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2d */ PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2e */ PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 2f */ PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + + PORT_START("row_3") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 30 */ PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 31 */ PORT_NAME("31") // shown in keyboard test + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 32 */ PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 33 */ PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 34 */ PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 35 */ PORT_NAME("35") + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 36 */ PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // or rshift + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 37 */ PORT_NAME("37") + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 38 */ PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // or lshift + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 39 */ PORT_NAME("39") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3a */ PORT_NAME("3a") // shown in keyboard test + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3b */ PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3c */ PORT_NAME("PF1") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3d */ PORT_NAME("PF2") + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3e */ PORT_NAME("PF3") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 3f */ PORT_NAME("PF4") + + PORT_START("row_4") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 40 */ PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 41 */ PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 42 */ PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 43 */ PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 44 */ PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 45 */ PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 46 */ PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 47 */ PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 48 */ PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 49 */ PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4a */ PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4b */ PORT_CODE(KEYCODE_COMMA_PAD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4c */ PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Keypad .") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4d */ PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4e */ PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 4f */ PORT_NAME("4f") // shown in keyboard test + + PORT_START("row_5") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 50 */ PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("F1 (HOLD SCREEN)") + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 51 */ PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("F2 (PRINT SCREEN)") + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 52 */ PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_NAME("F3 (SET-UP)") + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 53 */ PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_NAME("F4 (DATA/TALK)") + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 54 */ PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("F5 (BREAK)") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 55 */ PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 56 */ PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 57 */ PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 58 */ PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 59 */ PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5a */ PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_NAME("F11 (ESC)") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5b */ PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_NAME("F12 (BS)") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5c */ PORT_CODE(KEYCODE_F13) PORT_CHAR(UCHAR_MAMEKEY(F13)) PORT_NAME("F13 (LF)") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5d */ PORT_CODE(KEYCODE_F14) PORT_CHAR(UCHAR_MAMEKEY(F14)) + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5e */ PORT_CODE(KEYCODE_F15) PORT_CHAR(UCHAR_MAMEKEY(F15)) PORT_NAME("F15 (HELP)") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 5f */ PORT_CODE(KEYCODE_F16) PORT_CHAR(UCHAR_MAMEKEY(F16)) PORT_NAME("F16 (DO)") + + PORT_START("row_6") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 60 */ PORT_CODE(KEYCODE_F17) PORT_CHAR(UCHAR_MAMEKEY(F17)) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 61 */ PORT_CODE(KEYCODE_F18) PORT_CHAR(UCHAR_MAMEKEY(F18)) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 62 */ PORT_CODE(KEYCODE_F19) PORT_CHAR(UCHAR_MAMEKEY(F19)) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 63 */ PORT_CODE(KEYCODE_F20) PORT_CHAR(UCHAR_MAMEKEY(F20)) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 64 */ PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 65 */ PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 66 */ PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 67 */ PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 68 */ PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 69 */ PORT_NAME("Find") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6a */ PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Insert Here") + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6b */ PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("Remove") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6c */ PORT_NAME("Select") + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6d */ PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) PORT_NAME("Prev. Screen") + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) /* 6e */ PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_NAME("Next Screen") + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 6f */ + + PORT_START("row_7") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) /* 70 */ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED) /* 71 */ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED) /* 72 */ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_UNUSED) /* 73 */ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_UNUSED) /* 74 */ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNUSED) /* 75 */ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_UNUSED) /* 76 */ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) /* 77 */ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_UNUSED) /* 78 */ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNUSED) /* 79 */ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7a */ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7b */ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7c */ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7d */ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7e */ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_UNUSED) /* 7f */ +INPUT_PORTS_END + +ioport_constructor xds_kbd_hle_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( keyboard ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// xds_kbd_hle_device - constructor +//------------------------------------------------- + +xds_kbd_hle_device::xds_kbd_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, XDS_KBD_HLE, tag, owner, clock), + device_buffered_serial_interface(mconfig, *this), + device_matrix_keyboard_interface(mconfig, *this, "row_0", "row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7"), + m_tx_handler(*this), + m_cts_handler(*this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void xds_kbd_hle_device::device_start() +{ + // signal ready + m_cts_handler(0); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void xds_kbd_hle_device::device_reset() +{ + clear_fifo(); + + receive_register_reset(); + transmit_register_reset(); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rcv_rate(1200); + set_tra_rate(1200); + + reset_key_state(); + start_processing(attotime::from_hz(1200)); + typematic_stop(); +} + +//------------------------------------------------- +// tra_callback - send bit to host +//------------------------------------------------- + +void xds_kbd_hle_device::tra_callback() +{ + m_tx_handler(transmit_register_get_data_bit()); +} + +//------------------------------------------------- +// received_byte - handle received byte +//------------------------------------------------- + +void xds_kbd_hle_device::received_byte(uint8_t byte) +{ + logerror("Received from host: %02x\n", byte); +} + +//------------------------------------------------- +// key_make - handle a key being pressed +//------------------------------------------------- + +void xds_kbd_hle_device::key_make(uint8_t row, uint8_t column) +{ + // send the make code + uint8_t code = row * 16 + column; + transmit_byte(code); + + // no typematic for modifier keys + if (code != 0x34 && code != 0x36 && code != 0x38) + typematic_start(row, column, attotime::from_msec(750), attotime::from_msec(50)); +} + +//------------------------------------------------- +// key_break - handle a key being released +//------------------------------------------------- + +void xds_kbd_hle_device::key_break(uint8_t row, uint8_t column) +{ + // send the break code + uint8_t code = row * 16 + column; + transmit_byte(0x80 | code); + + if (typematic_is(row, column)) + typematic_stop(); +} + +//------------------------------------------------- +// key_repeat - handle a key being repeated +//------------------------------------------------- + +void xds_kbd_hle_device::key_repeat(u8 row, u8 column) +{ + uint8_t code = row * 16 + column; + transmit_byte(code); +} + +//------------------------------------------------- +// rx_w - receive bit from host +//------------------------------------------------- + +void xds_kbd_hle_device::rx_w(int state) +{ + device_buffered_serial_interface::rx_w(state); +} diff -Nru mame-0.263+dfsg.1/src/mame/visual/xds_kbd.h mame-0.264+dfsg.1/src/mame/visual/xds_kbd.h --- mame-0.263+dfsg.1/src/mame/visual/xds_kbd.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/visual/xds_kbd.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,61 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Visual X Display Station Keyboard (HLE) + +***************************************************************************/ + +#ifndef MAME_VISUAL_XDS_KBD_H +#define MAME_VISUAL_XDS_KBD_H + +#pragma once + +#include "machine/keyboard.h" +#include "diserial.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class xds_kbd_hle_device : + public device_t, + public device_buffered_serial_interface<16>, + protected device_matrix_keyboard_interface<8> +{ +public: + // construction/destruction + xds_kbd_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + // callbacks + auto tx_handler() { return m_tx_handler.bind(); } + auto cts_handler() { return m_cts_handler.bind(); } + + // from host + void rx_w(int state); + +protected: + // device_t overrides + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; + + // device_buffered_serial_interface overrides + virtual void tra_callback() override; + virtual void received_byte(uint8_t byte) override; + + // device_matrix_keyboard_interface overrides + virtual void key_make(uint8_t row, uint8_t column) override; + virtual void key_break(uint8_t row, uint8_t column) override; + virtual void key_repeat(uint8_t row, uint8_t column) override; + +private: + devcb_write_line m_tx_handler; + devcb_write_line m_cts_handler; +}; + +// device type definition +DECLARE_DEVICE_TYPE(XDS_KBD_HLE, xds_kbd_hle_device) + +#endif // MAME_VISUAL_XDS_KBD_H diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/crshrace.cpp mame-0.264+dfsg.1/src/mame/vsystem/crshrace.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/crshrace.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/crshrace.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -231,8 +231,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -349,8 +347,6 @@ } -// machine - void crshrace_state::sh_bankswitch_w(uint8_t data) { m_z80bank->set_entry(data & 0x03); diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/f1gp.cpp mame-0.264+dfsg.1/src/mame/vsystem/f1gp.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/f1gp.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/f1gp.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -187,8 +187,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -461,8 +459,6 @@ } -// machine - void f1gp_state::sh_bankswitch_w(uint8_t data) { m_z80bank->set_entry(data & 0x01); diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/gstriker.cpp mame-0.264+dfsg.1/src/mame/vsystem/gstriker.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/gstriker.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/gstriker.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -293,8 +293,6 @@ }; -// video - /*** VIDEO UPDATE/START **********************************************/ void gstriker_state::video_start() @@ -347,8 +345,6 @@ } -// machine - void gstriker_state::machine_start() { m_soundbank->configure_entries(0, 8, memregion("audiocpu")->base(), 0x8000); diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/ojankohs.cpp mame-0.264+dfsg.1/src/mame/vsystem/ojankohs.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/ojankohs.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/ojankohs.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -985,5 +985,5 @@ GAME( 1986, ojankoca, ojankoc, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.2)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, ojankoy, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, ojanko2, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata 2bankan (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, ccasino, 0, ccasino, ccasino, ccasino_state, empty_init, ROT0, "V-System Co.", "Chinese Casino [BET] (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, ccasino, 0, ccasino, ccasino, ccasino_state, empty_init, ROT0, "V-System Co.", "Chinese Casino (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, ojankohs, 0, ojankohs, ojankohs, ojankohs_state, empty_init, ROT0, "V-System Co.", "Ojanko High School (Japan)", MACHINE_SUPPORTS_SAVE ) diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/suprslam.cpp mame-0.264+dfsg.1/src/mame/vsystem/suprslam.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/suprslam.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/suprslam.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -168,8 +168,6 @@ }; -// video - // FG 'SCREEN' LAYER void suprslam_state::screen_videoram_w(offs_t offset, uint16_t data) @@ -261,8 +259,6 @@ } -// machine - /*** SOUND *******************************************************************/ void suprslam_state::sh_bankswitch_w(uint8_t data) diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/tail2nos.cpp mame-0.264+dfsg.1/src/mame/vsystem/tail2nos.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/tail2nos.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/tail2nos.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -101,8 +101,6 @@ }; -// video - /*************************************************************************** Callbacks for the TileMap code @@ -268,8 +266,6 @@ } -// machine - uint8_t tail2nos_state::soundlatch_pending_r() { return m_soundlatch->pending_r(); diff -Nru mame-0.263+dfsg.1/src/mame/vsystem/taotaido.cpp mame-0.264+dfsg.1/src/mame/vsystem/taotaido.cpp --- mame-0.263+dfsg.1/src/mame/vsystem/taotaido.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/vsystem/taotaido.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -166,8 +166,6 @@ }; -// video - // sprite tile codes 0x4000 - 0x7fff get remapped according to the content of these registers void taotaido_state::spritebank_w(offs_t offset, uint8_t data) { @@ -289,8 +287,6 @@ } -// machine - void taotaido_state::machine_start() { m_soundbank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000); diff -Nru mame-0.263+dfsg.1/src/mame/xerox/xerox820.cpp mame-0.264+dfsg.1/src/mame/xerox/xerox820.cpp --- mame-0.263+dfsg.1/src/mame/xerox/xerox820.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/xerox/xerox820.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -918,6 +918,13 @@ ROM_LOAD( "2716mk83.bin", 0x0000, 0x0800, CRC(10bf0d81) SHA1(7ec73670a4d9d6421a5d6a4c4edc8b7c87923f6c) ) ROM_END +ROM_START( mojmikro ) + ROM_REGION( 0x2000, Z80_TAG, 0 ) + ROM_LOAD( "mikro-s.u67", 0x0000, 0x0800, CRC(56a329a8) SHA1(22a5d6bef121d14eddc0c25e85b8a73f6ca6a65f)) + ROM_REGION( 0x0800, "chargen", ROMREGION_ERASEFF ) // MMSCHAR YU 8.1.1987 + ROM_LOAD( "mmschar-yu.u73", 0x0000, 0x0800, CRC(ebcc72d3) SHA1(1c3f90b1d2e57586dcd32385d0aaa09e56662e32)) +ROM_END + /* System Drivers */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS @@ -927,3 +934,4 @@ COMP( 1983, x820ii, 0, 0, xerox820ii, xerox820, xerox820ii_state, empty_init, "Xerox", "Xerox 820-II", MACHINE_NOT_WORKING ) COMP( 1983, x168, x820ii, 0, xerox168, xerox820, xerox820ii_state, empty_init, "Xerox", "Xerox 16/8", MACHINE_NOT_WORKING ) COMP( 1983, mk83, bigboard, 0, mk83, xerox820, xerox820_state, empty_init, "Scomar", "MK-83", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) +COMP( 1985, mojmikro, bigboard, 0, bigboard, xerox820, bigboard_state, empty_init, "", "Moj mikro Slovenija", MACHINE_NOT_WORKING ) diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/mks3.cpp mame-0.264+dfsg.1/src/mame/yamaha/mks3.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/mks3.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/mks3.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,238 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// HLE emulation of the MKS3 keyboard scanning PCB used in the psr340 +// and psr540 among others. + +// Uses a 63B05 with a not-yet-dumped internal rom + +// Messages 0x81 and 0x82 are special, but not understood. + +// What should happen so that the test mode works is not understood either. + +#include "emu.h" +#include "mks3.h" + +DEFINE_DEVICE_TYPE(MKS3, mks3_device, "mks3", "Yamaha MKS3 piano keyboard scanner") + +static INPUT_PORTS_START(piano) + PORT_START("P0") + PORT_BIT(0xffffffff, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("P1") + PORT_BIT(0x0000000f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C1") + PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C1#") + PORT_BIT(0x00000040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D1") + PORT_BIT(0x00000080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D1#") + PORT_BIT(0x00000100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("E1") + PORT_BIT(0x00000200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F1") + PORT_BIT(0x00000400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F1#") + PORT_BIT(0x00000800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G1") + PORT_BIT(0x00001000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G1#") + PORT_BIT(0x00002000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A1") + PORT_BIT(0x00004000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A1#") + PORT_BIT(0x00008000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B1") + PORT_BIT(0x00010000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C2") + PORT_BIT(0x00020000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C2#") + PORT_BIT(0x00040000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D2") + PORT_BIT(0x00080000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D2#") + PORT_BIT(0x00100000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("E2") + PORT_BIT(0x00200000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F2") + PORT_BIT(0x00400000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F2#") + PORT_BIT(0x00800000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G2") + PORT_BIT(0x01000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G2#") + PORT_BIT(0x02000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A2") + PORT_BIT(0x04000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A2#") + PORT_BIT(0x08000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B2") + PORT_BIT(0x10000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C3") + PORT_BIT(0x20000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C3#") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D3") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D3#") + + PORT_START("P2") + PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("E3") + PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F3") + PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F3#") + PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G3") + PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G3#") + PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A3") + PORT_BIT(0x00000040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A3#") + PORT_BIT(0x00000080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B3") + PORT_BIT(0x00000100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C4") + PORT_BIT(0x00000200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C4#") + PORT_BIT(0x00000400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D4") + PORT_BIT(0x00000800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D4#") + PORT_BIT(0x00001000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("E4") + PORT_BIT(0x00002000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F4") + PORT_BIT(0x00004000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F4#") + PORT_BIT(0x00008000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G4") + PORT_BIT(0x00010000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G4#") + PORT_BIT(0x00020000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A4") + PORT_BIT(0x00040000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A4#") + PORT_BIT(0x00080000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B4") + PORT_BIT(0x00100000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C5") + PORT_BIT(0x00200000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C5#") + PORT_BIT(0x00400000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D5") + PORT_BIT(0x00800000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D5#") + PORT_BIT(0x01000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("E5") + PORT_BIT(0x02000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F5") + PORT_BIT(0x04000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("F5#") + PORT_BIT(0x08000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G5") + PORT_BIT(0x10000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("G5#") + PORT_BIT(0x20000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A5") + PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A5#") + PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B5") + + PORT_START("P3") + PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C6") + PORT_BIT(0xfffffffe, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + +mks3_device::mks3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, MKS3, tag, owner, clock), + m_port(*this, "P%d", 0), + m_write_da(*this), + m_write_clk(*this) +{ +} + +ioport_constructor mks3_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(piano); +} + +void mks3_device::device_start() +{ + save_item(NAME(m_ic)); + save_item(NAME(m_req)); + save_item(NAME(m_step)); + save_item(NAME(m_byte)); + save_item(NAME(m_bytes)); + save_item(NAME(m_byte_count)); + save_item(NAME(m_sent_state)); + save_item(NAME(m_current_state)); + + m_ic = 1; + m_req = 1; + + m_scan_timer = timer_alloc(FUNC(mks3_device::scan_tick), this); + m_transmit_timer = timer_alloc(FUNC(mks3_device::transmit_tick), this); +} + +void mks3_device::device_reset() +{ + m_write_da(1); + m_write_clk(1); + m_step = 0xff; + m_byte = 0; + m_byte_count = 0; + std::fill(m_bytes.begin(), m_bytes.end(), 0); + std::fill(m_sent_state.begin(), m_sent_state.end(), 0); + + for(int i=0; i != 4; i++) + m_current_state[i] = m_port[i]->read(); + + + m_scan_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100)); +} + +void mks3_device::ic_w(int state) +{ + if(state == m_ic) + return; + + m_ic = state; + if(!m_ic) + reset(); +} + +void mks3_device::req_w(int state) +{ + if(state == m_req) + return; + + m_req = state; + if(m_req == 0 && m_step == 0xff) + transmit_next(); +} + +TIMER_CALLBACK_MEMBER(mks3_device::transmit_tick) +{ + logerror("tr %d\n", m_step); + if(m_step == 15) { + transmit_next(); + return; + } + + if(m_step & 1) { + m_write_clk(0); + m_write_da(BIT(m_byte, 6 - (m_step >> 1))); + } else + m_write_clk(1); + m_step++; + + m_transmit_timer->adjust(attotime::from_hz(500000)); +} + +void mks3_device::transmit_next() +{ + if(m_byte_count == 0) { + m_step = 0xff; + send_next(); + return; + } + + m_byte = m_bytes[0]; + m_byte_count --; + if(m_byte_count) + memmove(m_bytes.data(), m_bytes.data() + 1, m_byte_count); + + logerror("start %02x\n", m_byte); + m_write_clk(0); + m_write_da(BIT(m_byte, 7)); + m_step = 0; + m_transmit_timer->adjust(attotime::from_hz(500000)); +} + +u32 mks3_device::find_next() +{ + for(int i=0; i != 4; i++) + if(m_current_state[i] != m_sent_state[i]) + for(int j=0; j != 32; j++) + if(BIT(m_current_state[i]^m_sent_state[i], j)) { + m_sent_state[i] ^= 1 << j; + return (i << 5) | j | (BIT(m_current_state[i], j) ? 0x100 : 0); + } + return 0xffffffff; +} + +void mks3_device::send_next() +{ + u32 key = find_next(); + if(key == 0xffffffff) + return; + + // velocity is 10 bits, 0 = max, 3ff = min + // + // 80 | key number + // 20 for maximal time(?), velocity >> 5 otherwise + // 60 | (velocity & 1f) on) || 00 (keyoff) + + m_bytes[0] = 0x80 | (key & 0x7f); + m_bytes[1] = 0; //key & 0x100 ? 0 : 0x20; + m_bytes[2] = (key & 0x100) ? 0x60 : 0x00; + m_byte_count = 3; + transmit_next(); +} + + +TIMER_CALLBACK_MEMBER(mks3_device::scan_tick) +{ + for(int i=0; i != 4; i++) + m_current_state[i] = m_port[i]->read(); + + if(m_step == 0xff) + send_next(); +} diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/mks3.h mame-0.264+dfsg.1/src/mame/yamaha/mks3.h --- mame-0.263+dfsg.1/src/mame/yamaha/mks3.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/mks3.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,53 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +// HLE emulation of the MKS3 keyboard scanning PCB used in the psr340 +// and psr540 among others. + +// Uses a 63B05 with a not-yet-dumped internal rom + + +#ifndef MAME_YAMAHA_MKS3_H +#define MAME_YAMAHA_MKS3_H + +#pragma once + +DECLARE_DEVICE_TYPE(MKS3, mks3_device) + +class mks3_device : public device_t +{ +public: + mks3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + void ic_w(int state); + void req_w(int state); + auto write_da() { return m_write_da.bind(); } + auto write_clk() { return m_write_clk.bind(); } + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual ioport_constructor device_input_ports() const override; + +private: + required_ioport_array<4> m_port; + devcb_write_line m_write_da; + devcb_write_line m_write_clk; + emu_timer *m_scan_timer, *m_transmit_timer; + + std::array m_bytes; + + std::array m_sent_state; + std::array m_current_state; + + int m_ic, m_req; + u8 m_step, m_byte, m_byte_count; + + u32 find_next(); + void send_next(); + void transmit_next(); + TIMER_CALLBACK_MEMBER(transmit_tick); + TIMER_CALLBACK_MEMBER(scan_tick); +}; + +#endif diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymdx100.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymdx100.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymdx100.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymdx100.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -334,7 +334,7 @@ void yamaha_dx100_state::p22_w(int state) { if (state) - m_maincpu->m6801_clock_serial(); + m_maincpu->clock_serial(); } void yamaha_dx100_state::mem_map(address_map &map) diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymdx9.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymdx9.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymdx9.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymdx9.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -135,7 +135,7 @@ void midi_r(int state) { m_rx_data = state; } - void midiclock_w(int state) { if (state) m_maincpu->m6801_clock_serial(); } + void midiclock_w(int state) { if (state) m_maincpu->clock_serial(); } /** * @brief Handle a write to the synth's IO Port 1. diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu10.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu10.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu10.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu10.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,9 +53,9 @@ u16 adc_battery_r(); u16 adc_midisw_r(); - void p6_w(u16 data); - void pa_w(u16 data); - void pb_w(u16 data); + void p6_w(u8 data); + void pa_w(u8 data); + void pb_w(u8 data); u8 pb_r(); void mu10_map(address_map &map); @@ -98,13 +98,13 @@ return 0x000; } -void mu10_state::p6_w(u16 data) +void mu10_state::p6_w(u8 data) { cur_p6 = data; logerror("reset swp %d dac %d\n", BIT(data, 2), BIT(data, 0)); } -void mu10_state::pb_w(u16 data) +void mu10_state::pb_w(u8 data) { cur_pb = data; logerror("led %d gain %d\n", BIT(data, 0), BIT(data, 2)); @@ -116,7 +116,7 @@ return 8; } -void mu10_state::pa_w(u16 data) +void mu10_state::pa_w(u8 data) { cur_pa = data; logerror("mac host pin 1 %d\n", !BIT(data, 2)); diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu100.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu100.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu100.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu100.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -127,7 +127,7 @@ #include "cpu/h8/h8s2655.h" #include "mulcd.h" #include "sound/swp30.h" -#include "bus/plg100/plg100.h" +#include "bus/plg1x0/plg1x0.h" #include "debugger.h" #include "speaker.h" @@ -185,8 +185,8 @@ required_device m_maincpu; required_device m_swp30; required_device m_lcd; - required_device m_ext1; - optional_device m_ext2; + required_device m_ext1; + optional_device m_ext2; required_ioport m_ioport_p7; required_ioport m_ioport_p8; @@ -199,19 +199,19 @@ u16 adc_midisw_r(); u16 adc_battery_r(); - void p1_w(u16 data); - u16 p1_r(); - void p2_w(u16 data); - void p3_w(u16 data); - void p5_w(u16 data); - void p6_w(u16 data); - u16 p6_r(); - void pa_w(u16 data); - u16 pa_r(); - void pb_w(u16 data); - u16 pb_r(); - void pf_w(u16 data); - void pg_w(u16 data); + void p1_w(u8 data); + u8 p1_r(); + void p2_w(u8 data); + void p3_w(u8 data); + void p5_w(u8 data); + void p6_w(u8 data); + u8 p6_r(); + void pa_w(u8 data); + u8 pa_r(); + void pb_w(u8 data); + u8 pb_r(); + void pf_w(u8 data); + void pg_w(u8 data); void ext_serial_update(); void h8_tx(int state); @@ -305,12 +305,12 @@ return 0x3ff; } -void mu100_state::p1_w(u16 data) +void mu100_state::p1_w(u8 data) { m_cur_p1 = data; } -u16 mu100_state::p1_r() +u8 mu100_state::p1_r() { if((m_cur_p2 & P2_LCD_ENABLE)) { if(m_cur_p2 & P2_LCD_RW) { @@ -334,10 +334,10 @@ return 0xff; } -void mu100_state::p2_w(u16 data) +void mu100_state::p2_w(u8 data) { - // LCB enable edge - if(!(m_cur_p2 & P2_LCD_ENABLE) && (data & P2_LCD_ENABLE)) { + // LCD enable edge + if((m_cur_p2 & P2_LCD_ENABLE) && !(data & P2_LCD_ENABLE)) { if(!(m_cur_p2 & P2_LCD_RW)) { if(m_cur_p2 & P2_LCD_RS) m_lcd->data_write(m_cur_p1); @@ -349,44 +349,44 @@ m_cur_p2 = data; } -void mu100_state::p3_w(u16 data) +void mu100_state::p3_w(u8 data) { m_cur_p3 = data; logerror("A/D gain control %d\n", (data >> 4) & 3); } -void mu100_state::p5_w(u16 data) +void mu100_state::p5_w(u8 data) { m_cur_p5 = data; logerror("Rotary reset %d\n", (data >> 3) & 1); } -void mu100_state::p6_w(u16 data) +void mu100_state::p6_w(u8 data) { m_cur_p6 = data; m_cur_sw = (m_cur_sw & 0xc) | BIT(m_cur_pf, 2, 2); ext_serial_update(); } -u16 mu100_state::p6_r() +u8 mu100_state::p6_r() { // logerror("plug in detect read\n"); return 0x00; } -void mu100_state::pa_w(u16 data) +void mu100_state::pa_w(u8 data) { m_cur_pa = data; logerror("rotary encoder %d\n", (data >> 6) & 3); } -u16 mu100_state::pa_r() +u8 mu100_state::pa_r() { logerror("offline detect read\n"); return 0x00; } -void mu100_state::pf_w(u16 data) +void mu100_state::pf_w(u8 data) { if(!(m_cur_pf & 0x01) && (data & 0x01)) { m_cur_ic32 = m_cur_p1; @@ -397,7 +397,7 @@ ext_serial_update(); } -void mu100_state::pg_w(u16 data) +void mu100_state::pg_w(u8 data) { m_cur_pg = data; m_cur_sw = (m_cur_sw & 0xb) | (BIT(m_cur_pg, 0) << 2); @@ -473,7 +473,7 @@ MULCD(config, m_lcd); - PLG100_CONNECTOR(config, m_ext1, plg100_intf, "vl"); + PLG1X0_CONNECTOR(config, m_ext1, plg1x0_intf, nullptr); m_ext1->midi_tx().set(FUNC(mu100_state::e1_tx)); SPEAKER(config, "lspeaker").front_left(); @@ -501,7 +501,7 @@ { mu100(config); - PLG100_CONNECTOR(config, m_ext2, plg100_intf, nullptr); + PLG1X0_CONNECTOR(config, m_ext2, plg1x0_intf, nullptr); m_ext2->midi_tx().set(FUNC(mu100r_state::e2_tx)); } diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu128.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu128.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu128.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu128.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -53,25 +53,76 @@ required_device m_sci; required_shared_ptr m_ram; + u16 m_pe; + void map(address_map &map); void swp30_map(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; + + u16 pe_r(); + void pe_w(u16 data); }; void mu128_state::machine_start() { + save_item(NAME(m_pe)); + m_pe = 0; } void mu128_state::machine_reset() { } +// Port E: +// 0: lcd-r/w +// 1: nc +// 2: lcd-rs +// 3: lcread (secondary functions on lcread edge) +// 4: lcd-e +// 5: 1mclk +// 6: siclk +// 7: sws +// 8-a: db 0-2, lcdc a-c +// b-c: db 3-4, mic/line +// d: db 5, swp reset +// e: db 6, sireset +// f: db 7, breset + +u16 mu128_state::pe_r() +{ + if(BIT(m_pe, 4)) { + if(BIT(m_pe, 0)) { + if(BIT(m_pe, 2)) + return m_lcd->data_read() << 8; + else + return m_lcd->control_read() << 8; + } else + return 0x0000; + } + + return 0; +} + +void mu128_state::pe_w(u16 data) +{ + if(BIT(m_pe, 4) && !BIT(data, 4)) { + if(!BIT(data, 0)) { + if(BIT(data, 2)) + m_lcd->data_write(data >> 8); + else + m_lcd->control_write(data >> 8); + } + } + + m_pe = data; +} + void mu128_state::map(address_map &map) { map(0x000000, 0x1fffff).rom().region("maincpu", 0); - map(0x200000, 0x21ffff).ram().share(m_ram); + map(0x400000, 0x43ffff).ram().share(m_ram); map(0x800000, 0x801fff).m(m_swp30m, FUNC(swp30_device::map)); map(0x802000, 0x803fff).m(m_swp30s, FUNC(swp30_device::map)); map(0xc00000, 0xc00000).rw(m_sci, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)).mirror(0x3ffffe); @@ -87,6 +138,8 @@ { SH7043(config, m_maincpu, 7_MHz_XTAL * 4); m_maincpu->set_addrmap(AS_PROGRAM, &mu128_state::map); + m_maincpu->read_porte().set(FUNC(mu128_state::pe_r)); + m_maincpu->write_porte().set(FUNC(mu128_state::pe_w)); NVRAM(config, m_nvram, nvram_device::DEFAULT_NONE); diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu15.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu15.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu15.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu15.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -26,6 +26,51 @@ namespace { static INPUT_PORTS_START( mu15 ) + PORT_START("SA") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Part -") PORT_CODE(KEYCODE_9) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Part +") PORT_CODE(KEYCODE_0) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Value -") PORT_CODE(KEYCODE_MINUS) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Value +") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("XG Bank") PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Play/Edit") PORT_CODE(KEYCODE_OPENBRACE) + + PORT_START("SB") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D2# Mute") PORT_CODE(KEYCODE_J) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C2# Solo") PORT_CODE(KEYCODE_H) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A1# Note Shft") PORT_CODE(KEYCODE_F) + PORT_BIT(0x38, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("SC") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G1# Pan") PORT_CODE(KEYCODE_D) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F1# Vol") PORT_CODE(KEYCODE_S) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D1# Init All") PORT_CODE(KEYCODE_8) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C1# Dump Out") PORT_CODE(KEYCODE_7) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A0# Locl Ctrl") PORT_CODE(KEYCODE_5) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G0# Velocity") PORT_CODE(KEYCODE_4) + + PORT_START("SD") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F0# Mstr Tune") PORT_CODE(KEYCODE_3) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Oct Up") PORT_CODE(KEYCODE_2) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Oct Down") PORT_CODE(KEYCODE_1) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E0 V Dry Lvl") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F0 V Ins Sys") PORT_CODE(KEYCODE_W) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G0 V Type") PORT_CODE(KEYCODE_E) + + PORT_START("SE") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A0 V Send Lvl") PORT_CODE(KEYCODE_R) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B0 C Type") PORT_CODE(KEYCODE_T) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C1 C Send Lvl") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D1 R Type") PORT_CODE(KEYCODE_U) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E1 R Send Lvl") PORT_CODE(KEYCODE_I) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("F1 V Rate") PORT_CODE(KEYCODE_Z) + + PORT_START("SF") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("G1 V Dpth") PORT_CODE(KEYCODE_X) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("A1 V Dely") PORT_CODE(KEYCODE_C) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("B1 E Atck Time") PORT_CODE(KEYCODE_V) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("C2 E Rels Time") PORT_CODE(KEYCODE_B) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("D2 F Cutoff") PORT_CODE(KEYCODE_N) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("E2 F Reso") PORT_CODE(KEYCODE_M) INPUT_PORTS_END class mu15_state : public driver_device @@ -34,9 +79,12 @@ mu15_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - // , m_nvram(*this, "ram") + //, m_nvram(*this, "ram") , m_lcd(*this, "lcd") - , m_ram(*this, "ram") + , m_ram1(*this, "ram1") + , m_ram2(*this, "ram2") + , m_ioport(*this, "S%c", 'A') + { } void mu15(machine_config &config); @@ -44,15 +92,24 @@ private: required_device m_maincpu; // required_device m_nvram; - // required_device m_swp00; required_device m_lcd; - required_shared_ptr m_ram; + required_shared_ptr m_ram1; + required_shared_ptr m_ram2; + required_ioport_array<6> m_ioport; + + u16 m_pdt; + u8 m_cmah; void c_map(address_map &map); void s_map(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; + + u16 pdt_r(); + void pdt_w(u16 data); + u8 pad_r(); + void cmah_w(u8 data); }; void mu15_state::machine_start() @@ -63,145 +120,78 @@ { } -void mu15_state::s_map(address_map &map) -{ - map(0x000000, 0x3fffff).rom().region("swx00", 0); - map(0x400000, 0x40ffff).ram().share(m_ram); - // map(0x400000, 0x4007ff).m(m_swp00, FUNC(swp00_device::map)); -} - void mu15_state::c_map(address_map &map) { + map(0x200000, 0x21ffff).ram().share(m_ram1); // ic12, cs1 + map(0xc00000, 0xc07fff).ram().share(m_ram2); // ic13, cs5, saved } -#if 0 -// Analog input right (not sent to the swp, mixing is analog) -u16 mu15_state::adc_ar_r() -{ - return 0x3ff; -} - -// Analog input left (not sent to the swp, mixing is analog) -u16 mu15_state::adc_al_r() -{ - return 0x3ff; -} - -// Put the host switch to pure midi -u16 mu15_state::adc_midisw_r() -{ - // 000-0bf: midi - // 0c0-1ff: pc2 - // 200-37f: pc1 - // 380-3ff: mac - return 0x000; -} - -// Battery level -u16 mu15_state::adc_battery_r() +void mu15_state::s_map(address_map &map) { - return 0x200; + map(0x000000, 0x1fffff).rom().region("swx00", 0); } -void mu15_state::p6_w(u16 data) +u16 mu15_state::pdt_r() { - data ^= P6_LCD_ENABLE; - if(!(cur_p6 & P6_LCD_ENABLE) && (data & P6_LCD_ENABLE)) { - if(!(cur_p6 & P6_LCD_RW)) { - if(cur_p6 & P6_LCD_RS) - m_lcd->data_write(cur_pa); - else - m_lcd->control_write(cur_pa); - } + u8 bus = 0; + if((m_cmah & 8) && (m_cmah & 4)) { + if(m_cmah & 2) + bus = m_lcd->dr_r(); + else + bus = m_lcd->status_r(); } - - cur_p6 = data; -} - -u16 mu15_state::p6_r() -{ - return cur_p6; -} - -u16 mu15_state::pb_r() -{ - return cur_pb; -} - -void mu15_state::pb_w(u16 data) -{ - cur_pb = data; -} - -void mu15_state::pa_w(u16 data) -{ - cur_pa = data; + return ((bus & 0xc0) << 8) | ((bus & 0x3f) << 6); } -void mu15_state::pc_w(u16 data) +void mu15_state::cmah_w(u8 data) { - cur_pc = data; + u8 old = m_cmah; + m_cmah = data; + if((old & 8) && !(m_cmah & 8) && !(m_cmah & 4) && !(old & 4)) { + u8 v = ((m_pdt >> 8) & 0xc0) | ((m_pdt >> 6) & 0x3f); + if(m_cmah & 2) + m_lcd->dr_w(v); + else + m_lcd->ir_w(v); + } } -u16 mu15_state::pa_r() +void mu15_state::pdt_w(u16 data) { - if((cur_p6 & P6_LCD_ENABLE)) { - if(cur_p6 & P6_LCD_RW) - { - if(cur_p6 & P6_LCD_RS) - return m_lcd->data_read(); - else - return m_lcd->control_read(); - } else - return 0x00; - } - return cur_pa; + m_pdt = data; } -u16 mu15_state::pc_r() +u8 mu15_state::pad_r() { - u16 res = cur_pc | 0x7c; - if(!(cur_pc & 0x01)) - res &= m_ioport_o0->read(); - if(!(cur_pc & 0x02)) - res &= m_ioport_o1->read(); - if(!(cur_pc & 0x80)) - res &= m_ioport_o2->read(); - return res; + u8 r = 0xff; + for(int i=0; i != 6; i++) + if(!BIT(m_pdt, 5-i)) + r &= m_ioport[i]->read(); + return r; } -#endif void mu15_state::mu15(machine_config &config) { SWX00(config, m_maincpu, 8.4672_MHz_XTAL, 0); - m_maincpu->set_addrmap(m_maincpu->c_bus_id(), &mu15_state::c_map); - m_maincpu->set_addrmap(m_maincpu->s_bus_id(), &mu15_state::s_map); + m_maincpu->set_addrmap(swx00_device::AS_C, &mu15_state::c_map); + m_maincpu->set_addrmap(swx00_device::AS_S, &mu15_state::s_map); + + m_maincpu->add_route(0, "lspeaker", 1.0); + m_maincpu->add_route(1, "rspeaker", 1.0); - // m_maincpu->read_porta().set(FUNC(mu15_state::pa_r)); - // m_maincpu->read_portb().set(FUNC(mu15_state::pa_r)); - // m_maincpu->write_portb().set(FUNC(mu15_state::pa_w)); - -#if 0 - m_maincpu->read_adc<0>().set(FUNC(mu15_state::adc_ar_r)); - m_maincpu->read_adc<1>().set_constant(0); - m_maincpu->read_adc<2>().set(FUNC(mu15_state::adc_al_r)); - m_maincpu->read_adc<3>().set_constant(0); - m_maincpu->read_adc<4>().set(FUNC(mu15_state::adc_midisw_r)); - m_maincpu->read_adc<5>().set_constant(0); - m_maincpu->read_adc<6>().set(FUNC(mu15_state::adc_battery_r)); - m_maincpu->read_adc<7>().set_constant(0); - m_maincpu->read_port6().set(FUNC(mu15_state::p6_r)); - m_maincpu->write_port6().set(FUNC(mu15_state::p6_w)); - m_maincpu->read_porta().set(FUNC(mu15_state::pa_r)); - m_maincpu->write_porta().set(FUNC(mu15_state::pa_w)); - m_maincpu->read_portb().set(FUNC(mu15_state::pb_r)); - m_maincpu->write_portb().set(FUNC(mu15_state::pb_w)); - m_maincpu->read_portc().set(FUNC(mu15_state::pc_r)); - m_maincpu->write_portc().set(FUNC(mu15_state::pc_w)); - - m_maincpu->read_port7().set_constant(0); - m_maincpu->read_port9().set_constant(0); -#endif + // Nothing connected to sclki, yet... + m_maincpu->sci_set_external_clock_period(0, attotime::from_hz(500000)); + m_maincpu->sci_set_external_clock_period(1, attotime::from_hz(500000)); + + m_maincpu->read_adc<0>().set_constant(0x000); // Host mode + m_maincpu->read_adc<1>().set_constant(0x000); // GND + m_maincpu->read_adc<2>().set_constant(0x3ff); // Battery level + m_maincpu->read_adc<3>().set_constant(0x000); // GND + + m_maincpu->read_pdt().set(FUNC(mu15_state::pdt_r)); + m_maincpu->write_pdt().set(FUNC(mu15_state::pdt_w)); + m_maincpu->read_pad().set(FUNC(mu15_state::pad_r)); + m_maincpu->write_cmah().set(FUNC(mu15_state::cmah_w)); // NVRAM(config, m_nvram, nvram_device::DEFAULT_NONE); diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu5.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu5.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu5.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu5.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -52,10 +52,10 @@ u8 m_lcd_ctrl = 0U; u8 m_lcd_data = 0U; - void lcd_ctrl_w(u16 data); - u16 lcd_ctrl_r(); - void lcd_data_w(u16 data); - u16 lcd_data_r(); + void lcd_ctrl_w(u8 data); + u8 lcd_ctrl_r(); + void lcd_data_w(u8 data); + u8 lcd_data_r(); u8 m_matrixsel; u8 matrix_r(); @@ -98,7 +98,7 @@ return data; } -void mu5_state::lcd_ctrl_w(u16 data) +void mu5_state::lcd_ctrl_w(u8 data) { // bit 2 = rs // bit 1 = r/w @@ -124,17 +124,17 @@ } } -u16 mu5_state::lcd_ctrl_r() +u8 mu5_state::lcd_ctrl_r() { return m_lcd_ctrl; } -void mu5_state::lcd_data_w(u16 data) +void mu5_state::lcd_data_w(u8 data) { m_lcd_data = data; } -u16 mu5_state::lcd_data_r() +u8 mu5_state::lcd_data_r() { return m_lcd_data; } diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu50.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu50.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu50.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu50.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -96,14 +96,14 @@ u16 adc_midisw_r(); u16 adc_battery_r(); - void p6_w(u16 data); - u16 p6_r(); - void pa_w(u16 data); - u16 pa_r(); - void pb_w(u16 data); - u16 pb_r(); - void pc_w(u16 data); - u16 pc_r(); + void p6_w(u8 data); + u8 p6_r(); + void pa_w(u8 data); + u8 pa_r(); + void pb_w(u8 data); + u8 pb_r(); + void pc_w(u8 data); + u8 pc_r(); void mu50_map(address_map &map); @@ -157,10 +157,10 @@ return 0x200; } -void mu50_state::p6_w(u16 data) +void mu50_state::p6_w(u8 data) { data ^= P6_LCD_ENABLE; - if(!(cur_p6 & P6_LCD_ENABLE) && (data & P6_LCD_ENABLE)) { + if((cur_p6 & P6_LCD_ENABLE) && !(data & P6_LCD_ENABLE)) { if(!(cur_p6 & P6_LCD_RW)) { if(cur_p6 & P6_LCD_RS) m_lcd->data_write(cur_pa); @@ -172,32 +172,32 @@ cur_p6 = data; } -u16 mu50_state::p6_r() +u8 mu50_state::p6_r() { return cur_p6; } -u16 mu50_state::pb_r() +u8 mu50_state::pb_r() { return cur_pb; } -void mu50_state::pb_w(u16 data) +void mu50_state::pb_w(u8 data) { cur_pb = data; } -void mu50_state::pa_w(u16 data) +void mu50_state::pa_w(u8 data) { cur_pa = data; } -void mu50_state::pc_w(u16 data) +void mu50_state::pc_w(u8 data) { cur_pc = data; } -u16 mu50_state::pa_r() +u8 mu50_state::pa_r() { if((cur_p6 & P6_LCD_ENABLE)) { if(cur_p6 & P6_LCD_RW) @@ -212,9 +212,9 @@ return cur_pa; } -u16 mu50_state::pc_r() +u8 mu50_state::pc_r() { - u16 res = cur_pc | 0x7c; + u8 res = cur_pc | 0x7c; if(!(cur_pc & 0x01)) res &= m_ioport_o0->read(); if(!(cur_pc & 0x02)) diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu80.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu80.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu80.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu80.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -179,18 +179,6 @@ private: enum { - P2_LCD_RS = 0x01, - P2_LCD_RW = 0x02, - P2_LCD_ENABLE = 0x04 - }; - - enum { - P6_LCD_RS = 0x04, - P6_LCD_RW = 0x02, - P6_LCD_ENABLE = 0x01 - }; - - enum { PA_LCD_RS = 0x02, PA_LCD_ENABLE = 0x20, PA_LCD_RW = 0x40 @@ -211,12 +199,12 @@ u16 adc_midisw_r(); u16 adc_battery_r(); - void p6_w(u16 data); - u16 p6_r(); - void pa_w(u16 data); - u16 pa_r(); - void pb_w(u16 data); - u16 pb_r(); + void p6_w(u8 data); + u8 p6_r(); + void pa_w(u8 data); + u8 pa_r(); + void pb_w(u8 data); + u8 pb_r(); virtual void machine_start() override; virtual void machine_reset() override; @@ -267,12 +255,12 @@ return 0x200; } -void mu80_state::pb_w(u16 data) +void mu80_state::pb_w(u8 data) { cur_pb = data; } -u16 mu80_state::pb_r() +u8 mu80_state::pb_r() { if((cur_pa & PA_LCD_ENABLE)) { if(cur_pa & PA_LCD_RW) { @@ -297,20 +285,20 @@ return cur_pb; } -void mu80_state::p6_w(u16 data) +void mu80_state::p6_w(u8 data) { cur_p6 = data; } -u16 mu80_state::p6_r() +u8 mu80_state::p6_r() { return cur_p6; } -void mu80_state::pa_w(u16 data) +void mu80_state::pa_w(u8 data) { data ^= PA_LCD_ENABLE; - if(!(cur_pa & PA_LCD_ENABLE) && (data & PA_LCD_ENABLE)) { + if((cur_pa & PA_LCD_ENABLE) && !(data & PA_LCD_ENABLE)) { if(!(cur_pa & PA_LCD_RW)) { if(cur_pa & PA_LCD_RS) m_lcd->data_write(cur_pb); @@ -325,7 +313,7 @@ cur_pa = data; } -u16 mu80_state::pa_r() +u8 mu80_state::pa_r() { return cur_pa; } diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymmu90.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymmu90.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymmu90.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymmu90.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -83,9 +83,9 @@ u16 adc_midisw_r(); u16 adc_battery_r(); - void pa_w(u16 data); - void pb_w(u16 data); - u16 pb_r(); + void pa_w(u8 data); + void pb_w(u8 data); + u8 pb_r(); virtual void machine_start() override; virtual void machine_reset() override; @@ -140,12 +140,12 @@ return 0x200; } -void mu90_state::pb_w(u16 data) +void mu90_state::pb_w(u8 data) { cur_pb = data; } -u16 mu90_state::pb_r() +u8 mu90_state::pb_r() { u8 res = 0xff; if((cur_pa & 0x20)) { @@ -167,7 +167,7 @@ return res; } -void mu90_state::pa_w(u16 data) +void mu90_state::pa_w(u8 data) { if(!(cur_pa & 0x01) && (data & 0x01)) { m_lcd->set_contrast(cur_pb & 7); @@ -175,7 +175,7 @@ logerror("ad2 input level %s\n", cur_pb & 0x40 ? "line" : "mic"); } - if(!(cur_pa & 0x20) && (data & 0x20)) { + if((cur_pa & 0x20) && !(data & 0x20)) { if(!(cur_pa & 0x40)) { if(cur_pa & 0x02) m_lcd->data_write(cur_pb); diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ympsr2000.cpp mame-0.264+dfsg.1/src/mame/yamaha/ympsr2000.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ympsr2000.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ympsr2000.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,106 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert + +#include "emu.h" + +#include "bus/midi/midiinport.h" +#include "bus/midi/midioutport.h" +#include "cpu/sh/sh4.h" +#include "video/sed1330.h" + +#include "debugger.h" +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + + +namespace { + +class psr2000_state : public driver_device { +public: + psr2000_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_lcdc(*this, "lcdc") + { } + + void psr2000(machine_config &config); + +private: + required_device m_maincpu; + required_device m_lcdc; // In reality a sed1335 + + void map(address_map &map); + void lcdc_map(address_map &map); + + void machine_start() override; +}; + +void psr2000_state::machine_start() +{ +} + +void psr2000_state::psr2000(machine_config &config) +{ + SH3BE(config, m_maincpu, 10_MHz_XTAL*4); + m_maincpu->set_addrmap(AS_PROGRAM, &psr2000_state::map); + + auto &palette = PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + auto &screen = SCREEN(config, "screen", SCREEN_TYPE_LCD); + screen.set_refresh_hz(60); + screen.set_screen_update(m_lcdc, FUNC(sed1330_device::screen_update)); + screen.set_size(320, 240); + screen.set_visarea(0, 320-1, 0, 240-1); + screen.set_palette(palette); + + SED1330(config, m_lcdc, 16_MHz_XTAL / 2); // Clock provided by the fdc + m_lcdc->set_screen("screen"); + m_lcdc->set_addrmap(0, &psr2000_state::lcdc_map); + + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); +} + +void psr2000_state::map(address_map &map) +{ + map(0x00000000, 0x007fffff).rom().region("maincpu", 0).mirror(0xe0000000); + map(0x08000000, 0x087fffff).rom().region("style", 0).mirror(0xe0000000); + map(0x0c000000, 0x0c7fffff).ram().mirror(0xe0000000); + map(0x10000000, 0x100fffff).rom().region("data", 0).mirror(0xe0000000); + map(0x14000000, 0x1400000f); // 8bitcs -> lcdccs, fdccs + map(0x14400000, 0x14400000).rw(m_lcdc, FUNC(sed1330_device::status_r), FUNC(sed1330_device::data_w)); + map(0x14400002, 0x14400002).rw(m_lcdc, FUNC(sed1330_device::data_r), FUNC(sed1330_device::command_w)); + + map(0x14c00000, 0x14ffffff).nopw(); + map(0x18000000, 0x1800000f); // 16bitcs -> vopcs, tgccs +} + +void psr2000_state::lcdc_map(address_map &map) +{ + map.global_mask(0x7fff); + map(0x0000, 0x7fff).ram(); +} + +static INPUT_PORTS_START( psr2000 ) +INPUT_PORTS_END + +ROM_START( psr2000 ) + ROM_REGION64_BE( 0x800000, "maincpu", 0 ) + ROM_LOAD32_WORD_SWAP( "x031420.ic206", 0, 0x400000, CRC(42109711) SHA1(4b9ff95d55154fff50142134e2de0fd9b95c4e8e)) + ROM_LOAD32_WORD_SWAP( "x031520.ic205", 2, 0x400000, CRC(4b0943cb) SHA1(eb2895f3957b06b991fe3a3b3030fa9aa3cc85b6)) + + ROM_REGION64_BE( 0x800000, "style", 0 ) + ROM_LOAD16_WORD_SWAP( "x031710.ic207", 0, 0x800000, CRC(669c31ba) SHA1(d0b13ca2414ad8b476391ea53a511783f9f8d030)) + + ROM_REGION64_BE( 0x400000, "data", 0 ) // flash + ROM_LOAD16_WORD_SWAP( "xv685a0.ic204", 0, 0x100000, CRC(c339a386) SHA1(6ae30913d2aff7ae2056f6a5f1a2264ad3f7798c)) + + ROM_REGION32_BE( 0x1000000, "swp30", 0 ) + ROM_LOAD32_WORD_SWAP( "x004010.ic406", 0, 0x800000, CRC(126e5f07) SHA1(db93965e4226212fdbe34df2f0f5457173f01dda)) + ROM_LOAD32_WORD_SWAP( "x004110.ic407", 2, 0x800000, CRC(fae720fe) SHA1(df80a9a75308f0ab1ab33248b5e8cd6563e6aed5)) +ROM_END + +} // anonymous namespace + +SYST( 2001, psr2000, 0, 0, psr2000, psr2000, psr2000_state, empty_init, "Yamaha", "PSR-2000", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ympsr340.cpp mame-0.264+dfsg.1/src/mame/yamaha/ympsr340.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ympsr340.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ympsr340.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -18,9 +18,12 @@ #include "emu.h" +#include "bus/midi/midi.h" #include "cpu/h8/swx00.h" +#include "machine/nvram.h" #include "video/hd44780.h" -#include "bus/midi/midi.h" + +#include "mks3.h" #include "emupal.h" #include "screen.h" @@ -35,6 +38,9 @@ psr340_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_ram(*this, "ram"), + m_nvram(*this, "ram"), + m_mks3(*this, "mks3"), m_lcdc(*this, "ks0066"), m_outputs(*this, "%02d.%x.%x", 0U, 0U, 0U), m_key(*this, "S%c", 'A') @@ -48,6 +54,9 @@ private: required_device m_maincpu; + required_shared_ptr m_ram; + required_device m_nvram; + required_device m_mks3; required_device m_lcdc; output_finder<80, 8, 5> m_outputs; required_ioport_array<8> m_key; @@ -55,16 +64,16 @@ void c_map(address_map &map); void s_map(address_map &map); - void lcd_ctrl_w(u8 data); - void lcd_data_w(u8 data); + void pdt_w(u16 data); + u8 pad_r(); + void txd_w(u8 data); void render_w(int state); u8 m_matrixsel = 0U; - u8 matrix_r(); }; -u8 psr340_state::matrix_r() +u8 psr340_state::pad_r() { u8 data = 0; @@ -79,44 +88,38 @@ return data; } -void psr340_state::lcd_ctrl_w(u8 data) +void psr340_state::pdt_w(u16 data) { - // bit 3 = E, bit 4 = RS, R/W is connected to GND so write-only + // bit 14 = mks3 ic, bit 11 = E, bit 12 = RS, R/W is connected to GND so write-only // all bits are also matrix select for reading the controls - m_lcdc->rs_w(BIT(data, 4)); - m_lcdc->e_w(BIT(data, 3)); + m_mks3->ic_w(BIT(data, 14)); + m_lcdc->rs_w(BIT(data, 12)); + m_lcdc->e_w(BIT(data, 11)); + m_lcdc->db_w(data); + m_matrixsel = data; } -void psr340_state::lcd_data_w(u8 data) +void psr340_state::txd_w(u8 data) { - m_lcdc->db_w(data); - m_matrixsel = data; + m_mks3->req_w(BIT(data, 1)); } void psr340_state::c_map(address_map &map) { - map(0x000000, 0x1fffff).rom().region("maincpu", 0); - map(0x400000, 0x43ffff).ram(); // Work RAM? Or SWP / MEG? - - map(0x600000, 0x600000).lr8(NAME([]() -> uint8_t { return 0x80; })); // FDC status - -// map(0xffe000, 0xffe7ff).ram(); + map(0x000000, 0x1fffff).rom().region("maincpu", 0); // cs0 + map(0x400000, 0x43ffff).ram().share(m_ram); // cs2 - map(0xffe027, 0xffe027).r(FUNC(psr340_state::matrix_r)); - - map(0xffe02a, 0xffe02a).w(FUNC(psr340_state::lcd_ctrl_w)); - map(0xffe02b, 0xffe02b).w(FUNC(psr340_state::lcd_data_w)); - - map(0xffe02f, 0xffe02f).lr8(NAME([]() -> uint8_t { return 0xff; })); + map(0x600000, 0x600000).lr8(NAME([]() -> uint8_t { return 0x80; })); // FDC status, cs3, cs4 w/ dack } void psr340_state::s_map(address_map &map) { - map(0x000000, 0x1fffff).rom().region("wave", 0); + map(0x000000, 0x0fffff).rom().region("wave", 0); } void psr340_state::machine_start() { + save_item(NAME(m_matrixsel)); m_outputs.resolve(); } @@ -130,70 +133,6 @@ return; const u8 *render = m_lcdc->render(); - - if(0) { - logerror("XX -\n"); - for(int i=2; i != 3; i++) { - for(int y=0; y != 8; y++) { - std::string r = "XX"; - for(int x=0; x != 10; x++) { - int idx = x+20*i; - uint8_t v = render[16*(x+20*i) + y]; - r += ' '; - for(int b=4; b >= 0; b--) { - bool known = (idx == 43 && b <= 3) || (idx == 44) || (idx == 45) || (idx == 46 && b >= 3); - known = known || (idx == 46 && b == 2 && y >= 5); - known = known || (idx == 46 && b == 1 && y >= 4); - known = known || (idx == 46 && b == 0 && y >= 5); - known = known || (idx == 47 && b == 4 && y >= 4); - known = known || (idx == 47 && b == 3 && y >= 5); - known = known || (idx == 47 && b == 2 && y >= 4); - known = known || (idx == 43 && b == 4 && y >= 4); - known = known || (idx == 42 && b == 0 && y >= 4 && y <= 6); - known = known || (idx == 42 && b == 1 && y >= 4); - known = known || (idx == 42 && b == 2 && y >= 4 && y <= 6); - known = known || (idx == 42 && b == 3 && y >= 4); - known = known || (idx == 42 && b == 4 && y >= 4 && y <= 6); - known = known || (idx == 41 && b == 1 && y >= 4); - known = known || (idx == 41 && b == 2 && y >= 4 && y <= 6); - known = known || (idx == 41 && b == 3 && y >= 4); - known = known || (idx == 41 && b == 4 && y >= 4 && y <= 6); - known = known || (idx == 40 && b == 0 && y >= 4); - known = known || (idx == 40 && b == 1 && y >= 4 && y <= 6); - - known = known || (idx == 40 && b == 4 && y >= 1 && y <= 6); - - known = known || (idx == 46 && y == 3 && b == 2); - known = known || (idx == 46 && y == 2 && b == 1); - known = known || (idx == 46 && y == 3 && b == 1); - known = known || (idx == 46 && y == 2 && b == 0); - known = known || (idx == 46 && y == 3 && b == 0); - known = known || (idx == 47 && y == 3 && b == 4); - known = known || (idx == 47 && y == 4 && b == 3); - - known = known || (idx == 40 && y == 7 && b == 2); - known = known || (idx == 40 && y == 7 && b == 1); - known = known || (idx == 41 && y == 7 && b == 4); - known = known || (idx == 41 && y == 7 && b == 2); - known = known || (idx == 42 && y == 7 && b == 4); - known = known || (idx == 42 && y == 7 && b == 2); - known = known || (idx == 42 && y == 7 && b == 0); - known = known || (idx == 47 && y == 3 && b == 3); - known = known || (idx == 47 && y == 3 && b == 2); - known = known || (idx == 47 && y == 1 && b == 1); - known = known || (idx == 47 && y == 1 && b == 0); - known = known || (idx == 47 && y == 2 && b == 4); - known = known || (idx == 41 && y == 4 && b == 0); - bool is = v & (0x01 << b); - r += known ? '_' : is ? '#' : '.'; - } - } - logerror("%s\n", r); - } - logerror("XX\n"); - } - } - for(int yy=0; yy != 8; yy++) for(int x=0; x != 80; x++) { uint8_t v = render[16*x + yy]; @@ -272,14 +211,32 @@ void psr340_state::psr340(machine_config &config) { /* basic machine hardware */ - SWX00(config, m_maincpu, 8.4672_MHz_XTAL*2, 1); - m_maincpu->set_addrmap(m_maincpu->c_bus_id(), &psr340_state::c_map); - m_maincpu->set_addrmap(m_maincpu->s_bus_id(), &psr340_state::s_map); + SWX00(config, m_maincpu, 8.4672_MHz_XTAL*2, swx00_device::MODE_DUAL); + m_maincpu->set_addrmap(swx00_device::AS_C, &psr340_state::c_map); + m_maincpu->set_addrmap(swx00_device::AS_S, &psr340_state::s_map); + m_maincpu->read_adc<0>().set_constant(0x3ff); // Battery level + m_maincpu->read_adc<1>().set_constant(0x000); // GND + m_maincpu->read_adc<2>().set_constant(0x000); // GND + m_maincpu->read_adc<3>().set_constant(0x000); // GND + + m_maincpu->write_pdt().set(FUNC(psr340_state::pdt_w)); + m_maincpu->read_pad().set(FUNC(psr340_state::pad_r)); + m_maincpu->write_txd().set(FUNC(psr340_state::txd_w)); + + m_maincpu->add_route(0, "lspeaker", 1.0); + m_maincpu->add_route(1, "rspeaker", 1.0); + + // mks3 is connected to sclki, sync comms on sci1 + // something generates 500K for sci0, probably internal to the swx00 + m_maincpu->sci_set_external_clock_period(0, attotime::from_hz(500000)); + + NVRAM(config, m_nvram, nvram_device::DEFAULT_NONE); + + MKS3(config, m_mks3); + m_mks3->write_da().set(m_maincpu, FUNC(swx00_device::sci_rx_w<1>)); + m_mks3->write_clk().set(m_maincpu, FUNC(swx00_device::sci_clk_w<1>)); - // SCI0 is externally clocked at the 31250 Hz MIDI rate by the mks3 - m_maincpu->sci_set_external_clock_period(0, attotime::from_hz(31250 * 16)); - - KS0066(config, m_lcdc, 270'000); // TODO: clock not measured, datasheet typical clock used + KS0066(config, m_lcdc, 270000); // 91K resistor m_lcdc->set_default_bios_tag("f05"); m_lcdc->set_lcd_size(2, 40); @@ -303,15 +260,11 @@ ROM_REGION(0x200000, "maincpu", 0) ROM_LOAD16_WORD_SWAP("xv89710.bin", 0x000000, 0x200000, CRC(271ccb8a) SHA1(ec6abbdb82a5e851b77338c79ecabfd8040f023d)) - // patch out battery check for now (SWX00B customized H8S reads ADC *value* at FFFF90) - ROM_FILL(0x20e6, 1, 0x54) - ROM_FILL(0x20e7, 1, 0x70) - ROM_REGION16_BE(0x200000, "wave", 0) ROM_LOAD("xv89810.bin", 0x000000, 0x200000, CRC(10e68363) SHA1(5edee814bf07c49088da44474fdd5c817e7c5af0)) - ROM_REGION(0x5704b, "screen", 0) - ROM_LOAD("psr340-lcd.svg", 0, 0x5704b, CRC(d93af0a9) SHA1(76156443025e0b4089259417bb266888c547b2d7)) + ROM_REGION(399369, "screen", 0) + ROM_LOAD("psr340-lcd.svg", 0, 399369, CRC(f9d11ca6) SHA1(da036d713c73d6b452a3e2d2b2234d473422d5fb)) ROM_END } // anonymous namespace diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ympsr540.cpp mame-0.264+dfsg.1/src/mame/yamaha/ympsr540.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ympsr540.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ympsr540.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -107,7 +107,7 @@ ROM_REGION16_LE( 0x600000, "swx00", 0) ROM_LOAD16_WORD_SWAP( "xw25410.ic210", 0, 0x400000, CRC(c7c4736d) SHA1(ff1052eb076557071ed8652e6c2fc0925144fbd5)) - ROM_LOAD16_WORD_SWAP( "xw25520.ic220", 0, 0x200000, CRC(9ef56c4e) SHA1(f26b588f9bcfd7bdbf1c0b38e4a1ea57e2f29f10)) + ROM_LOAD16_WORD_SWAP( "xw25520.ic220", 0x400000, 0x200000, CRC(9ef56c4e) SHA1(f26b588f9bcfd7bdbf1c0b38e4a1ea57e2f29f10)) ROM_END SYST( 1999, psr540, 0, 0, psr540, psr540, psr540_state, empty_init, "Yamaha", "PSR540", MACHINE_IS_SKELETON ) diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymqy70.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymqy70.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymqy70.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymqy70.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -107,7 +107,7 @@ u8 sw_sel; - void pa_w(u16 data) { if (data) sw_sel = data; } + void pa_w(u8 data) { if (data) sw_sel = data; } u8 sw_in(); u16 adc_bkupbat_r() { return 0x2a0; } void mem_map(address_map &map); diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymtx81z.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymtx81z.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymtx81z.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymtx81z.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -47,7 +47,7 @@ u8 p2_r(); void midi_rx_r(int state) { m_rx_data = state; } - void midiclock_w(int state) { if (state) m_maincpu->m6801_clock_serial(); } + void midiclock_w(int state) { if (state) m_maincpu->clock_serial(); } required_device m_maincpu; required_ioport m_port2; diff -Nru mame-0.263+dfsg.1/src/mame/yamaha/ymvl70.cpp mame-0.264+dfsg.1/src/mame/yamaha/ymvl70.cpp --- mame-0.263+dfsg.1/src/mame/yamaha/ymvl70.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yamaha/ymvl70.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -60,23 +60,11 @@ private: enum { - P2_LCD_RS = 0x01, - P2_LCD_RW = 0x02, - P2_LCD_ENABLE = 0x04 - }; - - enum { P6_LCD_RS = 0x04, P6_LCD_RW = 0x02, P6_LCD_ENABLE = 0x01 }; - enum { - PA_LCD_RS = 0x02, - PA_LCD_ENABLE = 0x20, - PA_LCD_RW = 0x40 - }; - required_device m_vl70cpu; required_device m_dspv; required_device m_meg; @@ -85,20 +73,18 @@ required_ioport m_ioport_b1; required_ioport m_ioport_b2; - u8 cur_p1, cur_p2, cur_p3, cur_p5, cur_p6, cur_pa, cur_pc, cur_pf, cur_pg; - u8 cur_ic32; + u8 cur_p6, cur_pa, cur_pc; u16 adc_midisw_r(); u16 adc_battery_r(); u16 adc_breath_r(); - void p6_w(u16 data); - u16 p6_r(); - void pa_w(u16 data); - u16 pa_r(); - void pb_w(u16 data); - void pc_w(u16 data); - u16 pc_r(); + void p6_w(u8 data); + void pa_w(u8 data); + u8 pa_r(); + void pb_w(u8 data); + void pc_w(u8 data); + u8 pc_r(); virtual void machine_start() override; void vl70_map(address_map &map); @@ -106,7 +92,7 @@ void vl70_state::machine_start() { - cur_p1 = cur_p2 = cur_p3 = cur_p5 = cur_p6 = cur_pa = cur_pc = cur_pf = cur_pg = cur_ic32 = 0xff; + cur_p6 = cur_pa = cur_pc = 0xff; } void vl70_state::vl70_map(address_map &map) @@ -135,31 +121,31 @@ return 0x000; } -void vl70_state::p6_w(u16 data) +void vl70_state::p6_w(u8 data) { - if(!(cur_p6 & P6_LCD_ENABLE) && (data & P6_LCD_ENABLE)) { - if(!(cur_p6 & P6_LCD_RW)) { - if(cur_p6 & P6_LCD_RS) - m_lcd->data_write(cur_pa); - else - m_lcd->control_write(cur_pa); + if((cur_p6 & P6_LCD_ENABLE) && !(data & P6_LCD_ENABLE)) { + if(!(cur_p6 & P6_LCD_RW)) { + if(cur_p6 & P6_LCD_RS) + m_lcd->data_write(cur_pa); + else + m_lcd->control_write(cur_pa); } } cur_p6 = data; } -void vl70_state::pb_w(u16 data) +void vl70_state::pb_w(u8 data) { m_lcd->set_leds(bitswap<6>((data >> 2) ^ 0x3f, 5, 3, 1, 4, 2, 0)); } -void vl70_state::pc_w(u16 data) +void vl70_state::pc_w(u8 data) { cur_pc = data; } -u16 vl70_state::pc_r() +u8 vl70_state::pc_r() { u8 r = 0xff; if(!(cur_pc & 0x01)) @@ -171,17 +157,12 @@ return r; } -u16 vl70_state::p6_r() -{ - return cur_p6; -} - -void vl70_state::pa_w(u16 data) +void vl70_state::pa_w(u8 data) { cur_pa = data; } -u16 vl70_state::pa_r() +u8 vl70_state::pa_r() { if((cur_p6 & P6_LCD_ENABLE)) { if(cur_p6 & P6_LCD_RW) @@ -209,7 +190,6 @@ m_vl70cpu->read_adc<5>().set_constant(0); m_vl70cpu->read_adc<6>().set_constant(0); m_vl70cpu->read_adc<7>().set_constant(0); - m_vl70cpu->read_port6().set(FUNC(vl70_state::p6_r)); m_vl70cpu->write_port6().set(FUNC(vl70_state::p6_w)); m_vl70cpu->read_porta().set(FUNC(vl70_state::pa_r)); m_vl70cpu->write_porta().set(FUNC(vl70_state::pa_w)); diff -Nru mame-0.263+dfsg.1/src/mame/yeno/301xl.cpp mame-0.264+dfsg.1/src/mame/yeno/301xl.cpp --- mame-0.263+dfsg.1/src/mame/yeno/301xl.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yeno/301xl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,241 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger, Sean Riddle +/******************************************************************************* + +Yeno 301 XL + +NOTE: It triggers an IRQ when the power switch is changed from ON to SAVE. +If this is not done, NVRAM won't save properly. + +It's by the same programmer as Chess King Triomphe / Counter Gambit, also using +the TRAP interrupt for the beeper routine. Intelligent Software did not exist +anymore in 1988. + +Hardware notes: +- PCB label: WSE 8108A +- Hitachi HD63B01X0P, 8MHz XTAL +- 8*8 chessboard buttons, 16+1 LEDs, piezo + +Yeno 309 XT is on the same PCB, and has the same MCU ROM. + +TODO: +- if/when MAME supports an exit callback, hook up power-off switch to that + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6800/m6801.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "yeno_301xl.lh" + + +namespace { + +class y301xl_state : public driver_device +{ +public: + y301xl_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(power_off); + + void y301xl(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<2> m_inputs; + + emu_timer *m_standbytimer; + u16 m_inp_mux = 0; + + // I/O handlers + u8 input_r(); + void control_w(u8 data); + void board_w(u8 data); + + TIMER_CALLBACK_MEMBER(set_standby); +}; + +void y301xl_state::machine_start() +{ + m_standbytimer = timer_alloc(FUNC(y301xl_state::set_standby), this); + + // register for savestates + save_item(NAME(m_inp_mux)); +} + + + +/******************************************************************************* + Power +*******************************************************************************/ + +void y301xl_state::machine_reset() +{ + m_maincpu->set_input_line(HD6301_IRQ1_LINE, CLEAR_LINE); + m_maincpu->set_input_line(M6801_STBY_LINE, CLEAR_LINE); +} + +TIMER_CALLBACK_MEMBER(y301xl_state::set_standby) +{ + m_maincpu->set_input_line(M6801_STBY_LINE, ASSERT_LINE); +} + +INPUT_CHANGED_MEMBER(y301xl_state::power_off) +{ + if (newval && !m_maincpu->standby()) + { + // IRQ1 when power switch is set to SAVE, followed by STBY after a short delay + m_maincpu->set_input_line(HD6301_IRQ1_LINE, ASSERT_LINE); + m_standbytimer->adjust(attotime::from_msec(50)); + } +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +u8 y301xl_state::input_r() +{ + // P20-P27: multiplexed inputs + u8 data = 0; + + // read buttons + for (int i = 0; i < 2; i++) + if (BIT(m_inp_mux, i + 8)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i); + + return ~data; +} + +void y301xl_state::control_w(u8 data) +{ + // P40,P41: input mux (buttons) + m_inp_mux = (m_inp_mux & 0xff) | (~data << 8 & 0x300); + + // P42: green led (direct) + // P44,P45: led select + m_display->write_my(bitswap<3>(~data,2,5,4)); + + // P47: speaker out + m_dac->write(BIT(~data, 7)); +} + +void y301xl_state::board_w(u8 data) +{ + // P60-P67: input mux (chessboard), led data + m_inp_mux = (m_inp_mux & 0x300) | (data ^ 0xff); + m_display->write_mx(~data); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( y301xl ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Set Up") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Black") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("White") + + PORT_START("POWER") // needs to be triggered for nvram to work + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, y301xl_state, power_off, 0) PORT_NAME("Power Off") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void y301xl_state::y301xl(machine_config &config) +{ + // basic machine hardware + HD6301X0(config, m_maincpu, 8_MHz_XTAL); + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301x0_cpu_device::nvram_set_battery)); + m_maincpu->standby_cb().append([this](int state) { if (state) m_display->clear(); }); + m_maincpu->in_p2_cb().set(FUNC(y301xl_state::input_r)); + m_maincpu->out_p4_cb().set(FUNC(y301xl_state::control_w)); + m_maincpu->out_p6_cb().set(FUNC(y301xl_state::board_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2+1, 8); + config.set_default_layout(layout_yeno_301xl); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( y301xl ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD("yeno_301_xl_hd63b01x0c70p", 0x0000, 0x1000, CRC(6da5ee23) SHA1(f37298c56c5130783c86fb03fab78d86c20467e5) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1988, y301xl, 0, 0, y301xl, y301xl, y301xl_state, empty_init, "Yeno / Bray Research", "301 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/yeno/416xl.cpp mame-0.264+dfsg.1/src/mame/yeno/416xl.cpp --- mame-0.263+dfsg.1/src/mame/yeno/416xl.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yeno/416xl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,222 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/******************************************************************************* + +Yeno 416 XL + +The chess engine is by Frans Morsch, similar to Mephisto Europa. + +NOTE: Turn the power off (SAVE) before exiting MAME, otherwise NVRAM won't save +properly. + +Hardware notes: +- PCB label: CHESS3 YENO 416XL +- Hitachi HD6301Y0P @ ~8MHz (LC oscillator) +- 8*8 chessboard buttons, 16+7 LEDs, piezo + +TODO: +- if/when MAME supports an exit callback, hook up power-off switch to that + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6800/m6801.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "yeno_416xl.lh" + + +namespace { + +class y416xl_state : public driver_device +{ +public: + y416xl_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + void y416xl(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(power_off) { if (newval) m_power = false; } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override { m_power = true; } + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<2> m_inputs; + + bool m_power = false; + u16 m_inp_mux = 0; + + // I/O handlers + template void leds_w(u8 data); + u8 p2_r(); + void p2_w(u8 data); + u8 p5_r(); + void p6_w(u8 data); +}; + +void y416xl_state::machine_start() +{ + // register for savestates + save_item(NAME(m_power)); + save_item(NAME(m_inp_mux)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +template +void y416xl_state::leds_w(u8 data) +{ + // P10-P17, P30-P37, P40-P47: leds (direct) + m_display->write_row(N, ~data); +} + +u8 y416xl_state::p2_r() +{ + // P22: power switch + return m_power ? 0xff : 0xfb; +} + +void y416xl_state::p2_w(u8 data) +{ + // P20,P21: input mux (buttons) + m_inp_mux = (m_inp_mux & 0xff) | (~data << 8 & 0x300); + + // P23: speaker out + m_dac->write(BIT(data, 3)); +} + +u8 y416xl_state::p5_r() +{ + // P50-P57: multiplexed inputs + u8 data = 0; + + // read buttons + for (int i = 0; i < 3; i++) + if (BIT(m_inp_mux, i + 8)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i); + + return ~data; +} + +void y416xl_state::p6_w(u8 data) +{ + // P60-P67: input mux (chessboard) + m_inp_mux = (m_inp_mux & 0x300) | (data ^ 0xff); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( y416xl ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Up") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Multimove") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Change Color") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Sound / Change Direction") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Learning") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Show Move") + + PORT_START("POWER") // needs to be triggered for nvram to work + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, y416xl_state, power_off, 0) PORT_NAME("Power Off") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void y416xl_state::y416xl(machine_config &config) +{ + // basic machine hardware + HD6301Y0(config, m_maincpu, 8'000'000); // approximation, no XTAL + m_maincpu->nvram_enable_backup(true); + m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301y0_cpu_device::nvram_set_battery)); + m_maincpu->standby_cb().append([this](int state) { if (state) m_display->clear(); }); + m_maincpu->out_p1_cb().set(FUNC(y416xl_state::leds_w<0>)); + m_maincpu->in_p2_cb().set(FUNC(y416xl_state::p2_r)); + m_maincpu->out_p2_cb().set(FUNC(y416xl_state::p2_w)); + m_maincpu->out_p3_cb().set(FUNC(y416xl_state::leds_w<1>)); + m_maincpu->out_p4_cb().set(FUNC(y416xl_state::leds_w<2>)); + m_maincpu->in_p5_cb().set(FUNC(y416xl_state::p5_r)); + m_maincpu->out_p6_cb().set(FUNC(y416xl_state::p6_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + m_board->set_nvram_enable(true); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 8); + config.set_default_layout(layout_yeno_416xl); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( y416xl ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD("yeno_ic-890529_hd6301y0k79p.u1", 0x0000, 0x4000, CRC(85b4368d) SHA1(9dc12a6538141efe1ebcf8162ac7348ddc2b33ae) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1989, y416xl, 0, 0, y416xl, y416xl, y416xl_state, empty_init, "Yeno", "416 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/yeno/532xl.cpp mame-0.264+dfsg.1/src/mame/yeno/532xl.cpp --- mame-0.263+dfsg.1/src/mame/yeno/532xl.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yeno/532xl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,281 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Mr. Lars +/******************************************************************************* + +Yeno 532 XL + +This is the only Yeno chesscomputer that has a common CPU with external EPROM, +others are based on a 1-chip MCU. The 532 XL chess engine is by Ulf Rathsman. + +Hardware notes: +- R65C02P4 @ 4 MHz +- 32KB ROM (MBM27C256H-10) +- 8KB battery-backed RAM (HY6264LP-10) +- HD61603, 2 4*7seg LCD screens +- TTL, piezo, 8*8+7 LEDs, button sensors + +The software searches for an opening book ROM in 0x4000-0x7fff, it looks like +it's compatible with Conchess L16 / Mephisto HG240. Though the hardware does +not have an edge connector or empty ROM socket for it. + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6502/r65c02.h" +#include "machine/nvram.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/hd61603.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "yeno_532xl.lh" + + +namespace { + +class y532xl_state : public driver_device +{ +public: + y532xl_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_lcd(*this, "lcd"), + m_display(*this, "display"), + m_board(*this, "board"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0), + m_out_digit(*this, "digit%u", 0U), + m_out_lcd(*this, "lcd%u", 0U) + { } + + // machine configs + void y532xl(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_lcd; + required_device m_display; + required_device m_board; + required_device m_dac; + required_ioport_array<3> m_inputs; + output_finder<8> m_out_digit; + output_finder<64> m_out_lcd; + + u8 m_led_data = 0; + u8 m_cb_mux = 0xff; + u8 m_control = 0xff; + + // address maps + void main_map(address_map &map); + + // I/O handlers + void update_display(); + void lcd_seg_w(u64 data); + u8 input_r(); + void cb_w(u8 data); + void led_w(u8 data); + void control_w(offs_t offset, u8 data); +}; + +void y532xl_state::machine_start() +{ + m_out_digit.resolve(); + m_out_lcd.resolve(); + + // register for savestates + save_item(NAME(m_led_data)); + save_item(NAME(m_cb_mux)); + save_item(NAME(m_control)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void y532xl_state::update_display() +{ + m_display->matrix(~(m_control << 8 | m_cb_mux), m_led_data); +} + +void y532xl_state::lcd_seg_w(u64 data) +{ + // output individual segments + for (int i = 0; i < 64; i++) + m_out_lcd[i] = BIT(data, i); + + // output digits + for (int i = 0; i < 8; i++) + { + u8 digit_data = bitswap<8>(data,7,3,2,4,5,6,0,1); + m_out_digit[i] = (i & 3) ? digit_data : digit_data & 0x7f; // no DP for last digit + data >>= 8; + } +} + +u8 y532xl_state::input_r() +{ + u8 data = 0; + + // read side panel buttons + for (int i = 0; i < 3; i++) + if (BIT(~m_control, i)) + data |= m_inputs[i]->read(); + + // read chessboard sensors + for (int i = 0; i < 8; i++) + if (BIT(~m_cb_mux, i)) + data |= m_board->read_file(i); + + return data; +} + +void y532xl_state::cb_w(u8 data) +{ + // d0-d3: lcd data (see control_w) + // d0-d7: chessboard input mux + m_cb_mux = data; + update_display(); +} + +void y532xl_state::led_w(u8 data) +{ + // d0-d7: led data + m_led_data = data; + update_display(); +} + +void y532xl_state::control_w(offs_t offset, u8 data) +{ + u8 prev = m_control; + + // a0-a2,d0: 74259 + u8 mask = 1 << offset; + m_control = (m_control & ~mask) | ((data & 1) ? mask : 0); + + // Q0-Q2: button input mux + // Q0: select side leds + update_display(); + + // Q3,Q4: speaker out + m_dac->write(m_control >> 3 & 3); + + // Q7 rising edge: write to lcd + if (~prev & m_control & 0x80) + m_lcd->data_w(m_cb_mux & 0xf); +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void y532xl_state::main_map(address_map &map) +{ + map(0x0000, 0x1fff).ram().share("nvram"); + map(0x2000, 0x2000).w(FUNC(y532xl_state::cb_w)); + map(0x2080, 0x2080).w(FUNC(y532xl_state::led_w)); + map(0x2100, 0x2100).r(FUNC(y532xl_state::input_r)); + map(0x2180, 0x2187).w(FUNC(y532xl_state::control_w)); + map(0x8000, 0xffff).rom(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( y532xl ) + PORT_START("IN.0") + PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Show Move") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("Play") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game / Clear Board") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Up") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Multi Move") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Teach") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Take Back") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Forward") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A / 1 / Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B / 2 / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C / 3 / Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D / 4 / Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E / 5 / Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F / 6 / King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G / 7 / Black") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H / 8 / White") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void y532xl_state::y532xl(machine_config &config) +{ + // basic machine hardware + R65C02(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &y532xl_state::main_map); + + const attotime nmi_period = attotime::from_hz(4_MHz_XTAL / 0x2000); + m_maincpu->set_periodic_int(FUNC(y532xl_state::nmi_line_pulse), nmi_period); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + m_board->set_nvram_enable(true); + + // video hardware + HD61603(config, m_lcd, 0); + m_lcd->write_segs().set(FUNC(y532xl_state::lcd_seg_w)); + + PWM_DISPLAY(config, m_display).set_size(9, 8); + config.set_default_layout(layout_yeno_532xl); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_2BIT_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.125); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( y532xl ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("532xl_00674.u9", 0x8000, 0x8000, CRC(8ded1df6) SHA1(6bcbebb8e1fde472e1ccd0036cb3f00b27f72d89) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1989, y532xl, 0, 0, y532xl, y532xl, y532xl_state, empty_init, "Yeno", "532 XL (Yeno)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff -Nru mame-0.263+dfsg.1/src/mame/yunsung/paradise.cpp mame-0.264+dfsg.1/src/mame/yunsung/paradise.cpp --- mame-0.263+dfsg.1/src/mame/yunsung/paradise.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yunsung/paradise.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -211,8 +211,6 @@ }; -// video - /*************************************************************************** Note: if MAME_DEBUG is defined, pressing Z with: @@ -498,8 +496,6 @@ return 0; } -// machine - /*************************************************************************** Memory Maps diff -Nru mame-0.263+dfsg.1/src/mame/yunsung/yunsun16.cpp mame-0.264+dfsg.1/src/mame/yunsung/yunsun16.cpp --- mame-0.263+dfsg.1/src/mame/yunsung/yunsun16.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yunsung/yunsun16.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -201,8 +201,6 @@ }; -// video - /*************************************************************************** @@ -395,8 +393,6 @@ } -// machine - /*************************************************************************** diff -Nru mame-0.263+dfsg.1/src/mame/yunsung/yunsung8.cpp mame-0.264+dfsg.1/src/mame/yunsung/yunsung8.cpp --- mame-0.263+dfsg.1/src/mame/yunsung/yunsung8.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/mame/yunsung/yunsung8.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -117,8 +117,6 @@ }; -// video - /*************************************************************************** Note: if MAME_DEBUG is defined, pressing Z with: @@ -287,8 +285,6 @@ } -// machine - /*************************************************************************** diff -Nru mame-0.263+dfsg.1/src/osd/interface/midiport.h mame-0.264+dfsg.1/src/osd/interface/midiport.h --- mame-0.263+dfsg.1/src/osd/interface/midiport.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/interface/midiport.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,40 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + midiport.h + + OSD interface to midi ports + +***************************************************************************/ +#ifndef MAME_OSD_INTERFACE_MIDIPORT_H +#define MAME_OSD_INTERFACE_MIDIPORT_H + +#pragma once + +#include + + +namespace osd { + +class midi_input_port +{ +public: + virtual ~midi_input_port() = default; + + virtual bool poll() = 0; + virtual int read(uint8_t *pOut) = 0; +}; + + +class midi_output_port +{ +public: + virtual ~midi_output_port() = default; + + virtual void write(uint8_t data) = 0; +}; + +} // namespace osd + +#endif // MAME_OSD_INTERFACE_MIDIPORT_H diff -Nru mame-0.263+dfsg.1/src/osd/interface/nethandler.cpp mame-0.264+dfsg.1/src/osd/interface/nethandler.cpp --- mame-0.263+dfsg.1/src/osd/interface/nethandler.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/interface/nethandler.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,24 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + nethandler.cpp + + OSD interface to virtual networking handlers + +***************************************************************************/ + +#include "nethandler.h" + +#include + + +namespace osd { + +network_handler::network_handler() noexcept + : m_promisc(false) +{ + std::fill(std::begin(m_mac), std::end(m_mac), 0); +} + +} // namespace osd diff -Nru mame-0.263+dfsg.1/src/osd/interface/nethandler.h mame-0.264+dfsg.1/src/osd/interface/nethandler.h --- mame-0.263+dfsg.1/src/osd/interface/nethandler.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/interface/nethandler.h 2024-03-25 14:00:46.000000000 +0000 @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + nethandler.h + + OSD interface to virtual networking handlers + +***************************************************************************/ +#ifndef MAME_OSD_INTERFACE_NETHANDLER_H +#define MAME_OSD_INTERFACE_NETHANDLER_H + +#pragma once + +#include "osdcomm.h" + +#include + + +namespace osd { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// base for virtual network interface handler + +class network_handler +{ +public: + network_handler() noexcept; + + virtual void recv_cb(u8 *buf, int len) = 0; + + std::array const &get_mac() noexcept { return m_mac; } + bool get_promisc() noexcept { return m_promisc; } + +protected: + ~network_handler() = default; + + bool m_promisc; + std::array m_mac; +}; + +} // namespace osd + +#endif // MAME_OSD_INTERFACE_NETHANDLER_H diff -Nru mame-0.263+dfsg.1/src/osd/modules/debugger/debuggdbstub.cpp mame-0.264+dfsg.1/src/osd/modules/debugger/debuggdbstub.cpp --- mame-0.263+dfsg.1/src/osd/modules/debugger/debuggdbstub.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/debugger/debuggdbstub.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -253,9 +253,9 @@ { "A4", "a4", false, TYPE_INT }, { "A5", "a5", false, TYPE_INT }, { "A6", "fp", true, TYPE_INT }, - { "A7", "sp", true, TYPE_INT }, + { "SP", "sp", true, TYPE_INT }, { "SR", "ps", false, TYPE_INT }, // NOTE GDB named it ps, but it's actually sr - { "PC", "pc", true, TYPE_CODE_POINTER }, + { "CURPC","pc", true, TYPE_CODE_POINTER }, } }; @@ -280,9 +280,9 @@ { "A4", "a4", false, TYPE_INT }, { "A5", "a5", false, TYPE_INT }, { "A6", "fp", true, TYPE_INT }, - { "A7", "sp", true, TYPE_INT }, + { "SP", "sp", true, TYPE_INT }, { "SR", "ps", false, TYPE_INT }, // NOTE GDB named it ps, but it's actually sr - { "PC", "pc", true, TYPE_CODE_POINTER }, + { "CURPC","pc", true, TYPE_CODE_POINTER }, //NOTE m68-elf-gdb complains about fpcontrol register not present but 68000 doesn't have floating point so... } }; @@ -682,6 +682,9 @@ result.reserve(src.length()); for ( char ch: src ) { + if ( ch == '\n' ) // don't let socket convert line endings and messing up the checksum + continue; + if ( ch == '#' || ch == '$' || ch == '}' ) { result += '}'; diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_common.cpp mame-0.264+dfsg.1/src/osd/modules/input/input_common.cpp --- mame-0.263+dfsg.1/src/osd/modules/input/input_common.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_common.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -20,7 +20,9 @@ #if defined(OSD_WINDOWS) || defined(SDLMAME_WIN32) #include -#define KEY_TRANS_WIN32(disc, virtual) KEY_##disc, virtual, +#include +#define DIK_UNKNOWN 0xffff // intentionally impossible +#define KEY_TRANS_WIN32(disc, virtual) DIK_##disc, virtual, #else #define KEY_TRANS_WIN32(disc, virtual) #endif @@ -41,147 +43,147 @@ #endif #if defined(OSD_WINDOWS) || defined(OSD_SDL) + key_trans_entry keyboard_trans_table::s_default_table[] = { - // MAME key sdl scancode di scancode virtual key ascii ui - KEY_TRANS_ENTRY0(ESC, ESCAPE, ESCAPE, VK_ESCAPE, 27, "ESCAPE"), - KEY_TRANS_ENTRY1(1, 1, 1, '1', '1'), - KEY_TRANS_ENTRY1(2, 2, 2, '2', '2'), - KEY_TRANS_ENTRY1(3, 3, 3, '3', '3'), - KEY_TRANS_ENTRY1(4, 4, 4, '4', '4'), - KEY_TRANS_ENTRY1(5, 5, 5, '5', '5'), - KEY_TRANS_ENTRY1(6, 6, 6, '6', '6'), - KEY_TRANS_ENTRY1(7, 7, 7, '7', '7'), - KEY_TRANS_ENTRY1(8, 8, 8, '8', '8'), - KEY_TRANS_ENTRY1(9, 9, 9, '9', '9'), - KEY_TRANS_ENTRY1(0, 0, 0, '0', '0'), - KEY_TRANS_ENTRY1(MINUS, MINUS, MINUS, VK_OEM_MINUS, '-'), - KEY_TRANS_ENTRY1(EQUALS, EQUALS, EQUALS, VK_OEM_PLUS, '='), - KEY_TRANS_ENTRY1(BACKSPACE, BACKSPACE, BACK, VK_BACK, 8), - KEY_TRANS_ENTRY1(TAB, TAB, TAB, VK_TAB, 9), - KEY_TRANS_ENTRY1(Q, Q, Q, 'Q', 'Q'), - KEY_TRANS_ENTRY1(W, W, W, 'W', 'W'), - KEY_TRANS_ENTRY1(E, E, E, 'E', 'E'), - KEY_TRANS_ENTRY1(R, R, R, 'R', 'R'), - KEY_TRANS_ENTRY1(T, T, T, 'T', 'T'), - KEY_TRANS_ENTRY1(Y, Y, Y, 'Y', 'Y'), - KEY_TRANS_ENTRY1(U, U, U, 'U', 'U'), - KEY_TRANS_ENTRY1(I, I, I, 'I', 'I'), - KEY_TRANS_ENTRY1(O, O, O, 'O', 'O'), - KEY_TRANS_ENTRY1(P, P, P, 'P', 'P'), - KEY_TRANS_ENTRY1(OPENBRACE, LEFTBRACKET, LBRACKET, VK_OEM_4, '['), - KEY_TRANS_ENTRY1(CLOSEBRACE, RIGHTBRACKET, RBRACKET, VK_OEM_6, ']'), - KEY_TRANS_ENTRY0(ENTER, RETURN, RETURN, VK_RETURN, 13, "RETURN"), - KEY_TRANS_ENTRY1(LCONTROL, LCTRL, LCONTROL, VK_LCONTROL, 0), - KEY_TRANS_ENTRY1(A, A, A, 'A', 'A'), - KEY_TRANS_ENTRY1(S, S, S, 'S', 'S'), - KEY_TRANS_ENTRY1(D, D, D, 'D', 'D'), - KEY_TRANS_ENTRY1(F, F, F, 'F', 'F'), - KEY_TRANS_ENTRY1(G, G, G, 'G', 'G'), - KEY_TRANS_ENTRY1(H, H, H, 'H', 'H'), - KEY_TRANS_ENTRY1(J, J, J, 'J', 'J'), - KEY_TRANS_ENTRY1(K, K, K, 'K', 'K'), - KEY_TRANS_ENTRY1(L, L, L, 'L', 'L'), - KEY_TRANS_ENTRY1(COLON, SEMICOLON, SEMICOLON, VK_OEM_1, ';'), - KEY_TRANS_ENTRY1(QUOTE, APOSTROPHE, APOSTROPHE, VK_OEM_7, '\''), - KEY_TRANS_ENTRY1(TILDE, GRAVE, GRAVE, VK_OEM_3, '`'), - KEY_TRANS_ENTRY1(LSHIFT, LSHIFT, LSHIFT, VK_LSHIFT, 0), - KEY_TRANS_ENTRY1(BACKSLASH, BACKSLASH, BACKSLASH, VK_OEM_5, '\\'), + // MAME key SDL scancode DI scancode virtual key ASCII UI + KEY_TRANS_ENTRY0(ESC, ESCAPE, ESCAPE, VK_ESCAPE, 27, "ESCAPE"), + KEY_TRANS_ENTRY1(1, 1, 1, '1', '1'), + KEY_TRANS_ENTRY1(2, 2, 2, '2', '2'), + KEY_TRANS_ENTRY1(3, 3, 3, '3', '3'), + KEY_TRANS_ENTRY1(4, 4, 4, '4', '4'), + KEY_TRANS_ENTRY1(5, 5, 5, '5', '5'), + KEY_TRANS_ENTRY1(6, 6, 6, '6', '6'), + KEY_TRANS_ENTRY1(7, 7, 7, '7', '7'), + KEY_TRANS_ENTRY1(8, 8, 8, '8', '8'), + KEY_TRANS_ENTRY1(9, 9, 9, '9', '9'), + KEY_TRANS_ENTRY1(0, 0, 0, '0', '0'), + KEY_TRANS_ENTRY1(MINUS, MINUS, MINUS, VK_OEM_MINUS, '-'), + KEY_TRANS_ENTRY1(EQUALS, EQUALS, EQUALS, VK_OEM_PLUS, '='), + KEY_TRANS_ENTRY1(BACKSPACE, BACKSPACE, BACK, VK_BACK, 8), + KEY_TRANS_ENTRY1(TAB, TAB, TAB, VK_TAB, 9), + KEY_TRANS_ENTRY1(Q, Q, Q, 'Q', 'Q'), + KEY_TRANS_ENTRY1(W, W, W, 'W', 'W'), + KEY_TRANS_ENTRY1(E, E, E, 'E', 'E'), + KEY_TRANS_ENTRY1(R, R, R, 'R', 'R'), + KEY_TRANS_ENTRY1(T, T, T, 'T', 'T'), + KEY_TRANS_ENTRY1(Y, Y, Y, 'Y', 'Y'), + KEY_TRANS_ENTRY1(U, U, U, 'U', 'U'), + KEY_TRANS_ENTRY1(I, I, I, 'I', 'I'), + KEY_TRANS_ENTRY1(O, O, O, 'O', 'O'), + KEY_TRANS_ENTRY1(P, P, P, 'P', 'P'), + KEY_TRANS_ENTRY1(OPENBRACE, LEFTBRACKET, LBRACKET, VK_OEM_4, '['), + KEY_TRANS_ENTRY1(CLOSEBRACE, RIGHTBRACKET, RBRACKET, VK_OEM_6, ']'), + KEY_TRANS_ENTRY0(ENTER, RETURN, RETURN, VK_RETURN, 13, "RETURN"), + KEY_TRANS_ENTRY1(LCONTROL, LCTRL, LCONTROL, VK_LCONTROL, 0), + KEY_TRANS_ENTRY1(A, A, A, 'A', 'A'), + KEY_TRANS_ENTRY1(S, S, S, 'S', 'S'), + KEY_TRANS_ENTRY1(D, D, D, 'D', 'D'), + KEY_TRANS_ENTRY1(F, F, F, 'F', 'F'), + KEY_TRANS_ENTRY1(G, G, G, 'G', 'G'), + KEY_TRANS_ENTRY1(H, H, H, 'H', 'H'), + KEY_TRANS_ENTRY1(J, J, J, 'J', 'J'), + KEY_TRANS_ENTRY1(K, K, K, 'K', 'K'), + KEY_TRANS_ENTRY1(L, L, L, 'L', 'L'), + KEY_TRANS_ENTRY1(COLON, SEMICOLON, SEMICOLON, VK_OEM_1, ';'), + KEY_TRANS_ENTRY1(QUOTE, APOSTROPHE, APOSTROPHE, VK_OEM_7, '\''), + KEY_TRANS_ENTRY1(TILDE, GRAVE, GRAVE, VK_OEM_3, '`'), + KEY_TRANS_ENTRY1(LSHIFT, LSHIFT, LSHIFT, VK_LSHIFT, 0), + KEY_TRANS_ENTRY1(BACKSLASH, BACKSLASH, BACKSLASH, VK_OEM_5, '\\'), // KEY_TRANS_ENTRY1(BACKSLASH2, NONUSHASH, UNKNOWN, OEM_102, VK_OEM_102, '<'), // This is the additional key that ISO keyboards have over ANSI ones, located between left shift and Y. - KEY_TRANS_ENTRY1(BACKSLASH2, NONUSBACKSLASH, OEM_102, VK_OEM_102, '<'), - KEY_TRANS_ENTRY1(Z, Z, Z, 'Z', 'Z'), - KEY_TRANS_ENTRY1(X, X, X, 'X', 'X'), - KEY_TRANS_ENTRY1(C, C, C, 'C', 'C'), - KEY_TRANS_ENTRY1(V, V, V, 'V', 'V'), - KEY_TRANS_ENTRY1(B, B, B, 'B', 'B'), - KEY_TRANS_ENTRY1(N, N, N, 'N', 'N'), - KEY_TRANS_ENTRY1(M, M, M, 'M', 'M'), - KEY_TRANS_ENTRY1(COMMA, COMMA, COMMA, VK_OEM_COMMA, ','), - KEY_TRANS_ENTRY1(STOP, PERIOD, PERIOD, VK_OEM_PERIOD, '.'), - KEY_TRANS_ENTRY1(SLASH, SLASH, SLASH, VK_OEM_2, '/'), - KEY_TRANS_ENTRY1(RSHIFT, RSHIFT, RSHIFT, VK_RSHIFT, 0), - KEY_TRANS_ENTRY1(ASTERISK, KP_MULTIPLY, MULTIPLY, VK_MULTIPLY, '*'), - KEY_TRANS_ENTRY1(LALT, LALT, LMENU, VK_LMENU, 0), - KEY_TRANS_ENTRY1(SPACE, SPACE, SPACE, VK_SPACE, ' '), - KEY_TRANS_ENTRY1(CAPSLOCK, CAPSLOCK, CAPITAL, VK_CAPITAL, 0), - KEY_TRANS_ENTRY1(F1, F1, F1, VK_F1, 0), - KEY_TRANS_ENTRY1(F2, F2, F2, VK_F2, 0), - KEY_TRANS_ENTRY1(F3, F3, F3, VK_F3, 0), - KEY_TRANS_ENTRY1(F4, F4, F4, VK_F4, 0), - KEY_TRANS_ENTRY1(F5, F5, F5, VK_F5, 0), - KEY_TRANS_ENTRY1(F6, F6, F6, VK_F6, 0), - KEY_TRANS_ENTRY1(F7, F7, F7, VK_F7, 0), - KEY_TRANS_ENTRY1(F8, F8, F8, VK_F8, 0), - KEY_TRANS_ENTRY1(F9, F9, F9, VK_F9, 0), - KEY_TRANS_ENTRY1(F10, F10, F10, VK_F10, 0), - KEY_TRANS_ENTRY1(NUMLOCK, NUMLOCKCLEAR, NUMLOCK, VK_NUMLOCK, 0), - KEY_TRANS_ENTRY1(SCRLOCK, SCROLLLOCK, SCROLL, VK_SCROLL, 0), - KEY_TRANS_ENTRY1(7_PAD, KP_7, NUMPAD7, VK_NUMPAD7, 0), - KEY_TRANS_ENTRY1(8_PAD, KP_8, NUMPAD8, VK_NUMPAD8, 0), - KEY_TRANS_ENTRY1(9_PAD, KP_9, NUMPAD9, VK_NUMPAD9, 0), - KEY_TRANS_ENTRY1(MINUS_PAD, KP_MINUS, SUBTRACT, VK_SUBTRACT, 0), - KEY_TRANS_ENTRY1(4_PAD, KP_4, NUMPAD4, VK_NUMPAD4, 0), - KEY_TRANS_ENTRY1(5_PAD, KP_5, NUMPAD5, VK_NUMPAD5, 0), - KEY_TRANS_ENTRY1(6_PAD, KP_6, NUMPAD6, VK_NUMPAD6, 0), - KEY_TRANS_ENTRY1(PLUS_PAD, KP_PLUS, ADD, VK_ADD, 0), - KEY_TRANS_ENTRY1(1_PAD, KP_1, NUMPAD1, VK_NUMPAD1, 0), - KEY_TRANS_ENTRY1(2_PAD, KP_2, NUMPAD2, VK_NUMPAD2, 0), - KEY_TRANS_ENTRY1(3_PAD, KP_3, NUMPAD3, VK_NUMPAD3, 0), - KEY_TRANS_ENTRY1(0_PAD, KP_0, NUMPAD0, VK_NUMPAD0, 0), - KEY_TRANS_ENTRY1(DEL_PAD, KP_PERIOD, DECIMAL, VK_DECIMAL, 0), - KEY_TRANS_ENTRY1(F11, F11, F11, VK_F11, 0), - KEY_TRANS_ENTRY1(F12, F12, F12, VK_F12, 0), - KEY_TRANS_ENTRY1(F13, F13, F13, VK_F13, 0), - KEY_TRANS_ENTRY1(F14, F14, F14, VK_F14, 0), - KEY_TRANS_ENTRY1(F15, F15, F15, VK_F15, 0), - KEY_TRANS_ENTRY1(ENTER_PAD, KP_ENTER, NUMPADENTER, VK_RETURN, 0), - KEY_TRANS_ENTRY1(RCONTROL, RCTRL, RCONTROL, VK_RCONTROL, 0), - KEY_TRANS_ENTRY1(SLASH_PAD, KP_DIVIDE, DIVIDE, VK_DIVIDE, 0), - KEY_TRANS_ENTRY1(PRTSCR, PRINTSCREEN, SYSRQ, 0, 0), - KEY_TRANS_ENTRY1(RALT, RALT, RMENU, VK_RMENU, 0), - KEY_TRANS_ENTRY1(HOME, HOME, HOME, VK_HOME, 0), - KEY_TRANS_ENTRY1(UP, UP, UP, VK_UP, 0), - KEY_TRANS_ENTRY1(PGUP, PAGEUP, PRIOR, VK_PRIOR, 0), - KEY_TRANS_ENTRY1(LEFT, LEFT, LEFT, VK_LEFT, 0), - KEY_TRANS_ENTRY1(RIGHT, RIGHT, RIGHT, VK_RIGHT, 0), - KEY_TRANS_ENTRY1(END, END, END, VK_END, 0), - KEY_TRANS_ENTRY1(DOWN, DOWN, DOWN, VK_DOWN, 0), - KEY_TRANS_ENTRY1(PGDN, PAGEDOWN, NEXT, VK_NEXT, 0), - KEY_TRANS_ENTRY1(INSERT, INSERT, INSERT, VK_INSERT, 0), - KEY_TRANS_ENTRY0(DEL, DELETE, DELETE, VK_DELETE, 0, "DELETE"), - KEY_TRANS_ENTRY1(LWIN, LGUI, LWIN, VK_LWIN, 0), - KEY_TRANS_ENTRY1(RWIN, RGUI, RWIN, VK_RWIN, 0), - KEY_TRANS_ENTRY1(MENU, MENU, APPS, VK_APPS, 0), - KEY_TRANS_ENTRY1(PAUSE, PAUSE, PAUSE, VK_PAUSE, 0), - KEY_TRANS_ENTRY0(CANCEL, CANCEL, UNKNOWN, 0, 0, "CANCEL"), - KEY_TRANS_ENTRY1(BS_PAD, KP_BACKSPACE, UNKNOWN, 0, 0), - KEY_TRANS_ENTRY1(TAB_PAD, KP_TAB, UNKNOWN, 0, 0), - KEY_TRANS_ENTRY1(00_PAD, KP_00, UNKNOWN, 0, 0), - KEY_TRANS_ENTRY1(000_PAD, KP_000, UNKNOWN, 0, 0), - KEY_TRANS_ENTRY1(COMMA_PAD, KP_COMMA, NUMPADCOMMA, 0, 0), - KEY_TRANS_ENTRY1(EQUALS_PAD, KP_EQUALS, NUMPADEQUALS, 0, 0), - - // New keys introduced in Windows 2000. These have no MAME codes to - // preserve compatibility with old config files that may refer to them - // as e.g. FORWARD instead of e.g. KEYCODE_WEBFORWARD. They need table - // entries anyway because otherwise they aren't recognized when - // GetAsyncKeyState polling is used (as happens currently when MAME is - // paused). Some codes are missing because the mapping to vkey codes - // isn't clear, and MapVirtualKey is no help. - KEY_TRANS_ENTRY1(OTHER_SWITCH, MUTE, MUTE, VK_VOLUME_MUTE, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, VOLUMEDOWN, VOLUMEDOWN, VK_VOLUME_DOWN, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, VOLUMEUP, VOLUMEUP, VK_VOLUME_UP, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_HOME, WEBHOME, VK_BROWSER_HOME, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_SEARCH, WEBSEARCH, VK_BROWSER_SEARCH, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_BOOKMARKS, WEBFAVORITES, VK_BROWSER_FAVORITES, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_REFRESH, WEBREFRESH, VK_BROWSER_REFRESH, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_STOP, WEBSTOP, VK_BROWSER_STOP, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_FORWARD, WEBFORWARD, VK_BROWSER_FORWARD, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_BACK, WEBBACK, VK_BROWSER_BACK, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, MAIL, MAIL, VK_LAUNCH_MAIL, 0), - KEY_TRANS_ENTRY1(OTHER_SWITCH, MEDIASELECT, MEDIASELECT, VK_LAUNCH_MEDIA_SELECT, 0), - KEY_TRANS_ENTRY0(INVALID, UNKNOWN, ESCAPE, 0, 0, "INVALID") + KEY_TRANS_ENTRY1(BACKSLASH2, NONUSBACKSLASH, OEM_102, VK_OEM_102, '<'), + KEY_TRANS_ENTRY1(Z, Z, Z, 'Z', 'Z'), + KEY_TRANS_ENTRY1(X, X, X, 'X', 'X'), + KEY_TRANS_ENTRY1(C, C, C, 'C', 'C'), + KEY_TRANS_ENTRY1(V, V, V, 'V', 'V'), + KEY_TRANS_ENTRY1(B, B, B, 'B', 'B'), + KEY_TRANS_ENTRY1(N, N, N, 'N', 'N'), + KEY_TRANS_ENTRY1(M, M, M, 'M', 'M'), + KEY_TRANS_ENTRY1(COMMA, COMMA, COMMA, VK_OEM_COMMA, ','), + KEY_TRANS_ENTRY1(STOP, PERIOD, PERIOD, VK_OEM_PERIOD, '.'), + KEY_TRANS_ENTRY1(SLASH, SLASH, SLASH, VK_OEM_2, '/'), + KEY_TRANS_ENTRY1(RSHIFT, RSHIFT, RSHIFT, VK_RSHIFT, 0), + KEY_TRANS_ENTRY1(ASTERISK, KP_MULTIPLY, MULTIPLY, VK_MULTIPLY, '*'), + KEY_TRANS_ENTRY1(LALT, LALT, LMENU, VK_LMENU, 0), + KEY_TRANS_ENTRY1(SPACE, SPACE, SPACE, VK_SPACE, ' '), + KEY_TRANS_ENTRY1(CAPSLOCK, CAPSLOCK, CAPITAL, VK_CAPITAL, 0), + KEY_TRANS_ENTRY1(F1, F1, F1, VK_F1, 0), + KEY_TRANS_ENTRY1(F2, F2, F2, VK_F2, 0), + KEY_TRANS_ENTRY1(F3, F3, F3, VK_F3, 0), + KEY_TRANS_ENTRY1(F4, F4, F4, VK_F4, 0), + KEY_TRANS_ENTRY1(F5, F5, F5, VK_F5, 0), + KEY_TRANS_ENTRY1(F6, F6, F6, VK_F6, 0), + KEY_TRANS_ENTRY1(F7, F7, F7, VK_F7, 0), + KEY_TRANS_ENTRY1(F8, F8, F8, VK_F8, 0), + KEY_TRANS_ENTRY1(F9, F9, F9, VK_F9, 0), + KEY_TRANS_ENTRY1(F10, F10, F10, VK_F10, 0), + KEY_TRANS_ENTRY1(NUMLOCK, NUMLOCKCLEAR, NUMLOCK, VK_NUMLOCK, 0), + KEY_TRANS_ENTRY1(SCRLOCK, SCROLLLOCK, SCROLL, VK_SCROLL, 0), + KEY_TRANS_ENTRY1(7_PAD, KP_7, NUMPAD7, VK_NUMPAD7, 0), + KEY_TRANS_ENTRY1(8_PAD, KP_8, NUMPAD8, VK_NUMPAD8, 0), + KEY_TRANS_ENTRY1(9_PAD, KP_9, NUMPAD9, VK_NUMPAD9, 0), + KEY_TRANS_ENTRY1(MINUS_PAD, KP_MINUS, SUBTRACT, VK_SUBTRACT, 0), + KEY_TRANS_ENTRY1(4_PAD, KP_4, NUMPAD4, VK_NUMPAD4, 0), + KEY_TRANS_ENTRY1(5_PAD, KP_5, NUMPAD5, VK_NUMPAD5, 0), + KEY_TRANS_ENTRY1(6_PAD, KP_6, NUMPAD6, VK_NUMPAD6, 0), + KEY_TRANS_ENTRY1(PLUS_PAD, KP_PLUS, ADD, VK_ADD, 0), + KEY_TRANS_ENTRY1(1_PAD, KP_1, NUMPAD1, VK_NUMPAD1, 0), + KEY_TRANS_ENTRY1(2_PAD, KP_2, NUMPAD2, VK_NUMPAD2, 0), + KEY_TRANS_ENTRY1(3_PAD, KP_3, NUMPAD3, VK_NUMPAD3, 0), + KEY_TRANS_ENTRY1(0_PAD, KP_0, NUMPAD0, VK_NUMPAD0, 0), + KEY_TRANS_ENTRY1(DEL_PAD, KP_PERIOD, DECIMAL, VK_DECIMAL, 0), + KEY_TRANS_ENTRY1(F11, F11, F11, VK_F11, 0), + KEY_TRANS_ENTRY1(F12, F12, F12, VK_F12, 0), + KEY_TRANS_ENTRY1(F13, F13, F13, VK_F13, 0), + KEY_TRANS_ENTRY1(F14, F14, F14, VK_F14, 0), + KEY_TRANS_ENTRY1(F15, F15, F15, VK_F15, 0), + KEY_TRANS_ENTRY1(ENTER_PAD, KP_ENTER, NUMPADENTER, VK_RETURN, 0), + KEY_TRANS_ENTRY1(RCONTROL, RCTRL, RCONTROL, VK_RCONTROL, 0), + KEY_TRANS_ENTRY1(SLASH_PAD, KP_DIVIDE, DIVIDE, VK_DIVIDE, 0), + KEY_TRANS_ENTRY1(PRTSCR, PRINTSCREEN, SYSRQ, 0, 0), + KEY_TRANS_ENTRY1(RALT, RALT, RMENU, VK_RMENU, 0), + KEY_TRANS_ENTRY1(HOME, HOME, HOME, VK_HOME, 0), + KEY_TRANS_ENTRY1(UP, UP, UP, VK_UP, 0), + KEY_TRANS_ENTRY1(PGUP, PAGEUP, PRIOR, VK_PRIOR, 0), + KEY_TRANS_ENTRY1(LEFT, LEFT, LEFT, VK_LEFT, 0), + KEY_TRANS_ENTRY1(RIGHT, RIGHT, RIGHT, VK_RIGHT, 0), + KEY_TRANS_ENTRY1(END, END, END, VK_END, 0), + KEY_TRANS_ENTRY1(DOWN, DOWN, DOWN, VK_DOWN, 0), + KEY_TRANS_ENTRY1(PGDN, PAGEDOWN, NEXT, VK_NEXT, 0), + KEY_TRANS_ENTRY1(INSERT, INSERT, INSERT, VK_INSERT, 0), + KEY_TRANS_ENTRY0(DEL, DELETE, DELETE, VK_DELETE, 0, "DELETE"), + KEY_TRANS_ENTRY1(LWIN, LGUI, LWIN, VK_LWIN, 0), + KEY_TRANS_ENTRY1(RWIN, RGUI, RWIN, VK_RWIN, 0), + KEY_TRANS_ENTRY1(MENU, MENU, APPS, VK_APPS, 0), + KEY_TRANS_ENTRY1(PAUSE, PAUSE, PAUSE, VK_PAUSE, 0), + KEY_TRANS_ENTRY1(CANCEL, CANCEL, UNKNOWN, 0, 0), + KEY_TRANS_ENTRY1(BS_PAD, KP_BACKSPACE, UNKNOWN, 0, 0), + KEY_TRANS_ENTRY1(TAB_PAD, KP_TAB, UNKNOWN, 0, 0), + KEY_TRANS_ENTRY1(00_PAD, KP_00, UNKNOWN, 0, 0), + KEY_TRANS_ENTRY1(000_PAD, KP_000, UNKNOWN, 0, 0), + KEY_TRANS_ENTRY1(COMMA_PAD, KP_COMMA, NUMPADCOMMA, VK_SEPARATOR, 0), + KEY_TRANS_ENTRY1(EQUALS_PAD, KP_EQUALS, NUMPADEQUALS, VK_OEM_NEC_EQUAL, 0), + + // keys that have no specific MAME input item IDs + KEY_TRANS_ENTRY0(OTHER_SWITCH, AUDIONEXT, NEXTTRACK, VK_MEDIA_NEXT_TRACK, 0, "AUDIONEXT"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AUDIOMUTE, MUTE, VK_VOLUME_MUTE, 0, "VOLUMEMUTE"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AUDIOPLAY, PLAYPAUSE, VK_MEDIA_PLAY_PAUSE, 0, "AUDIOPLAY"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AUDIOSTOP, MEDIASTOP, VK_MEDIA_STOP, 0, "AUDIOSTOP"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, VOLUMEDOWN, VOLUMEDOWN, VK_VOLUME_DOWN, 0, "VOLUMEDOWN"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, VOLUMEUP, VOLUMEUP, VK_VOLUME_UP, 0, "VOLUMEUP"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_HOME, WEBHOME, VK_BROWSER_HOME, 0, "NAVHOME"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_SEARCH, WEBSEARCH, VK_BROWSER_SEARCH, 0, "NAVSEARCH"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_BOOKMARKS, WEBFAVORITES, VK_BROWSER_FAVORITES, 0, "NAVFAVORITES"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_REFRESH, WEBREFRESH, VK_BROWSER_REFRESH, 0, "NAVREFRESH"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_STOP, WEBSTOP, VK_BROWSER_STOP, 0, "NAVSTOP"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_FORWARD, WEBFORWARD, VK_BROWSER_FORWARD, 0, "NAVFORWARD"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, AC_BACK, WEBBACK, VK_BROWSER_BACK, 0, "NAVBACK"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, MAIL, MAIL, VK_LAUNCH_MAIL, 0, "MAIL"), + KEY_TRANS_ENTRY0(OTHER_SWITCH, MEDIASELECT, MEDIASELECT, VK_LAUNCH_MEDIA_SELECT, 0, "MEDIASEL"), + + // sentinel + KEY_TRANS_ENTRY0(INVALID, UNKNOWN, UNKNOWN, 0, 0, "INVALID") }; // The private constructor to create the default instance @@ -190,14 +192,18 @@ m_table = s_default_table; m_table_size = std::size(s_default_table); } -#else + +#else // defined(OSD_WINDOWS) || defined(OSD_SDL) + keyboard_trans_table::keyboard_trans_table() { m_table = nullptr; m_table_size = 0; } -#endif +#endif // defined(OSD_WINDOWS) || defined(OSD_SDL) + + // public constructor to allow creation of non-default instances keyboard_trans_table::keyboard_trans_table(std::unique_ptr entries, unsigned int size) { @@ -248,11 +254,10 @@ // only works for keyboard switches if (code.device_class() == DEVICE_CLASS_KEYBOARD && code.item_class() == ITEM_CLASS_SWITCH) { - input_item_id id = code.item_id(); - int tablenum; + const input_item_id id = code.item_id(); // scan the table for a match - for (tablenum = 0; tablenum < m_table_size; tablenum++) + for (int tablenum = 0; tablenum < m_table_size; tablenum++) if (m_table[tablenum].mame_key == id) return m_table[tablenum].virtual_key; } diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_common.h mame-0.264+dfsg.1/src/osd/modules/input/input_common.h --- mame-0.263+dfsg.1/src/osd/modules/input/input_common.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_common.h 2024-03-25 14:00:46.000000000 +0000 @@ -47,155 +47,6 @@ #define MAX_HATS 8 #define MAX_POV 4 -/**************************************************************************** -* DirectInput compatible keyboard scan codes -****************************************************************************/ -#define KEY_UNKNOWN 0x00 -#define KEY_ESCAPE 0x01 -#define KEY_1 0x02 -#define KEY_2 0x03 -#define KEY_3 0x04 -#define KEY_4 0x05 -#define KEY_5 0x06 -#define KEY_6 0x07 -#define KEY_7 0x08 -#define KEY_8 0x09 -#define KEY_9 0x0A -#define KEY_0 0x0B -#define KEY_MINUS 0x0C /* - on main keyboard */ -#define KEY_EQUALS 0x0D -#define KEY_BACK 0x0E /* backspace */ -#define KEY_TAB 0x0F -#define KEY_Q 0x10 -#define KEY_W 0x11 -#define KEY_E 0x12 -#define KEY_R 0x13 -#define KEY_T 0x14 -#define KEY_Y 0x15 -#define KEY_U 0x16 -#define KEY_I 0x17 -#define KEY_O 0x18 -#define KEY_P 0x19 -#define KEY_LBRACKET 0x1A -#define KEY_RBRACKET 0x1B -#define KEY_RETURN 0x1C /* Enter on main keyboard */ -#define KEY_LCONTROL 0x1D -#define KEY_A 0x1E -#define KEY_S 0x1F -#define KEY_D 0x20 -#define KEY_F 0x21 -#define KEY_G 0x22 -#define KEY_H 0x23 -#define KEY_J 0x24 -#define KEY_K 0x25 -#define KEY_L 0x26 -#define KEY_SEMICOLON 0x27 -#define KEY_APOSTROPHE 0x28 -#define KEY_GRAVE 0x29 /* accent grave */ -#define KEY_LSHIFT 0x2A -#define KEY_BACKSLASH 0x2B -#define KEY_Z 0x2C -#define KEY_X 0x2D -#define KEY_C 0x2E -#define KEY_V 0x2F -#define KEY_B 0x30 -#define KEY_N 0x31 -#define KEY_M 0x32 -#define KEY_COMMA 0x33 -#define KEY_PERIOD 0x34 /* . on main keyboard */ -#define KEY_SLASH 0x35 /* / on main keyboard */ -#define KEY_RSHIFT 0x36 -#define KEY_MULTIPLY 0x37 /* * on numeric keypad */ -#define KEY_LMENU 0x38 /* left Alt */ -#define KEY_SPACE 0x39 -#define KEY_CAPITAL 0x3A -#define KEY_F1 0x3B -#define KEY_F2 0x3C -#define KEY_F3 0x3D -#define KEY_F4 0x3E -#define KEY_F5 0x3F -#define KEY_F6 0x40 -#define KEY_F7 0x41 -#define KEY_F8 0x42 -#define KEY_F9 0x43 -#define KEY_F10 0x44 -#define KEY_NUMLOCK 0x45 -#define KEY_SCROLL 0x46 /* Scroll Lock */ -#define KEY_NUMPAD7 0x47 -#define KEY_NUMPAD8 0x48 -#define KEY_NUMPAD9 0x49 -#define KEY_SUBTRACT 0x4A /* - on numeric keypad */ -#define KEY_NUMPAD4 0x4B -#define KEY_NUMPAD5 0x4C -#define KEY_NUMPAD6 0x4D -#define KEY_ADD 0x4E /* + on numeric keypad */ -#define KEY_NUMPAD1 0x4F -#define KEY_NUMPAD2 0x50 -#define KEY_NUMPAD3 0x51 -#define KEY_NUMPAD0 0x52 -#define KEY_DECIMAL 0x53 /* . on numeric keypad */ -#define KEY_OEM_102 0x56 /* <> or \| on RT 102-key keyboard (Non-U.S.) */ -#define KEY_F11 0x57 -#define KEY_F12 0x58 -#define KEY_F13 0x64 /* (NEC PC98) */ -#define KEY_F14 0x65 /* (NEC PC98) */ -#define KEY_F15 0x66 /* (NEC PC98) */ -#define KEY_KANA 0x70 /* (Japanese keyboard) */ -#define KEY_ABNT_C1 0x73 /* /? on Brazilian keyboard */ -#define KEY_CONVERT 0x79 /* (Japanese keyboard) */ -#define KEY_NOCONVERT 0x7B /* (Japanese keyboard) */ -#define KEY_YEN 0x7D /* (Japanese keyboard) */ -#define KEY_ABNT_C2 0x7E /* Numpad . on Brazilian keyboard */ -#define KEY_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ -#define KEY_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ -#define KEY_AT 0x91 /* (NEC PC98) */ -#define KEY_COLON 0x92 /* (NEC PC98) */ -#define KEY_UNDERLINE 0x93 /* (NEC PC98) */ -#define KEY_KANJI 0x94 /* (Japanese keyboard) */ -#define KEY_STOP 0x95 /* (NEC PC98) */ -#define KEY_AX 0x96 /* (Japan AX) */ -#define KEY_UNLABELED 0x97 /* (J3100) */ -#define KEY_NEXTTRACK 0x99 /* Next Track */ -#define KEY_NUMPADENTER 0x9C /* Enter on numeric keypad */ -#define KEY_RCONTROL 0x9D -#define KEY_MUTE 0xA0 /* Mute */ -#define KEY_CALCULATOR 0xA1 /* Calculator */ -#define KEY_PLAYPAUSE 0xA2 /* Play / Pause */ -#define KEY_MEDIASTOP 0xA4 /* Media Stop */ -#define KEY_VOLUMEDOWN 0xAE /* Volume - */ -#define KEY_VOLUMEUP 0xB0 /* Volume + */ -#define KEY_WEBHOME 0xB2 /* Web home */ -#define KEY_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ -#define KEY_DIVIDE 0xB5 /* / on numeric keypad */ -#define KEY_SYSRQ 0xB7 -#define KEY_RMENU 0xB8 /* right Alt */ -#define KEY_PAUSE 0xC5 /* Pause */ -#define KEY_HOME 0xC7 /* Home on arrow keypad */ -#define KEY_UP 0xC8 /* UpArrow on arrow keypad */ -#define KEY_PRIOR 0xC9 /* PgUp on arrow keypad */ -#define KEY_LEFT 0xCB /* LeftArrow on arrow keypad */ -#define KEY_RIGHT 0xCD /* RightArrow on arrow keypad */ -#define KEY_END 0xCF /* End on arrow keypad */ -#define KEY_DOWN 0xD0 /* DownArrow on arrow keypad */ -#define KEY_NEXT 0xD1 /* PgDn on arrow keypad */ -#define KEY_INSERT 0xD2 /* Insert on arrow keypad */ -#define KEY_DELETE 0xD3 /* Delete on arrow keypad */ -#define KEY_LWIN 0xDB /* Left Windows key */ -#define KEY_RWIN 0xDC /* Right Windows key */ -#define KEY_APPS 0xDD /* AppMenu key */ -#define KEY_POWER 0xDE /* System Power */ -#define KEY_SLEEP 0xDF /* System Sleep */ -#define KEY_WAKE 0xE3 /* System Wake */ -#define KEY_WEBSEARCH 0xE5 /* Web Search */ -#define KEY_WEBFAVORITES 0xE6 /* Web Favorites */ -#define KEY_WEBREFRESH 0xE7 /* Web Refresh */ -#define KEY_WEBSTOP 0xE8 /* Web Stop */ -#define KEY_WEBFORWARD 0xE9 /* Web Forward */ -#define KEY_WEBBACK 0xEA /* Web Back */ -#define KEY_MYCOMPUTER 0xEB /* My Computer */ -#define KEY_MAIL 0xEC /* Mail */ -#define KEY_MEDIASELECT 0xED /* Media Select */ - //============================================================ // device_info @@ -342,7 +193,7 @@ int sdl_scancode; #endif #if defined(OSD_WINDOWS) || defined(SDLMAME_WIN32) - int scan_code; + uint16_t scan_code; unsigned char virtual_key; #endif diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_dinput.cpp mame-0.264+dfsg.1/src/osd/modules/input/input_dinput.cpp --- mame-0.263+dfsg.1/src/osd/modules/input/input_dinput.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_dinput.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -194,7 +194,7 @@ { // populate it char defname[20]; - for (int keynum = 0; keynum < MAX_KEYS; keynum++) + for (unsigned keynum = 0; keynum < MAX_KEYS; keynum++) { input_item_id itemid = keyboard_trans_table::instance().map_di_scancode_to_itemid(keynum); diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_rawinput.cpp mame-0.264+dfsg.1/src/osd/modules/input/input_rawinput.cpp --- mame-0.263+dfsg.1/src/osd/modules/input/input_rawinput.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_rawinput.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -25,9 +25,11 @@ #include #include +#include #include #include #include +#include // standard windows headers #include @@ -307,23 +309,75 @@ public: rawinput_keyboard_device(std::string &&name, std::string &&id, input_module &module, HANDLE handle) : rawinput_device(std::move(name), std::move(id), module, handle), + m_pause_pressed(std::chrono::steady_clock::time_point::min()), + m_e1(0xffff), m_keyboard({ { 0 } }) { } virtual void reset() override { + m_pause_pressed = std::chrono::steady_clock::time_point::min(); memset(&m_keyboard, 0, sizeof(m_keyboard)); + m_e1 = 0xffff; + } + + virtual void poll(bool relative_reset) override + { + rawinput_device::poll(relative_reset); + + if (m_keyboard.state[0x80 | 0x45] && (std::chrono::steady_clock::now() > (m_pause_pressed + std::chrono::milliseconds(30)))) + m_keyboard.state[0x80 | 0x45] = 0x00; } virtual void process_event(RAWINPUT const &rawinput) override { // determine the full DIK-compatible scancode - uint8_t scancode = (rawinput.data.keyboard.MakeCode & 0x7f) | ((rawinput.data.keyboard.Flags & RI_KEY_E0) ? 0x80 : 0x00); + uint8_t scancode; - // scancode 0xaa is a special shift code we need to ignore - if (scancode == 0xaa) + // the only thing that uses this is Pause + if (rawinput.data.keyboard.Flags & RI_KEY_E1) + { + m_e1 = rawinput.data.keyboard.MakeCode; return; + } + else if (0xffff != m_e1) + { + auto const e1 = std::exchange(m_e1, 0xffff); + if (!(rawinput.data.keyboard.Flags & RI_KEY_E0)) + { + if (((e1 & ~USHORT(0x80)) == 0x1d) && ((rawinput.data.keyboard.MakeCode & ~USHORT(0x80)) == 0x45)) + { + if (rawinput.data.keyboard.Flags & RI_KEY_BREAK) + return; // RawInput generates a fake break immediately after the make - ignore it + + m_pause_pressed = std::chrono::steady_clock::now(); + scancode = 0x80 | 0x45; + } + else + { + return; // no idea + } + } + else + { + return; // shouldn't happen, ignore it + } + } + else + { + // strip bit 7 of the make code to work around dodgy drivers that set it for key up events + if (rawinput.data.keyboard.MakeCode & ~USHORT(0xff)) + { + // won't fit in a byte along with the E0 flag + return; + } + scancode = (rawinput.data.keyboard.MakeCode & 0x7f) | ((rawinput.data.keyboard.Flags & RI_KEY_E0) ? 0x80 : 0x00); + + // fake shift generated with cursor control and Ins/Del for compatibility with very old DOS software + if (scancode == 0xaa) + return; + } // set or clear the key m_keyboard.state[scancode] = (rawinput.data.keyboard.Flags & RI_KEY_BREAK) ? 0x00 : 0x80; @@ -333,13 +387,20 @@ { keyboard_trans_table const &table = keyboard_trans_table::instance(); - for (int keynum = 0; keynum < MAX_KEYS; keynum++) + // FIXME: GetKeyNameTextW is for scan codes from WM_KEYDOWN, which aren't quite the same as DIK_* keycodes + // in particular, NumLock and Pause are reversed for US-style keyboard systems + for (unsigned keynum = 0; keynum < MAX_KEYS; keynum++) { input_item_id itemid = table.map_di_scancode_to_itemid(keynum); WCHAR keyname[100]; // generate the name - if (GetKeyNameTextW(((keynum & 0x7f) << 16) | ((keynum & 0x80) << 17), keyname, std::size(keyname)) == 0) + // FIXME: GetKeyNameText gives bogus names for media keys and various other things + // in many cases it ignores the "extended" bit and returns the key name corresponding to the scan code alone + LONG lparam = ((keynum & 0x7f) << 16) | ((keynum & 0x80) << 17); + if ((keynum & 0x7f) == 0x45) + lparam ^= 0x0100'0000; // horrid hack + if (GetKeyNameTextW(lparam, keyname, std::size(keyname)) == 0) _snwprintf(keyname, std::size(keyname), L"Scan%03d", keynum); std::string name = text::from_wstring(keyname); @@ -354,6 +415,8 @@ } private: + std::chrono::steady_clock::time_point m_pause_pressed; + uint16_t m_e1; keyboard_state m_keyboard; }; @@ -545,7 +608,7 @@ //============================================================ -// rawinput_module - base class for rawinput modules +// rawinput_module - base class for RawInput modules //============================================================ class rawinput_module : public wininput_module @@ -663,9 +726,9 @@ { HRAWINPUT const rawinputdevice = *static_cast(eventdata); - BYTE small_buffer[4096]; + union { RAWINPUT r; BYTE b[4096]; } small_buffer; std::unique_ptr larger_buffer; - LPBYTE data = small_buffer; + LPVOID data = &small_buffer; UINT size; // determine the size of data buffer we need @@ -675,7 +738,7 @@ // if necessary, allocate a temporary buffer and fetch the data if (size > sizeof(small_buffer)) { - larger_buffer.reset(new (std::nothrow) BYTE [size]); + larger_buffer.reset(new (std::align_val_t(alignof(RAWINPUT)), std::nothrow) BYTE [size]); data = larger_buffer.get(); if (!data) return false; @@ -780,7 +843,7 @@ //============================================================ -// keyboard_input_rawinput - rawinput keyboard module +// keyboard_input_rawinput - RawInput keyboard module //============================================================ class keyboard_input_rawinput : public rawinput_module @@ -807,7 +870,7 @@ //============================================================ -// mouse_input_rawinput - rawinput mouse module +// mouse_input_rawinput - RawInput mouse module //============================================================ class mouse_input_rawinput : public rawinput_module @@ -834,7 +897,7 @@ //============================================================ -// lightgun_input_rawinput - rawinput lightgun module +// lightgun_input_rawinput - RawInput lightgun module //============================================================ class lightgun_input_rawinput : public rawinput_module diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_sdl.cpp mame-0.264+dfsg.1/src/osd/modules/input/input_sdl.cpp --- mame-0.263+dfsg.1/src/osd/modules/input/input_sdl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_sdl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -617,13 +617,8 @@ for (int keynum = 0; m_trans_table[keynum].mame_key != ITEM_ID_INVALID; keynum++) { input_item_id itemid = m_trans_table[keynum].mame_key; - - // generate the default / modified name - char defname[20]; - snprintf(defname, sizeof(defname) - 1, "%s", m_trans_table[keynum].ui_name); - device.add_item( - defname, + m_trans_table[keynum].ui_name, std::string_view(), itemid, generic_button_get_state, @@ -1977,8 +1972,7 @@ { public: sdl_keyboard_module() : - sdl_input_module(OSD_KEYBOARDINPUT_PROVIDER, "sdl"), - m_key_trans_table(nullptr) + sdl_input_module(OSD_KEYBOARDINPUT_PROVIDER, "sdl") { } @@ -1993,7 +1987,7 @@ subscribe(osd(), event_types); // Read our keymap and store a pointer to our table - m_key_trans_table = sdlinput_read_keymap(); + sdlinput_read_keymap(); osd_printf_verbose("Keyboard: Start initialization\n"); @@ -2009,12 +2003,27 @@ } private: - keyboard_trans_table *sdlinput_read_keymap() + void sdlinput_read_keymap() { keyboard_trans_table &default_table = keyboard_trans_table::instance(); + // Allocate a block of translation entries big enough to hold what's in the default table + auto key_trans_entries = std::make_unique(default_table.size()); + + // copy the elements from the default table and ask SDL for key names + for (int i = 0; i < default_table.size(); i++) + { + key_trans_entries[i] = default_table[i]; + char const *const name = SDL_GetScancodeName(SDL_Scancode(default_table[i].sdl_scancode)); + if (name && *name) + key_trans_entries[i].ui_name = name; + } + + // Allocate the trans table to be associated with the machine so we don't have to free it + m_key_trans_table = std::make_unique(std::move(key_trans_entries), default_table.size()); + if (!options()->bool_value(SDLOPTION_KEYMAP)) - return &default_table; + return; const char *const keymap_filename = dynamic_cast(*options()).keymap_file(); osd_printf_verbose("Keymap: Start reading keymap_file %s\n", keymap_filename); @@ -2023,19 +2032,9 @@ if (!keymap_file) { osd_printf_warning("Keymap: Unable to open keymap %s, using default\n", keymap_filename); - return &default_table; + return; } - // Allocate a block of translation entries big enough to hold what's in the default table - auto key_trans_entries = std::make_unique(default_table.size()); - - // copy the elements from the default table - for (int i = 0; i < default_table.size(); i++) - key_trans_entries[i] = default_table[i]; - - // Allocate the trans table to be associated with the machine so we don't have to free it - m_custom_table = std::make_unique(std::move(key_trans_entries), default_table.size()); - int line = 1; int sdl2section = 0; while (!feof(keymap_file)) @@ -2068,7 +2067,7 @@ if (sk >= 0 && index >= 0) { - key_trans_entry &entry = (*m_custom_table)[index]; + key_trans_entry &entry = (*m_key_trans_table)[index]; entry.sdl_scancode = sk; entry.ui_name = const_cast(m_ui_names.emplace_back(kns).c_str()); osd_printf_verbose("Keymap: Mapped <%s> to <%s> with ui-text <%s>\n", sks, mks, kns); @@ -2083,12 +2082,9 @@ } fclose(keymap_file); osd_printf_verbose("Keymap: Processed %d lines\n", line); - - return m_custom_table.get(); } - keyboard_trans_table *m_key_trans_table; - std::unique_ptr m_custom_table; + std::unique_ptr m_key_trans_table; std::list m_ui_names; }; diff -Nru mame-0.263+dfsg.1/src/osd/modules/input/input_win32.cpp mame-0.264+dfsg.1/src/osd/modules/input/input_win32.cpp --- mame-0.263+dfsg.1/src/osd/modules/input/input_win32.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/input/input_win32.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -59,6 +59,8 @@ TCHAR keyname[100]; // generate the name + // FIXME: GetKeyNameText gives bogus names for media keys and various other things + // in many cases it ignores the "extended" bit and returns the key name corresponding to the scan code alone if (GetKeyNameText(((keynum & 0x7f) << 16) | ((keynum & 0x80) << 17), keyname, std::size(keyname)) == 0) _sntprintf(keyname, std::size(keyname), TEXT("Scan%03d"), keynum); std::string name = text::from_tstring(keyname); diff -Nru mame-0.263+dfsg.1/src/osd/modules/lib/osdobj_common.cpp mame-0.264+dfsg.1/src/osd/modules/lib/osdobj_common.cpp --- mame-0.263+dfsg.1/src/osd/modules/lib/osdobj_common.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/lib/osdobj_common.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -592,7 +592,19 @@ if (strcmp(command, OSDCOMMAND_LIST_NETWORK_ADAPTERS) == 0) { osd_module &om = select_module_options(OSD_NETDEV_PROVIDER); - osd_list_network_adapters(); + auto const &interfaces = get_netdev_list(); + if (interfaces.empty()) + { + printf("No supported network interfaces were found\n"); + } + else + { + printf("Available network interfaces:\n"); + for (auto &entry : interfaces) + { + printf(" %s\n", entry->description); + } + } om.exit(); return true; @@ -600,7 +612,27 @@ else if (strcmp(command, OSDCOMMAND_LIST_MIDI_DEVICES) == 0) { osd_module &om = select_module_options(OSD_MIDI_PROVIDER); - dynamic_cast(om).list_midi_devices(); + auto const ports = dynamic_cast(om).list_midi_ports(); + if (ports.empty()) + { + printf("No MIDI ports were found\n"); + } + else + { + printf("MIDI input ports:\n"); + for (auto const &port : ports) + { + if (port.input) + printf(port.default_input ? "%s (default)\n" : "%s\n", port.name.c_str()); + } + + printf("\nMIDI output ports:\n"); + for (auto const &port : ports) + { + if (port.output) + printf(port.default_output ? "%s (default)\n" : "%s\n", port.name.c_str()); + } + } om.exit(); return true; @@ -717,7 +749,12 @@ return m_font_module->get_font_families(font_path, result); } -std::unique_ptr osd_common_t::create_midi_device() +std::unique_ptr osd_common_t::create_midi_input(std::string_view name) { - return m_midi->create_midi_device(); + return m_midi->create_input(name); +} + +std::unique_ptr osd_common_t::create_midi_output(std::string_view name) +{ + return m_midi->create_output(name); } diff -Nru mame-0.263+dfsg.1/src/osd/modules/lib/osdobj_common.h mame-0.264+dfsg.1/src/osd/modules/lib/osdobj_common.h --- mame-0.263+dfsg.1/src/osd/modules/lib/osdobj_common.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/lib/osdobj_common.h 2024-03-25 14:00:46.000000000 +0000 @@ -238,7 +238,8 @@ virtual osd_font::ptr font_alloc() override; virtual bool get_font_families(std::string const &font_path, std::vector > &result) override; - virtual std::unique_ptr create_midi_device() override; + virtual std::unique_ptr create_midi_input(std::string_view name) override; + virtual std::unique_ptr create_midi_output(std::string_view name) override; // FIXME: everything below seems to be osd specific and not part of // this INTERFACE but part of the osd IMPLEMENTATION diff -Nru mame-0.263+dfsg.1/src/osd/modules/midi/midi_module.h mame-0.264+dfsg.1/src/osd/modules/midi/midi_module.h --- mame-0.263+dfsg.1/src/osd/modules/midi/midi_module.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/midi/midi_module.h 2024-03-25 14:00:46.000000000 +0000 @@ -9,9 +9,12 @@ #pragma once -#include "osdepend.h" +#include "interface/midiport.h" #include +#include +#include +#include //============================================================ @@ -23,13 +26,23 @@ class midi_module { public: + struct port_info + { + std::string name; + bool input; + bool output; + bool default_input; + bool default_output; + }; + using port_info_vector = std::vector; + virtual ~midi_module() = default; // specific routines - virtual std::unique_ptr create_midi_device() = 0; - // FIXME: should return a list of strings ... - virtual void list_midi_devices() = 0; + virtual std::unique_ptr create_input(std::string_view name) = 0; + virtual std::unique_ptr create_output(std::string_view name) = 0; + virtual port_info_vector list_midi_ports() = 0; }; #endif // MAME_OSD_MODULES_MIDI_MIDI_MODULE_H diff -Nru mame-0.263+dfsg.1/src/osd/modules/midi/none.cpp mame-0.264+dfsg.1/src/osd/modules/midi/none.cpp --- mame-0.263+dfsg.1/src/osd/modules/midi/none.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/midi/none.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -20,18 +20,6 @@ namespace { -class osd_midi_device_none : public osd_midi_device -{ -public: - virtual bool open_input(const char *devname) override { return false; } - virtual bool open_output(const char *devname) override { return false; } - virtual void close() override { } - virtual bool poll() override { return false; } - virtual int read(uint8_t *pOut) override { return 0; } - virtual void write(uint8_t data) override { } -}; - - class none_module : public osd_module, public midi_module { public: @@ -40,20 +28,11 @@ virtual int init(osd_interface &osd, const osd_options &options) override { return 0; } virtual void exit() override { } - virtual std::unique_ptr create_midi_device() override; - virtual void list_midi_devices() override; + virtual std::unique_ptr create_input(std::string_view name) override { return nullptr; } + virtual std::unique_ptr create_output(std::string_view name) override { return nullptr; } + virtual port_info_vector list_midi_ports() override { return port_info_vector(); } }; -std::unique_ptr none_module::create_midi_device() -{ - return std::make_unique(); -} - -void none_module::list_midi_devices() -{ - osd_printf_warning("\nMIDI is not supported in this configuration\n"); -} - } // anonymous namespace } // namespace osd diff -Nru mame-0.263+dfsg.1/src/osd/modules/midi/portmidi.cpp mame-0.264+dfsg.1/src/osd/modules/midi/portmidi.cpp --- mame-0.263+dfsg.1/src/osd/modules/midi/portmidi.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/midi/portmidi.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -14,6 +14,9 @@ #ifndef NO_USE_MIDI +#include "interface/midiport.h" +#include "osdcore.h" // osd_printf_* + #include #include @@ -36,45 +39,51 @@ virtual int init(osd_interface &osd, const osd_options &options) override; virtual void exit() override; - virtual std::unique_ptr create_midi_device() override; - virtual void list_midi_devices() override; + virtual std::unique_ptr create_input(std::string_view name) override; + virtual std::unique_ptr create_output(std::string_view name) override; + virtual port_info_vector list_midi_ports() override; }; -static const int RX_EVENT_BUF_SIZE = 512; +static constexpr unsigned RX_EVENT_BUF_SIZE = 512; -#define MIDI_SYSEX 0xf0 -#define MIDI_EOX 0xf7 +static constexpr uint8_t MIDI_SYSEX = 0xf0; +static constexpr uint8_t MIDI_EOX = 0xf7; -class osd_midi_device_pm : public osd_midi_device +class midi_input_pm : public midi_input_port { public: - osd_midi_device_pm(): pmStream(nullptr), xmit_cnt(0), last_status(0), rx_sysex(false) { } - virtual ~osd_midi_device_pm() { } - virtual bool open_input(const char *devname) override; - virtual bool open_output(const char *devname) override; - virtual void close() override; + midi_input_pm(PortMidiStream *stream) : m_stream(stream), m_rx_sysex(false) { } + virtual ~midi_input_pm(); + virtual bool poll() override; virtual int read(uint8_t *pOut) override; - virtual void write(uint8_t data) override; private: - PortMidiStream *pmStream; - PmEvent rx_evBuf[RX_EVENT_BUF_SIZE]; - uint8_t xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes - int xmit_cnt; - uint8_t last_status; - bool rx_sysex; + PortMidiStream *const m_stream; + PmEvent m_evbuf[RX_EVENT_BUF_SIZE]; + bool m_rx_sysex; }; -std::unique_ptr pm_module::create_midi_device() +class midi_output_pm : public midi_output_port { - return std::make_unique(); -} +public: + midi_output_pm(PortMidiStream *stream) : m_stream(stream), m_xmit_cnt(0), m_last_status(0) { } + virtual ~midi_output_pm(); + + virtual void write(uint8_t data) override; + +private: + PortMidiStream *const m_stream; + uint8_t m_xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes + int m_xmit_cnt; + uint8_t m_last_status; +}; int pm_module::init(osd_interface &osd, const osd_options &options) { + // FIXME: check error return code Pm_Initialize(); return 0; } @@ -84,151 +93,126 @@ Pm_Terminate(); } -void pm_module::list_midi_devices() +std::unique_ptr pm_module::create_input(std::string_view name) { - int num_devs = Pm_CountDevices(); - const PmDeviceInfo *pmInfo; - - printf("\n"); - - if (num_devs == 0) + int found_dev = -1; + if (name == "default") { - printf("No MIDI ports were found\n"); - return; + found_dev = Pm_GetDefaultInputDeviceID(); } - - printf("MIDI input ports:\n"); - for (int i = 0; i < num_devs; i++) + else { - pmInfo = Pm_GetDeviceInfo(i); - - if (pmInfo->input) + int const num_devs = Pm_CountDevices(); + for (found_dev = 0; num_devs > found_dev; ++found_dev) { - printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultInputDeviceID()) ? "(default)" : ""); + auto const info = Pm_GetDeviceInfo(found_dev); + if (info->input && (name == info->name)) + break; } + if (num_devs <= found_dev) + found_dev = -1; } - printf("\nMIDI output ports:\n"); - for (int i = 0; i < num_devs; i++) + if (0 > found_dev) { - pmInfo = Pm_GetDeviceInfo(i); - - if (pmInfo->output) - { - printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultOutputDeviceID()) ? "(default)" : ""); - } + osd_printf_warning("No MIDI input device named '%s' was found.\n", name); + return nullptr; } -} -bool osd_midi_device_pm::open_input(const char *devname) -{ - int num_devs = Pm_CountDevices(); - int found_dev = -1; - const PmDeviceInfo *pmInfo; - PortMidiStream *stm; - - if (!strcmp("default", devname)) + PortMidiStream *stream = nullptr; + PmError const err = Pm_OpenInput(&stream, found_dev, nullptr, RX_EVENT_BUF_SIZE, nullptr, nullptr); + if (pmNoError != err) { - found_dev = Pm_GetDefaultInputDeviceID(); + osd_printf_error("Error opening PortMidi device '%s' for input.\n", name); + return nullptr; } - else - { - for (int i = 0; i < num_devs; i++) - { - pmInfo = Pm_GetDeviceInfo(i); - if (pmInfo->input) - { - if (!strcmp(devname, pmInfo->name)) - { - found_dev = i; - break; - } - } - } - } - - if (found_dev >= 0) + try { - if (Pm_OpenInput(&stm, found_dev, nullptr, RX_EVENT_BUF_SIZE, nullptr, nullptr) == pmNoError) - { - pmStream = stm; - return true; - } - else - { - printf("Couldn't open PM device\n"); - return false; - } + return std::make_unique(stream); } - else + catch (...) { - return false; + Pm_Close(stream); + return nullptr; } } -bool osd_midi_device_pm::open_output(const char *devname) +std::unique_ptr pm_module::create_output(std::string_view name) { - int num_devs = Pm_CountDevices(); int found_dev = -1; - const PmDeviceInfo *pmInfo; - PortMidiStream *stm; - - if (!strcmp("default", devname)) + if (name == "default") { found_dev = Pm_GetDefaultOutputDeviceID(); } else { - for (int i = 0; i < num_devs; i++) + int const num_devs = Pm_CountDevices(); + for (found_dev = 0; num_devs > found_dev; ++found_dev) { - pmInfo = Pm_GetDeviceInfo(i); - - if (pmInfo->output) - { - if (!strcmp(devname, pmInfo->name)) - { - found_dev = i; - break; - } - } + auto const info = Pm_GetDeviceInfo(found_dev); + if (info->output && (name == info->name)) + break; } + if (num_devs <= found_dev) + found_dev = -1; } - if (found_dev >= 0) + PortMidiStream *stream = nullptr; + PmError const err = Pm_OpenOutput(&stream, found_dev, nullptr, 100, nullptr, nullptr, 0); + if (pmNoError != err) { - if (Pm_OpenOutput(&stm, found_dev, nullptr, 100, nullptr, nullptr, 0) == pmNoError) - { - pmStream = stm; - return true; - } - else - { - printf("Couldn't open PM device\n"); - return false; - } + osd_printf_error("Error opening PortMidi device '%s' for output.\n", name); + return nullptr; } - else + + try + { + return std::make_unique(stream); + } + catch (...) { - return false; + Pm_Close(stream); + return nullptr; } } -void osd_midi_device_pm::close() +midi_module::port_info_vector pm_module::list_midi_ports() { - Pm_Close(pmStream); + int const num_devs = Pm_CountDevices(); + int const def_input = Pm_GetDefaultInputDeviceID(); + int const def_output = Pm_GetDefaultOutputDeviceID(); + port_info_vector result; + result.reserve(num_devs); + for (int i = 0; num_devs > i; ++i) + { + auto const pm_info = Pm_GetDeviceInfo(i); + result.emplace_back(port_info{ + pm_info->name, + 0 != pm_info->input, + 0 != pm_info->output, + def_input == i, + def_output == i }); + } + return result; } -bool osd_midi_device_pm::poll() + +midi_input_pm::~midi_input_pm() { - PmError chk = Pm_Poll(pmStream); + if (m_stream) + Pm_Close(m_stream); +} +bool midi_input_pm::poll() +{ + PmError const chk = Pm_Poll(m_stream); return (chk == pmGotData) ? true : false; } -int osd_midi_device_pm::read(uint8_t *pOut) +int midi_input_pm::read(uint8_t *pOut) { - int msgsRead = Pm_Read(pmStream, rx_evBuf, RX_EVENT_BUF_SIZE); + int msgsRead = Pm_Read(m_stream, m_evbuf, RX_EVENT_BUF_SIZE); int bytesOut = 0; if (msgsRead <= 0) @@ -238,23 +222,23 @@ for (int msg = 0; msg < msgsRead; msg++) { - uint8_t status = Pm_MessageStatus(rx_evBuf[msg].message); + uint8_t status = Pm_MessageStatus(m_evbuf[msg].message); - if (rx_sysex) + if (m_rx_sysex) { if (status & 0x80) // sys real-time imposing on us? { if (status == 0xf2) { *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); - *pOut++ = Pm_MessageData2(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); + *pOut++ = Pm_MessageData2(m_evbuf[msg].message); bytesOut += 3; } else if (status == 0xf3) { *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); bytesOut += 2; } else @@ -263,7 +247,7 @@ bytesOut++; if (status == MIDI_EOX) { - rx_sysex = false; + m_rx_sysex = false; } } } @@ -271,15 +255,15 @@ { for (int i = 0; i < 4; i++) { - uint8_t byte = rx_evBuf[msg].message & 0xff; + uint8_t byte = m_evbuf[msg].message & 0xff; *pOut++ = byte; bytesOut++; if (byte == MIDI_EOX) { - rx_sysex = false; + m_rx_sysex = false; break; } - rx_evBuf[msg].message >>= 8; + m_evbuf[msg].message >>= 8; } } } @@ -290,7 +274,7 @@ case 0xc: // 2-byte messages case 0xd: *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); bytesOut += 2; break; @@ -300,30 +284,30 @@ case 0: // System Exclusive { *pOut++ = status; // this should be OK: the shortest legal sysex is F0 tt dd F7, I believe - *pOut++ = (rx_evBuf[msg].message>>8) & 0xff; - *pOut++ = (rx_evBuf[msg].message>>16) & 0xff; - uint8_t last = *pOut++ = (rx_evBuf[msg].message>>24) & 0xff; + *pOut++ = (m_evbuf[msg].message>>8) & 0xff; + *pOut++ = (m_evbuf[msg].message>>16) & 0xff; + uint8_t last = *pOut++ = (m_evbuf[msg].message>>24) & 0xff; bytesOut += 4; - rx_sysex = (last != MIDI_EOX); + m_rx_sysex = (last != MIDI_EOX); break; } case 7: // End of System Exclusive *pOut++ = status; bytesOut += 1; - rx_sysex = false; + m_rx_sysex = false; break; case 2: // song pos *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); - *pOut++ = Pm_MessageData2(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); + *pOut++ = Pm_MessageData2(m_evbuf[msg].message); bytesOut += 3; break; case 3: // song select *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); bytesOut += 2; break; @@ -336,8 +320,8 @@ default: *pOut++ = status; - *pOut++ = Pm_MessageData1(rx_evBuf[msg].message); - *pOut++ = Pm_MessageData2(rx_evBuf[msg].message); + *pOut++ = Pm_MessageData1(m_evbuf[msg].message); + *pOut++ = Pm_MessageData2(m_evbuf[msg].message); bytesOut += 3; break; } @@ -347,57 +331,64 @@ return bytesOut; } -void osd_midi_device_pm::write(uint8_t data) + +midi_output_pm::~midi_output_pm() +{ + if (m_stream) + Pm_Close(m_stream); +} + +void midi_output_pm::write(uint8_t data) { int bytes_needed = 0; PmEvent ev; ev.timestamp = 0; // use the current time -// printf("write: %02x (%d)\n", data, xmit_cnt); +// printf("write: %02x (%d)\n", data, m_xmit_cnt); // reject data bytes when no valid status exists - if ((last_status == 0) && !(data & 0x80)) + if ((m_last_status == 0) && !(data & 0x80)) { - xmit_cnt = 0; + m_xmit_cnt = 0; return; } - if (xmit_cnt >= 4) + if (m_xmit_cnt >= 4) { printf("MIDI out: packet assembly overflow, contact MAMEdev!\n"); return; } // handle sysex - if (last_status == MIDI_SYSEX) + if (m_last_status == MIDI_SYSEX) { -// printf("sysex: %02x (%d)\n", data, xmit_cnt); +// printf("sysex: %02x (%d)\n", data, m_xmit_cnt); // if we get a status that isn't sysex, assume it's system common if ((data & 0x80) && (data != MIDI_EOX)) { // printf("common during sysex!\n"); ev.message = Pm_Message(data, 0, 0); - Pm_Write(pmStream, &ev, 1); + Pm_Write(m_stream, &ev, 1); return; } - xmit_in[xmit_cnt++] = data; + m_xmit_in[m_xmit_cnt++] = data; // if EOX or 4 bytes filled, transmit 4 bytes - if ((xmit_cnt == 4) || (data == MIDI_EOX)) + if ((m_xmit_cnt == 4) || (data == MIDI_EOX)) { - ev.message = xmit_in[0] | (xmit_in[1]<<8) | (xmit_in[2]<<16) | (xmit_in[3]<<24); - Pm_Write(pmStream, &ev, 1); - xmit_in[0] = xmit_in[1] = xmit_in[2] = xmit_in[3] = 0; - xmit_cnt = 0; + ev.message = m_xmit_in[0] | (m_xmit_in[1]<<8) | (m_xmit_in[2]<<16) | (m_xmit_in[3]<<24); + Pm_Write(m_stream, &ev, 1); + m_xmit_in[0] = m_xmit_in[1] = m_xmit_in[2] = m_xmit_in[3] = 0; + m_xmit_cnt = 0; // printf("SysEx packet: %08x\n", ev.message); // if this is EOX, kill the running status if (data == MIDI_EOX) { - last_status = 0; + m_last_status = 0; } } @@ -405,33 +396,33 @@ } // handle running status. don't allow system real-time messages to be considered as running status. - if ((xmit_cnt == 0) && (data & 0x80) && (data < 0xf8)) + if ((m_xmit_cnt == 0) && (data & 0x80) && (data < 0xf8)) { - last_status = data; + m_last_status = data; } - if ((xmit_cnt == 0) && !(data & 0x80)) + if ((m_xmit_cnt == 0) && !(data & 0x80)) { - xmit_in[xmit_cnt++] = last_status; - xmit_in[xmit_cnt++] = data; -// printf("\trunning status: [%d] = %02x, [%d] = %02x, last_status = %02x\n", xmit_cnt-2, last_status, xmit_cnt-1, data, last_status); + m_xmit_in[m_xmit_cnt++] = m_last_status; + m_xmit_in[m_xmit_cnt++] = data; +// printf("\trunning status: [%d] = %02x, [%d] = %02x, m_last_status = %02x\n", m_xmit_cnt-2, m_last_status, m_xmit_cnt-1, data, m_last_status); } else { - xmit_in[xmit_cnt++] = data; -// printf("\tNRS: [%d] = %02x\n", xmit_cnt-1, data); + m_xmit_in[m_xmit_cnt++] = data; +// printf("\tNRS: [%d] = %02x\n", m_xmit_cnt-1, data); } - if ((xmit_cnt == 1) && (xmit_in[0] == MIDI_SYSEX)) + if ((m_xmit_cnt == 1) && (m_xmit_in[0] == MIDI_SYSEX)) { // printf("Start SysEx!\n"); - last_status = MIDI_SYSEX; + m_last_status = MIDI_SYSEX; return; } // are we there yet? -// printf("status check: %02x\n", xmit_in[0]); - switch ((xmit_in[0]>>4) & 0xf) +// printf("status check: %02x\n", m_xmit_in[0]); + switch ((m_xmit_in[0]>>4) & 0xf) { case 0xc: // 2-byte messages case 0xd: @@ -439,7 +430,7 @@ break; case 0xf: // system common - switch (xmit_in[0] & 0xf) + switch (m_xmit_in[0] & 0xf) { case 0: // System Exclusive is handled above break; @@ -464,11 +455,11 @@ break; } - if (xmit_cnt == bytes_needed) + if (m_xmit_cnt == bytes_needed) { - ev.message = Pm_Message(xmit_in[0], xmit_in[1], xmit_in[2]); - Pm_Write(pmStream, &ev, 1); - xmit_cnt = 0; + ev.message = Pm_Message(m_xmit_in[0], m_xmit_in[1], m_xmit_in[2]); + Pm_Write(m_stream, &ev, 1); + m_xmit_cnt = 0; } } diff -Nru mame-0.263+dfsg.1/src/osd/modules/netdev/pcap.cpp mame-0.264+dfsg.1/src/osd/modules/netdev/pcap.cpp --- mame-0.263+dfsg.1/src/osd/modules/netdev/pcap.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/netdev/pcap.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -7,10 +7,11 @@ #if defined(OSD_NET_USE_PCAP) -#include "emu.h" -#include "dinetwork.h" -#include "osdnet.h" #include "modules/lib/osdlib.h" +#include "osdnet.h" +#include "osdcore.h" // osd_printf_* + +#include "util/strformat.h" // string_format #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) #include @@ -100,7 +101,8 @@ static pcap_module *module = nullptr; #ifdef SDLMAME_MACOSX -struct netdev_pcap_context { +struct netdev_pcap_context +{ uint8_t *pkt; int len; pcap_t *p; @@ -112,16 +114,18 @@ }; #endif -class netdev_pcap : public osd_netdev +class netdev_pcap : public osd_network_device { public: - netdev_pcap(const char *name, class device_network_interface *ifdev, int rate); + netdev_pcap(const char *name, network_handler &ifdev); ~netdev_pcap(); virtual int send(uint8_t *buf, int len) override; - virtual void set_mac(const char *mac) override; + virtual void set_mac(const uint8_t *mac) override; + protected: virtual int recv_dev(uint8_t **buf) override; + private: pcap_t *m_p; #ifdef SDLMAME_MACOSX @@ -131,7 +135,8 @@ }; #ifdef SDLMAME_MACOSX -static void netdev_pcap_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) { +static void netdev_pcap_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) +{ struct netdev_pcap_context *ctx = (struct netdev_pcap_context*)user; if(!ctx->p) return; @@ -156,8 +161,8 @@ } #endif -netdev_pcap::netdev_pcap(const char *name, class device_network_interface *ifdev, int rate) - : osd_netdev(ifdev, rate) +netdev_pcap::netdev_pcap(const char *name, network_handler &ifdev) + : osd_network_device(ifdev) { char errbuf[PCAP_ERRBUF_SIZE]; #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) @@ -177,7 +182,7 @@ m_p = nullptr; return; } - netdev_pcap::set_mac(get_mac()); + netdev_pcap::set_mac(&get_mac()[0]); #ifdef SDLMAME_MACOSX m_ctx.head = 0; @@ -187,7 +192,7 @@ #endif } -void netdev_pcap::set_mac(const char *mac) +void netdev_pcap::set_mac(const uint8_t *mac) { struct bpf_program fp; if(!m_p) return; @@ -256,8 +261,8 @@ static CREATE_NETDEV(create_pcap) { - auto *dev = new netdev_pcap(ifname, ifdev, rate); - return dynamic_cast(dev); + auto *dev = new netdev_pcap(ifname, ifdev); + return dynamic_cast(dev); } int pcap_module::init(osd_interface &osd, const osd_options &options) diff -Nru mame-0.263+dfsg.1/src/osd/modules/netdev/taptun.cpp mame-0.264+dfsg.1/src/osd/modules/netdev/taptun.cpp --- mame-0.263+dfsg.1/src/osd/modules/netdev/taptun.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/netdev/taptun.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -17,11 +17,13 @@ #include #endif -#include "emu.h" -#include "dinetwork.h" +#include "osdcore.h" // osd_printf_verbose +#include "osdfile.h" // PATH_SEPARATOR #include "osdnet.h" #include "unicode.h" +#include "util/hashing.h" // crc32_creator + #ifdef __linux__ #define IFF_TAP 0x0002 #define IFF_NO_PI 0x1000 @@ -58,16 +60,18 @@ -class netdev_tap : public osd_netdev +class netdev_tap : public osd_network_device { public: - netdev_tap(const char *name, class device_network_interface *ifdev, int rate); + netdev_tap(const char *name, network_handler &ifdev); ~netdev_tap(); int send(uint8_t *buf, int len) override; - void set_mac(const char *mac) override; + void set_mac(const uint8_t *mac) override; + protected: int recv_dev(uint8_t **buf) override; + private: #if defined(_WIN32) HANDLE m_handle = INVALID_HANDLE_VALUE; @@ -81,8 +85,8 @@ uint8_t m_buf[2048]; }; -netdev_tap::netdev_tap(const char *name, class device_network_interface *ifdev, int rate) - : osd_netdev(ifdev, rate) +netdev_tap::netdev_tap(const char *name, network_handler &ifdev) + : osd_network_device(ifdev) { #ifdef __linux__ struct ifreq ifr; @@ -141,7 +145,7 @@ #endif } -void netdev_tap::set_mac(const char *mac) +void netdev_tap::set_mac(const uint8_t *mac) { memcpy(m_mac, mac, 6); } @@ -338,7 +342,7 @@ // are in promiscuous mode or got a packet with our mac. do { len = read(m_fd, m_buf, sizeof(m_buf)); - } while((len > 0) && memcmp(get_mac(), m_buf, 6) && !get_promisc() && !(m_buf[0] & 1)); + } while((len > 0) && memcmp(&get_mac()[0], m_buf, 6) && !get_promisc() && !(m_buf[0] & 1)); if (len > 0) len = finalise_frame(m_buf, len); @@ -350,8 +354,8 @@ static CREATE_NETDEV(create_tap) { - auto *dev = new netdev_tap(ifname, ifdev, rate); - return dynamic_cast(dev); + auto *dev = new netdev_tap(ifname, ifdev); + return dynamic_cast(dev); } int taptun_module::init(osd_interface &osd, const osd_options &options) diff -Nru mame-0.263+dfsg.1/src/osd/modules/render/drawogl.cpp mame-0.264+dfsg.1/src/osd/modules/render/drawogl.cpp --- mame-0.263+dfsg.1/src/osd/modules/render/drawogl.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/modules/render/drawogl.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -316,8 +316,8 @@ #endif private: - static const uint32_t HASH_SIZE = ((1 << 10) + 1); - static const uint32_t OVERFLOW_SIZE = (1 << 10); + static const uint32_t HASH_SIZE = ((1 << 18) + 1); + static const uint32_t OVERFLOW_SIZE = (1 << 12); void destroy_all_textures(); diff -Nru mame-0.263+dfsg.1/src/osd/osdepend.h mame-0.264+dfsg.1/src/osd/osdepend.h --- mame-0.263+dfsg.1/src/osd/osdepend.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/osdepend.h 2024-03-25 14:00:46.000000000 +0000 @@ -20,12 +20,13 @@ #include #include #include +#include #include // forward references class input_type_entry; -class osd_midi_device; +namespace osd { class midi_input_port; class midi_output_port; } namespace ui { class menu_item; } @@ -93,28 +94,12 @@ // command option overrides virtual bool execute_command(const char *command) = 0; - // midi interface - virtual std::unique_ptr create_midi_device() = 0; + // MIDI interface + virtual std::unique_ptr create_midi_input(std::string_view name) = 0; + virtual std::unique_ptr create_midi_output(std::string_view name) = 0; protected: virtual ~osd_interface() { } }; - -/*************************************************************************** - MIDI I/O INTERFACES -***************************************************************************/ - -class osd_midi_device -{ -public: - virtual ~osd_midi_device() { } - virtual bool open_input(const char *devname) = 0; - virtual bool open_output(const char *devname) = 0; - virtual void close() = 0; - virtual bool poll() = 0; - virtual int read(uint8_t *pOut) = 0; - virtual void write(uint8_t data) = 0; -}; - #endif // MAME_OSD_OSDEPEND_H diff -Nru mame-0.263+dfsg.1/src/osd/osdnet.cpp mame-0.264+dfsg.1/src/osd/osdnet.cpp --- mame-0.263+dfsg.1/src/osd/osdnet.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/osdnet.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -1,16 +1,16 @@ // license:BSD-3-Clause // copyright-holders:Carl -#include "emu.h" #include "osdnet.h" -#include "dinetwork.h" +#include "interface/nethandler.h" -static class std::vector> netdev_list; + +static std::vector> netdev_list; void add_netdev(const char *name, const char *description, create_netdev func) { - auto entry = std::make_unique(); + auto entry = std::make_unique(); entry->id = netdev_list.size(); strncpy(entry->name, name, 255); entry->name[255] = '\0'; @@ -25,56 +25,50 @@ netdev_list.clear(); } -const std::vector>& get_netdev_list() +const std::vector>& get_netdev_list() { return netdev_list; } -class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int rate) +osd_network_device *open_netdev(int id, osd::network_handler &ifdev) { for(auto &entry : netdev_list) if(entry->id==id) - return entry->func(entry->name, ifdev, rate); + return entry->func(entry->name, ifdev); return nullptr; } -osd_netdev::osd_netdev(class device_network_interface *ifdev, int rate) -{ - m_dev = ifdev; - m_timer = ifdev->device().timer_alloc(FUNC(osd_netdev::recv), this); - m_timer->adjust(attotime::from_hz(rate), 0, attotime::from_hz(rate)); -} - -osd_netdev::~osd_netdev() +osd_network_device::osd_network_device(osd::network_handler &ifdev) + : m_dev(ifdev) + , m_stopped(true) { } -void osd_netdev::start() +osd_network_device::~osd_network_device() { - m_timer->enable(true); } -void osd_netdev::stop() +void osd_network_device::start() { - m_timer->enable(false); + m_stopped = false; } -int osd_netdev::send(uint8_t *buf, int len) +void osd_network_device::stop() { - return 0; + m_stopped = true; } -void osd_netdev::recv(int32_t param) +void osd_network_device::poll() { uint8_t *buf; int len; //const char atalkmac[] = { 0x09, 0x00, 0x07, 0xff, 0xff, 0xff }; - while(m_timer->enabled() && (len = recv_dev(&buf))) + while(!m_stopped && (len = recv_dev(&buf))) { #if 0 if(buf[0] & 1) { - if(memcmp("\xff\xff\xff\xff\xff\xff", buf, 6) && memcmp(atalkmac, buf, 6) && !m_dev->mcast_chk(buf, len)) continue; + if(memcmp("\xff\xff\xff\xff\xff\xff", buf, 6) && memcmp(atalkmac, buf, 6) && !m_dev.mcast_chk(buf, len)) continue; } else { //const unsigned char *ourmac = (const unsigned char *)get_mac(); @@ -83,60 +77,34 @@ } #endif - m_dev->recv_cb(buf, len); + m_dev.recv_cb(buf, len); } } -int osd_netdev::recv_dev(uint8_t **buf) +int osd_network_device::send(uint8_t *buf, int len) { return 0; } -void osd_netdev::set_mac(const char *mac) -{ -} - -void osd_netdev::set_promisc(bool promisc) +int osd_network_device::recv_dev(uint8_t **buf) { + return 0; } -bool osd_netdev::get_promisc() +void osd_network_device::set_mac(const uint8_t *mac) { - if(m_dev) - return m_dev->get_promisc(); - return false; } -const char *osd_netdev::get_mac() +void osd_network_device::set_promisc(bool promisc) { - if(m_dev) - return m_dev->get_mac(); - return "\0\0\0\0\0\0"; } -int netdev_count() +bool osd_network_device::get_promisc() { - return netdev_list.size(); + return m_dev.get_promisc(); } -void osd_list_network_adapters() +const std::array &osd_network_device::get_mac() { - #ifdef USE_NETWORK - int num_devs = netdev_list.size(); - - if (num_devs == 0) - { - printf("No network adapters were found\n"); - return; - } - - printf("Available network adapters:\n"); - for (auto &entry : netdev_list) - { - printf(" %s\n", entry->description); - } - - #else - printf("Network is not supported in this build\n"); - #endif + return m_dev.get_mac(); } diff -Nru mame-0.263+dfsg.1/src/osd/osdnet.h mame-0.264+dfsg.1/src/osd/osdnet.h --- mame-0.263+dfsg.1/src/osd/osdnet.h 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/osdnet.h 2024-03-25 14:00:46.000000000 +0000 @@ -5,14 +5,21 @@ #pragma once +#include "osdcomm.h" + #include +#include +#include +#include + -class osd_netdev; +namespace osd { class network_handler; } +class osd_network_device; -#define CREATE_NETDEV(name) class osd_netdev *name(const char *ifname, class device_network_interface *ifdev, int rate) -typedef class osd_netdev *(*create_netdev)(const char *ifname, class device_network_interface *ifdev, int rate); +#define CREATE_NETDEV(name) osd_network_device *name(const char *ifname, osd::network_handler &ifdev) +typedef osd_network_device *(*create_netdev)(const char *ifname, osd::network_handler &ifdev); -class osd_netdev +class osd_network_device { public: struct entry_t @@ -28,33 +35,32 @@ char description[256]; create_netdev func = nullptr; }; - osd_netdev(class device_network_interface *ifdev, int rate); - virtual ~osd_netdev(); + + osd_network_device(osd::network_handler &ifdev); + virtual ~osd_network_device(); + void start(); void stop(); + void poll(); virtual int send(uint8_t *buf, int len); - virtual void set_mac(const char *mac); + virtual void set_mac(const uint8_t *mac); virtual void set_promisc(bool promisc); - const char *get_mac(); + const std::array &get_mac(); bool get_promisc(); protected: virtual int recv_dev(uint8_t **buf); private: - void recv(int32_t param); - - class device_network_interface *m_dev; - emu_timer *m_timer; + osd::network_handler &m_dev; + bool m_stopped; }; -class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int rate); +osd_network_device *open_netdev(int id, osd::network_handler &ifdev); void add_netdev(const char *name, const char *description, create_netdev func); void clear_netdev(); -const std::vector>& get_netdev_list(); -int netdev_count(); -void osd_list_network_adapters(); +const std::vector>& get_netdev_list(); #endif // MAME_OSD_OSDNET_H diff -Nru mame-0.263+dfsg.1/src/osd/windows/window.cpp mame-0.264+dfsg.1/src/osd/windows/window.cpp --- mame-0.263+dfsg.1/src/osd/windows/window.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/osd/windows/window.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -31,10 +31,10 @@ #include "modules/monitor/monitor_common.h" -#define NOT_ALREADY_DOWN(x) (x & 0x40000000) == 0 +#define NOT_ALREADY_DOWN(x) ((x & 0x40000000) == 0) #define SCAN_CODE(x) ((x >> 16) & 0xff) -#define IS_EXTENDED(x) (0x01000000 & x) -#define MAKE_DI_SCAN(scan, isextended) (scan & 0x7f) | (isextended ? 0x80 : 0x00) +#define IS_EXTENDED(x) ((x >> 24) & 0x01) +#define MAKE_DI_SCAN(scan, isextended) ((scan & 0x7f) | (isextended ? 0x80 : 0x00)) #define WINOSD(machine) downcast(&machine.osd()) //============================================================ diff -Nru mame-0.263+dfsg.1/src/tools/chdman.cpp mame-0.264+dfsg.1/src/tools/chdman.cpp --- mame-0.263+dfsg.1/src/tools/chdman.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/chdman.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -284,8 +284,7 @@ length = m_maxoffset - offset; if (m_file.seek(offset, SEEK_SET)) // FIXME: better error reporting? return 0; - std::size_t actual; - m_file.read(dest, length, actual); // FIXME: check for error return + auto const [err, actual] = read(m_file, dest, length); // FIXME: check for error return return actual; } @@ -405,6 +404,7 @@ { const cdrom_file::track_info &trackinfo = m_toc.tracks[tracknum]; uint64_t endoffs = startoffs + (uint64_t)(trackinfo.frames + trackinfo.extraframes) * cdrom_file::FRAME_SIZE; + if (offset >= startoffs && offset < endoffs) { // if we don't already have this file open, open it now @@ -421,11 +421,11 @@ uint64_t bytesperframe = trackinfo.datasize + trackinfo.subsize; uint64_t src_track_start = m_info.track[tracknum].offset; uint64_t src_track_end = src_track_start + bytesperframe * (uint64_t)trackinfo.frames; - uint64_t pad_track_start = src_track_end - ((uint64_t)m_toc.tracks[tracknum].padframes * bytesperframe); - uint64_t split_track_start = pad_track_start - ((uint64_t)m_toc.tracks[tracknum].splitframes * bytesperframe); + uint64_t split_track_start = src_track_end - ((uint64_t)trackinfo.splitframes * bytesperframe); + uint64_t pad_track_start = split_track_start - ((uint64_t)trackinfo.padframes * bytesperframe); // dont split when split-bin read not required - if ((uint64_t)m_toc.tracks[tracknum].splitframes == 0L) + if ((uint64_t)trackinfo.splitframes == 0L) split_track_start = UINT64_MAX; while (length_remaining != 0 && offset < endoffs) @@ -434,7 +434,7 @@ uint64_t src_frame_start = src_track_start + ((offset - startoffs) / cdrom_file::FRAME_SIZE) * bytesperframe; // auto-advance next track for split-bin read - if (src_frame_start == split_track_start && m_lastfile.compare(m_info.track[tracknum+1].fname)!=0) + if (src_frame_start >= split_track_start && src_frame_start < src_track_end && m_lastfile.compare(m_info.track[tracknum+1].fname)!=0) { m_file.reset(); m_lastfile = m_info.track[tracknum+1].fname; @@ -446,7 +446,7 @@ if (src_frame_start < src_track_end) { // read it in, or pad if we're into the padframes - if (src_frame_start >= pad_track_start) + if (src_frame_start >= pad_track_start && src_frame_start < split_track_start) { memset(dest, 0, bytesperframe); } @@ -459,7 +459,7 @@ SEEK_SET); std::size_t count = 0; if (!err) - err = m_file->read(dest, bytesperframe, count); + std::tie(err, count) = read(*m_file, dest, bytesperframe); if (err || (count != bytesperframe)) report_error(1, "Error reading input file (%s)'", m_lastfile); } @@ -2545,9 +2545,8 @@ report_error(1, "Error reading CHD file (%s): %s", *params.find(OPTION_INPUT)->second, err.message()); // write to the output - size_t count; - std::error_condition const writerr = output_file->write(&buffer[0], bytes_to_read, count); - if (writerr || (count != bytes_to_read)) + auto const [writerr, count] = write(*output_file, &buffer[0], bytes_to_read); + if (writerr) report_error(1, "Error writing to file; check disk space (%s)", *output_file_str->second); // advance @@ -2629,6 +2628,11 @@ mode = MODE_GDI; } + if (cdrom->is_gdrom() && (mode == MODE_CUEBIN)) + { + util::stream_format(std::cout, "Warning: extracting GD-ROM CHDs as bin/cue is not fully supported and will result in an unusable CD-ROM cue file.\n"); + } + // process output file std::error_condition filerr = util::core_file::open(*output_file_str->second, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_NO_BOM, output_toc_file); if (filerr) @@ -2771,15 +2775,36 @@ if (bufferoffs == buffer.size() || frame == actualframes - 1) { output_bin_file->seek(outputoffs, SEEK_SET); - size_t byteswritten; - std::error_condition const writerr = output_bin_file->write(&buffer[0], bufferoffs, byteswritten); - if (writerr || (byteswritten != bufferoffs)) + auto const [writerr, byteswritten] = write(*output_bin_file, &buffer[0], bufferoffs); + if (writerr) report_error(1, "Error writing frame %d to file (%s): %s\n", frame, *output_file_str->second, "Write error"); outputoffs += bufferoffs; bufferoffs = 0; } } + if (cdrom->is_gdrom() && mode == MODE_CUEBIN && trackinfo.padframes > 0) + { + uint32_t padframes = trackinfo.padframes; + + // don't write the pad frames between the end of the single density area and start of the high density area + if (tracknum+1 < toc.numtrks && toc.tracks[tracknum+1].physframeofs == 45000) + padframes = 0; + + bufferoffs = 0; + std::fill(buffer.begin(), buffer.end(), 0); + + while (bufferoffs < padframes) + { + auto const [writerr, byteswritten] = write(*output_bin_file, &buffer[0], output_frame_size); + if (writerr) + report_error(1, "Error writing pad data to file (%s): %s\n", *output_file_str->second, "Write error"); + bufferoffs++; + } + + outputoffs += output_frame_size * padframes; + } + discoffs += trackinfo.padframes; } @@ -3123,10 +3148,10 @@ // output the metadata size_t count; - filerr = output_file->write(&buffer[0], buffer.size(), count); + std::tie(filerr, count) = write(*output_file, &buffer[0], buffer.size()); if (!filerr) filerr = output_file->flush(); - if (filerr || (count != buffer.size())) + if (filerr) report_error(1, "Error writing file (%s)", *output_file_str->second); output_file.reset(); diff -Nru mame-0.263+dfsg.1/src/tools/imgtool/stream.cpp mame-0.264+dfsg.1/src/tools/imgtool/stream.cpp --- mame-0.263+dfsg.1/src/tools/imgtool/stream.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/imgtool/stream.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include @@ -70,7 +71,7 @@ return std::error_condition(); } - virtual std::error_condition read(void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some(void *buffer, std::size_t length, std::size_t &actual) noexcept override { actual = m_stream->read(buffer, length); if (actual < length) @@ -78,7 +79,7 @@ return std::error_condition(); } - virtual std::error_condition read_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition read_some_at(std::uint64_t offset, void *buffer, std::size_t length, std::size_t &actual) noexcept override { std::uint64_t const pos = m_stream->tell(); m_stream->seek(offset, SEEK_SET); @@ -111,7 +112,7 @@ return std::error_condition(); } - virtual std::error_condition write(void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some(void const *buffer, std::size_t length, std::size_t &actual) noexcept override { std::uint64_t const pos = m_stream->tell(); std::uint64_t size = m_stream->size(); @@ -124,7 +125,7 @@ return (actual == length) ? std::error_condition() : std::errc::io_error; } - virtual std::error_condition write_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override + virtual std::error_condition write_some_at(std::uint64_t offset, void const *buffer, std::size_t length, std::size_t &actual) noexcept override { std::uint64_t const pos = m_stream->tell(); std::uint64_t size = m_stream->size(); @@ -391,13 +392,14 @@ uint32_t stream::read(void *buf, uint32_t sz) { + std::error_condition err; size_t result = 0; switch(imgtype) { case IMG_FILE: if (!file->seek(position, SEEK_SET)) - file->read(buf, sz, result); // FIXME: check error return + std::tie(err, result) = util::read(*file, buf, sz); // FIXME: check error return break; case IMG_MEM: @@ -424,6 +426,7 @@ uint32_t stream::write(const void *buf, uint32_t sz) { + std::error_condition err; size_t result = 0; switch(imgtype) @@ -455,7 +458,7 @@ case IMG_FILE: if (!file->seek(position, SEEK_SET)) - file->write(buf, sz, result); // FIXME: check error return + std::tie(err, result) = util::write(*file, buf, sz); // FIXME: check error return break; default: diff -Nru mame-0.263+dfsg.1/src/tools/regrep.cpp mame-0.264+dfsg.1/src/tools/regrep.cpp --- mame-0.263+dfsg.1/src/tools/regrep.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/regrep.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -224,7 +224,7 @@ int main(int argc, char *argv[]) { - uint32_t bufsize; + size_t bufsize; void *buffer; int listnum; int result; @@ -577,8 +577,7 @@ /* print a header */ std::string modified(templatefile); strreplace(modified, "", title); - std::size_t written; - file->write(modified.c_str(), modified.length(), written); // FIXME: check for errors + /*auto const [err, written] =*/ write(*file, modified.c_str(), modified.length()); // FIXME: check for errors /* return the file */ return file; @@ -594,8 +593,7 @@ { std::string modified(templatefile); strreplace(modified, "", title); - std::size_t written; - file->write(modified.c_str(), modified.length(), written); // FIXME: check for errors + /*auto const [err, written] =*/ write(*file, modified.c_str(), modified.length()); // FIXME: check for errors file.reset(); } diff -Nru mame-0.263+dfsg.1/src/tools/split.cpp mame-0.264+dfsg.1/src/tools/split.cpp --- mame-0.263+dfsg.1/src/tools/split.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/split.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -12,11 +12,13 @@ #include "corestr.h" #include "hashing.h" +#include +#include #include #include #include -#include -#include +#include +#include #define DEFAULT_SPLIT_SIZE 100 #define MAX_PARTS 1000 @@ -34,11 +36,19 @@ hash over a buffer and return a string -------------------------------------------------*/ -static void compute_hash_as_string(std::string &buffer, void *data, uint32_t length) +static void compute_hash_as_string(std::string &buffer, const void *data, size_t length) { // compute the SHA1 util::sha1_creator sha1; - sha1.append(data, length); + do + { + // deal with size_t potentially being bigger than 32 bits + auto const chunk = std::min >(length, std::numeric_limits::max()); + sha1.append(data, chunk); + length -= chunk; + data = reinterpret_cast(data) + chunk; + } + while (length); const util::sha1_t sha1digest = sha1.finish(); // expand the digest to a string @@ -141,7 +151,7 @@ // read as much as we can from the file size_t length; - infile->read(splitbuffer, splitsize, length); // FIXME check error return + std::tie(filerr, length) = read(*infile, splitbuffer, splitsize); // FIXME check error return if (length == 0) break; @@ -167,8 +177,8 @@ // write the data size_t actual; - filerr = outfile->write(splitbuffer, length, actual); - if (filerr || (actual != length) || outfile->flush()) + std::tie(filerr, actual) = write(*outfile, splitbuffer, length); + if (filerr || outfile->flush()) { printf("\n"); fprintf(stderr, "Fatal error: Error writing output file (out of space?)\n"); @@ -302,7 +312,7 @@ // read the file's contents infilename.insert(0, basepath); - uint32_t length; + size_t length; filerr = util::core_file::load(infilename.c_str(), &splitbuffer, length); if (filerr) { @@ -328,8 +338,8 @@ printf(" writing..."); size_t actual; - filerr = outfile->write(splitbuffer, length, actual); - if (filerr || (actual != length) || outfile->flush()) + std::tie(filerr, actual) = write(*outfile, splitbuffer, length); + if (filerr || outfile->flush()) { printf("\n"); fprintf(stderr, "Fatal error: Error writing output file (out of space?)\n"); diff -Nru mame-0.263+dfsg.1/src/tools/srcclean.cpp mame-0.264+dfsg.1/src/tools/srcclean.cpp --- mame-0.263+dfsg.1/src/tools/srcclean.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/srcclean.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -2305,11 +2305,22 @@ ++failures; continue; } - std::size_t block; - while (remaining && !infile->read(original, (std::min)(std::uint64_t(sizeof(original)), remaining), block) && block) + while (remaining) { - remaining -= block; - cleaner->process(original, original + block); + std::size_t block((std::min)(std::uint64_t(sizeof(original)), remaining)); + std::size_t actual; + std::error_condition const readerr(infile->read_some(original, block, actual)); + if (readerr) + { + if (std::errc::interrupted != readerr) + break; + } + else if (!actual) + { + break; + } + remaining -= actual; + cleaner->process(original, original + actual); } if (remaining) { diff -Nru mame-0.263+dfsg.1/src/tools/unidasm.cpp mame-0.264+dfsg.1/src/tools/unidasm.cpp --- mame-0.263+dfsg.1/src/tools/unidasm.cpp 2024-02-27 12:17:06.000000000 +0000 +++ mame-0.264+dfsg.1/src/tools/unidasm.cpp 2024-03-25 14:00:46.000000000 +0000 @@ -210,6 +210,7 @@ #include "cpu/xtensa/xtensad.h" #include "cpu/z180/z180dasm.h" #include "cpu/z8/z8dasm.h" +#include "cpu/z80/r800dasm.h" #include "cpu/z80/z80dasm.h" #include "cpu/z8000/8000dasm.h" @@ -263,7 +264,6 @@ bool x_flag; g65816_unidasm_t() { m_flag = false; x_flag = false; } - virtual ~g65816_unidasm_t() override = default; virtual bool get_m_flag() const override { return m_flag; } virtual bool get_x_flag() const override { return x_flag; } } g65816_unidasm; @@ -585,6 +585,7 @@ { "psxcpu", le, 0, []() -> util::disasm_interface * { return new psxcpu_disassembler; } }, { "r65c02", le, 0, []() -> util::disasm_interface * { return new r65c02_disassembler; } }, { "r65c19", le, 0, []() -> util::disasm_interface * { return new r65c19_disassembler; } }, + { "r800", le, 0, []() -> util::disasm_interface * { return new r800_disassembler; } }, { "romp", be, 0, []() -> util::disasm_interface * { return new romp_disassembler; } }, { "rsp", le, 0, []() -> util::disasm_interface * { return new rsp_disassembler; } }, { "rupi44", le, 0, []() -> util::disasm_interface * { return new rupi44_disassembler; } }, @@ -1301,8 +1302,7 @@ base_buffer.data.resize(rounded_size + 8, 0x00); base_buffer.size = length; base_buffer.base_pc = opts.basepc; - std::size_t actual; - std::error_condition filerr = file.read_at(opts.skip, &base_buffer.data[0], length - opts.skip, actual); + auto const [filerr, actual] = read_at(file, opts.skip, &base_buffer.data[0], length - opts.skip); if(filerr) { std::fprintf(stderr, "Error reading from file '%s' (%s)\n", opts.filename, filerr.message().c_str()); return 1;