src/mame/drivers/megadriv.c
| r9366 | r9367 | |
| 270 | 270 | #include "includes/megadriv.h" |
| 271 | 271 | #include "cpu/sh2/sh2.h" |
| 272 | 272 | #include "cpu/sh2/sh2comn.h" |
| 273 | #include "sound/cdda.h" |
| 274 | #ifdef MESS |
| 273 | 275 | #include "devices/chd_cd.h" |
| 274 | | #include "sound/cdda.h" |
| 276 | #endif |
| 275 | 277 | |
| 276 | 278 | #define MEGADRIV_VDP_VRAM(address) megadrive_vdp_vram[(address)&0x7fff] |
| 277 | 279 | |
| r9366 | r9367 | |
| 396 | 398 | UINT8 ext; |
| 397 | 399 | UINT8 ctrl; |
| 398 | 400 | }segacd_cdd; |
| 401 | #ifdef MESS |
| 399 | 402 | static struct |
| 400 | 403 | { |
| 401 | 404 | UINT32 current_frame; |
| r9366 | r9367 | |
| 405 | 408 | cdrom_file *cd; |
| 406 | 409 | const cdrom_toc* toc; |
| 407 | 410 | }segacd; |
| 411 | #endif |
| 408 | 412 | |
| 409 | 413 | static void segacd_mark_tiles_dirty(running_machine* machine, int offset); |
| 410 | 414 | |
| r9366 | r9367 | |
| 869 | 873 | { |
| 870 | 874 | source -= 2; // the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer) |
| 871 | 875 | } |
| 872 | | |
| 876 | |
| 873 | 877 | // likewise segaCD, at least when reading wordram? |
| 874 | 878 | // we might need to check what mode we're in here.. |
| 875 | 879 | if (segacd_wordram_mapped) |
| r9366 | r9367 | |
| 4644 | 4648 | memory_set_bankptr(space->machine, "scd_4m_prgbank", segacd_4meg_prgram + segacd_4meg_prgbank * 0x20000 ); |
| 4645 | 4649 | memory_install_write16_handler (space, 0x0020000, 0x003ffff, 0, 0, scd_4m_prgbank_ram_w ); |
| 4646 | 4650 | segacd_wordram_mapped = 1; |
| 4647 | | |
| 4648 | 4651 | |
| 4652 | |
| 4649 | 4653 | memory_install_readwrite16_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200000, 0x23ffff, 0, 0, segacd_main_dataram_part1_r, segacd_main_dataram_part1_w); // RAM shared with sub |
| 4650 | 4654 | |
| 4651 | 4655 | memory_install_readwrite16_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xa12000, 0xa12001, 0, 0, scd_a12000_halt_reset_r, scd_a12000_halt_reset_w); // sub-cpu control |
| r9366 | r9367 | |
| 4717 | 4721 | |
| 4718 | 4722 | /* init cd-rom device */ |
| 4719 | 4723 | |
| 4724 | #ifdef MESS |
| 4720 | 4725 | { |
| 4721 | 4726 | running_device *device; |
| 4722 | 4727 | |
| r9366 | r9367 | |
| 4734 | 4739 | } |
| 4735 | 4740 | } |
| 4736 | 4741 | } |
| 4742 | #endif |
| 4737 | 4743 | } |
| 4738 | 4744 | |
| 4739 | 4745 | |
| r9366 | r9367 | |
| 4951 | 4957 | "Invalid 0xF", |
| 4952 | 4958 | }; |
| 4953 | 4959 | |
| 4960 | #ifdef MESS |
| 4954 | 4961 | static void segacd_cdd_get_status(running_machine *machine) |
| 4955 | 4962 | { |
| 4956 | 4963 | // ... |
| r9366 | r9367 | |
| 5033 | 5040 | cdd_hock_irq(machine,1); |
| 5034 | 5041 | } |
| 5035 | 5042 | |
| 5043 | #endif |
| 5044 | |
| 5036 | 5045 | static WRITE8_HANDLER( segacd_cdd_tx_w ) |
| 5037 | 5046 | { |
| 5038 | 5047 | //printf("CDD Communication write %02x -> [%02x]\n",data,offset); |
| 5039 | 5048 | segacd_cdd_tx[offset] = data & 0xf; |
| 5040 | 5049 | |
| 5050 | #ifdef MESS |
| 5041 | 5051 | if(offset == 9) //execute the command when crc is sent (TODO: I wonder if we need to check if crc is valid. Plus obviously this shouldn't be instant) |
| 5042 | 5052 | { |
| 5043 | 5053 | logerror("CDD: command %s issued\n",segacd_cdd_cmd[segacd_cdd_tx[0] & 0xf]); |
| r9366 | r9367 | |
| 5050 | 5060 | //default: logerror("CDD: unhandled command %s issued\n",segacd_cdd_cmd[segacd_cdd_tx[0] & 0xf]); |
| 5051 | 5061 | } |
| 5052 | 5062 | } |
| 5063 | #endif |
| 5053 | 5064 | } |
| 5054 | 5065 | |
| 5055 | 5066 | |
| r9366 | r9367 | |
| 5112 | 5123 | segacd_mark_stampmaps_dirty(); |
| 5113 | 5124 | |
| 5114 | 5125 | segacd_conversion_active = 1; |
| 5115 | | |
| 5126 | |
| 5116 | 5127 | // todo: proper time calculation |
| 5117 | 5128 | timer_adjust_oneshot(segacd_gfx_conversion_timer, ATTOTIME_IN_HZ(1000), 0); |
| 5118 | 5129 | |
| r9366 | r9367 | |
| 5142 | 5153 | x = BITMAP_ADDR16(srcbitmap,10,10); |
| 5143 | 5154 | UINT16 datax; |
| 5144 | 5155 | datax = x[0]; |
| 5145 | | |
| 5156 | |
| 5146 | 5157 | // I don't quite understand what happens if the lower bits of hdotsize are set.. do we end up rounding up? |
| 5147 | 5158 | // this 'buffersize' clearly fills the frame for the SegaCD logo screen at least |
| 5148 | 5159 | int buffersize = ((segacd_imagebuffer_vcell_size+1) * (segacd_imagebuffer_hdot_size>>3)*0x20)/2; // 0x20 = 8x8x4 tile, /2 due to word offset |
| 5149 | 5160 | //buffersize -= 8; |
| 5150 | | |
| 5161 | |
| 5151 | 5162 | for (int i=0;i< buffersize ;i++) |
| 5152 | 5163 | { |
| 5153 | 5164 | int offsetx = ((segacd_imagebuffer_start_address&0xfff8)*2)+i; |
| r9366 | r9367 | |
| 5225 | 5236 | static READ16_HANDLER( segacd_imagebuffer_vcell_size_r ) |
| 5226 | 5237 | { |
| 5227 | 5238 | return segacd_imagebuffer_vcell_size; |
| 5228 | | } |
| 5239 | } |
| 5229 | 5240 | |
| 5230 | 5241 | static WRITE16_HANDLER( segacd_imagebuffer_vcell_size_w ) |
| 5231 | 5242 | { |
| r9366 | r9367 | |
| 5236 | 5247 | static READ16_HANDLER( segacd_imagebuffer_hdot_size_r ) |
| 5237 | 5248 | { |
| 5238 | 5249 | return segacd_imagebuffer_hdot_size; |
| 5239 | | } |
| 5250 | } |
| 5240 | 5251 | |
| 5241 | 5252 | static WRITE16_HANDLER( segacd_imagebuffer_hdot_size_w ) |
| 5242 | 5253 | { |
| r9366 | r9367 | |
| 8223 | 8234 | MDRV_SOUND_ROUTE( 0, "lspeaker", 1.00 ) |
| 8224 | 8235 | MDRV_SOUND_ROUTE( 1, "rspeaker", 1.00 ) |
| 8225 | 8236 | |
| 8237 | #ifdef MESS |
| 8226 | 8238 | MDRV_CDROM_ADD( "cdrom" ) |
| 8239 | #endif |
| 8227 | 8240 | MACHINE_CONFIG_END |
| 8228 | 8241 | |
| 8229 | 8242 | MACHINE_CONFIG_DERIVED( genesis_32x_scd, genesis_32x ) |
| r9366 | r9367 | |
| 8235 | 8248 | MDRV_SOUND_ROUTE( 0, "lspeaker", 1.00 ) |
| 8236 | 8249 | MDRV_SOUND_ROUTE( 1, "rspeaker", 1.00 ) |
| 8237 | 8250 | |
| 8251 | #ifdef MESS |
| 8238 | 8252 | MDRV_CDROM_ADD( "cdrom" ) |
| 8253 | #endif |
| 8239 | 8254 | MACHINE_CONFIG_END |
| 8240 | 8255 | |
| 8241 | 8256 | |