src/mame/drivers/megadriv.c
| r9379 | r9380 | |
| 2681 | 2681 | |
| 2682 | 2682 | current_fifo_read_pos++; |
| 2683 | 2683 | |
| 2684 | | // printf("reading FIFO!\n"); |
| 2684 | // printf("reading FIFO!\n"); |
| 2685 | 2685 | |
| 2686 | 2686 | if (current_fifo_readblock == fifo_block_a && !fifo_block_a_full) |
| 2687 | 2687 | printf("Fifo block a isn't filled!\n"); |
| r9379 | r9380 | |
| 2741 | 2741 | dreq_src_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xfffe); |
| 2742 | 2742 | |
| 2743 | 2743 | //if((dreq_src_addr[0]<<16)|dreq_src_addr[1]) |
| 2744 | | // printf("DREQ set SRC = %08x\n",(dreq_src_addr[0]<<16)|dreq_src_addr[1]); |
| 2744 | // printf("DREQ set SRC = %08x\n",(dreq_src_addr[0]<<16)|dreq_src_addr[1]); |
| 2745 | 2745 | |
| 2746 | 2746 | break; |
| 2747 | 2747 | |
| r9379 | r9380 | |
| 2756 | 2756 | dreq_dst_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xffff); |
| 2757 | 2757 | |
| 2758 | 2758 | //if((dreq_dst_addr[0]<<16)|dreq_dst_addr[1]) |
| 2759 | | // printf("DREQ set DST = %08x\n",(dreq_dst_addr[0]<<16)|dreq_dst_addr[1]); |
| 2759 | // printf("DREQ set DST = %08x\n",(dreq_dst_addr[0]<<16)|dreq_dst_addr[1]); |
| 2760 | 2760 | |
| 2761 | 2761 | break; |
| 2762 | 2762 | |
| r9379 | r9380 | |
| 2769 | 2769 | |
| 2770 | 2770 | dreq_size = data & 0xfffc; |
| 2771 | 2771 | |
| 2772 | | // if(dreq_size) |
| 2773 | | // printf("DREQ set SIZE = %04x\n",dreq_size); |
| 2772 | // if(dreq_size) |
| 2773 | // printf("DREQ set SIZE = %04x\n",dreq_size); |
| 2774 | 2774 | |
| 2775 | 2775 | break; |
| 2776 | 2776 | |
| r9379 | r9380 | |
| 3208 | 3208 | |
| 3209 | 3209 | |
| 3210 | 3210 | |
| 3211 | | // printf("_32x_68k_a15180_r (a15180) %04x\n",mem_mask); |
| 3211 | // printf("_32x_68k_a15180_r (a15180) %04x\n",mem_mask); |
| 3212 | 3212 | |
| 3213 | 3213 | // read needs authorization too I think, undefined behavior otherwise |
| 3214 | 3214 | switch (offset) |
| r9379 | r9380 | |
| 3382 | 3382 | |
| 3383 | 3383 | case 0x0a/2: |
| 3384 | 3384 | // bit 0 is the framebuffer select, change is delayed until vblank; |
| 3385 | | // _32x_a1518a_reg = (_32x_a1518a_reg & 0xfffe); |
| 3385 | // _32x_a1518a_reg = (_32x_a1518a_reg & 0xfffe); |
| 3386 | 3386 | if (ACCESSING_BITS_0_7) |
| 3387 | 3387 | { |
| 3388 | 3388 | _32x_fb_swap = data & 1; |
| r9379 | r9380 | |
| 3861 | 3861 | static UINT16 segacd_imagebuffer_start_address; |
| 3862 | 3862 | static UINT16 segacd_imagebuffer_offset; |
| 3863 | 3863 | static tilemap_t *segacd_stampmap[4]; |
| 3864 | | static void segacd_mark_stampmaps_dirty(void); |
| 3864 | //static void segacd_mark_stampmaps_dirty(void); |
| 3865 | 3865 | |
| 3866 | 3866 | |
| 3867 | 3867 | static WRITE16_HANDLER( scd_a12000_halt_reset_w ) |
| r9379 | r9380 | |
| 3979 | 3979 | static READ16_HANDLER( segacd_sub_memory_mode_r ) |
| 3980 | 3980 | { |
| 3981 | 3981 | return (segacd_ram_writeprotect_bits << 8) | |
| 3982 | | /*(segacd_4meg_prgbank << 6) | */ |
| 3982 | /*(segacd_4meg_prgbank << 6) | */ |
| 3983 | 3983 | (segacd_memory_priority_mode << 3) | |
| 3984 | 3984 | (segacd_ram_mode << 2) | |
| 3985 | 3985 | ((segacd_maincpu_has_ram_access^1) << 1) | |
| r9379 | r9380 | |
| 4309 | 4309 | |
| 4310 | 4310 | static READ16_HANDLER( scd_hint_vector_r ) |
| 4311 | 4311 | { |
| 4312 | | // printf("read HINT offset %d\n", offset); |
| 4312 | // printf("read HINT offset %d\n", offset); |
| 4313 | 4313 | |
| 4314 | 4314 | switch (offset&1) |
| 4315 | 4315 | { |
| r9379 | r9380 | |
| 4339 | 4339 | { |
| 4340 | 4340 | // todo irqmask |
| 4341 | 4341 | |
| 4342 | | printf("segacd_gfx_conversion_timer_callback\n"); |
| 4342 | //printf("segacd_gfx_conversion_timer_callback\n"); |
| 4343 | 4343 | |
| 4344 | 4344 | if (segacd_irq_mask & 0x02) |
| 4345 | 4345 | cputag_set_input_line(machine, "segacd_68k", 1, HOLD_LINE); |
| r9379 | r9380 | |
| 4360 | 4360 | /* |
| 4361 | 4361 | static const gfx_layout sega_8x8_layout = |
| 4362 | 4362 | { |
| 4363 | | 8,8, |
| 4364 | | SEGACD_NUM_TILES16, |
| 4365 | | 4, |
| 4366 | | { 0,1,2,3 }, |
| 4367 | | { 8,12,0,4,24,28,16,20 }, |
| 4368 | | { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, |
| 4369 | | 8*32 |
| 4363 | 8,8, |
| 4364 | SEGACD_NUM_TILES16, |
| 4365 | 4, |
| 4366 | { 0,1,2,3 }, |
| 4367 | { 8,12,0,4,24,28,16,20 }, |
| 4368 | { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, |
| 4369 | 8*32 |
| 4370 | 4370 | }; |
| 4371 | 4371 | */ |
| 4372 | 4372 | |
| r9379 | r9380 | |
| 4377 | 4377 | #define _16x16_SEQUENCE_1_FLIP { 512+20,512+16,512+28,512+24,512+4,512+0, 512+12,512+8, 20,16,28,24,4,0,12,8 }, |
| 4378 | 4378 | |
| 4379 | 4379 | #define _16x16_SEQUENCE_2 { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32,10*32,11*32,12*32,13*32,14*32,15*32 }, |
| 4380 | | #define _16x16_SEQUENCE_2_FLIP { 16*32, 14*32, 13*32, 12*32, 11*32, 10*32, 9*32, 8*32, 7*32, 6*32, 5*32, 4*32, 3*32, 2*32, 1*32, 0*32 }, |
| 4380 | #define _16x16_SEQUENCE_2_FLIP { 15*32, 14*32, 13*32, 12*32, 11*32, 10*32, 9*32, 8*32, 7*32, 6*32, 5*32, 4*32, 3*32, 2*32, 1*32, 0*32 }, |
| 4381 | 4381 | |
| 4382 | 4382 | |
| 4383 | 4383 | #define _16x16_START \ |
| r9379 | r9380 | |
| 4421 | 4421 | |
| 4422 | 4422 | #define _32x32_SEQUENCE_2 \ |
| 4423 | 4423 | { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, \ |
| 4424 | | 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32, \ |
| 4425 | | 16*32,17*32,18*32,19*32,20*32,21*32,22*32,23*32, \ |
| 4424 | 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32, \ |
| 4425 | 16*32,17*32,18*32,19*32,20*32,21*32,22*32,23*32, \ |
| 4426 | 4426 | 24*32,25*32, 26*32, 27*32, 28*32, 29*32, 30*32, 31*32}, \ |
| 4427 | 4427 | |
| 4428 | 4428 | #define _32x32_SEQUENCE_2_FLIP \ |
| r9379 | r9380 | |
| 4552 | 4552 | gfx_element_mark_dirty(machine->gfx[15],(offset*2)/(SEGACD_BYTES_PER_TILE32)); |
| 4553 | 4553 | } |
| 4554 | 4554 | |
| 4555 | |
| 4555 | 4556 | // mame specific.. map registers to which tilemap cache we use |
| 4556 | 4557 | static int segacd_get_active_stampmap_tilemap(void) |
| 4557 | 4558 | { |
| 4558 | 4559 | return (segacd_stampsize & 0x6)>>1; |
| 4559 | 4560 | } |
| 4560 | 4561 | |
| 4562 | #if 0 |
| 4561 | 4563 | static void segacd_mark_stampmaps_dirty(void) |
| 4562 | 4564 | { |
| 4563 | 4565 | tilemap_mark_all_tiles_dirty(segacd_stampmap[segacd_get_active_stampmap_tilemap()]); |
| r9379 | r9380 | |
| 4567 | 4569 | //tilemap_mark_all_tiles_dirty(segacd_stampmap[2]); |
| 4568 | 4570 | //tilemap_mark_all_tiles_dirty(segacd_stampmap[3]); |
| 4569 | 4571 | } |
| 4572 | #endif |
| 4570 | 4573 | |
| 4571 | | static TILE_GET_INFO( get_stampmap_16x16_1x1_tile_info ) |
| 4574 | void SCD_GET_TILE_INFO_16x16_1x1( int& tile_region, int& tileno, int tile_index ) |
| 4572 | 4575 | { |
| 4573 | | int tile_region = 0; // 16x16 tiles |
| 4576 | tile_region = 0; // 16x16 tiles |
| 4574 | 4577 | int tile_base = (segacd_stampmap_base_address & 0xff80) * 4; |
| 4575 | 4578 | |
| 4576 | 4579 | int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff]; |
| 4577 | | int tileno = tiledat & 0x07ff; |
| 4580 | tileno = tiledat & 0x07ff; |
| 4578 | 4581 | int xflip = tiledat & 0x8000; |
| 4579 | 4582 | int roll = (tiledat & 0x6000)>>13; |
| 4580 | 4583 | |
| 4581 | 4584 | if (xflip) tile_region += 4; |
| 4582 | 4585 | tile_region+=roll; |
| 4583 | | |
| 4584 | | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4585 | 4586 | } |
| 4586 | 4587 | |
| 4587 | | static TILE_GET_INFO( get_stampmap_16x16_16x16_tile_info ) |
| 4588 | void SCD_GET_TILE_INFO_32x32_1x1( int& tile_region, int& tileno, int tile_index ) |
| 4588 | 4589 | { |
| 4589 | | int tile_region = 0; // 16x16 tiles |
| 4590 | | int tile_base = (0x8000) * 4; // fixed address in this mode |
| 4590 | tile_region = 8; // 32x32 tiles |
| 4591 | int tile_base = (segacd_stampmap_base_address & 0xffe0) * 4; |
| 4591 | 4592 | |
| 4592 | 4593 | int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff]; |
| 4593 | | int tileno = tiledat & 0x07ff; |
| 4594 | tileno = (tiledat & 0x07fc)>>2; |
| 4594 | 4595 | int xflip = tiledat & 0x8000; |
| 4595 | 4596 | int roll = (tiledat & 0x6000)>>13; |
| 4596 | 4597 | |
| 4597 | 4598 | if (xflip) tile_region += 4; |
| 4598 | 4599 | tile_region+=roll; |
| 4599 | | |
| 4600 | | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4601 | 4600 | } |
| 4602 | 4601 | |
| 4603 | | static TILE_GET_INFO( get_stampmap_32x32_1x1_tile_info ) |
| 4602 | |
| 4603 | void SCD_GET_TILE_INFO_16x16_16x16( int& tile_region, int& tileno, int tile_index ) |
| 4604 | 4604 | { |
| 4605 | | int tile_region = 8; // 32x32 tiles |
| 4606 | | int tile_base = (segacd_stampmap_base_address & 0xffe0) * 4; |
| 4605 | tile_region = 0; // 16x16 tiles |
| 4606 | int tile_base = (0x8000) * 4; // fixed address in this mode |
| 4607 | 4607 | |
| 4608 | 4608 | int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff]; |
| 4609 | | int tileno = (tiledat & 0x07fc)>>2; |
| 4609 | tileno = tiledat & 0x07ff; |
| 4610 | 4610 | int xflip = tiledat & 0x8000; |
| 4611 | 4611 | int roll = (tiledat & 0x6000)>>13; |
| 4612 | 4612 | |
| 4613 | 4613 | if (xflip) tile_region += 4; |
| 4614 | 4614 | tile_region+=roll; |
| 4615 | | |
| 4616 | | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4617 | 4615 | } |
| 4618 | 4616 | |
| 4619 | | static TILE_GET_INFO( get_stampmap_32x32_16x16_tile_info ) |
| 4617 | |
| 4618 | void SCD_GET_TILE_INFO_32x32_16x16( int& tile_region, int& tileno, int tile_index ) |
| 4620 | 4619 | { |
| 4621 | | int tile_region = 8; // 32x32 tiles |
| 4620 | tile_region = 8; // 32x32 tiles |
| 4622 | 4621 | int tile_base = (segacd_stampmap_base_address & 0xe000) * 4; |
| 4623 | 4622 | |
| 4624 | 4623 | int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff]; |
| 4625 | | int tileno = (tiledat & 0x07fc)>>2; |
| 4624 | tileno = (tiledat & 0x07fc)>>2; |
| 4626 | 4625 | int xflip = tiledat & 0x8000; |
| 4627 | 4626 | int roll = (tiledat & 0x6000)>>13; |
| 4628 | 4627 | |
| 4629 | 4628 | if (xflip) tile_region += 4; |
| 4630 | 4629 | tile_region+=roll; |
| 4630 | } |
| 4631 | 4631 | |
| 4632 | /* Tilemap callbacks (we don't actually use the tilemaps due to the excessive overhead */ |
| 4633 | |
| 4634 | |
| 4635 | |
| 4636 | static TILE_GET_INFO( get_stampmap_16x16_1x1_tile_info ) |
| 4637 | { |
| 4638 | int tile_region, tileno; |
| 4639 | SCD_GET_TILE_INFO_16x16_1x1(tile_region,tileno,(int)tile_index); |
| 4632 | 4640 | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4633 | 4641 | } |
| 4634 | 4642 | |
| 4643 | static TILE_GET_INFO( get_stampmap_32x32_1x1_tile_info ) |
| 4644 | { |
| 4645 | int tile_region, tileno; |
| 4646 | SCD_GET_TILE_INFO_32x32_1x1(tile_region,tileno,(int)tile_index); |
| 4647 | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4648 | } |
| 4635 | 4649 | |
| 4636 | 4650 | |
| 4651 | static TILE_GET_INFO( get_stampmap_16x16_16x16_tile_info ) |
| 4652 | { |
| 4653 | int tile_region, tileno; |
| 4654 | SCD_GET_TILE_INFO_16x16_16x16(tile_region,tileno,(int)tile_index); |
| 4655 | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4656 | } |
| 4657 | |
| 4658 | static TILE_GET_INFO( get_stampmap_32x32_16x16_tile_info ) |
| 4659 | { |
| 4660 | int tile_region, tileno; |
| 4661 | SCD_GET_TILE_INFO_32x32_16x16(tile_region,tileno,(int)tile_index); |
| 4662 | SET_TILE_INFO(tile_region, tileno, 0, 0); |
| 4663 | } |
| 4664 | |
| 4665 | // non-tilemap functions to get a pixel from a 'tilemap' based on the above, but looking up each pixel, as to avoid the heavy cache bitmap |
| 4666 | |
| 4667 | INLINE UINT8 get_stampmap_16x16_1x1_tile_info_pixel(running_machine* machine, UINT16 xpos, UINT16 ypos) |
| 4668 | { |
| 4669 | const int tilesize = 4; // 0xf pixels |
| 4670 | const int tilemapsize = 0x0f; |
| 4671 | |
| 4672 | int wraparound = segacd_stampsize&1; |
| 4673 | wraparound = 1; |
| 4674 | |
| 4675 | int xtile = xpos / (1<<tilesize); |
| 4676 | int ytile = ypos / (1<<tilesize); |
| 4677 | |
| 4678 | if (wraparound) |
| 4679 | { |
| 4680 | // wrap... |
| 4681 | xtile &= tilemapsize; |
| 4682 | ytile &= tilemapsize; |
| 4683 | } |
| 4684 | else |
| 4685 | { |
| 4686 | if (xtile>tilemapsize) return 0; |
| 4687 | if (xtile<0) return 0; |
| 4688 | |
| 4689 | if (ytile>tilemapsize) return 0; |
| 4690 | if (ytile<0) return 0; |
| 4691 | } |
| 4692 | |
| 4693 | int tile_index = (ytile * (tilemapsize+1)) + xtile; |
| 4694 | |
| 4695 | int tile_region, tileno; |
| 4696 | SCD_GET_TILE_INFO_16x16_1x1(tile_region,tileno,(int)tile_index); |
| 4697 | |
| 4698 | const gfx_element *gfx = machine->gfx[tile_region]; |
| 4699 | tileno %= gfx->total_elements; |
| 4700 | const UINT8* srcdata = gfx_element_get_data(gfx, tileno); |
| 4701 | return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))]; |
| 4702 | } |
| 4703 | |
| 4704 | INLINE UINT8 get_stampmap_32x32_1x1_tile_info_pixel(running_machine* machine, UINT16 xpos, UINT16 ypos) |
| 4705 | { |
| 4706 | const int tilesize = 5; // 0x1f pixels |
| 4707 | const int tilemapsize = 0x07; |
| 4708 | |
| 4709 | int wraparound = segacd_stampsize&1; |
| 4710 | wraparound = 1; |
| 4711 | |
| 4712 | int xtile = xpos / (1<<tilesize); |
| 4713 | int ytile = ypos / (1<<tilesize); |
| 4714 | |
| 4715 | if (wraparound) |
| 4716 | { |
| 4717 | // wrap... |
| 4718 | xtile &= tilemapsize; |
| 4719 | ytile &= tilemapsize; |
| 4720 | } |
| 4721 | else |
| 4722 | { |
| 4723 | if (xtile>tilemapsize) return 0; |
| 4724 | if (xtile<0) return 0; |
| 4725 | |
| 4726 | if (ytile>tilemapsize) return 0; |
| 4727 | if (ytile<0) return 0; |
| 4728 | } |
| 4729 | |
| 4730 | int tile_index = (ytile * (tilemapsize+1)) + xtile; |
| 4731 | |
| 4732 | int tile_region, tileno; |
| 4733 | SCD_GET_TILE_INFO_32x32_1x1(tile_region,tileno,(int)tile_index); |
| 4734 | |
| 4735 | const gfx_element *gfx = machine->gfx[tile_region]; |
| 4736 | tileno %= gfx->total_elements; |
| 4737 | const UINT8* srcdata = gfx_element_get_data(gfx, tileno); |
| 4738 | return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))]; |
| 4739 | } |
| 4740 | |
| 4741 | INLINE UINT8 get_stampmap_16x16_16x16_tile_info_pixel(running_machine* machine, UINT16 xpos, UINT16 ypos) |
| 4742 | { |
| 4743 | const int tilesize = 4; // 0xf pixels |
| 4744 | const int tilemapsize = 0xff; |
| 4745 | |
| 4746 | int wraparound = segacd_stampsize&1; |
| 4747 | wraparound = 1; |
| 4748 | |
| 4749 | int xtile = xpos / (1<<tilesize); |
| 4750 | int ytile = ypos / (1<<tilesize); |
| 4751 | |
| 4752 | if (wraparound) |
| 4753 | { |
| 4754 | // wrap... |
| 4755 | xtile &= tilemapsize; |
| 4756 | ytile &= tilemapsize; |
| 4757 | } |
| 4758 | else |
| 4759 | { |
| 4760 | if (xtile>tilemapsize) return 0; |
| 4761 | if (xtile<0) return 0; |
| 4762 | |
| 4763 | if (ytile>tilemapsize) return 0; |
| 4764 | if (ytile<0) return 0; |
| 4765 | } |
| 4766 | |
| 4767 | int tile_index = (ytile * (tilemapsize+1)) + xtile; |
| 4768 | |
| 4769 | int tile_region, tileno; |
| 4770 | SCD_GET_TILE_INFO_16x16_16x16(tile_region,tileno,(int)tile_index); |
| 4771 | |
| 4772 | const gfx_element *gfx = machine->gfx[tile_region]; |
| 4773 | tileno %= gfx->total_elements; |
| 4774 | const UINT8* srcdata = gfx_element_get_data(gfx, tileno); |
| 4775 | return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))]; |
| 4776 | } |
| 4777 | |
| 4778 | INLINE UINT8 get_stampmap_32x32_16x16_tile_info_pixel(running_machine* machine, UINT16 xpos, UINT16 ypos) |
| 4779 | { |
| 4780 | const int tilesize = 5; // 0x1f pixels |
| 4781 | const int tilemapsize = 0x7f; |
| 4782 | |
| 4783 | int wraparound = segacd_stampsize&1; |
| 4784 | wraparound = 1; |
| 4785 | |
| 4786 | int xtile = xpos / (1<<tilesize); |
| 4787 | int ytile = ypos / (1<<tilesize); |
| 4788 | |
| 4789 | if (wraparound) |
| 4790 | { |
| 4791 | // wrap... |
| 4792 | xtile &= tilemapsize; |
| 4793 | ytile &= tilemapsize; |
| 4794 | } |
| 4795 | else |
| 4796 | { |
| 4797 | if (xtile>tilemapsize) return 0; |
| 4798 | if (xtile<0) return 0; |
| 4799 | |
| 4800 | if (ytile>tilemapsize) return 0; |
| 4801 | if (ytile<0) return 0; |
| 4802 | } |
| 4803 | |
| 4804 | int tile_index = (ytile * (tilemapsize+1)) + xtile; |
| 4805 | |
| 4806 | int tile_region, tileno; |
| 4807 | SCD_GET_TILE_INFO_32x32_16x16(tile_region,tileno,(int)tile_index); |
| 4808 | |
| 4809 | const gfx_element *gfx = machine->gfx[tile_region]; |
| 4810 | tileno %= gfx->total_elements; |
| 4811 | const UINT8* srcdata = gfx_element_get_data(gfx, tileno); |
| 4812 | return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))]; |
| 4813 | } |
| 4814 | |
| 4815 | |
| 4816 | |
| 4817 | |
| 4637 | 4818 | /* main CPU map set up in INIT */ |
| 4638 | 4819 | void segacd_init_main_cpu( running_machine* machine ) |
| 4639 | 4820 | { |
| r9379 | r9380 | |
| 4693 | 4874 | |
| 4694 | 4875 | /* as a temporary measure we use the MAME tilemaps, this is hideously inefficient as we have to mark the active one as |
| 4695 | 4876 | dirty before each operation due to the RAM based tiles. For the larger tilemaps this means we have to re-render a 4096x4096 |
| 4696 | | bitmap to the tilemap cache on each blit operation just to copy the few needed tiles out of it, needless to say, this is SLOW. |
| 4697 | | Eventually the tilemaps will be replaced with a get_pixel function which will perform all the needed lookups on a per-pixel |
| 4698 | | basis instead of re-rendering the whole thing */ |
| 4877 | bitmap to the tilemap cache on each blit operation just to copy the few needed tiles out of it, needless to say, this is SLOW. |
| 4878 | Eventually the tilemaps will be replaced with a get_pixel function which will perform all the needed lookups on a per-pixel |
| 4879 | basis instead of re-rendering the whole thing */ |
| 4699 | 4880 | segacd_stampmap[0] = tilemap_create(machine, get_stampmap_16x16_1x1_tile_info, tilemap_scan_rows, 16, 16, 16, 16); |
| 4700 | 4881 | segacd_stampmap[1] = tilemap_create(machine, get_stampmap_32x32_1x1_tile_info, tilemap_scan_rows, 32, 32, 8, 8); |
| 4701 | 4882 | segacd_stampmap[2] = tilemap_create(machine, get_stampmap_16x16_16x16_tile_info, tilemap_scan_rows, 16, 16, 256, 256); // 128kb! |
| r9379 | r9380 | |
| 4963 | 5144 | // ... |
| 4964 | 5145 | |
| 4965 | 5146 | /*segacd_cdd.status = 0; |
| 4966 | | segacd_cdd.minute = 0; |
| 4967 | | segacd_cdd.seconds = 0; |
| 4968 | | segacd_cdd.frame = 0; |
| 4969 | | segacd_cdd.ext = 0;*/ |
| 5147 | segacd_cdd.minute = 0; |
| 5148 | segacd_cdd.seconds = 0; |
| 5149 | segacd_cdd.frame = 0; |
| 5150 | segacd_cdd.ext = 0;*/ |
| 4970 | 5151 | |
| 4971 | 5152 | cdd_hock_irq(machine,1); |
| 4972 | 5153 | } |
| r9379 | r9380 | |
| 5104 | 5285 | } |
| 5105 | 5286 | } |
| 5106 | 5287 | |
| 5288 | // these functions won't cope if |
| 5289 | // |
| 5290 | // the lower 3 bits of segacd_imagebuffer_hdot_size are set |
| 5291 | |
| 5292 | // this really needs to be doing it's own lookups rather than depending on the inefficient MAME cache.. |
| 5293 | INLINE UINT8 read_pixel_from_stampmap( running_machine* machine, bitmap_t* srcbitmap, UINT16 x, UINT16 y) |
| 5294 | { |
| 5295 | /* |
| 5296 | if (!srcbitmap) |
| 5297 | { |
| 5298 | return mame_rand(machine); |
| 5299 | } |
| 5300 | |
| 5301 | if (x >= srcbitmap->width) return 0; |
| 5302 | if (y >= srcbitmap->height) return 0; |
| 5303 | |
| 5304 | UINT16* cacheptr = BITMAP_ADDR16( srcbitmap, y, x); |
| 5305 | |
| 5306 | return cacheptr[0] & 0xf; |
| 5307 | */ |
| 5308 | |
| 5309 | switch (segacd_get_active_stampmap_tilemap()&3) |
| 5310 | { |
| 5311 | case 0x00: return get_stampmap_16x16_1x1_tile_info_pixel( machine, x, y ); |
| 5312 | case 0x01: return get_stampmap_32x32_1x1_tile_info_pixel( machine, x, y ); |
| 5313 | case 0x02: return get_stampmap_16x16_16x16_tile_info_pixel( machine, x, y ); |
| 5314 | case 0x03: return get_stampmap_32x32_16x16_tile_info_pixel( machine, x, y ); |
| 5315 | } |
| 5316 | |
| 5317 | return 0; |
| 5318 | } |
| 5319 | |
| 5320 | INLINE void write_pixel_to_imagebuffer( running_machine* machine, UINT32 pix, int line, int xpos ) |
| 5321 | { |
| 5322 | |
| 5323 | UINT32 bufferstart = (segacd_imagebuffer_start_address&0xfff8)*2; |
| 5324 | UINT32 bufferend = bufferstart + (((segacd_imagebuffer_vcell_size+1) * (segacd_imagebuffer_hdot_size>>3)*0x20)/2); |
| 5325 | UINT32 offset; |
| 5326 | |
| 5327 | offset = bufferstart+(((segacd_imagebuffer_vcell_size+1)*0x10)*xpos); |
| 5328 | |
| 5329 | // lines of each output cell |
| 5330 | offset+= (line*2); |
| 5331 | |
| 5332 | while (offset>=bufferend) |
| 5333 | offset-= bufferend; |
| 5334 | |
| 5335 | |
| 5336 | switch (segacd_memory_priority_mode) |
| 5337 | { |
| 5338 | case 0x00: // normal write, just write the data |
| 5339 | segacd_dataram[offset] = pix >> 16; |
| 5340 | segacd_dataram[offset+1] = pix & 0xffff; |
| 5341 | break; |
| 5342 | |
| 5343 | case 0x01: // underwrite, only write if the existing data is 0 |
| 5344 | if ((segacd_dataram[offset]&0xf000) == 0x0000) segacd_dataram[offset] |= (pix>>16)&0xf000; |
| 5345 | if ((segacd_dataram[offset]&0x0f00) == 0x0000) segacd_dataram[offset] |= (pix>>16)&0x0f00; |
| 5346 | if ((segacd_dataram[offset]&0x00f0) == 0x0000) segacd_dataram[offset] |= (pix>>16)&0x00f0; |
| 5347 | if ((segacd_dataram[offset]&0x000f) == 0x0000) segacd_dataram[offset] |= (pix>>16)&0x000f; |
| 5348 | if ((segacd_dataram[offset+1]&0xf000) == 0x0000) segacd_dataram[offset+1] |= (pix)&0xf000; |
| 5349 | if ((segacd_dataram[offset+1]&0x0f00) == 0x0000) segacd_dataram[offset+1] |= (pix)&0x0f00; |
| 5350 | if ((segacd_dataram[offset+1]&0x00f0) == 0x0000) segacd_dataram[offset+1] |= (pix)&0x00f0; |
| 5351 | if ((segacd_dataram[offset+1]&0x000f) == 0x0000) segacd_dataram[offset+1] |= (pix)&0x000f; |
| 5352 | break; |
| 5353 | |
| 5354 | case 0x02: // overwrite, only write non-zero data |
| 5355 | if ((pix>>16)&0xf000) segacd_dataram[offset] = (segacd_dataram[offset] & 0x0fff) | ((pix>>16)&0xf000); |
| 5356 | if ((pix>>16)&0x0f00) segacd_dataram[offset] = (segacd_dataram[offset] & 0xf0ff) | ((pix>>16)&0x0f00); |
| 5357 | if ((pix>>16)&0x00f0) segacd_dataram[offset] = (segacd_dataram[offset] & 0xff0f) | ((pix>>16)&0x00f0); |
| 5358 | if ((pix>>16)&0x000f) segacd_dataram[offset] = (segacd_dataram[offset] & 0xfff0) | ((pix>>16)&0x000f); |
| 5359 | if ((pix)&0xf000) segacd_dataram[offset+1] = (segacd_dataram[offset+1] & 0x0fff) | ((pix)&0xf000); |
| 5360 | if ((pix)&0x0f00) segacd_dataram[offset+1] = (segacd_dataram[offset+1] & 0xf0ff) | ((pix)&0x0f00); |
| 5361 | if ((pix)&0x00f0) segacd_dataram[offset+1] = (segacd_dataram[offset+1] & 0xff0f) | ((pix)&0x00f0); |
| 5362 | if ((pix)&0x000f) segacd_dataram[offset+1] = (segacd_dataram[offset+1] & 0xfff0) | ((pix)&0x000f); |
| 5363 | break; |
| 5364 | |
| 5365 | default: |
| 5366 | case 0x03: // invalid? |
| 5367 | segacd_dataram[offset] = mame_rand(machine); |
| 5368 | segacd_dataram[offset+1] = mame_rand(machine); |
| 5369 | break; |
| 5370 | |
| 5371 | } |
| 5372 | |
| 5373 | segacd_mark_tiles_dirty(machine, offset); |
| 5374 | segacd_mark_tiles_dirty(machine, offset+1); |
| 5375 | |
| 5376 | } |
| 5377 | |
| 5107 | 5378 | // this triggers the conversion operation, which will cause an IRQ1 when finished |
| 5108 | 5379 | WRITE16_HANDLER( segacd_trace_vector_base_address_w ) |
| 5109 | 5380 | { |
| r9379 | r9380 | |
| 5112 | 5383 | printf("ILLEGAL: segacd_trace_vector_base_address_w %04x %04x in mode 1!\n",data,mem_mask); |
| 5113 | 5384 | } |
| 5114 | 5385 | |
| 5115 | | logerror("segacd_trace_vector_base_address_w %04x %04x\n",data,mem_mask); |
| 5386 | //printf("segacd_trace_vector_base_address_w %04x %04x\n",data,mem_mask); |
| 5116 | 5387 | |
| 5117 | 5388 | { |
| 5118 | 5389 | int base = (data & 0xfffe) * 4; |
| r9379 | r9380 | |
| 5120 | 5391 | logerror("actual base = %06x\n", base + 0x80000); |
| 5121 | 5392 | |
| 5122 | 5393 | // nasty nasty nasty |
| 5123 | | segacd_mark_stampmaps_dirty(); |
| 5394 | //segacd_mark_stampmaps_dirty(); |
| 5124 | 5395 | |
| 5125 | 5396 | segacd_conversion_active = 1; |
| 5126 | 5397 | |
| r9379 | r9380 | |
| 5128 | 5399 | timer_adjust_oneshot(segacd_gfx_conversion_timer, ATTOTIME_IN_HZ(1000), 0); |
| 5129 | 5400 | |
| 5130 | 5401 | |
| 5131 | | int i; |
| 5402 | int line; |
| 5403 | //bitmap_t *srcbitmap = tilemap_get_pixmap(segacd_stampmap[segacd_get_active_stampmap_tilemap()]); |
| 5404 | bitmap_t *srcbitmap = 0; |
| 5132 | 5405 | |
| 5133 | | for (i=0;i<segacd_imagebuffer_vdot_size;i++) |
| 5406 | for (line=0;line<segacd_imagebuffer_vdot_size;line++) |
| 5134 | 5407 | { |
| 5135 | | int currbase = base + i * 0x8; |
| 5136 | | UINT16 param1 = segacd_dataram[(currbase+0x0)>>1]; |
| 5137 | | UINT16 param2 = segacd_dataram[(currbase+0x2)>>1]; |
| 5138 | | UINT16 param3 = segacd_dataram[(currbase+0x4)>>1]; |
| 5139 | | UINT16 param4 = segacd_dataram[(currbase+0x6)>>1]; |
| 5408 | int currbase = base + line * 0x8; |
| 5409 | UINT16 param1,param2,param3,param4; |
| 5410 | |
| 5411 | param1 = segacd_dataram[(currbase+0x0)>>1]; |
| 5412 | param2 = segacd_dataram[(currbase+0x2)>>1]; |
| 5413 | param3 = segacd_dataram[(currbase+0x4)>>1]; |
| 5414 | param4 = segacd_dataram[(currbase+0x6)>>1]; |
| 5140 | 5415 | |
| 5141 | 5416 | |
| 5142 | | logerror("%06x: %04x %04x %04x %04x\n", currbase, param1, param2, param3, param4); |
| 5417 | //printf("%06x: %04x (%d) %04x (%d) %04x %04x\n", currbase, param1, param1>>3, param2, param2>>3, param3, param4); |
| 5143 | 5418 | |
| 5144 | | } |
| 5145 | | |
| 5146 | | { |
| 5147 | | // not real code.. yet |
| 5148 | | // should copy part of the stamp into the imagebuffer area using the rotation / zooming parameters given |
| 5149 | | // (while we're using the MAME tilemaps that means, part of the tilemap cache into the ram buffer for the image) |
| 5150 | | |
| 5151 | | bitmap_t *srcbitmap = tilemap_get_pixmap(segacd_stampmap[segacd_get_active_stampmap_tilemap()]); |
| 5152 | | UINT16* x; |
| 5153 | | x = BITMAP_ADDR16(srcbitmap,10,10); |
| 5154 | | UINT16 datax; |
| 5155 | | datax = x[0]; |
| 5156 | | |
| 5157 | | // I don't quite understand what happens if the lower bits of hdotsize are set.. do we end up rounding up? |
| 5158 | | // this 'buffersize' clearly fills the frame for the SegaCD logo screen at least |
| 5159 | | int buffersize = ((segacd_imagebuffer_vcell_size+1) * (segacd_imagebuffer_hdot_size>>3)*0x20)/2; // 0x20 = 8x8x4 tile, /2 due to word offset |
| 5160 | | //buffersize -= 8; |
| 5161 | | |
| 5162 | | for (int i=0;i< buffersize ;i++) |
| 5419 | int xbase = param1 << 8; |
| 5420 | int ybase = param2 << 8; |
| 5421 | int count; |
| 5422 | |
| 5423 | for (count=0;count<(segacd_imagebuffer_hdot_size>>3);count++) |
| 5163 | 5424 | { |
| 5164 | | int offsetx = ((segacd_imagebuffer_start_address&0xfff8)*2)+i; |
| 5425 | int i; |
| 5426 | UINT32 pixblock = 0x00000000; |
| 5427 | for (i=7*4;i>=0;i-=4) |
| 5428 | { |
| 5429 | pixblock |= read_pixel_from_stampmap(space->machine, srcbitmap, xbase>>(3+8), ybase>>(3+8)) << (i); |
| 5430 | |
| 5431 | if (param3&0x8000) |
| 5432 | xbase -= param3&0x7fff; |
| 5433 | else |
| 5434 | xbase += param3&0x7fff; |
| 5435 | |
| 5436 | if (param4&0x8000) |
| 5437 | ybase -= param4&0x7fff; |
| 5438 | else |
| 5439 | ybase += param4&0x7fff; |
| 5440 | |
| 5165 | 5441 | |
| 5166 | | //printf("data write %08x\n", offsetx*2); |
| 5167 | | |
| 5168 | | |
| 5169 | | segacd_dataram[offsetx]=mame_rand(space->machine); |
| 5170 | | |
| 5171 | | segacd_mark_tiles_dirty(space->machine, offsetx); |
| 5442 | } |
| 5443 | |
| 5444 | |
| 5445 | |
| 5446 | |
| 5447 | write_pixel_to_imagebuffer(space->machine, pixblock, line, count); |
| 5172 | 5448 | } |
| 5173 | 5449 | |
| 5174 | | |
| 5175 | 5450 | } |
| 5176 | | |
| 5177 | 5451 | } |
| 5178 | 5452 | |
| 5179 | 5453 | } |
| r9379 | r9380 | |
| 5186 | 5460 | |
| 5187 | 5461 | WRITE16_HANDLER( segacd_imagebuffer_vdot_size_w ) |
| 5188 | 5462 | { |
| 5189 | | printf("segacd_imagebuffer_vdot_size_w %04x %04x\n",data,mem_mask); |
| 5463 | //printf("segacd_imagebuffer_vdot_size_w %04x %04x\n",data,mem_mask); |
| 5190 | 5464 | COMBINE_DATA(&segacd_imagebuffer_vdot_size); |
| 5191 | 5465 | } |
| 5192 | 5466 | |
| r9379 | r9380 | |
| 5217 | 5491 | { |
| 5218 | 5492 | COMBINE_DATA(&segacd_imagebuffer_start_address); |
| 5219 | 5493 | |
| 5220 | | int base = (segacd_imagebuffer_start_address & 0xfffe) * 4; |
| 5221 | | |
| 5222 | | printf("segacd_imagebuffer_start_address_w %04x %04x (actual base = %06x)\n", data, segacd_imagebuffer_start_address, base); |
| 5494 | //int base = (segacd_imagebuffer_start_address & 0xfffe) * 4; |
| 5495 | //printf("segacd_imagebuffer_start_address_w %04x %04x (actual base = %06x)\n", data, segacd_imagebuffer_start_address, base); |
| 5223 | 5496 | } |
| 5224 | 5497 | |
| 5225 | 5498 | static READ16_HANDLER( segacd_imagebuffer_offset_r ) |
| r9379 | r9380 | |
| 5270 | 5543 | |
| 5271 | 5544 | AM_RANGE(0xff8004 ,0xff8005) AM_READWRITE(segacd_cdc_mode_address_r, segacd_cdc_mode_address_w) |
| 5272 | 5545 | AM_RANGE(0xff8006 ,0xff8007) AM_READWRITE(segacd_cdc_data_r, segacd_cdc_data_w) |
| 5273 | | // AM_RANGE(0xff8008, 0xff8009) // CDC Host Data |
| 5274 | | // AM_RANGE(0xff800a, 0xff800b) // CDC DMA Address |
| 5275 | | // AM_RANGE(0xff800c, 0xff800d) // Stopwatch timer |
| 5546 | // AM_RANGE(0xff8008, 0xff8009) // CDC Host Data |
| 5547 | // AM_RANGE(0xff800a, 0xff800b) // CDC DMA Address |
| 5548 | // AM_RANGE(0xff800c, 0xff800d) // Stopwatch timer |
| 5276 | 5549 | AM_RANGE(0xff800e ,0xff800f) AM_READWRITE(segacd_comms_flags_r, segacd_comms_flags_subcpu_w) |
| 5277 | 5550 | AM_RANGE(0xff8010 ,0xff801f) AM_READWRITE(segacd_comms_sub_part1_r, segacd_comms_sub_part1_w) |
| 5278 | 5551 | AM_RANGE(0xff8020 ,0xff802f) AM_READWRITE(segacd_comms_sub_part2_r, segacd_comms_sub_part2_w) |
| 5279 | | // AM_RANGE(0xff8030, 0xff8031) // Timer W/INT3 |
| 5552 | // AM_RANGE(0xff8030, 0xff8031) // Timer W/INT3 |
| 5280 | 5553 | AM_RANGE(0xff8032, 0xff8033) AM_READWRITE(segacd_irq_mask_r,segacd_irq_mask_w) |
| 5281 | 5554 | AM_RANGE(0xff8034, 0xff8035) AM_NOP // CD Fader |
| 5282 | 5555 | AM_RANGE(0xff8036, 0xff8037) AM_READWRITE(segacd_cdd_ctrl_r,segacd_cdd_ctrl_w) |
| 5283 | 5556 | AM_RANGE(0xff8038, 0xff8041) AM_READ8(segacd_cdd_rx_r,0xffff) |
| 5284 | 5557 | AM_RANGE(0xff8042, 0xff804b) AM_WRITE8(segacd_cdd_tx_w,0xffff) |
| 5285 | | // AM_RANGE(0xff804c, 0xff804d) // Font Color |
| 5286 | | // AM_RANGE(0xff804e, 0xff804f) // Font bit |
| 5287 | | // AM_RANGE(0xff8050, 0xff8057) // Font data (read only) |
| 5558 | // AM_RANGE(0xff804c, 0xff804d) // Font Color |
| 5559 | // AM_RANGE(0xff804e, 0xff804f) // Font bit |
| 5560 | // AM_RANGE(0xff8050, 0xff8057) // Font data (read only) |
| 5288 | 5561 | AM_RANGE(0xff8058, 0xff8059) AM_READWRITE(segacd_stampsize_r, segacd_stampsize_w) // Stamp size |
| 5289 | 5562 | AM_RANGE(0xff805a, 0xff805b) AM_READWRITE(segacd_stampmap_base_address_r, segacd_stampmap_base_address_w) // Stamp map base address |
| 5290 | 5563 | AM_RANGE(0xff805c, 0xff805d) AM_READWRITE(segacd_imagebuffer_vcell_size_r, segacd_imagebuffer_vcell_size_w)// Image buffer V cell size |
| r9379 | r9380 | |
| 5293 | 5566 | AM_RANGE(0xff8062, 0xff8063) AM_READWRITE(segacd_imagebuffer_hdot_size_r, segacd_imagebuffer_hdot_size_w) // Image buffer H dot size |
| 5294 | 5567 | AM_RANGE(0xff8064, 0xff8065) AM_READWRITE(segacd_imagebuffer_vdot_size_r, segacd_imagebuffer_vdot_size_w ) // Image buffer V dot size |
| 5295 | 5568 | AM_RANGE(0xff8066, 0xff8067) AM_WRITE(segacd_trace_vector_base_address_w)// Trace vector base address |
| 5296 | | // AM_RANGE(0xff8068, 0xff8069) // Subcode address |
| 5569 | // AM_RANGE(0xff8068, 0xff8069) // Subcode address |
| 5297 | 5570 | |
| 5298 | | // AM_RANGE(0xff8100, 0xff817f) // Subcode buffer area |
| 5299 | | // AM_RANGE(0xff8180, 0xff81ff) // mirror of subcode buffer area |
| 5571 | // AM_RANGE(0xff8100, 0xff817f) // Subcode buffer area |
| 5572 | // AM_RANGE(0xff8180, 0xff81ff) // mirror of subcode buffer area |
| 5300 | 5573 | |
| 5301 | 5574 | ADDRESS_MAP_END |
| 5302 | 5575 | |