trunk/src/emu/machine/stvcd.c
| r20954 | r20955 | |
| 109 | 109 | 1) |
| 110 | 110 | printf("CD: command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat); |
| 111 | 111 | |
| 112 | | switch (cr1 & 0xff00) |
| 112 | switch ((cr1 >> 8) & 0xff) |
| 113 | 113 | { |
| 114 | | case 0x0000: |
| 114 | case 0x00: |
| 115 | 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 | | case 0x0100: |
| 121 | case 0x01: |
| 122 | 122 | CDROM_LOG(("%s:CD: Get Hardware Info\n", machine.describe_context())) |
| 123 | 123 | hirqreg |= CMOK; |
| 124 | 124 | cr1 = cd_stat; |
| r20954 | r20955 | |
| 127 | 127 | cr4 = 0x0400; |
| 128 | 128 | break; |
| 129 | 129 | |
| 130 | | case 0x0200: // Get TOC |
| 130 | case 0x02: // Get TOC |
| 131 | 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; |
| r20954 | r20955 | |
| 139 | 139 | hirqreg |= (CMOK|DRDY); |
| 140 | 140 | break; |
| 141 | 141 | |
| 142 | | case 0x0300: // get session info (lower byte = session # to get?) |
| 142 | case 0x03: // get session info (lower byte = session # to get?) |
| 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. |
| r20954 | r20955 | |
| 176 | 176 | break; |
| 177 | 177 | |
| 178 | 178 | /* TODO: double check this */ |
| 179 | | case 0x0400: // initialize CD system |
| 179 | case 0x04: // initialize CD system |
| 180 | 180 | // CR1 & 1 = reset software |
| 181 | 181 | // CR1 & 2 = decode RW subcode |
| 182 | 182 | // CR1 & 4 = don't confirm mode 2 subheader |
| r20954 | r20955 | |
| 224 | 224 | cr_standard_return(cd_stat); |
| 225 | 225 | break; |
| 226 | 226 | |
| 227 | | case 0x0600: // end data transfer (TODO: needs to be worked on!) |
| 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 | 230 | CDROM_LOG(("%s:CD: End data transfer (%d bytes xfer'd)\n", machine.describe_context(), xferdnum)) |
| r20954 | r20955 | |
| 297 | 297 | CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) |
| 298 | 298 | break; |
| 299 | 299 | |
| 300 | | case 0x1000: // Play Disc. FAD is in lowest 7 bits of cr1 and all of cr2. |
| 300 | case 0x10: // Play Disc. FAD is in lowest 7 bits of cr1 and all of cr2. |
| 301 | 301 | UINT32 start_pos,end_pos; |
| 302 | 302 | UINT8 play_mode; |
| 303 | 303 | |
| r20954 | r20955 | |
| 413 | 413 | |
| 414 | 414 | break; |
| 415 | 415 | |
| 416 | | case 0x1100: // disc seek |
| 416 | case 0x11: // disc seek |
| 417 | 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) |
| r20954 | r20955 | |
| 459 | 459 | cr_standard_return(cd_stat); |
| 460 | 460 | break; |
| 461 | 461 | |
| 462 | | case 0x1200: // FFWD / REW |
| 462 | case 0x12: // FFWD / REW |
| 463 | 463 | //cr1 bit 0 determines if this is a Fast Forward (0) or a Rewind (1) command |
| 464 | 464 | // ... |
| 465 | 465 | break; |
| 466 | 466 | |
| 467 | | case 0x2000: // Get SubCode Q / RW Channel |
| 467 | case 0x20: // Get SubCode Q / RW Channel |
| 468 | 468 | switch(cr1 & 0xff) |
| 469 | 469 | { |
| 470 | 470 | case 0: // Get Q |
| r20954 | r20955 | |
| 535 | 535 | hirqreg |= CMOK|DRDY; |
| 536 | 536 | break; |
| 537 | 537 | |
| 538 | | case 0x3000: // Set CD Device connection |
| 538 | case 0x30: // Set CD Device connection |
| 539 | 539 | { |
| 540 | 540 | UINT8 parm; |
| 541 | 541 | |
| r20954 | r20955 | |
| 564 | 564 | } |
| 565 | 565 | break; |
| 566 | 566 | |
| 567 | | case 0x3100: |
| 567 | case 0x31: |
| 568 | 568 | popmessage("Get CD Device Connection, contact MAMEdev"); |
| 569 | 569 | hirqreg |= CMOK; |
| 570 | 570 | break; |
| 571 | 571 | |
| 572 | | case 0x3200: // Last Buffer Destination |
| 572 | case 0x32: // Last Buffer Destination |
| 573 | 573 | cr1 = cd_stat | 0; |
| 574 | 574 | cr2 = 0; |
| 575 | 575 | cr3 = lastbuf << 8; |
| r20954 | r20955 | |
| 577 | 577 | hirqreg |= (CMOK); |
| 578 | 578 | break; |
| 579 | 579 | |
| 580 | | case 0x4000: // Set Filter Range |
| 580 | case 0x40: // Set Filter Range |
| 581 | 581 | // cr1 low + cr2 = FAD0, cr3 low + cr4 = FAD1 |
| 582 | 582 | // cr3 hi = filter num. |
| 583 | 583 | { |
| r20954 | r20955 | |
| 595 | 595 | } |
| 596 | 596 | break; |
| 597 | 597 | |
| 598 | | case 0x4100: |
| 598 | case 0x41: |
| 599 | 599 | popmessage("Get Filter Range, contact MAMEdev"); |
| 600 | 600 | hirqreg |= CMOK; |
| 601 | 601 | break; |
| 602 | 602 | |
| 603 | | case 0x4200: // Set Filter Subheader conditions |
| 603 | case 0x42: // Set Filter Subheader conditions |
| 604 | 604 | { |
| 605 | 605 | UINT8 fnum = (cr3>>8)&0xff; |
| 606 | 606 | |
| r20954 | r20955 | |
| 618 | 618 | } |
| 619 | 619 | break; |
| 620 | 620 | |
| 621 | | case 0x4300: // Get Filter Subheader conditions |
| 621 | case 0x43: // Get Filter Subheader conditions |
| 622 | 622 | { |
| 623 | 623 | UINT8 fnum = (cr3>>8)&0xff; |
| 624 | 624 | |
| r20954 | r20955 | |
| 633 | 633 | } |
| 634 | 634 | break; |
| 635 | 635 | |
| 636 | | case 0x4400: // Set Filter Mode |
| 636 | case 0x44: // Set Filter Mode |
| 637 | 637 | { |
| 638 | 638 | UINT8 fnum = (cr3>>8)&0xff; |
| 639 | 639 | UINT8 mode = (cr1 & 0xff); |
| r20954 | r20955 | |
| 654 | 654 | } |
| 655 | 655 | break; |
| 656 | 656 | |
| 657 | | case 0x4500: // Get Filter Mode |
| 657 | case 0x45: // Get Filter Mode |
| 658 | 658 | { |
| 659 | 659 | UINT8 fnum = (cr3>>8)&0xff; |
| 660 | 660 | |
| r20954 | r20955 | |
| 666 | 666 | } |
| 667 | 667 | break; |
| 668 | 668 | |
| 669 | | case 0x4600: // Set Filter Connection |
| 669 | case 0x46: // Set Filter Connection |
| 670 | 670 | { |
| 671 | 671 | /* TODO: maybe condition false is cr3 low? */ |
| 672 | 672 | UINT8 fnum = (cr3>>8)&0xff; |
| r20954 | r20955 | |
| 684 | 684 | } |
| 685 | 685 | break; |
| 686 | 686 | |
| 687 | | case 0x4800: // Reset Selector |
| 687 | case 0x48: // Reset Selector |
| 688 | 688 | { |
| 689 | 689 | int i,j; |
| 690 | 690 | |
| r20954 | r20955 | |
| 771 | 771 | } |
| 772 | 772 | break; |
| 773 | 773 | |
| 774 | | case 0x5000: // get Buffer Size |
| 774 | case 0x50: // get Buffer Size |
| 775 | 775 | cr1 = cd_stat; |
| 776 | 776 | cr2 = (freeblocks > 200) ? 200 : freeblocks; |
| 777 | 777 | cr3 = 0x1800; |
| r20954 | r20955 | |
| 780 | 780 | hirqreg |= (CMOK); |
| 781 | 781 | break; |
| 782 | 782 | |
| 783 | | case 0x5100: // get # sectors used in a buffer |
| 783 | case 0x51: // get # sectors used in a buffer |
| 784 | 784 | { |
| 785 | 785 | UINT32 bufnum = cr3>>8; |
| 786 | 786 | |
| r20954 | r20955 | |
| 803 | 803 | } |
| 804 | 804 | break; |
| 805 | 805 | |
| 806 | | case 0x5200: // calculate actual size |
| 806 | case 0x52: // calculate actual size |
| 807 | 807 | { |
| 808 | 808 | UINT32 bufnum = cr3>>8; |
| 809 | 809 | UINT32 sectoffs = cr2; |
| r20954 | r20955 | |
| 830 | 830 | } |
| 831 | 831 | break; |
| 832 | 832 | |
| 833 | | case 0x5300: // get actual block size |
| 833 | case 0x53: // get actual block size |
| 834 | 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); |
| r20954 | r20955 | |
| 839 | 839 | cr4 = 0; |
| 840 | 840 | break; |
| 841 | 841 | |
| 842 | | case 0x5400: // get sector info |
| 842 | case 0x54: // get sector info |
| 843 | 843 | { |
| 844 | 844 | UINT32 sectoffs = cr2 & 0xff; |
| 845 | 845 | UINT32 bufnum = cr3>>8; |
| r20954 | r20955 | |
| 861 | 861 | } |
| 862 | 862 | break; |
| 863 | 863 | |
| 864 | | case 0x6000: // set sector length |
| 864 | case 0x60: // set sector length |
| 865 | 865 | CDROM_LOG(("%s:CD: Set sector length\n", machine.describe_context())) |
| 866 | 866 | |
| 867 | 867 | switch (cr1 & 0xff) |
| r20954 | r20955 | |
| 899 | 899 | cr_standard_return(cd_stat); |
| 900 | 900 | break; |
| 901 | 901 | |
| 902 | | case 0x6100: // get sector data |
| 902 | case 0x61: // get sector data |
| 903 | 903 | { |
| 904 | 904 | UINT32 sectnum = cr4; |
| 905 | 905 | UINT32 sectofs = cr2; |
| r20954 | r20955 | |
| 941 | 941 | } |
| 942 | 942 | break; |
| 943 | 943 | |
| 944 | | case 0x6200: // delete sector data |
| 944 | case 0x62: // delete sector data |
| 945 | 945 | { |
| 946 | 946 | UINT32 sectnum = cr4; |
| 947 | 947 | UINT32 sectofs = cr2; |
| r20954 | r20955 | |
| 993 | 993 | } |
| 994 | 994 | break; |
| 995 | 995 | |
| 996 | | case 0x6300: // get then delete sector data |
| 996 | case 0x63: // get then delete sector data |
| 997 | 997 | { |
| 998 | 998 | UINT32 sectnum = cr4; |
| 999 | 999 | UINT32 sectofs = cr2; |
| r20954 | r20955 | |
| 1035 | 1035 | } |
| 1036 | 1036 | break; |
| 1037 | 1037 | |
| 1038 | | case 0x6400: // put sector data |
| 1038 | case 0x64: // put sector data |
| 1039 | 1039 | /* TODO: After Burner 2, Out Run, Fantasy Zone and Dungeon Master Nexus trips this */ |
| 1040 | 1040 | // ... |
| 1041 | 1041 | { |
| r20954 | r20955 | |
| 1049 | 1049 | cr_standard_return(cd_stat); |
| 1050 | 1050 | break; |
| 1051 | 1051 | |
| 1052 | | case 0x6500: |
| 1052 | case 0x65: |
| 1053 | 1053 | popmessage("Copy Sector data, contact MAMEdev"); |
| 1054 | 1054 | hirqreg |= (CMOK); |
| 1055 | 1055 | break; |
| 1056 | 1056 | |
| 1057 | | case 0x6600: // move sector data |
| 1057 | case 0x66: // move sector data |
| 1058 | 1058 | /* TODO: Sword & Sorcery / Riglord Saga 2 */ |
| 1059 | 1059 | { |
| 1060 | 1060 | //UINT8 src_filter = (cr3>>8)&0xff; |
| r20954 | r20955 | |
| 1066 | 1066 | break; |
| 1067 | 1067 | |
| 1068 | 1068 | |
| 1069 | | case 0x6700: // get copy error |
| 1069 | case 0x67: // get copy error |
| 1070 | 1070 | CDROM_LOG(("%s:CD: Get copy error\n", machine.describe_context())) |
| 1071 | 1071 | printf("Get copy error\n"); |
| 1072 | 1072 | cr1 = cd_stat; |
| r20954 | r20955 | |
| 1076 | 1076 | hirqreg |= (CMOK); |
| 1077 | 1077 | break; |
| 1078 | 1078 | |
| 1079 | | case 0x7000: // change directory |
| 1079 | case 0x70: // change directory |
| 1080 | 1080 | CDROM_LOG(("%s:CD: Change Directory\n", machine.describe_context())) |
| 1081 | 1081 | hirqreg |= (CMOK|EFLS); |
| 1082 | 1082 | |
| r20954 | r20955 | |
| 1087 | 1087 | cr_standard_return(cd_stat); |
| 1088 | 1088 | break; |
| 1089 | 1089 | |
| 1090 | | case 0x7100: // Read directory entry |
| 1090 | case 0x71: // Read directory entry |
| 1091 | 1091 | CDROM_LOG(("%s:CD: Read Directory Entry\n", machine.describe_context())) |
| 1092 | 1092 | // UINT32 read_dir; |
| 1093 | 1093 | |
| r20954 | r20955 | |
| 1105 | 1105 | hirqreg |= (CMOK|EFLS); |
| 1106 | 1106 | break; |
| 1107 | 1107 | |
| 1108 | | case 0x7200: // Get file system scope |
| 1108 | case 0x72: // Get file system scope |
| 1109 | 1109 | CDROM_LOG(("CD: Get file system scope\n")) |
| 1110 | 1110 | hirqreg |= (CMOK|EFLS); |
| 1111 | 1111 | cr1 = cd_stat; |
| r20954 | r20955 | |
| 1115 | 1115 | printf("%04x %04x %04x %04x\n",cr1,cr2,cr3,cr4); |
| 1116 | 1116 | break; |
| 1117 | 1117 | |
| 1118 | | case 0x7300: // Get File Info |
| 1118 | case 0x73: // Get File Info |
| 1119 | 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 |
| r20954 | r20955 | |
| 1173 | 1173 | CDROM_LOG((" = %04x %04x %04x %04x %04x\n", hirqreg, cr1, cr2, cr3, cr4)) |
| 1174 | 1174 | break; |
| 1175 | 1175 | |
| 1176 | | case 0x7400: // Read File |
| 1176 | case 0x74: // Read File |
| 1177 | 1177 | CDROM_LOG(("%s:CD: Read File\n", machine.describe_context())) |
| 1178 | 1178 | UINT16 file_offset,file_filter,file_id,file_size; |
| 1179 | 1179 | |
| r20954 | r20955 | |
| 1203 | 1203 | |
| 1204 | 1204 | break; |
| 1205 | 1205 | |
| 1206 | | case 0x7500: |
| 1206 | case 0x75: |
| 1207 | 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); |
| r20954 | r20955 | |
| 1215 | 1215 | cr_standard_return(cd_stat); |
| 1216 | 1216 | break; |
| 1217 | 1217 | |
| 1218 | | case 0xe000: // appears to be copy protection check. needs only to return OK. |
| 1218 | case 0xe0: // appears to be copy protection check. needs only to return OK. |
| 1219 | 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; |
| r20954 | r20955 | |
| 1227 | 1227 | cr_standard_return(cd_stat); |
| 1228 | 1228 | break; |
| 1229 | 1229 | |
| 1230 | | case 0xe100: // get disc region |
| 1230 | case 0xe1: // get disc region |
| 1231 | 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; |
| r20954 | r20955 | |
| 1240 | 1240 | break; |
| 1241 | 1241 | |
| 1242 | 1242 | default: |
| 1243 | | CDROM_LOG(("CD: Unknown command %04x\n", cr1)) |
| 1243 | CDROM_LOG(("CD: Unknown command %04x\n", cr1>>8)) |
| 1244 | popmessage("CD Block unknown command %02x, contact MAMEdev",cr1>>8); |
| 1244 | 1245 | hirqreg |= (CMOK); |
| 1245 | 1246 | break; |
| 1246 | 1247 | } |