summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2023-05-08 19:05:12 +0200
committer GitHub <noreply@github.com>2023-05-08 19:05:12 +0200
commiteefe5912b6dc04d435bb9ddf36d049e5feccff6e (patch)
tree688156e6bc828fa6de0023a9b3a2cbcb895fa76c
parent5af539b77740a29d82c7b86b8375995d0390a256 (diff)
ata/gdrom.cpp: overhaul (#11140)
- ata/gdrom.cpp: Fix READ_TOC command, improve logging, add redbook playback & repeat, add basic CD status; - ata/gdrom.cpp: fix loopchk Maker/Model identify ATA command 0104; - ata/gdrom.h: flip is_ready() to true, fixes several hangs (cfr. hash/dc.xml) - sound/aica.cpp: fix EXTS[1] routing; - sega/dccons.cpp: fix dcfish gdrom region hookup regression;
-rw-r--r--hash/dc.xml211
-rw-r--r--src/devices/bus/ata/gdrom.cpp690
-rw-r--r--src/devices/bus/ata/gdrom.h17
-rw-r--r--src/devices/sound/aica.cpp9
-rw-r--r--src/mame/sega/dccons.cpp25
-rw-r--r--src/mame/sega/dccons_m.cpp4
6 files changed, 684 insertions, 272 deletions
diff --git a/hash/dc.xml b/hash/dc.xml
index 5366c50c791..8d76cc6030d 100644
--- a/hash/dc.xml
+++ b/hash/dc.xml
@@ -740,7 +740,8 @@ Black screen [GDROM]
<year>2002</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] title screen text blink don't mix properly with logo
]]></notes>
<info name="serial" value="HDR-0154"/>
<!-- Disc ID: 673-03371 -->
@@ -1141,7 +1142,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2004</year>
<publisher>Pionesoft</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-18705M"/>
<!-- Disc Serial: T-18705M/T-18706M -->
@@ -1222,7 +1223,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-20112M"/>
<info name="release" value="20010920"/>
@@ -1891,7 +1892,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-No [redbook] audio
+No [AICA] audio on opening FMV
]]></notes>
<info name="serial" value="T-20107M"/>
<info name="release" value="20010412"/>
@@ -1914,7 +1915,8 @@ No [redbook] audio
<year>2005</year>
<publisher>Pionesoft</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] dire performance at (static) title screen
]]></notes>
<info name="serial" value="T-18712M"/>
<info name="release" value="20050224"/>
@@ -1982,7 +1984,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2000</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+Hangs at "Now loading" screen [GDROM]?
]]></notes>
<info name="serial" value="HDR-0075"/>
<info name="release" value="20001207"/>
@@ -2229,7 +2232,7 @@ Optional [BBA] support
<year>2004</year>
<publisher>Alchemist</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-47110M"/>
<info name="release" value="20041028"/>
@@ -2417,7 +2420,9 @@ Punts to BIOS at start of loading [GDROM]
<year>1999</year>
<publisher>ESP</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
+Has [redbook] audio
+Doesn't update [PVR] cursor on no [VMU] screen and title screen
]]></notes>
<info name="serial" value="T-38702M"/>
<info name="release" value="19991209"/>
@@ -2440,7 +2445,7 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2000</year>
<publisher>Visco</publisher>
<notes><![CDATA[
-Black screen [GDROM]
+Black screen [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-5801M"/>
<info name="release" value="20001221"/>
@@ -3165,7 +3170,7 @@ Black screen [GDROM]
<year>2002</year>
<publisher>Fujicom</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-42904M"/>
<info name="release" value="20020124"/>
@@ -3238,7 +3243,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Bimboosoft</publisher>
<notes><![CDATA[
-No [redbook] audio
+Ugly Bimboosoft [PVR] render at startup
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-41202M"/>
<info name="release" value="20010920"/>
@@ -3343,7 +3349,8 @@ No [redbook] audio
<year>2003</year>
<publisher>G.rev</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] ugly cutoff of background at VMU screen
]]></notes>
<info name="serial" value="T-46703M"/>
<info name="release" value="20030925"/>
@@ -3769,7 +3776,7 @@ Built on Windows CE, requires [MMU] support
<year>2003</year>
<publisher>Princess Soft</publisher>
<notes><![CDATA[
-Black screen [GDROM]
+Black screen [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-46513M"/>
<info name="release" value="20030529"/>
@@ -3793,7 +3800,8 @@ Black screen [GDROM]
<year>2001</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] logo reel do ugly fade-ins/-outs
]]></notes>
<info name="serial" value="T-20111M"/>
<info name="release" value="20010823"/>
@@ -3915,11 +3923,12 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-20108M"/>
<info name="release" value="20010405"/>
<info name="alt_title" value="Canvas 〜セピア色のモチーフ〜"/>
+ <info name="developer" value="Cocktail Soft"/>
<part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="canvas sepia-iro no motif (jpn)" sha1="a4f5b577a5452d6783750506f593727b45314623"/>
@@ -4136,7 +4145,7 @@ Hangs on ADX logo with [drc]
<year>2002</year>
<publisher>Abel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-44405M"/>
<info name="release" value="20020328"/>
@@ -4171,7 +4180,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2000</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Black screen [GDROM], [SH4] jumps to lalaland
+Black screen [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="HDR-0115, HDR-0132 (Limited Box)"/>
<info name="release" value="20001228"/>
@@ -4469,7 +4478,7 @@ Crashes after ADX logo with [drc]
<year>2004</year>
<publisher>Milestone Inc.</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-47801M"/>
<info name="release" value="20041216"/>
@@ -4487,7 +4496,7 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2004</year>
<publisher>Milestone Inc.</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-47801M, STRV-002 (Bonus CD)"/>
<info name="release" value="20041216"/>
@@ -4512,7 +4521,7 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2004</year>
<publisher>Milestone Inc.</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-47801M, STRV-003 (Bonus CD)"/>
<info name="release" value="20050224"/>
@@ -4777,7 +4786,7 @@ Built on Windows CE, requires [MMU] support
<year>2003</year>
<publisher>Alchemist</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-47107M"/>
<info name="release" value="20031225"/>
@@ -4801,7 +4810,7 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2003</year>
<publisher>Alchemist</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="610-8395"/>
<info name="alt_title" value="ショコラ 〜maid cafe “curio”〜 体験版"/>
@@ -5393,7 +5402,7 @@ Overly stretched [PVR] output (displays top right of actual screen, SCALER_CTL)
<year>2001</year>
<publisher>AquaPlus</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-38301M, T-38302M (Shokai Genteiban)"/>
<info name="release" value="20010809"/>
@@ -5464,7 +5473,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] ROP bug for title screen composition
]]></notes>
<info name="serial" value="HDR-0160"/>
<info name="release" value="20010614"/>
@@ -5625,7 +5635,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Crashes at "Produced by Sega"
+Crashes at "Produced by Sega" [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="HDR-0176"/>
<info name="release" value="20010913"/>
@@ -5650,7 +5660,7 @@ Crashes at "Produced by Sega"
<year>2001</year>
<publisher>Hackberry</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-45801M"/>
<info name="release" value="20010802"/>
@@ -5852,7 +5862,8 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2001</year>
<publisher>Media Factory</publisher>
<notes><![CDATA[
-Hangs at "Produced by Sega", [GDROM] keeps reading LBA=$afbe with REQ_ERROR 13h
+Hangs at "Produced by Sega", [GDROM READY] keeps reading LBA=$afbe with REQ_ERROR 13h (fixed)
+[PVR] ROP bug for title screen text
]]></notes>
<info name="serial" value="T-43903M"/>
<info name="release" value="20010712"/>
@@ -6064,7 +6075,8 @@ Hangs at "Produced by Sega", [GDROM] keeps reading LBA=$afbe with REQ_ERROR 13h
<year>2001</year>
<publisher>Princess Soft</publisher>
<notes><![CDATA[
-Black screen [GDROM]
+Black screen [GDROM READY] (fixed)
+No [PVR] renders/black screen on FMV and title screen (sound plays)
]]></notes>
<info name="serial" value="T-46502M, T-46552M (Alt. Audio CD)"/>
<info name="release" value="20011025"/>
@@ -7384,7 +7396,7 @@ Black screen [GDROM]
<publisher>Hudson</publisher>
<notes><![CDATA[
Test case for [PVR] flickerfree feature
-No [redbook] audio
+Has [redbook] audio (title screen)
]]></notes>
<info name="serial" value="T-14305M"/>
<info name="release" value="19990722"/>
@@ -8145,7 +8157,7 @@ Hardlocks MAME if left idle on title screen with [drc]
<year>2002</year>
<publisher>G.rev</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-46701M"/>
<info name="release" value="20020131"/>
@@ -8348,7 +8360,7 @@ Punts to BIOS at start of loading [GDROM]
<year>1999</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164"/>
<info name="release" value="19990723"/>
@@ -8381,7 +8393,7 @@ No [redbook] audio
<year>1999</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-02 (Disc 1), 610-7164-03 (Disc 2)"/>
<info name="release" value="19990827"/>
@@ -8476,7 +8488,7 @@ No [redbook] audio
<year>2000</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-06"/>
<info name="release" value="20000707"/>
@@ -8500,7 +8512,7 @@ No [redbook] audio
<year>2000</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-07"/>
<info name="release" value="20000811"/>
@@ -8524,7 +8536,12 @@ No [redbook] audio
<year>2000</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
+deSPIRIA:
+OutTrigger: crashes during loading with big [GDROM] transfer [drc]
+18 Wheeler:
+Illbleed:
+Capcom vs SNK:
]]></notes>
<info name="serial" value="610-7164-08"/>
<info name="release" value="20000929"/>
@@ -8560,7 +8577,13 @@ No [redbook] audio
<year>2000</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
+Virtua Tennis: fails [GDROM READY] loading, punts to game select (fixed)
+Heavy [PVR] issues (too many to list)
+Guilty Gear X:
+Marionette Handler 2:
+Tricolore Crise (FMV):
+Moero! Justice Gakuen (FMV):
]]></notes>
<info name="serial" value="610-7164-09"/>
<info name="release" value="20001127"/>
@@ -8585,7 +8608,7 @@ No [redbook] audio
<year>2000</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-10"/>
<info name="release" value="20001229"/>
@@ -8610,7 +8633,8 @@ No [redbook] audio
<year>2001</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
+[AICA] sound crackling on game select menu
]]></notes>
<info name="serial" value="610-7164-11"/>
<info name="release" value="20010209"/>
@@ -8635,7 +8659,7 @@ No [redbook] audio
<year>2001</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-12"/>
<info name="release" value="20010330"/>
@@ -8660,7 +8684,7 @@ No [redbook] audio
<year>2001</year>
<publisher>Softbank</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title/attract (btanb)
]]></notes>
<info name="serial" value="610-7164-13"/>
<info name="release" value="2001"/>
@@ -11707,7 +11731,7 @@ Doesn't detect key repeat properly in main menu (inputs get stuck), [Maple] timi
<year>2001</year>
<publisher>Capcom</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-1227M"/>
<info name="release" value="20010606"/>
@@ -11730,7 +11754,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Capcom</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-1228M"/>
<info name="release" value="20010808"/>
@@ -11753,7 +11777,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Capcom</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-1229M"/>
<info name="release" value="20011010"/>
@@ -11817,7 +11841,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2002</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-20116M"/>
<info name="release" value="20020725"/>
@@ -12030,7 +12054,7 @@ Hardlocks MAME after event "how to play" with [drc]
<year>2001</year>
<publisher>NetVillage</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-39802M"/>
<info name="release" value="20010322"/>
@@ -12328,7 +12352,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2001</year>
<publisher>Abel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-44404M"/>
<info name="release" value="20010531"/>
@@ -12648,7 +12672,8 @@ Punts to BIOS at start of loading [GDROM]
<year>1999</year>
<publisher>Video System</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio
+[PVR] Z-fighting on car select, specifically front wings
]]></notes>
<info name="serial" value="T-3001M"/>
<info name="release" value="19991125"/>
@@ -13085,7 +13110,8 @@ Gameplay requires [PVR] user tile clip
<year>2001</year>
<publisher>SNK</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
+Hangs on SNK logo
]]></notes>
<info name="serial" value="T-3108M, T-47302M (SNK Best Buy)"/>
<info name="release" value="20010927"/>
@@ -13401,7 +13427,10 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2001</year>
<publisher>Spike</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio
+[PVR] goes blank during first frames, should display white over black screen before CD audio starts up
+[PVR] ROP bug for end intro title/pre-match presentation flames
+[PVR] user tile clip for referee on exibition match setup
]]></notes>
<info name="serial" value="T-18804M, T-18805M"/>
<info name="release" value="20010301"/>
@@ -13431,7 +13460,8 @@ No [redbook] audio
<year>2002</year>
<publisher>Broccoli</publisher>
<notes><![CDATA[
-Hangs at "Produced by Sega", [GDROM] reads LBA=$afd8 and $afdc (same as culdcept2?)
+Hangs at "Produced by Sega", [GDROM READY] (fixed)
+Too fast ADX logo transition
]]></notes>
<info name="serial" value="T-46305M"/>
<!-- JASRAC ID: V-021068 -->
@@ -13485,7 +13515,8 @@ Hangs at "Produced by Sega", [GDROM] reads LBA=$afd8 and $afdc (same as culdcept
<year>2002</year>
<publisher>Broccoli</publisher>
<notes><![CDATA[
-Hangs at "Produced by Sega", [GDROM] reads LBA=$afd8 and $afdc (same as culdcept2?)
+Hangs at "Produced by Sega", [GDROM READY] (fixed)
+Too fast ADX logo transition
]]></notes>
<info name="serial" value="T-46304M"/>
<!-- JASRAC ID: V-021068 -->
@@ -13594,7 +13625,7 @@ Hangs at "Produced by Sega", [GDROM] reads LBA=$afd8 and $afdc (same as culdcept
<notes><![CDATA[
[PVR] safety cars in attract mode have ugly renders
Black screen on title, [PVR] wrong ROP?
-Checkered flag is blackened on main menu [PVR]
+[PVR] Checkered flag is blackened on main menu
]]></notes>
<info name="serial" value="HDR-0013"/>
<info name="release" value="19990325"/>
@@ -15229,7 +15260,7 @@ Hangs on FMV with [drc]
<year>2001</year>
<publisher>Softmax</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-44501M"/>
<info name="release" value="20010125"/>
@@ -15664,8 +15695,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2000</year>
<publisher>Sammy</publisher>
<notes><![CDATA[
-[PVR] tester for bare polygons wrong normals (in training)
-No [redbook] audio
+[PVR] wrong normals for bare polygons HP bars in gameplay
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-2402M"/>
<info name="release" value="20001214"/>
@@ -15752,7 +15783,7 @@ No [redbook] audio
<year>2000</year>
<publisher>Sammy</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio
]]></notes>
<info name="serial" value="610-7937"/>
<info name="alt_title" value="GUILTY GEAR X 体験版"/>
@@ -16029,7 +16060,7 @@ Optional [BBA] support
<publisher>Sega</publisher>
<notes><![CDATA[
Optional [BBA] support
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="HDR-0195"/>
<info name="release" value="20020314"/>
@@ -16191,7 +16222,8 @@ Built on Windows CE, requires [MMU] support
<year>2001</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] title screen text doesn't blend properly
]]></notes>
<info name="serial" value="T-20106M"/>
<info name="release" value="20010322"/>
@@ -16337,7 +16369,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2000</year>
<publisher>Capcom</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-2202M"/>
<info name="release" value="20001026"/>
@@ -16569,7 +16601,8 @@ Built on Windows CE, requires [MMU] support
<year>2001</year>
<publisher>Starfish-SD</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] title screen text doesn't blend properly
]]></notes>
<info name="serial" value="T-46101M"/>
<info name="release" value="20010726"/>
@@ -17009,7 +17042,7 @@ FMV draws [PVR] black pixels instead of transparent color
<year>2002</year>
<publisher>ESP</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
]]></notes>
<info name="serial" value="T-38706M"/>
<info name="release" value="20020905"/>
@@ -17175,7 +17208,7 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>1998</year>
<publisher>Imagineer</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio, requires pause state to kick in during attract
]]></notes>
<info name="serial" value="T-15001M"/>
<info name="release" value="19981217"/>
@@ -17209,7 +17242,7 @@ No [redbook] audio
<year>1998</year>
<publisher>Imagineer</publisher>
<notes><![CDATA[
-No [redbook] audio
+Has [redbook] audio, requires pause state to kick in during attract
]]></notes>
<info name="serial" value="T-15001M"/>
<info name="release" value="19981217"/>
@@ -17331,7 +17364,7 @@ No [redbook] audio
<year>2001</year>
<publisher>Datam Polystar</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-19506M"/>
<info name="release" value="20011108"/>
@@ -17547,7 +17580,7 @@ Crashes on FMV with [drc]
<year>2004</year>
<publisher>Symbio Planning</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-46902M"/>
<info name="release" value="20040129"/>
@@ -17600,7 +17633,7 @@ Punts to BIOS at start of loading [GDROM]
<publisher>Visit</publisher>
<notes><![CDATA[
Black screen after initial screen loading with [drc]
-No [redbook] audio
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-43401M"/>
<info name="release" value="20000831"/>
@@ -17625,6 +17658,10 @@ No [redbook] audio
<description>Jeremy McGrath Supercross 2000 (USA)</description>
<year>2000</year>
<publisher>Acclaim Entertainment</publisher>
+ <notes><![CDATA[
+[PVR] loading and main menu have no background images [drc]
+Fails loading when selecting race [drc]
+]]></notes>
<info name="serial" value="T-8104N"/>
<info name="release" value="20000808"/>
<info name="ring_code" value="1S T-8104N"/>
@@ -17736,7 +17773,8 @@ No [redbook] audio
<year>2000</year>
<publisher>Bimboosoft</publisher>
<notes><![CDATA[
-No [redbook] audio
+Ugly Bimboosoft [PVR] render at startup
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-41201M"/>
<info name="release" value="20001102"/>
@@ -18488,7 +18526,9 @@ Built on Windows CE, requires [MMU] support
<year>2007</year>
<publisher>Milestone Inc.</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM], locks up
+Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
+Hangs on gameplay
+Ugly sample scratches coming from [AICA]
]]></notes>
<info name="serial" value="T-47803M"/>
<info name="release" value="20070308"/>
@@ -18514,7 +18554,8 @@ Punts to BIOS at start of loading [GDROM], locks up
<year>2004</year>
<publisher>Rain Software</publisher>
<notes><![CDATA[
-No [redbook] audio
+Goes silent on title screen (verify)
+cdrom2: [redbook] audio
]]></notes>
<info name="serial" value="T-47501M"/>
<info name="release" value="20040415"/>
@@ -18671,7 +18712,7 @@ No [redbook] audio
<year>2002</year>
<publisher>Alchemist</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-47101M, T-47102M"/>
<info name="release" value="20020926"/>
@@ -18923,7 +18964,8 @@ Built on Windows CE, requires [MMU] support
<year>2001</year>
<publisher>Success</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+Black screen
]]></notes>
<info name="serial" value="T-9905M"/>
<info name="release" value="20010426"/>
@@ -18948,7 +18990,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2002</year>
<publisher>Success</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+Black screen
]]></notes>
<info name="serial" value="T-9906M"/>
<info name="release" value="20021128"/>
@@ -19229,6 +19272,10 @@ Hangs after (skipped) FMV, keeps stuck at 0% on loading
<description>Legacy of Kain: Soul Reaver (USA)</description>
<year>2000</year>
<publisher>Eidos Interactive</publisher>
+ <notes><![CDATA[
+Heavy [PVR] texture issues
+Crashes after FMV on few seconds of (broken) GFXs [drc]
+]]></notes>
<info name="serial" value="T-36802N"/>
<part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
@@ -19840,6 +19887,10 @@ Hangs after (skipped) FMV, keeps stuck at 0% on loading
<description>Maken X (USA)</description>
<year>1999</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+[PVR] missing backface culling during new game intro
+[PVR] texture warps during gameplay
+]]></notes>
<info name="serial" value="51050"/>
<info name="release" value="19991031"/>
<part interface="cdrom" name="cdrom">
@@ -20808,7 +20859,7 @@ Built on Windows CE, requires [MMU] support
<year>2002</year>
<publisher>FOG</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-36702M"/>
<info name="release" value="20020117"/>
@@ -20831,7 +20882,7 @@ Punts to BIOS at start of loading [GDROM]
<year>2002</year>
<publisher>FOG</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="T-36703M"/>
<info name="release" value="20021024"/>
@@ -20874,7 +20925,8 @@ Punts to BIOS at start of loading [GDROM]
<year>2002</year>
<publisher>NEC Interchannel</publisher>
<notes><![CDATA[
-Punts to BIOS at start of loading [GDROM]
+Punts to BIOS at start of loading [GDROM READY] (fixed)
+[PVR] ugly fade-ins/-outs effects
]]></notes>
<info name="serial" value="T-20114M"/>
<info name="release" value="20020307"/>
@@ -21054,7 +21106,7 @@ Punts to BIOS at start of loading [GDROM]
<publisher>Ubisoft</publisher>
<notes><![CDATA[
Wrong [PVR] texture renders in gameplay
-No [redbook] audio
+Has [redbook] audio
]]></notes>
<info name="serial" value="T-17701M"/>
<info name="release" value="19990311"/>
@@ -21502,7 +21554,7 @@ Built on Windows CE, requires [MMU] support
<year>2000</year>
<publisher>Sega</publisher>
<notes><![CDATA[
-Crashes at "Produced by Sega", PC=C010094
+Crashes at "Produced by Sega" [GDROM READY] (fixed)
]]></notes>
<info name="serial" value="HDR-0092"/>
<info name="release" value="20000928"/>
@@ -21584,6 +21636,9 @@ Crashes at "Produced by Sega", PC=C010094
<description>Mr. Driller (USA)</description>
<year>2000</year>
<publisher>Namco</publisher>
+ <notes><![CDATA[
+Has [redbook] audio
+]]></notes>
<info name="serial" value="T-1402N"/>
<info name="release" value="20000625"/>
<part interface="cdrom" name="cdrom">
@@ -23939,7 +23994,7 @@ cfr. https://github.com/mamedev/mame/issues/9106 for more info.
<publisher>Sega</publisher>
<notes><![CDATA[
Check-GD program
-Stuck with a Sega copyright printed on screen
+Stuck with "Please Connect PAD Port A" [Maple]
]]></notes>
<!--<info name="serial" value="DCFD01"/>-->
<info name="serial" value="HKT-999999"/>
diff --git a/src/devices/bus/ata/gdrom.cpp b/src/devices/bus/ata/gdrom.cpp
index 135cbcb66b4..a362bf5cb18 100644
--- a/src/devices/bus/ata/gdrom.cpp
+++ b/src/devices/bus/ata/gdrom.cpp
@@ -8,18 +8,25 @@
#include "emu.h"
#include "gdrom.h"
+#include "coreutil.h"
+
+#include <iostream>
#define LOG_WARN (1U << 1)
#define LOG_CMD (1U << 2)
-#define LOG_XFER (1U << 3)
+#define LOG_CMD_RAW (1U << 3) // bare command IDs (temp until all commands are in)
+#define LOG_XFER (1U << 4)
+#define LOG_TOC (1U << 5) // TOC frame offsets
-#define VERBOSE (LOG_WARN | LOG_CMD)
+#define VERBOSE (LOG_GENERAL | LOG_WARN | LOG_CMD | LOG_TOC)
//#define LOG_OUTPUT_STREAM std::cout
#include "logmacro.h"
#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
#define LOGCMD(...) LOGMASKED(LOG_CMD, __VA_ARGS__)
+#define LOGCMDRAW(...) LOGMASKED(LOG_CMD_RAW, __VA_ARGS__)
#define LOGXFER(...) LOGMASKED(LOG_XFER, __VA_ARGS__)
+#define LOGTOC(...) LOGMASKED(LOG_TOC, __VA_ARGS__)
#define GDROM_BUSY_STATE 0x00
#define GDROM_PAUSE_STATE 0x01
@@ -32,6 +39,8 @@
#define GDROM_RETRY_STATE 0x08
#define GDROM_ERROR_STATE 0x09
+// CD status readback/subchannel Q
+#define LIVE_REQ_STAT 0
/*
Officially not documented security-related packet commands:
@@ -161,6 +170,8 @@ void gdrom_device::device_reset()
GDROM_Cmd11_Reply[i] = GDROM_Def_Cmd11_Reply[i];
atapi_cdrom_device::device_reset();
+
+ m_cdda->set_cdrom(m_image);
}
// scsicd_exec_command
@@ -169,29 +180,201 @@ void gdrom_device::device_reset()
void gdrom_device::ExecCommand()
{
+ LOGCMDRAW("%02x\n", command[0]);
switch ( command[0] )
{
- case 0x11: // REQ_MODE
+ case 0x00:
+ // TEST_UNIT
+ // TODO: verify if t10mmc use is enough
+ // loopchk returns OK in Packet cmnd (0201)
+ t10mmc::ExecCommand();
+ break;
+
+ case 0x10:
+ {
+ transferOffset = command[2];
+ u8 allocation_length = SCSILengthFromUINT8( &command[ 4 ] );
+ // any game that enables [redbook]
+ LOGCMD("REQ_STAT 10h offset %02x length %02x\n", transferOffset, allocation_length);
+
+ if (transferOffset || allocation_length != 0xa)
+ throw emu_fatalerror("GDROM: REQ_STAT with unsupported offset %02x length %02x", transferOffset, allocation_length);
+
m_phase = SCSI_PHASE_DATAIN;
m_status_code = SCSI_STATUS_CODE_GOOD;
- LOGCMD("REQ_MODE %02x %02x %02x %02x %02x %02x\n",
- command[0], command[1],
- command[2], command[3],
- command[4], command[5]
- );
+ m_transfer_length = allocation_length;
+ break;
+ }
+
+ case 0x11:
+ LOGCMD("REQ_MODE 11h %02x %02x\n", command[2], command[4]);
+ m_phase = SCSI_PHASE_DATAIN;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+
// if (SCSILengthFromUINT8( &command[ 4 ] ) < 32) return -1;
transferOffset = command[2];
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
+ if (transferOffset & 1)
+ throw emu_fatalerror("GDROM: REQ_MODE with odd offset %02x %02x", transferOffset, m_transfer_length);
break;
case 0x12: // SET_MODE
+ LOGCMD("SET_MODE 12h %02x %02x\n", command[2], command[4]);
+
m_phase = SCSI_PHASE_DATAOUT;
m_status_code = SCSI_STATUS_CODE_GOOD;
//transferOffset = command[2];
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
- LOGCMD("SET_MODE %02x %02x\n", command[2], command[4]);
+ if (command[2])
+ throw emu_fatalerror("GDROM: SET_MODE with offset %02x %02x", transferOffset, m_transfer_length);
+
+ if (m_transfer_length > 0xa)
+ {
+ LOGWARN("SET_MODE attempt to write on read only regs %02x\n", command[4]);
+ m_transfer_length = 0xa;
+ }
break;
+ case 0x14:
+ {
+ if (!m_image->exists())
+ {
+ m_phase = SCSI_PHASE_STATUS;
+ m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION;
+ m_transfer_length = 0;
+ break;
+ }
+
+ // TODO: it's supposed to write a single and a double density TOC request
+ //if (command[1])
+ // throw emu_fatalerror("Double density unsupported");
+ u16 allocation_length = SCSILengthFromUINT16( &command[ 3 ] );
+ LOGCMD("READ_TOC 14h %02x %02x %d\n",
+ command[1], command[2], allocation_length
+ );
+
+ if (allocation_length != 408)
+ throw emu_fatalerror("TOC with allocation length != 408 (%d)", allocation_length);
+
+ if (m_cdda != nullptr)
+ {
+ m_cdda->stop_audio();
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_STANDBY_STATE;
+ }
+
+ m_phase = SCSI_PHASE_DATAIN;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = allocation_length;
+ break;
+ }
+
+ // accessed for audio CDs
+ // TODO: needed for Mil CD support
+ case 0x15:
+ {
+ m_phase = SCSI_PHASE_DATAIN;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
+ LOGCMD("REQ_SES 15h %02x %02x\n", command[2], m_transfer_length);
+ break;
+ }
+
+ case 0x20: // CD_PLAY
+ {
+ if (!m_image->exists())
+ {
+ m_phase = SCSI_PHASE_STATUS;
+ m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION;
+ m_transfer_length = 0;
+ break;
+ }
+
+ const u32 start_offs = (command[2]<<16 | command[3]<<8 | command[4]);
+ const u32 end_offs = (command[8]<<16 | command[9]<<8 | command[10]);
+ //(command[8] % 75) + ((command[7] * 75) % (60*75)) + (command[6] * (75*60)) - m_lba;
+
+ const u8 play_mode = command[1] & 7;
+
+ auto trk = m_image->get_track(start_offs);
+ const u8 repeat = command[6] & 0xf;
+ LOGCMD("CD_PLAY 20h track %d FAD %d blocks %d type %02x repeat %01x\n"
+ , trk + 1
+ , start_offs
+ , end_offs - start_offs
+ , play_mode
+ , repeat
+ );
+
+ if (play_mode == 7 && m_audio_sense == SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_PAUSED)
+ {
+ m_cdda->pause_audio(0);
+ m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS;
+ LOGCMD("\tPlayback resume\n");
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_PLAY_STATE;
+ }
+ else if (m_image->get_track_type(trk) == cdrom_file::CD_TRACK_AUDIO && end_offs > start_offs)
+ {
+ // TODO: check end > start assertion
+ m_cd_status.cdda_fad = start_offs - 150;
+ m_cd_status.cdda_blocks = (end_offs - start_offs);
+
+ m_cdda->start_audio(m_cd_status.cdda_fad, m_cd_status.cdda_blocks);
+ m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS;
+ m_cd_status.repeat_current = 0;
+ m_cd_status.repeat_count = repeat;
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_PLAY_STATE;
+
+ LOGCMD("\tPlayback started\n");
+ }
+ else
+ {
+ LOGWARN("track is NOT audio!\n");
+ set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK);
+ // TODO: unconfirmed state
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_ERROR_STATE;
+ return;
+ }
+
+ m_phase = SCSI_PHASE_STATUS;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = 0;
+ break;
+ }
+
+ case 0x21:
+ {
+ if (!m_image->exists())
+ {
+ m_phase = SCSI_PHASE_STATUS;
+ m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION;
+ m_transfer_length = 0;
+ break;
+ }
+
+ const u32 start_seek = (command[2]<<16 | command[3]<<8 | command[4]);
+ const u8 seek_mode = command[1] & 0xf;
+ LOGCMD("CD_SEEK 21h FAD %d type %02x\n", start_seek + 150, seek_mode);
+ switch(seek_mode)
+ {
+ // TODO: implement SEEK & standby
+ // 1 FAD seek
+ // 2 MSF seek
+ // 3 stop audio, go to Home FAD
+ case 4:
+ // 4 pause audio
+ LOGCMD("\tPlayback paused\n");
+ m_cdda->pause_audio(1);
+ m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_PAUSED;
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_PAUSE_STATE;
+ break;
+ }
+
+ m_phase = SCSI_PHASE_STATUS;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = 0;
+ break;
+ }
+
case 0x30: // CD_READ
if (command[1] & 1)
{
@@ -204,9 +387,11 @@ void gdrom_device::ExecCommand()
m_blocks = command[8]<<16 | command[9]<<8 | command[10];
read_type = (command[1] >> 1) & 7;
- data_select = (command[1]>>4) & 0xf;
+ data_select = (command[1] >> 4) & 0xf;
+ //m_status |= IDE_STATUS_DSC;
- if (read_type != 2) // mode 1
+ // TODO: any other value is a non-Mode 1 attempt basically
+ if (read_type != 0 && read_type != 2)
{
throw emu_fatalerror("GDROM: Unhandled read_type %d", read_type);
}
@@ -217,7 +402,7 @@ void gdrom_device::ExecCommand()
}
// LBA 45000 is start of double density GD-ROM
- LOGCMD("CD_READ %02x %02x\n", command[2], command[4]);
+ LOGCMD("CD_READ 30h %02x %02x\n", command[2], command[4]);
LOGCMD(" LBA %d (%x) for %d blocks (%d bytes, read type %d, data select %d)\n",
m_lba + 150, m_lba, m_blocks,
m_blocks * m_sector_bytes, read_type, data_select
@@ -236,6 +421,8 @@ void gdrom_device::ExecCommand()
if (m_cdda != nullptr)
{
m_cdda->stop_audio();
+ m_audio_sense = SCSI_SENSE_ASC_ASCQ_NO_SENSE;
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_STANDBY_STATE;
}
m_phase = SCSI_PHASE_DATAIN;
@@ -244,54 +431,32 @@ void gdrom_device::ExecCommand()
}
break;
- // READ TOC (GD-ROM ver.)
- case 0x14:
+ case 0x40:
{
- if (!m_image->exists())
- {
- m_phase = SCSI_PHASE_STATUS;
- m_status_code = SCSI_STATUS_CODE_CHECK_CONDITION;
- m_transfer_length = 0;
- break;
- }
-
- // TODO: is this correct?
- int start_trk = command[2];
- int end_trk = m_image->get_last_track();
- int length;
- int allocation_length = SCSILengthFromUINT16( &command[ 3 ] );
-
- if( start_trk == 0 )
- {
- start_trk = 1;
- }
- if( start_trk == 0xaa )
- {
- end_trk = start_trk;
- }
-
- length = 4 + ( 8 * ( ( end_trk - start_trk ) + 1 ) );
- if( length > allocation_length )
- {
- length = allocation_length;
- }
- else if( length < 4 )
- {
- length = 4;
- }
+ m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
+ //LOGCMD("CD_SCD 40h %02x %d\n", command[1] & 0xf, m_transfer_length);
- if (m_cdda != nullptr)
+ switch(command[1] & 0xf)
{
- m_cdda->stop_audio();
+ case 0x00:
+ m_phase = SCSI_PHASE_DATAIN;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
+ break;
+ case 0x01:
+ m_phase = SCSI_PHASE_DATAIN;
+ m_status_code = SCSI_STATUS_CODE_GOOD;
+ m_transfer_length = 0xe;
+ break;
+ default:
+ LOGWARN("command 0x40: unhandled subchannel request\n");
+ break;
}
-
- m_phase = SCSI_PHASE_DATAIN;
- m_status_code = SCSI_STATUS_CODE_GOOD;
- m_transfer_length = length;
break;
}
- case 0x70: // security check, return no data, always followed by cmd 0x71, command[1] parameter can be 0x1f or 0x9f
+ // security check, return no data, always followed by cmd 0x71, command[1] parameter can be 0x1f or 0x9f
+ case 0x70:
m_phase = SCSI_PHASE_STATUS;
m_status_code = SCSI_STATUS_CODE_GOOD;
m_transfer_length = 0;
@@ -303,22 +468,16 @@ void gdrom_device::ExecCommand()
m_transfer_length = sizeof(GDROM_Cmd71_Reply);
break;
- case 0x40:
- if(command[1] & 0xf)
- {
- m_phase = SCSI_PHASE_DATAIN;
- m_status_code = SCSI_STATUS_CODE_GOOD;
- m_transfer_length = 0xe;
- }
- else
- {
- LOGWARN("command 0x40: unhandled subchannel request\n");
- }
- break;
+ // case 0x22: CD_SCAN
+ // case 0x31: CD_READ2
+ // case 0x13: REQ_ERROR
+ // case 0x16: CD_OPEN [Tray]
+
+ // case 0x08: ??? loopchk uses it in one of the Packet cmnd tests
+ // (check for unsupported command?)
default:
- t10mmc::ExecCommand();
- break;
+ throw emu_fatalerror("GDROM: unhandled command %02x", command[0]);
}
}
@@ -333,14 +492,152 @@ void gdrom_device::ReadData( uint8_t *data, int dataLength )
switch ( command[0] )
{
+ case 0x10: // REQ_STAT
+ {
+ data[0] = m_sector_number & 0xf; // CD status
+ data[1] = (m_sector_number & 0xf0) | (m_cd_status.repeat_current & 0xf);
+ auto fad = m_cdda->get_audio_lba();
+ auto trk = m_image->get_track(fad);
+ data[2] = m_image->get_adr_control(trk - 1);
+ data[3] = trk;
+ // TODO: index
+ data[4] = 1;
+ // FAD, in binary format
+ data[5] = (fad >> 16) & 0xff;
+ data[6] = (fad >> 8) & 0xff;
+ data[7] = fad & 0xff;
+ // Max Read Error Retry Times
+ data[8] = 0;
+ // <reserved>
+ data[9] = 0;
+ if (LIVE_REQ_STAT)
+ {
+ popmessage("REQ_STAT STATUS %02x track %d index %d adr %02x fad %06d"
+ , m_sector_number
+ , data[3]
+ , data[4]
+ , data[2]
+ , fad
+ );
+ }
+ break;
+ }
+
case 0x11: // REQ_MODE
- LOGCMD("REQ_MODE dataLength %d\n", dataLength);
+ //LOGCMD("REQ_MODE dataLength %d\n", dataLength);
memcpy(data, &GDROM_Cmd11_Reply[transferOffset], (dataLength >= 32-transferOffset) ? 32-transferOffset : dataLength);
+ // TODO: reading this while playing a redbook likely hardwires CD speed to 75 Hz
+ //data[1] = 0x01;
+ break;
+
+ case 0x13: // REQ_ERROR
+ // cfr. Appendix I for possible error types
+ data[0] = 0xf0; // fixed?
+ data[1] = 0;
+ data[2] = 6; // Sense Key
+ data[3] = 0;
+ // 4-7 "specific command details" (?) or FAD
+ data[4] = 0;
+ data[5] = 0;
+ data[6] = 0;
+ data[7] = 0;
+ data[8] = 0x29; // ASC
+ data[9] = 0; // ASCQ
+ break;
+
+ case 0x14: // READ TOC (GD-ROM ver.)
+ /*
+ Track numbers are problematic here: 0 = lead-in, 0xaa = lead-out.
+ That makes sense in terms of how real-world CDs are referred to, but
+ our internal routines for tracks use "0" as track 1. That probably
+ should be fixed...
+ */
+ LOGCMD("READ_TOC format %d time %d\n",
+ command[2] & 0xf, (command[1] >> 1) & 1
+ );
+ switch (command[2] & 0x0f)
+ {
+ case 0: // normal
+ {
+ int start_trk = 1;
+ int end_trk = m_image->get_last_track();
+ int len = 408;
+ //int in_len;
+ int dptr = 0;
+ uint32_t tstart;
+
+ // Non-standard, doesn't want in_len readback
+ //dptr = 0;
+ //data[dptr++] = (len>>8) & 0xff;
+ //data[dptr++] = (len & 0xff);
+
+ // pre-fill with 0xffs, audio CD player counts number of tracks by checking the
+ // first EOF it encounters (and don't care about the 396-407 dataset below)
+ memset(data, 0xff, len);
+ dptr = 0;
+ LOGTOC("TOC: Start track %d end track %d\n", start_trk, end_trk);
+ for (i = start_trk; i <= end_trk; i++)
+ {
+ u8 adr = m_image->get_adr_control(i - 1) | 1;
+ data[dptr++] = adr;
+
+ tstart = m_image->get_track_start(i - 1) + 150;
+ //if ((command[1]&2)>>1)
+ // tstart = cdrom_file::lba_to_msf(tstart);
+ data[dptr++] = (tstart>>16) & 0xff;
+ data[dptr++] = (tstart>>8) & 0xff;
+ data[dptr++] = (tstart & 0xff);
+ LOGTOC("\t%d: FAD %d %02x\n", i, tstart, adr);
+ }
+
+ dptr = 396;
+ data[dptr++] = m_image->get_adr_control(0) | 1;
+ data[dptr++] = start_trk;
+ data[dptr++] = 0;
+ data[dptr++] = 0;
+ data[dptr++] = m_image->get_adr_control(end_trk) | 1;
+ data[dptr++] = end_trk;
+ data[dptr++] = 0;
+ data[dptr++] = 0;
+ const u32 tend = m_image->get_track_start(0xaa) + 150;
+ //if ((command[1]&2)>>1)
+ // tstart = cdrom_file::lba_to_msf(tstart);
+ data[dptr++] = m_image->get_adr_control(0xaa) | 1;
+ data[dptr++] = (tend>>16) & 0xff;
+ data[dptr++] = (tend>>8) & 0xff;
+ data[dptr++] = (tend & 0xff);
+ LOGTOC("\t0xaa: FAD %d\n", tstart);
+ break;
+ }
+ default:
+ LOGWARN("Unhandled READ_TOC format %d\n", command[2]&0xf);
+ break;
+ }
break;
+ case 0x15:
+ {
+ // REQ_SES
+ data[0] = m_sector_number & 0xf; // CD status, stripped by type?
+ data[1] = 0; // <reserved>, zeroed
+ data[2] = 1; // number of sessions
+
+ const u8 session_num = command[2] & 0xff;
+ u32 fad;
+ if (session_num == 0)
+ fad = m_image->get_track_start(0xaa) + 150;
+ else
+ fad = m_image->get_track_start(0) + 150;
+ LOGTOC("SESSION %d: %06d\n", session_num, fad);
+ data[3] = (fad >> 16) & 0xff;
+ data[4] = (fad >> 8) & 0xff;
+ data[5] = fad & 0xff;
+ break;
+ }
+
case 0x30: // CD_READ
- LOGCMD("CD_READ read %x dataLength,\n", dataLength);
- if (m_image->exists() && m_blocks)
+ LOGXFER("CD_READ read %x dataLength,\n", dataLength);
+ if ((m_image->exists()) && (m_blocks))
{
while (dataLength > 0)
{
@@ -370,82 +667,71 @@ void gdrom_device::ReadData( uint8_t *data, int dataLength )
}
break;
- case 0x14: // READ TOC (GD-ROM ver.)
- /*
- Track numbers are problematic here: 0 = lead-in, 0xaa = lead-out.
- That makes sense in terms of how real-world CDs are referred to, but
- our internal routines for tracks use "0" as track 1. That probably
- should be fixed...
- */
- LOGCMD("READ TOC format = %d time=%d\n",
- command[2] & 0xf, (command[1] >> 1) & 1
- );
+ case 0x40: // Get Subchannel status
switch (command[2] & 0x0f)
{
- case 0: // normal
+ case 0: // Subcode P-W
{
- int start_trk;
- int end_trk;
- int len;
- int in_len;
- int dptr;
- uint32_t tstart;
-
- start_trk = command[2];
- if( start_trk == 0 )
- {
- start_trk = 1;
- }
-
- end_trk = m_image->get_last_track();
- len = (end_trk * 8) + 2;
-
- // the returned TOC DATA LENGTH must be the full amount,
- // regardless of how much we're able to pass back due to in_len
- dptr = 0;
- data[dptr++] = (len>>8) & 0xff;
- data[dptr++] = (len & 0xff);
- data[dptr++] = 1;
- data[dptr++] = end_trk;
-
- if( start_trk == 0xaa )
+ data[0] = 0; // Reserved
+ data[1] = m_audio_sense;
+ data[2] = 0;
+ data[3] = m_transfer_length; // header size
+ auto fad = m_cdda->get_audio_lba();
+ if (!m_image->read_subcode( fad, &data[4 + m_transfer_length]))
{
- end_trk = 0xaa;
- }
-
- in_len = command[3]<<8 | command[4];
-
- for (i = start_trk; i <= end_trk; i++)
- {
- int cdrom_track = i;
- if( cdrom_track != 0xaa )
- {
- cdrom_track--;
- }
-
- if( dptr >= in_len )
+ // attempt to provide Q channel
+ // TODO: audio CD player definitely reads here but never updates GFXs?
+ u8 subqbuf[12]{};
+ const u32 msf_abs = cdrom_file::lba_to_msf_alt( fad );
+ const auto trk = m_image->get_track( fad );
+ const u32 msf_rel = cdrom_file::lba_to_msf_alt( fad - m_image->get_track_start( trk ) );
+
+ subqbuf[0] = 0x01 | ((m_image->get_track_type(m_image->get_track(trk + 1)) == cdrom_file::CD_TRACK_AUDIO) ? 0x00 : 0x40);
+ subqbuf[1] = dec_2_bcd(trk + 1);
+ subqbuf[2] = 1;
+ subqbuf[3] = dec_2_bcd((msf_rel >> 16) & 0xff);
+ subqbuf[4] = dec_2_bcd((msf_rel >> 8) & 0xff);
+ subqbuf[5] = dec_2_bcd((msf_rel >> 0) & 0xff);
+ subqbuf[6] = 0;
+ subqbuf[7] = dec_2_bcd((msf_abs >> 16) & 0xff);
+ subqbuf[8] = dec_2_bcd((msf_abs >> 8) & 0xff);
+ subqbuf[9] = dec_2_bcd((msf_abs >> 0) & 0xff);
+ subqbuf[10] = 0xff; //machine().rand(); // CRC
+ subqbuf[11] = 0xff; //machine().rand();
+
+ if (LIVE_REQ_STAT)
{
- break;
+ popmessage("Qchan STATUS %02x TRACK %d ABS %02x:%02x:%02x REL %02x:%02x:%02x"
+ , subqbuf[0]
+ , subqbuf[1]
+ , subqbuf[7], subqbuf[8], subqbuf[9]
+ , subqbuf[3], subqbuf[4], subqbuf[5]
+ );
}
- data[dptr++] = 0;
- data[dptr++] = m_image->get_adr_control(cdrom_track);
- data[dptr++] = i;
- data[dptr++] = 0;
-
- tstart = m_image->get_track_start(cdrom_track);
- if ((command[1]&2)>>1)
- tstart = cdrom_file::lba_to_msf(tstart);
- data[dptr++] = (tstart>>24) & 0xff;
- data[dptr++] = (tstart>>16) & 0xff;
- data[dptr++] = (tstart>>8) & 0xff;
- data[dptr++] = (tstart & 0xff);
+ for (int i = 0; i < m_transfer_length - 4; i++)
+ data[i + 4] = BIT(subqbuf[i >> 3], 7 - (i & 7)) ? 0x40 : 0x00;
}
break;
}
- default:
- LOGWARN("Unhandled READ TOC format %d\n", command[2]&0xf);
+ case 1: // Subcode Q
+ // TODO: unread by audio CD player (?)
+ LOGWARN("CD_SCD: unhandled Subcode Q path\n");
+ data[0] = 0; // Reserved
+ data[1] = m_audio_sense;
+ data[2] = 0;
+ data[3] = m_transfer_length; // header size
+ data[4] = 0; // ADR
+ data[5] = 1; // Track Number
+ data[6] = 1; // index #1
+ data[7] = 0; // ?
+ data[8] = 0; // ?
+ data[9] = 0; // elapsed FAD
+ data[0xa] = 0; // <reserved>, zeroed
+ data[0xb] = 0; // FAD >> 16
+ data[0xc] = 0; // FAD >> 8
+ data[0xd] = 0x96; // FAD >> 0
break;
}
break;
@@ -457,23 +743,6 @@ void gdrom_device::ReadData( uint8_t *data, int dataLength )
data[10] = 0x1f; // needed by dimm board firmware
break;
- case 0x40: // Get Subchannel status
- data[0] = 0; // Reserved
- data[1] = 0x15; // Audio Playback status (todo)
- data[2] = 0;
- data[3] = 0x0e; // header size
- data[4] = 0; // ?
- data[5] = 1; // Track Number
- data[6] = 1; // gap #1
- data[7] = 0; // ?
- data[8] = 0; // ?
- data[9] = 0; // ?
- data[0xa] = 0; // ?
- data[0xb] = 0; // FAD >> 16
- data[0xc] = 0; // FAD >> 8
- data[0xd] = 0x96; // FAD >> 0
- break;
-
default:
t10mmc::ReadData( data, dataLength );
break;
@@ -490,6 +759,22 @@ void gdrom_device::WriteData( uint8_t *data, int dataLength )
{
case 0x12: // SET_MODE
memcpy(&GDROM_Cmd11_Reply[transferOffset], data, (dataLength >= 32-transferOffset) ? 32-transferOffset : dataLength);
+ if (data[2] != 0 && data[2] != 7)
+ throw emu_fatalerror("GDROM: Unsupported CD speed setting %02x\n", data[2]);
+ // ---- -000 Max speed (x12)
+ // ---- -xxx [x1 (75 Hz), x2, x4, x6, x8, x10, x12]
+ LOGCMD("\tCD speed: %02x\n", data[2]);
+ // Standby Time:
+ // - 0 = no standby
+ // any other value = number of seconds for pause -> standby transition
+ LOGCMD("\tStandby Time: %02x%02x\n", data[4], data[5]);
+
+ LOGCMD("\tRead Continous: %s\n", BIT(data[6], 5) ? "enable" : "disable");
+ LOGCMD("\tECC: %s\n", BIT(data[6], 4) ? "enable" : "disable");
+ LOGCMD("\tRead Retry: %s\n", BIT(data[6], 3) ? "enable" : "disable");
+ LOGCMD("\tForm 2 Read Retry: %s\n", BIT(data[6], 0) ? "enable" : "disable");
+
+ LOGCMD("\tRead Retry Times %d\n", data[9]);
break;
default:
@@ -519,31 +804,33 @@ void gdrom_device::device_start()
m_identify_buffer[0] = 0x8600; // ATAPI device, cmd set 6 compliant, DRQ within 3 ms of PACKET command
- m_identify_buffer[23] = ('S' << 8) | 'E';
- m_identify_buffer[24] = (' ' << 8) | ' ';
- m_identify_buffer[25] = (' ' << 8) | ' ';
- m_identify_buffer[26] = (' ' << 8) | ' ';
-
- m_identify_buffer[27] = ('C' << 8) | 'D';
- m_identify_buffer[28] = ('-' << 8) | 'R';
- m_identify_buffer[29] = ('O' << 8) | 'M';
- m_identify_buffer[30] = (' ' << 8) | 'D';
- m_identify_buffer[31] = ('R' << 8) | 'I';
- m_identify_buffer[32] = ('V' << 8) | 'E';
- m_identify_buffer[33] = (' ' << 8) | ' ';
- m_identify_buffer[34] = (' ' << 8) | ' ';
- m_identify_buffer[35] = ('6' << 8) | '.';
- m_identify_buffer[36] = ('4' << 8) | '2';
- m_identify_buffer[37] = (' ' << 8) | ' ';
- m_identify_buffer[38] = (' ' << 8) | ' ';
- m_identify_buffer[39] = (' ' << 8) | ' ';
- m_identify_buffer[40] = (' ' << 8) | ' ';
- m_identify_buffer[41] = (' ' << 8) | ' ';
- m_identify_buffer[42] = (' ' << 8) | ' ';
- m_identify_buffer[43] = (' ' << 8) | ' ';
- m_identify_buffer[44] = (' ' << 8) | ' ';
- m_identify_buffer[45] = (' ' << 8) | ' ';
- m_identify_buffer[46] = (' ' << 8) | ' ';
+ // non-standard identify returns
+ // TODO: should be centralized in command 11h
+ // loopchk: identify device Maker test (0104) PC=c04694a
+ // Was 23
+ int dptr = 8;
+ m_identify_buffer[dptr++] = 'S' | ('E' << 8);
+ m_identify_buffer[dptr++] = ' ' | (' ' << 8);
+ m_identify_buffer[dptr++] = ' ' | (' ' << 8);
+ m_identify_buffer[dptr++] = ' ' | (' ' << 8);
+
+ // loopchk: identify device Model test (0104) PC=c046acc
+ // Was 27
+ dptr = 16;
+ m_identify_buffer[dptr++] = 'C' | ('D' << 8);
+ m_identify_buffer[dptr++] = '-' | ('R' << 8);
+ m_identify_buffer[dptr++] = 'O' | ('M' << 8);
+ m_identify_buffer[dptr++] = ' ' | ('D' << 8);
+ m_identify_buffer[dptr++] = 'R' | ('I' << 8);
+ m_identify_buffer[dptr++] = 'V' | ('E' << 8);
+ m_identify_buffer[dptr++] = ' ' | (' ' << 8);
+ m_identify_buffer[dptr++] = ' ' | (' ' << 8);
+ // TODO: versioning is unchecked by loopchk
+ m_identify_buffer[dptr++] = '6' | ('.' << 8);
+ m_identify_buffer[dptr++] = '4' | ('2' << 8);
+ // FIXME: doc mentions a "System Date" readback
+ for (; dptr < 47; dptr ++)
+ m_identify_buffer[dptr] = ' ' | (' ' << 8);
m_identify_buffer[49] = 0x0400; // IORDY may be disabled
@@ -555,14 +842,57 @@ void gdrom_device::process_buffer()
{
atapi_hle_device::process_buffer();
// HACK: find out when this should be updated
- m_sector_number = 0x80 | GDROM_PAUSE_STATE;
+ // TODO: upper byte is CD type detection
+ // 0000 CD-DA
+ // 0001 CD-ROM
+ // 0010 CD-ROM XA / CD Extra
+ // 0011 CD-I
+ // 1000 GD-ROM
+ const u8 cd_type = m_image->is_gd() ? 0x80 : 0x00;
+ m_sector_number = cd_type | (m_image->exists() ? m_sector_number & 0xf : GDROM_NODISC_STATE);
}
void gdrom_device::signature()
{
atapi_hle_device::signature();
+ const u8 cd_type = m_image->is_gd() ? 0x80 : 0x00;
+
// naomi dimm board firmware needs the upper nibble to be 8 at the beginning
- if (m_image->is_gd())
- m_sector_number = 0x81;
+ m_sector_number = cd_type | (m_image->exists() ? m_sector_number & 0xf : GDROM_NODISC_STATE);
+}
+
+//bool gdrom_device::set_features()
+//{
+ // TODO: DSC, likely tested by Check-GD programs
+// m_status |= IDE_STATUS_DSC;
+// return atapi_cdrom_device::set_features();
+//}
+
+WRITE_LINE_MEMBER(gdrom_device::cdda_end_mark_cb)
+{
+ if (state != ASSERT_LINE)
+ return;
+
+ m_cd_status.repeat_current ++;
+ m_cd_status.repeat_current &= 0xf;
+ LOG("end marker %d %d\n", m_cd_status.repeat_current, m_cd_status.repeat_count);
+
+ // repeat_count = 0xf: infinite, not unlike Saturn CD Block
+ // - ggx sound test track #20 (opening) is a good testing scenario.
+ // - audio cd player don't care about this:
+ // it manually handle repeat modes depending on GD state alone.
+ if (m_cd_status.repeat_current > m_cd_status.repeat_count)
+ {
+ m_cdda->pause_audio(1);
+ m_audio_sense = SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_SUCCESSFULLY_COMPLETED;
+ LOG("\tCompleted\n");
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_PAUSE_STATE;
+ }
+ else
+ {
+ m_cdda->start_audio(m_cd_status.cdda_fad, m_cd_status.cdda_blocks);
+ LOG("\tRestart playback\n");
+ m_sector_number = (m_sector_number & 0xf0) | GDROM_PLAY_STATE;
+ }
}
diff --git a/src/devices/bus/ata/gdrom.h b/src/devices/bus/ata/gdrom.h
index 829186dec62..7467d1dff20 100644
--- a/src/devices/bus/ata/gdrom.h
+++ b/src/devices/bus/ata/gdrom.h
@@ -23,6 +23,7 @@ public:
virtual void ExecCommand() override;
virtual void WriteData( uint8_t *data, int dataLength ) override;
virtual void ReadData( uint8_t *data, int dataLength ) override;
+ DECLARE_WRITE_LINE_MEMBER(cdda_end_mark_cb);
protected:
virtual void process_buffer() override;
@@ -31,12 +32,26 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+// virtual bool set_features() override;
+ // TODO: how GDROM determines ready flag?
+ // cfr. dc.xml [GDROM READY] for a list of SW that wants this on.
+ virtual bool is_ready() override { return true; }
private:
- uint8_t GDROM_Cmd11_Reply[32];
+ uint8_t GDROM_Cmd11_Reply[32]{};
uint32_t read_type = 0; // for command 0x30 only
uint32_t data_select = 0; // for command 0x30 only
uint32_t transferOffset = 0;
+
+ struct cd_status
+ {
+ u8 repeat_count = 0;
+ u8 repeat_current = 0;
+ u32 cdda_fad = 0;
+ u32 cdda_blocks = 0;
+ };
+
+ cd_status m_cd_status;
};
DECLARE_DEVICE_TYPE(ATAPI_GDROM, gdrom_device)
diff --git a/src/devices/sound/aica.cpp b/src/devices/sound/aica.cpp
index a746f80eae0..9be26af8b8d 100644
--- a/src/devices/sound/aica.cpp
+++ b/src/devices/sound/aica.cpp
@@ -91,8 +91,8 @@ static constexpr s32 clip18(int x) { return std::clamp(x, -131072, 131071); }
#define DISDL(slot) ((slot->udata.data[0x24 / 2] >> 0x8) & 0x000F)
#define DIPAN(slot) (MONO() ? 0 : ((slot->udata.data[0x24 / 2] >> 0x0) & 0x001F))
-#define EFSDL(slot) ((m_EFSPAN[slot * 4] >> 8) & 0x000f)
-#define EFPAN(slot) (MONO() ? 0 : ((m_EFSPAN[slot * 4] >> 0) & 0x001f))
+#define EFSDL(slot) ((m_EFSPAN[slot] >> 8) & 0x000f)
+#define EFPAN(slot) (MONO() ? 0 : ((m_EFSPAN[slot] >> 0) & 0x001f))
//Unimplemented
#define Q(slot) ((slot->udata.data[0x28 / 2] >> 0x0) & 0x001F) // (0.75 × register value - 3)
@@ -874,7 +874,7 @@ void aica_device::w16(u32 addr,u16 val)
if (addr <= 0x2044)
{
// printf("%x to EFSxx slot %d (addr %x)\n", val, (addr - 0x2000)/4, addr & 0x7f);
- m_EFSPAN[addr & 0x7f] = val;
+ m_EFSPAN[(addr & 0x7f) >> 2] = val;
}
}
else if (addr < 0x3000)
@@ -976,7 +976,7 @@ u16 aica_device::r16(u32 addr)
{
if (addr <= 0x2044)
{
- v = m_EFSPAN[addr & 0x7f];
+ v = m_EFSPAN[(addr & 0x7f) >> 2];
}
else if (addr < 0x2800)
{
@@ -1300,6 +1300,7 @@ void aica_device::DoMasterSamples(std::vector<read_stream_view> const &inputs, w
}
bufl.put_int(s, smpl * m_LPANTABLE[MVOL() << 0xd], 32768 << SHIFT);
+ // TODO: diverges with SCSP, also wut?
bufr.put_int(s, smpr * m_LPANTABLE[MVOL() << 0xd], 32768 << SHIFT);
}
}
diff --git a/src/mame/sega/dccons.cpp b/src/mame/sega/dccons.cpp
index 9cc26768325..2191f09d22a 100644
--- a/src/mame/sega/dccons.cpp
+++ b/src/mame/sega/dccons.cpp
@@ -19,7 +19,6 @@
25925600 (PAL 480 @ 50.00), 13462800 (PAL 240 @ 50.00)
TODO:
- - RTC error always pops up at start-up, no flash plus bug with ticks (needs rewrite)
- cfr. naomi.cpp header for general DC notes;
- https://github.com/flyinghead/flycast/blob/master/docs/Notable%20game%20bugs.md
For a comprehensive list of issues to be verified;
@@ -27,15 +26,22 @@
- G1 i/f for GD-ROM needs to be converted in device class and hunted for unsupported features;
- VMU;
- Modem;
+ - regtest dc.xml against region setting, find the bad chance that a SW item
+ managed to brick a dcjp and turning into PAL. Notable symptoms:
+ - crzytaxi2j will start with 50Hz/60Hz screen selector;
+ - jojobaj will run in PAL mode;
+
+ Notes:
+ - RTC error pops up at start-up. (btanb)
+ System saves to flash the AICA RTC timestamp and prompt user to change the clock in
+ case that drifts out significantly during boot.
+ Solution is to insert the actual host PC timestamp and have MAME nvram_save on,
+ that will lift the RTC prompt at next boot.
Old TODO (to be rechecked and moved in XML notes):
- Inputs doesn't work most of the time;
- Candy Stripe: fills the log with "ATAPI_FEATURES_FLAG_OVL not supported", black screen
- - Carrier: Jaleco logo uses YUV, but y size is halved?
- Close To: Hangs at FMV
- - F355 Challenge: black screen after Sega logo;
- - Gundam - Side Story 0079: currently hangs at Bandai logo (regression)
- - Idol Janshi wo Tsukucchaou: pixel aspect is way wrong (stretched and offsetted horizontally)
- Power Stone: hangs at Capcom logo;
- Sega GT: no cursor on main menu;
- Tetris 4D: hangs at BPS FMV (bp 0C0B0C4E)
@@ -368,8 +374,9 @@ INPUT_PORTS_END
void dc_cons_state::gdrom_config(device_t *device)
{
cdda_device *cdda = device->subdevice<cdda_device>("cdda");
- cdda->add_route(0, "^^aica", 0.4);
- cdda->add_route(1, "^^aica", 0.4);
+ cdda->audio_end_cb().set(*device, FUNC(gdrom_device::cdda_end_mark_cb));
+ cdda->add_route(0, "^^aica", 1.0);
+ cdda->add_route(1, "^^aica", 1.0);
}
void dc_cons_state::dc_base(machine_config &config)
@@ -659,9 +666,9 @@ ROM_START( dcfish )
ROM_REGION64_LE(0x040000, "dcflash", ROMREGION_ERASEFF)
ROM_LOAD( "fish_flash.bin", 0x020000, 0x020000, CRC(f7f36b7b) SHA1(f49d18de85c519c16d5447ca8ae39b62d1b8e483) ) // VA1 NTSC-JP
- DISK_REGION( "ata:0:gdrom" )
+ DISK_REGION( "ata:0:gdrom:image" )
DISK_IMAGE_READONLY( "fish_life_amazon", 0, SHA1(2cbba727b219bbbeddf551d0f3e80c5f8ecbe21f) ) // HDR-0094
ROM_END
/* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME */
-GAME( 2000, dcfish, 0, dc_fish, dcfish,dc_cons_state, init_dc, ROT0, "Sega", "Fish Life Amazon Playful Edition (Japan)", MACHINE_NOT_WORKING )
+GAME( 2000, dcfish, 0, dc_fish, dcfish,dc_cons_state, init_dc, ROT0, "Sega", "Fish Life Amazon Playful Edition (Japan)", MACHINE_NOT_WORKING ) // requires SH-4 touch screen, crashes on attract mode with DRC
diff --git a/src/mame/sega/dccons_m.cpp b/src/mame/sega/dccons_m.cpp
index 419e7383351..c085f6a4320 100644
--- a/src/mame/sega/dccons_m.cpp
+++ b/src/mame/sega/dccons_m.cpp
@@ -105,6 +105,10 @@ TIMER_CALLBACK_MEMBER(dc_cons_state::atapi_xfer_end )
atapi_xferbase += 2048;
}
+ // TODO: understand when this should go off
+ // (would otherwise cause REQ ERRORs in gdrom_device with current hookup)
+ m_ata->write_dmack(0);
+
// set the next transfer, or a transfer end event.
atapi_timer->adjust(attotime::from_usec(ATAPI_SINGLE_XFER_TIME), atapi_xferlen);
}