trunk/src/emu/machine/stvcd.c
| r20982 | r20983 | |
| 112 | 112 | switch ((cr1 >> 8) & 0xff) |
| 113 | 113 | { |
| 114 | 114 | case 0x00: |
| 115 | | //CDROM_LOG(("%s:CD: Get Status\n", machine.describe_context())) |
| 115 | //CDROM_LOG(("%s:CD: Get Status\n", machine().describe_context())) |
| 116 | 116 | hirqreg |= CMOK; |
| 117 | 117 | cr_standard_return(cd_stat); |
| 118 | 118 | //CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) |
| 119 | 119 | break; |
| 120 | 120 | |
| 121 | 121 | case 0x01: |
| 122 | | CDROM_LOG(("%s:CD: Get Hardware Info\n", machine.describe_context())) |
| 122 | CDROM_LOG(("%s:CD: Get Hardware Info\n", machine().describe_context())) |
| 123 | 123 | hirqreg |= CMOK; |
| 124 | 124 | cr1 = cd_stat; |
| 125 | 125 | cr2 = 0x0201; |
| r20982 | r20983 | |
| 128 | 128 | break; |
| 129 | 129 | |
| 130 | 130 | case 0x02: // Get TOC |
| 131 | | CDROM_LOG(("%s:CD: Get TOC\n", machine.describe_context())) |
| 131 | CDROM_LOG(("%s:CD: Get TOC\n", machine().describe_context())) |
| 132 | 132 | cd_readTOC(); |
| 133 | 133 | cd_stat = CD_STAT_TRANS|CD_STAT_PAUSE; |
| 134 | 134 | cr1 = cd_stat; |
| r20982 | r20983 | |
| 143 | 143 | // bios is interested in returns in cr3 and cr4 |
| 144 | 144 | // cr3 should be data track # |
| 145 | 145 | // cr4 must be > 1 and < 100 or bios gets angry. |
| 146 | | CDROM_LOG(("%s:CD: Get Session Info\n", machine.describe_context())) |
| 146 | CDROM_LOG(("%s:CD: Get Session Info\n", machine().describe_context())) |
| 147 | 147 | cd_readTOC(); |
| 148 | 148 | switch (cr1 & 0xff) |
| 149 | 149 | { |
| r20982 | r20983 | |
| 183 | 183 | // CR1 & 8 = retry reading mode 2 sectors |
| 184 | 184 | // CR1 & 10 = force single-speed |
| 185 | 185 | // CR1 & 80 = no change flag (done by Assault Suit Leynos 2) |
| 186 | | CDROM_LOG(("%s:CD: Initialize CD system\n", machine.describe_context())) |
| 186 | CDROM_LOG(("%s:CD: Initialize CD system\n", machine().describe_context())) |
| 187 | 187 | //if((cr1 & 0x81) == 0x00) //guess TODO: nope, Choice Cuts doesn't like it, it crashes if you try to skip the FMV otherwise. |
| 188 | 188 | { |
| 189 | 189 | if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) |
| r20982 | r20983 | |
| 227 | 227 | case 0x06: // end data transfer (TODO: needs to be worked on!) |
| 228 | 228 | // returns # of bytes transfered (24 bits) in |
| 229 | 229 | // low byte of cr1 (MSB) and cr2 (middle byte, LSB) |
| 230 | | CDROM_LOG(("%s:CD: End data transfer (%d bytes xfer'd)\n", machine.describe_context(), xferdnum)) |
| 230 | CDROM_LOG(("%s:CD: End data transfer (%d bytes xfer'd)\n", machine().describe_context(), xferdnum)) |
| 231 | 231 | |
| 232 | 232 | // clear the "transfer" flag |
| 233 | 233 | cd_stat &= ~CD_STAT_TRANS; |
| r20982 | r20983 | |
| 301 | 301 | UINT32 start_pos,end_pos; |
| 302 | 302 | UINT8 play_mode; |
| 303 | 303 | |
| 304 | | CDROM_LOG(("%s:CD: Play Disc\n", machine.describe_context())) |
| 304 | CDROM_LOG(("%s:CD: Play Disc\n", machine().describe_context())) |
| 305 | 305 | cd_stat = CD_STAT_PLAY; |
| 306 | 306 | |
| 307 | 307 | play_mode = (cr3 >> 8) & 0x7f; |
| r20982 | r20983 | |
| 414 | 414 | break; |
| 415 | 415 | |
| 416 | 416 | case 0x11: // disc seek |
| 417 | | CDROM_LOG(("%s:CD: Disc seek\n", machine.describe_context())) |
| 417 | CDROM_LOG(("%s:CD: Disc seek\n", machine().describe_context())) |
| 418 | 418 | //printf("%08x %08x %08x %08x\n",cr1,cr2,cr3,cr4); |
| 419 | 419 | if (cr1 & 0x80) |
| 420 | 420 | { |
| r20982 | r20983 | |
| 542 | 542 | // get operation |
| 543 | 543 | parm = cr3>>8; |
| 544 | 544 | |
| 545 | | CDROM_LOG(("%s:CD: Set CD Device Connection filter # %x\n", machine.describe_context(), parm)) |
| 545 | CDROM_LOG(("%s:CD: Set CD Device Connection filter # %x\n", machine().describe_context(), parm)) |
| 546 | 546 | |
| 547 | 547 | cddevicenum = parm; |
| 548 | 548 | |
| r20982 | r20983 | |
| 583 | 583 | { |
| 584 | 584 | UINT8 fnum = (cr3>>8)&0xff; |
| 585 | 585 | |
| 586 | | CDROM_LOG(("%s:CD: Set Filter Range\n", machine.describe_context())) |
| 586 | CDROM_LOG(("%s:CD: Set Filter Range\n", machine().describe_context())) |
| 587 | 587 | |
| 588 | 588 | filters[fnum].fad = ((cr1 & 0xff)<<16) | cr2; |
| 589 | 589 | filters[fnum].range = ((cr3 & 0xff)<<16) | cr4; |
| r20982 | r20983 | |
| 604 | 604 | { |
| 605 | 605 | UINT8 fnum = (cr3>>8)&0xff; |
| 606 | 606 | |
| 607 | | CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine.describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) |
| 607 | CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) |
| 608 | 608 | |
| 609 | 609 | filters[fnum].chan = cr1 & 0xff; |
| 610 | 610 | filters[fnum].smmask = (cr2>>8)&0xff; |
| r20982 | r20983 | |
| 622 | 622 | { |
| 623 | 623 | UINT8 fnum = (cr3>>8)&0xff; |
| 624 | 624 | |
| 625 | | CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine.describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) |
| 625 | CDROM_LOG(("%s:CD: Set Filter Subheader conditions %x => chan %x masks %x fid %x vals %x\n", machine().describe_context(), fnum, cr1&0xff, cr2, cr3&0xff, cr4)) |
| 626 | 626 | |
| 627 | 627 | cr1 = cd_stat | (filters[fnum].chan & 0xff); |
| 628 | 628 | cr2 = (filters[fnum].smmask << 8) | (filters[fnum].cimask & 0xff); |
| r20982 | r20983 | |
| 648 | 648 | filters[fnum].mode = mode; |
| 649 | 649 | } |
| 650 | 650 | |
| 651 | | CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine.describe_context(), fnum, mode)) |
| 651 | CDROM_LOG(("%s:CD: Set Filter Mode filt %x mode %x\n", machine().describe_context(), fnum, mode)) |
| 652 | 652 | hirqreg |= (CMOK|ESEL); |
| 653 | 653 | cr_standard_return(cd_stat); |
| 654 | 654 | } |
| r20982 | r20983 | |
| 671 | 671 | /* TODO: maybe condition false is cr3 low? */ |
| 672 | 672 | UINT8 fnum = (cr3>>8)&0xff; |
| 673 | 673 | |
| 674 | | CDROM_LOG(("%s:CD: Set Filter Connection %x => mode %x parm %04x\n", machine.describe_context(), fnum, cr1 & 0xf, cr2)) |
| 674 | CDROM_LOG(("%s:CD: Set Filter Connection %x => mode %x parm %04x\n", machine().describe_context(), fnum, cr1 & 0xf, cr2)) |
| 675 | 675 | |
| 676 | 676 | if (cr1 & 1) // set true condition |
| 677 | 677 | filters[fnum].condtrue = (cr2>>8)&0xff; |
| r20982 | r20983 | |
| 688 | 688 | { |
| 689 | 689 | int i,j; |
| 690 | 690 | |
| 691 | | CDROM_LOG(("%s:CD: Reset Selector\n", machine.describe_context())) |
| 691 | CDROM_LOG(("%s:CD: Reset Selector\n", machine().describe_context())) |
| 692 | 692 | |
| 693 | 693 | if((cr1 & 0xff) == 0x00) |
| 694 | 694 | { |
| r20982 | r20983 | |
| 784 | 784 | { |
| 785 | 785 | UINT32 bufnum = cr3>>8; |
| 786 | 786 | |
| 787 | | CDROM_LOG(("%s:CD: Get Sector Number (bufno %d) = %d blocks\n", machine.describe_context(), bufnum, cr4)) |
| 787 | CDROM_LOG(("%s:CD: Get Sector Number (bufno %d) = %d blocks\n", machine().describe_context(), bufnum, cr4)) |
| 788 | 788 | cr1 = cd_stat; |
| 789 | 789 | cr2 = 0; |
| 790 | 790 | cr3 = 0; |
| r20982 | r20983 | |
| 809 | 809 | UINT32 sectoffs = cr2; |
| 810 | 810 | UINT32 numsect = cr4; |
| 811 | 811 | |
| 812 | | CDROM_LOG(("%s:CD: Calculate actual size: buf %x offs %x numsect %x\n", machine.describe_context(), bufnum, sectoffs, numsect)) |
| 812 | CDROM_LOG(("%s:CD: Calculate actual size: buf %x offs %x numsect %x\n", machine().describe_context(), bufnum, sectoffs, numsect)) |
| 813 | 813 | |
| 814 | 814 | calcsize = 0; |
| 815 | 815 | if (partitions[bufnum].size != -1) |
| r20982 | r20983 | |
| 831 | 831 | break; |
| 832 | 832 | |
| 833 | 833 | case 0x53: // get actual block size |
| 834 | | CDROM_LOG(("%s:CD: Get actual block size\n", machine.describe_context())) |
| 834 | CDROM_LOG(("%s:CD: Get actual block size\n", machine().describe_context())) |
| 835 | 835 | hirqreg |= (CMOK|ESEL); |
| 836 | 836 | cr1 = cd_stat | ((calcsize>>16)&0xff); |
| 837 | 837 | cr2 = (calcsize & 0xffff); |
| r20982 | r20983 | |
| 862 | 862 | break; |
| 863 | 863 | |
| 864 | 864 | case 0x60: // set sector length |
| 865 | | CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context())) |
| 865 | CDROM_LOG(("%s:CD: Set sector length\n", machine().describe_context())) |
| 866 | 866 | |
| 867 | 867 | switch (cr1 & 0xff) |
| 868 | 868 | { |
| r20982 | r20983 | |
| 905 | 905 | UINT32 sectofs = cr2; |
| 906 | 906 | UINT32 bufnum = cr3>>8; |
| 907 | 907 | |
| 908 | | CDROM_LOG(("%s:CD: Get sector data (SN %d SO %d BN %d)\n", machine.describe_context(), sectnum, sectofs, bufnum)) |
| 908 | CDROM_LOG(("%s:CD: Get sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) |
| 909 | 909 | |
| 910 | 910 | if (bufnum >= MAX_FILTERS) |
| 911 | 911 | { |
| r20982 | r20983 | |
| 948 | 948 | UINT32 bufnum = cr3>>8; |
| 949 | 949 | INT32 i; |
| 950 | 950 | |
| 951 | | CDROM_LOG(("%s:CD: Delete sector data (SN %d SO %d BN %d)\n", machine.describe_context(), sectnum, sectofs, bufnum)) |
| 951 | CDROM_LOG(("%s:CD: Delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) |
| 952 | 952 | |
| 953 | 953 | if (bufnum >= MAX_FILTERS) |
| 954 | 954 | { |
| r20982 | r20983 | |
| 999 | 999 | UINT32 sectofs = cr2; |
| 1000 | 1000 | UINT32 bufnum = cr3>>8; |
| 1001 | 1001 | |
| 1002 | | CDROM_LOG(("%s:CD: Get and delete sector data (SN %d SO %d BN %d)\n", machine.describe_context(), sectnum, sectofs, bufnum)) |
| 1002 | CDROM_LOG(("%s:CD: Get and delete sector data (SN %d SO %d BN %d)\n", machine().describe_context(), sectnum, sectofs, bufnum)) |
| 1003 | 1003 | |
| 1004 | 1004 | if (bufnum >= MAX_FILTERS) |
| 1005 | 1005 | { |
| r20982 | r20983 | |
| 1067 | 1067 | |
| 1068 | 1068 | |
| 1069 | 1069 | case 0x67: // get copy error |
| 1070 | | CDROM_LOG(("%s:CD: Get copy error\n", machine.describe_context())) |
| 1070 | CDROM_LOG(("%s:CD: Get copy error\n", machine().describe_context())) |
| 1071 | 1071 | printf("Get copy error\n"); |
| 1072 | 1072 | cr1 = cd_stat; |
| 1073 | 1073 | cr2 = 0; |
| r20982 | r20983 | |
| 1077 | 1077 | break; |
| 1078 | 1078 | |
| 1079 | 1079 | case 0x70: // change directory |
| 1080 | | CDROM_LOG(("%s:CD: Change Directory\n", machine.describe_context())) |
| 1080 | CDROM_LOG(("%s:CD: Change Directory\n", machine().describe_context())) |
| 1081 | 1081 | hirqreg |= (CMOK|EFLS); |
| 1082 | 1082 | |
| 1083 | 1083 | temp = (cr3&0xff)<<16; |
| r20982 | r20983 | |
| 1088 | 1088 | break; |
| 1089 | 1089 | |
| 1090 | 1090 | case 0x71: // Read directory entry |
| 1091 | | CDROM_LOG(("%s:CD: Read Directory Entry\n", machine.describe_context())) |
| 1091 | CDROM_LOG(("%s:CD: Read Directory Entry\n", machine().describe_context())) |
| 1092 | 1092 | // UINT32 read_dir; |
| 1093 | 1093 | |
| 1094 | 1094 | // read_dir = ((cr3&0xff)<<16)|cr4; |
| r20982 | r20983 | |
| 1116 | 1116 | break; |
| 1117 | 1117 | |
| 1118 | 1118 | case 0x73: // Get File Info |
| 1119 | | CDROM_LOG(("%s:CD: Get File Info\n", machine.describe_context())) |
| 1119 | CDROM_LOG(("%s:CD: Get File Info\n", machine().describe_context())) |
| 1120 | 1120 | cd_stat |= CD_STAT_TRANS; |
| 1121 | 1121 | cd_stat &= 0xff00; // clear top byte of return value |
| 1122 | 1122 | playtype = 0; |
| r20982 | r20983 | |
| 1174 | 1174 | break; |
| 1175 | 1175 | |
| 1176 | 1176 | case 0x74: // Read File |
| 1177 | | CDROM_LOG(("%s:CD: Read File\n", machine.describe_context())) |
| 1177 | CDROM_LOG(("%s:CD: Read File\n", machine().describe_context())) |
| 1178 | 1178 | UINT16 file_offset,file_filter,file_id,file_size; |
| 1179 | 1179 | |
| 1180 | 1180 | file_offset = ((cr1 & 0xff)<<8)|(cr2 & 0xff); /* correct? */ |
| r20982 | r20983 | |
| 1204 | 1204 | break; |
| 1205 | 1205 | |
| 1206 | 1206 | case 0x75: |
| 1207 | | CDROM_LOG(("%s:CD: Abort File\n", machine.describe_context())) |
| 1207 | CDROM_LOG(("%s:CD: Abort File\n", machine().describe_context())) |
| 1208 | 1208 | // bios expects "2bc" mask to work against this |
| 1209 | 1209 | hirqreg |= (CMOK|EFLS); |
| 1210 | 1210 | sectorstore = 0; |
| r20982 | r20983 | |
| 1216 | 1216 | break; |
| 1217 | 1217 | |
| 1218 | 1218 | case 0xe0: // appears to be copy protection check. needs only to return OK. |
| 1219 | | CDROM_LOG(("%s:CD: Verify copy protection\n", machine.describe_context())) |
| 1219 | CDROM_LOG(("%s:CD: Verify copy protection\n", machine().describe_context())) |
| 1220 | 1220 | if(((cd_stat & 0x0f00) != CD_STAT_NODISC) && ((cd_stat & 0x0f00) != CD_STAT_OPEN)) |
| 1221 | 1221 | cd_stat = CD_STAT_PAUSE; |
| 1222 | 1222 | // cr1 = cd_stat; // necessary to pass |
| r20982 | r20983 | |
| 1228 | 1228 | break; |
| 1229 | 1229 | |
| 1230 | 1230 | case 0xe1: // get disc region |
| 1231 | | CDROM_LOG(("%s:CD: Get disc region\n", machine.describe_context())) |
| 1231 | CDROM_LOG(("%s:CD: Get disc region\n", machine().describe_context())) |
| 1232 | 1232 | if(cd_stat != CD_STAT_NODISC && cd_stat != CD_STAT_OPEN) |
| 1233 | 1233 | cd_stat = CD_STAT_PAUSE; |
| 1234 | 1234 | cr1 = cd_stat; // necessary to pass |