Previous 199869 Revisions Next

r21718 Friday 8th March, 2013 at 19:04:41 UTC by Angelo Salese
First pass at improving CD get status command, fixes streamed music in falcom2, Wachenroder, World Cup 98 and probably others
[src/emu/machine]stvcd.c
[src/mame/includes]stv.h

trunk/src/emu/machine/stvcd.c
r21717r21718
118118      cr3 = (get_track_index(cd_curfad)<<8) | (cd_curfad>>16); //index & 0xff00
119119      cr4 = cd_curfad;
120120   }
121   cd_stat |= CD_STAT_PERI;
122121}
123122
124123void saturn_state::cd_exec_command( void )
r21717r21718
137136      case 0x00:
138137         //CDROM_LOG(("%s:CD: Get Status\n", machine().describe_context()))
139138         hirqreg |= CMOK;
140         cr_standard_return(cd_stat);
139         if(status_type == 0)
140            cr_standard_return(cd_stat);
141         else
142         {
143            cr1 = prev_cr1;
144            cr2 = prev_cr2;
145            cr3 = prev_cr3;
146            cr4 = prev_cr4;
147         }
141148         //CDROM_LOG(("   = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4))
142149         break;
143150
r21717r21718
148155         cr2 = 0x0201;
149156         cr3 = 0x0000;
150157         cr4 = 0x0400;
158         status_type = 0;
151159         break;
152160
153161      case 0x02:    // Get TOC
r21717r21718
160168         cr4 = 0;
161169         xferdnum = 0;
162170         hirqreg |= (CMOK|DRDY);
171         status_type = 0;
163172         break;
164173
165174      case 0x03:    // get session info (lower byte = session # to get?)
r21717r21718
196205         }
197206
198207         hirqreg |= (CMOK);
208         status_type = 0;
199209         break;
200210
201211      /* TODO: double check this */
r21717r21718
245255
246256         hirqreg |= (CMOK|ESEL);
247257         cr_standard_return(cd_stat);
258         status_type = 0;
248259         break;
249260
250261      case 0x06:    // end data transfer (TODO: needs to be worked on!)
r21717r21718
319330         hirqreg |= CMOK;
320331
321332         CDROM_LOG(("   = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4))
333         status_type = 0;
322334         break;
323335
324336      case 0x10: // Play Disc.  FAD is in lowest 7 bits of cr1 and all of cr2.
r21717r21718
435447            cdda_maxrepeat = 0;
436448
437449         cdda_repeat_count = 0;
438
450         status_type = 0;
439451         break;
440452
441453      case 0x11: // disc seek
r21717r21718
482494
483495         hirqreg |= CMOK;
484496         cr_standard_return(cd_stat);
497         status_type = 0;
485498         break;
486499
487500      case 0x12: // FFWD / REW
r21717r21718
558571               break;
559572         }
560573         hirqreg |= CMOK|DRDY;
574         status_type = 0;
561575         break;
562576
563577      case 0x30:    // Set CD Device connection
r21717r21718
586600
587601            hirqreg |= (CMOK|ESEL);
588602            cr_standard_return(cd_stat);
603            status_type = 0;
589604         }
590605         break;
591606
r21717r21718
600615         cr3 = lastbuf << 8;
601616         cr4 = 0;
602617         hirqreg |= (CMOK);
618         status_type = 0;
603619         break;
604620
605621      case 0x40:    // Set Filter Range
r21717r21718
617633
618634            hirqreg |= (CMOK|ESEL);
619635            cr_standard_return(cd_stat);
636            status_type = 0;
620637         }
621638         break;
622639
r21717r21718
640657
641658            hirqreg |= (CMOK|ESEL);
642659            cr_standard_return(cd_stat);
660            status_type = 0;
643661         }
644662         break;
645663
r21717r21718
655673            cr4 = (filters[fnum].smval << 8) | (filters[fnum].cival & 0xff);
656674
657675            hirqreg |= (CMOK|ESEL);
676            status_type = 0;
658677         }
659678         break;
660679
r21717r21718
676695            CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine().describe_context(), fnum, mode))
677696            hirqreg |= (CMOK|ESEL);
678697            cr_standard_return(cd_stat);
698            status_type = 0;
679699         }
680700         break;
681701
r21717r21718
689709            cr4 = 0;
690710
691711            hirqreg |= (CMOK|ESEL);
712            status_type = 0;
692713         }
693714         break;
694715
r21717r21718
707728
708729            hirqreg |= (CMOK|ESEL);
709730            cr_standard_return(cd_stat);
731            status_type = 0;
710732         }
711733         break;
712734
r21717r21718
739761
740762            hirqreg |= (CMOK|ESEL);
741763            cr_standard_return(cd_stat);
764            status_type = 0;
742765            return;
743766         }
744767
r21717r21718
795818
796819         hirqreg |= (CMOK|ESEL);
797820         cr_standard_return(cd_stat);
821         status_type = 0;
798822         }
799823         break;
800824
r21717r21718
805829         cr4 = 200;
806830         CDROM_LOG(("CD: Get Buffer Size = %d\n", cr2))
807831         hirqreg |= (CMOK);
832         status_type = 0;
808833         break;
809834
810835      case 0x51:    // get # sectors used in a buffer
r21717r21718
830855            }
831856
832857            hirqreg |= (CMOK|DRDY);
858            status_type = 1;
833859         }
834860         break;
835861
r21717r21718
857883
858884            hirqreg |= (CMOK|ESEL);
859885            cr_standard_return(cd_stat);
886            status_type = 1;
860887         }
861888         break;
862889
r21717r21718
867894         cr3 = 0;
868895         cr4 = 0;
869896         hirqreg |= (CMOK|ESEL);
897         status_type = 1;
870898         break;
871899
872900      case 0x54:    // get sector info
r21717r21718
888916               cr4 = ((partitions[bufnum].blocks[sectoffs]->subm & 0xff) << 8) | (partitions[bufnum].blocks[sectoffs]->cinf & 0xff);
889917               hirqreg |= (CMOK|ESEL);
890918            }
919
920            status_type = 0;
891921         }
892922         break;
893923
r21717r21718
927957         }
928958         hirqreg |= (CMOK|ESEL);
929959         cr_standard_return(cd_stat);
960         status_type = 0;
930961         break;
931962
932963      case 0x61:    // get sector data
r21717r21718
967998            cd_stat |= CD_STAT_TRANS;
968999            cr_standard_return(cd_stat);
9691000            hirqreg |= (CMOK|EHST|DRDY);
1001            status_type = 0;
9701002         }
9711003         break;
9721004
r21717r21718
10191051            cd_stat &= ~CD_STAT_TRANS;
10201052            cr_standard_return(cd_stat);
10211053            hirqreg |= (CMOK|EHST);
1054            status_type = 0;
10221055         }
10231056         break;
10241057
r21717r21718
10611094            cd_stat |= CD_STAT_TRANS;
10621095            cr_standard_return(cd_stat);
10631096            hirqreg |= (CMOK|EHST|DRDY);
1097            status_type = 0;
10641098         }
10651099         break;
10661100
r21717r21718
10991133
11001134         hirqreg |= (CMOK|DRDY);
11011135         cr_standard_return(cd_stat);
1136         status_type = 0;
11021137         break;
11031138
11041139      case 0x65:
r21717r21718
11401175
11411176         hirqreg |= (CMOK|ECPY);
11421177         cr_standard_return(cd_stat);
1178         status_type = 0;
11431179         break;
11441180
11451181
r21717r21718
11511187         cr3 = 0;
11521188         cr4 = 0;
11531189         hirqreg |= (CMOK);
1190         status_type = 0;
11541191         break;
11551192
11561193      case 0x70:    // change directory
r21717r21718
11621199
11631200         read_new_dir(temp);
11641201         cr_standard_return(cd_stat);
1202         status_type = 0;
11651203         break;
11661204
11671205      case 0x71:    // Read directory entry
r21717r21718
11801218
11811219         cr_standard_return(cd_stat);
11821220         hirqreg |= (CMOK|EFLS);
1221         status_type = 0;
11831222         break;
11841223
11851224      case 0x72:    // Get file system scope
r21717r21718
11901229         cr3 = 0x0100;   // report directory held
11911230         cr4 = firstfile;    // first file id
11921231         printf("%04x %04x %04x %04x\n",cr1,cr2,cr3,cr4);
1232         status_type = 0;
11931233         break;
11941234
11951235      case 0x73:    // Get File Info
r21717r21718
12481288            xfercount = 0;
12491289         }
12501290         CDROM_LOG(("   = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4))
1291         status_type = 0;
12511292         break;
12521293
12531294      case 0x74:    // Read File
r21717r21718
12771318         playtype = 1;
12781319
12791320         hirqreg |= (CMOK|EHST);
1280
1321         status_type = 0;
12811322         break;
12821323
12831324      case 0x75:
r21717r21718
12901331         if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN))
12911332            cd_stat = CD_STAT_PAUSE;    // force to pause
12921333         cr_standard_return(cd_stat);
1334         status_type = 0;
12931335         break;
12941336
12951337      case 0xe0:    // appears to be copy protection check.  needs only to return OK.
r21717r21718
13021344         sectorstore = 1;
13031345         hirqreg = 0xfc5;
13041346         cr_standard_return(cd_stat);
1347         status_type = 0;
13051348         break;
13061349
13071350      case 0xe1:    // get disc region
r21717r21718
13141357         cr4 = 0;
13151358         hirqreg |= (CMOK);
13161359//          cr_standard_return(cd_stat);
1360         status_type = 0;
13171361         break;
13181362
13191363      default:
r21717r21718
13221366         hirqreg |= (CMOK);
13231367         break;
13241368   }
1369
1370   prev_cr1 = cr1;
1371   prev_cr2 = cr2;
1372   prev_cr3 = cr3;
1373   prev_cr4 = cr4;
13251374}
13261375
13271376TIMER_DEVICE_CALLBACK_MEMBER( saturn_state::stv_sh1_sim )
trunk/src/mame/includes/stv.h
r21717r21718
621621   int cddevicenum;
622622
623623   UINT16 cr1, cr2, cr3, cr4;
624   UINT16 prev_cr1, prev_cr2, prev_cr3, prev_cr4;
625   UINT8 status_type;
624626   UINT16 hirqmask, hirqreg;
625627   UINT16 cd_stat;
626628   UINT32 cd_curfad;// = 0;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team