diff options
-rw-r--r-- | src/mame/drivers/naomi.c | 36 | ||||
-rw-r--r-- | src/mame/includes/dc.h | 14 | ||||
-rw-r--r-- | src/mame/machine/dc.c | 20 | ||||
-rw-r--r-- | src/mame/video/dc.c | 445 |
4 files changed, 380 insertions, 135 deletions
diff --git a/src/mame/drivers/naomi.c b/src/mame/drivers/naomi.c index ab921ef87fd..7545c961587 100644 --- a/src/mame/drivers/naomi.c +++ b/src/mame/drivers/naomi.c @@ -55,8 +55,8 @@ Notes: on power-up. JP1 - set to 2-3. Alt setting is 1-2 JP4 - set to 2-3. Alt setting is 1-2 - 93C46 - 128 bytes EEPROM - A179B 96K - ?, made by TI + 93C46 - 128 bytes serial EEPROM + A179B 96K - TI SN75179B Differential driver and receiver pair (like RS485) ADM485 - Analog Devices ADM485 BIOS.IC27 - 27C160 EPROM 5264165 - Hitachi 5264165FTTA60 (video RAM) @@ -662,11 +662,11 @@ Notes: #include "dc.h" #define CPU_CLOCK (200000000) - /* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */ + /* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */ static const struct sh4_config sh4cpu_config = { 1, 0, 1, 0, 0, 0, 1, 1, 0, CPU_CLOCK }; static UINT32 *dc_sound_ram; -static UINT32 rom_offset, dma_count; +static UINT32 rom_offset, rom_offset_flags, dma_count; UINT32 dma_offset; static INTERRUPT_GEN( naomi_vblank ) @@ -716,18 +716,19 @@ static WRITE64_HANDLER( naomi_unknown1_w ) Dimm board registers (add more information if you find it): - NAOMI_DIMM_COMMAND = 5f703c (16 bit): + Name: Naomi Dimm Bd. + NAOMI_DIMM_COMMAND = 5f703c 14000014 (16 bit): if bits all 1 no dimm board present and other registers not used bit 15: during an interrupt is 1 if the dimm board has a command to be executed bit 14-9: 6 bit command number (naomi bios understands 0 1 3 4 5 6 8 9 a) - bit 8-0: higher 9 bits of 25 bit offset parameter - NAOMI_DIMM_OFFSETL = 5f7040 (16 bit): - bit 15-0: lower 16 bits of 25 bit offset parameter - NAOMI_DIMM_PARAMETERL = 5f7044 (16 bit) - NAOMI_DIMM_PARAMETERH = 5f7048 (16 bit) - NAOMI_DIMM_STATUS = 5f704c (16 bit): - bit 0: when read as 1 means something has happened write it to 0 to clear - bit 8: written to 1 at the end of the interrupt routine (signals command response available to dimm board ?) + bit 7-0: higher 8 bits of 24 bit offset parameter + NAOMI_DIMM_OFFSETL = 5f7040 14000018 (16 bit): + bit 15-0: lower 16 bits of 24 bit offset parameter + NAOMI_DIMM_PARAMETERL = 5f7044 1400001c (16 bit) + NAOMI_DIMM_PARAMETERH = 5f7048 14000020 (16 bit) + NAOMI_DIMM_STATUS = 5f704c 14000024 (16 bit): + bit 0: when 0 signal interrupt from naomi to dimm board + bit 8: when 0 signal interrupt from dimm board to naomi */ // NOTE: all accesses are 16 or 32 bits wide but only 16 bits are valid @@ -812,6 +813,7 @@ static WRITE64_HANDLER( naomi_rom_board_w ) // ROM_OFFSETH rom_offset &= 0xffff; rom_offset |= (data & 0x1fff)<<16; + rom_offset_flags = data >> 13; } else if ((offset == 0) && ACCESSING_BITS_32_47) { @@ -819,6 +821,12 @@ static WRITE64_HANDLER( naomi_rom_board_w ) rom_offset &= 0xffff0000; rom_offset |= ((data >> 32) & 0xffff); } + if ((offset == 1) && ACCESSING_BITS_0_15) + { + // ROM_DATA + // Doa2 writes here (16 bit decryption key ?) + mame_printf_verbose("ROM: write %llx to 5f7008 (PC=%x)\n", data, activecpu_get_pc()); + } else if ((offset == 15) && ACCESSING_BITS_0_15) { // NAOMI_BOARDID_WRITE @@ -2529,7 +2537,7 @@ ROM_START( doa2 ) NAOMI_BIOS ROM_REGION( 0xb000000, "user1", 0) - ROM_LOAD("epr22121.22", 0x0000000, 0x0400000, CRC(30f93b5e) SHA1(0e33383e7ab9a721dab4708b063598f2e9c9f2e7) ) + ROM_LOAD("epr22121.22", 0x0000000, 0x0400000, CRC(30f93b5e) SHA1(0e33383e7ab9a721dab4708b063598f2e9c9f2e7) ) // partially encrypted ROM_LOAD("mpr-22100.ic1", 0x0800000, 0x0800000, CRC(92a53e5e) SHA1(87fcdeee9c4e65a3eb6eb345eed85d4f2df26c3c) ) ROM_LOAD("mpr-22101.ic2", 0x1000000, 0x0800000, CRC(14cd7dce) SHA1(5df14a5dad14bc922b4f88881dc2e9c8e74d6170) ) diff --git a/src/mame/includes/dc.h b/src/mame/includes/dc.h index 595298ddf5b..8cb92c97c10 100644 --- a/src/mame/includes/dc.h +++ b/src/mame/includes/dc.h @@ -113,7 +113,15 @@ VIDEO_UPDATE(dc); #define REVISION ((0x005F8004-0x005F8000)/4) #define SOFTRESET ((0x005F8008-0x005F8000)/4) #define STARTRENDER ((0x005F8014-0x005F8000)/4) +#define PARAM_BASE ((0x005F8020-0x005F8000)/4) #define VO_BORDER_COL ((0x005F8040-0x005F8000)/4) +#define FB_W_CTRL ((0x005F8048-0x005F8000)/4) +#define FB_W_LINESTRIDE ((0x005F804c-0x005F8000)/4) +#define FB_R_SOF1 ((0x005F8050-0x005F8000)/4) +#define FB_R_SOF2 ((0x005F8054-0x005F8000)/4) +#define FB_R_SIZE ((0x005F805c-0x005F8000)/4) +#define FB_W_SOF1 ((0x005F8060-0x005F8000)/4) +#define FB_W_SOF2 ((0x005F8064-0x005F8000)/4) #define VO_CONTROL ((0x005F80E8-0x005F8000)/4) #define PAL_RAM_CTRL ((0x005F8108-0x005F8000)/4) #define ISP_BACKGND_T ((0x005F808C-0x005F8000)/4) @@ -131,6 +139,7 @@ VIDEO_UPDATE(dc); #define TA_NEXT_OPB ((0x005F8134-0x005F8000)/4) #define TA_ITP_CURRENT ((0x005F8138-0x005F8000)/4) +/* ------------- normal interrupts ------------- */ #define IST_EOR_VIDEO 0x00000001 #define IST_EOR_ISP 0x00000002 #define IST_EOR_TSP 0x00000004 @@ -154,5 +163,10 @@ VIDEO_UPDATE(dc); #define IST_DMA_SORT 0x00100000 #define IST_G1G2EXTSTAT 0x40000000 #define IST_ERROR 0x80000000 +/* ------------ external interrupts ------------ */ +#define IST_EXT_EXTERNAL 0x00000008 +#define IST_EXT_MODEM 0x00000004 +#define IST_EXT_AICA 0x00000002 +#define IST_EXT_GDROM 0x00000001 #endif diff --git a/src/mame/machine/dc.c b/src/mame/machine/dc.c index eac56a6f6e0..2bb57516b4e 100644 --- a/src/mame/machine/dc.c +++ b/src/mame/machine/dc.c @@ -16,6 +16,7 @@ #define DEBUG_SYSCTRL (0) #define DEBUG_MAPLE (0) +#define DEBUG_MAPLE_REGS (0) #if DEBUG_SYSCTRL static const char *const sysctrl_names[] = @@ -289,7 +290,7 @@ READ64_HANDLER( dc_maple_r ) reg = decode_reg_64(offset, mem_mask, &shift); - #if DEBUG_MAPLE + #if DEBUG_MAPLE_REGS mame_printf_verbose("MAPLE: Unmapped read %08x\n", 0x5f6c00+reg*4); #endif return (UINT64)maple_regs[reg] << shift; @@ -313,7 +314,7 @@ WRITE64_HANDLER( dc_maple_w ) dat = (UINT32)(data >> shift); old = maple_regs[reg]; - #if DEBUG_MAPLE + #if DEBUG_MAPLE_REGS mame_printf_verbose("MAPLE: [%08x=%x] write %llx to %x (reg %x: %s), mask %llx\n", 0x5f6c00+reg*4, dat, data >> shift, offset, reg, maple_names[reg], mem_mask); #endif @@ -353,6 +354,8 @@ WRITE64_HANDLER( dc_maple_w ) if (pattern == 0) { + if (port > 0) + buff[0]=0xffffffff; switch (command) { case 1: @@ -398,6 +401,9 @@ WRITE64_HANDLER( dc_maple_w ) cpunum_set_info_ptr(0,CPUINFO_PTR_SH4_EXTERNAL_DDT_DMA,&ddtdata); subcommand = buff[0] & 0xff; + #if DEBUG_MAPLE + mame_printf_verbose("MAPLE: transfer command %d port %d subcommand %d\n", command, port, subcommand); + #endif if (subcommand == 3) // read data { for (a=0;a < 0x80;a+=4) @@ -594,6 +600,8 @@ WRITE64_HANDLER( dc_maple_w ) #if DEBUG_MAPLE mame_printf_verbose("MAPLE: unknown transfer command %d port %d\n", command, port); #endif + ddtdata.length=1; + buff[0]=0xffffffff; break; } } @@ -609,10 +617,16 @@ WRITE64_HANDLER( dc_maple_w ) // skip fixed packet header dat += 8; // skip transfer data - dat += ((command & 0xff) + 1) * 4; + dat += (length + 1) * 4; } // do transfers maple_regs[reg] = 0; } + else + { + #if DEBUG_MAPLE + mame_printf_verbose("MAPLE: hardware trigger not supported yet\n"); + #endif + } } break; } diff --git a/src/mame/video/dc.c b/src/mame/video/dc.c index 16ea778c368..b15b7267edb 100644 --- a/src/mame/video/dc.c +++ b/src/mame/video/dc.c @@ -30,10 +30,6 @@ static UINT32 tafifo_buff[32]; static emu_timer *vbout_timer; typedef struct { - int tafifo_pos, tafifo_mask, tafifo_vertexwords, tafifo_listtype; - int start_render_received; - int listtype_used; - int alloc_ctrl_OPB_Mode, alloc_ctrl_PT_OPB, alloc_ctrl_TM_OPB, alloc_ctrl_T_OPB, alloc_ctrl_OM_OPB, alloc_ctrl_O_OPB; struct testsprites { int positionx, positiony; @@ -51,7 +47,23 @@ typedef struct { int endofstrip; } showvertices[65536]; #endif - int testsprites_size, toerasesprites, testvertices_size; + int testsprites_size, testsprites_toerase, testvertices_size; + UINT32 ispbase; + UINT32 fbwsof1; + UINT32 fbwsof2; + int busy; + int valid; +} receiveddata; + +typedef struct { + int tafifo_pos, tafifo_mask, tafifo_vertexwords, tafifo_listtype; + int start_render_received; + int renderselect; + int listtype_used; + int alloc_ctrl_OPB_Mode, alloc_ctrl_PT_OPB, alloc_ctrl_TM_OPB, alloc_ctrl_T_OPB, alloc_ctrl_OM_OPB, alloc_ctrl_O_OPB; + receiveddata grab[4]; + int grabsel; + int grabsellast; UINT32 paracontrol,paratype,endofstrip,listtype,global_paratype,parameterconfig; UINT32 groupcontrol,groupen,striplen,userclip; UINT32 objcontrol,shadow,volume,coltype,texture,offfset,gouraud,uv16bit; @@ -130,7 +142,8 @@ READ64_HANDLER( pvr_ta_r ) } #if DEBUG_PVRTA_REGS - mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %llx (PC=%x)\n", 0x5f8000+reg*4, pvrta_regs[reg], offset, reg, mem_mask, activecpu_get_pc()); + if (reg != 0x43) + mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %llx (PC=%x)\n", 0x5f8000+reg*4, pvrta_regs[reg], offset, reg, mem_mask, activecpu_get_pc()); #endif return (UINT64)pvrta_regs[reg] << shift; } @@ -140,6 +153,7 @@ WRITE64_HANDLER( pvr_ta_w ) int reg; UINT64 shift; UINT32 old,dat; + int a; reg = decode_reg_64(offset, mem_mask, &shift); dat = (UINT32)(data >> shift); @@ -161,7 +175,12 @@ WRITE64_HANDLER( pvr_ta_w ) mame_printf_verbose("pvr_ta_w: Core Pipeline soft reset\n"); #endif if (state_ta.start_render_received == 1) + { + for (a=0;a < 4;a++) + if (state_ta.grab[a].busy == 1) + state_ta.grab[a].busy = 0; state_ta.start_render_received = 0; + } } if (dat & 4) { @@ -176,14 +195,28 @@ WRITE64_HANDLER( pvr_ta_w ) mame_printf_verbose(" Region Array at %08x\n",pvrta_regs[REGION_BASE]); mame_printf_verbose(" ISP/TSP Parameters at %08x\n",pvrta_regs[PARAM_BASE]); #endif - state_ta.start_render_received=1; + // select buffer to draw using PARAM_BASE + for (a=0;a < 4;a++) + { + if ((state_ta.grab[a].ispbase == pvrta_regs[PARAM_BASE]) && (state_ta.grab[a].valid == 1) && (state_ta.grab[a].busy == 0)) + { + state_ta.grab[a].busy = 1; + state_ta.renderselect = a; + state_ta.start_render_received=1; + state_ta.grab[a].fbwsof1=pvrta_regs[FB_W_SOF1]; + state_ta.grab[a].fbwsof2=pvrta_regs[FB_W_SOF2]; + break; + } + } + if (a != 4) + break; + assert_always(0, "TA grabber error!\n"); break; case TA_LIST_INIT: state_ta.tafifo_pos=0; state_ta.tafifo_mask=7; state_ta.tafifo_vertexwords=8; state_ta.tafifo_listtype= -1; - state_ta.toerasesprites=1; #if DEBUG_PVRTA mame_printf_verbose("TA_OL_BASE %08x TA_OL_LIMIT %08x\n", pvrta_regs[TA_OL_BASE], pvrta_regs[TA_OL_LIMIT]); mame_printf_verbose("TA_ISP_BASE %08x TA_ISP_LIMIT %08x\n", pvrta_regs[TA_ISP_BASE], pvrta_regs[TA_ISP_LIMIT]); @@ -199,6 +232,49 @@ WRITE64_HANDLER( pvr_ta_w ) state_ta.alloc_ctrl_OM_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 4) & 3)) & 0x38; state_ta.alloc_ctrl_O_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 0) & 3)) & 0x38; state_ta.listtype_used |= (1+4); + // use TA_ISP_BASE and select buffer for grab data + state_ta.grabsel = -1; + // try to find already used buffer but not busy + for (a=0;a < 4;a++) + { + if ((state_ta.grab[a].ispbase == pvrta_regs[TA_ISP_BASE]) && (state_ta.grab[a].busy == 0) && (state_ta.grab[a].valid == 1)) + { + state_ta.grabsel=a; + break; + } + } + // try a buffer not used yet + if (state_ta.grabsel < 0) + { + for (a=0;a < 4;a++) + { + if (state_ta.grab[a].valid == 0) + { + state_ta.grabsel=a; + break; + } + } + } + // find a non busy buffer starting from the last one used + if (state_ta.grabsel < 0) + { + for (a=0;a < 3;a++) + { + if (state_ta.grab[(state_ta.grabsellast+1+a) & 3].busy == 0) + { + state_ta.grabsel=a; + break; + } + } + } + if (state_ta.grabsel < 0) + assert_always(0, "TA grabber error!\n"); + state_ta.grabsellast=state_ta.grabsel; + state_ta.grab[state_ta.grabsel].ispbase=pvrta_regs[TA_ISP_BASE]; + state_ta.grab[state_ta.grabsel].busy=0; + state_ta.grab[state_ta.grabsel].valid=1; + state_ta.grab[state_ta.grabsel].testsprites_size=0; + state_ta.grab[state_ta.grabsel].testvertices_size=0; break; case TA_LIST_CONT: #if DEBUG_PVRTA @@ -210,7 +286,8 @@ WRITE64_HANDLER( pvr_ta_w ) } #if DEBUG_PVRTA_REGS - mame_printf_verbose("PVRTA: [%08x=%x] write %llx to %x (reg %x %x), mask %llx\n", 0x5f8000+reg*4, dat, data>>shift, offset, reg, (reg*4)+0x8000, mem_mask); + if ((reg != 0x14) && (reg != 0x15)) + mame_printf_verbose("PVRTA: [%08x=%x] write %llx to %x (reg %x %x), mask %llx\n", 0x5f8000+reg*4, dat, data>>shift, offset, reg, (reg*4)+0x8000, mem_mask); #endif } @@ -223,7 +300,7 @@ WRITE64_HANDLER( ta_fifo_poly_w ) tafifo_buff[state_ta.tafifo_pos]=(UINT32)data; tafifo_buff[state_ta.tafifo_pos+1]=(UINT32)(data >> 32); #if DEBUG_FIFO_POLY - mame_printf_debug("ta_fifo_poly_w: Unmapped write64 %08x = %llx -> %08x %08x\n", 0x10000000+offset*8, data, tafifo_buff[tafifo_pos], tafifo_buff[tafifo_pos+1]); + mame_printf_debug("ta_fifo_poly_w: Unmapped write64 %08x = %llx -> %08x %08x\n", 0x10000000+offset*8, data, tafifo_buff[state_ta.tafifo_pos], tafifo_buff[state_ta.tafifo_pos+1]); #endif state_ta.tafifo_pos += 2; } @@ -264,15 +341,6 @@ WRITE64_HANDLER( ta_fifo_poly_w ) state_ta.uv16bit=(state_ta.objcontrol >> 0) & 1; } - if (state_ta.toerasesprites == 1) - { - state_ta.toerasesprites=0; - state_ta.testsprites_size=0; -#if DEBUG_VERTICES - state_ta.testvertices_size=0; -#endif - } - // check if we need 8 words more if (state_ta.tafifo_mask == 7) { @@ -304,7 +372,8 @@ WRITE64_HANDLER( ta_fifo_poly_w ) } // now we heve all the needed words - // interpret their meaning + // here we should generate the data for the various tiles + // for now, just interpret their meaning if (state_ta.paratype == 0) { // end of list #if DEBUG_PVRDLIST @@ -461,22 +530,22 @@ WRITE64_HANDLER( ta_fifo_poly_w ) mame_printf_verbose(" A(%f,%f) B(%f,%f) C(%f,%f)\n",u2f(tafifo_buff[13] & 0xffff0000),u2f((tafifo_buff[13] & 0xffff) << 16),u2f(tafifo_buff[14] & 0xffff0000),u2f((tafifo_buff[14] & 0xffff) << 16),u2f(tafifo_buff[15] & 0xffff0000),u2f((tafifo_buff[15] & 0xffff) << 16)); #endif /* test video start */ - state_ta.showsprites[state_ta.testsprites_size].positionx=u2f(tafifo_buff[1]); - state_ta.showsprites[state_ta.testsprites_size].positiony=u2f(tafifo_buff[2]); - state_ta.showsprites[state_ta.testsprites_size].sizex=u2f(tafifo_buff[4])-u2f(tafifo_buff[1]); - state_ta.showsprites[state_ta.testsprites_size].sizey=u2f(tafifo_buff[8])-u2f(tafifo_buff[2]); - state_ta.showsprites[state_ta.testsprites_size].u=u2f(tafifo_buff[13] & 0xffff0000); - state_ta.showsprites[state_ta.testsprites_size].v=u2f((tafifo_buff[13] & 0xffff) << 16); - state_ta.showsprites[state_ta.testsprites_size].du=u2f(tafifo_buff[14] & 0xffff0000)-state_ta.showsprites[state_ta.testsprites_size].u; - state_ta.showsprites[state_ta.testsprites_size].dv=u2f((tafifo_buff[15] & 0xffff) << 16)-state_ta.showsprites[state_ta.testsprites_size].v; - state_ta.showsprites[state_ta.testsprites_size].textureaddress=state_ta.textureaddress; - state_ta.showsprites[state_ta.testsprites_size].texturesizex=state_ta.textureusize; - state_ta.showsprites[state_ta.testsprites_size].texturesizey=state_ta.texturevsize; - state_ta.showsprites[state_ta.testsprites_size].texturemode=state_ta.scanorder+state_ta.vqcompressed*2; - state_ta.showsprites[state_ta.testsprites_size].texturesizes=state_ta.texturesizes; - state_ta.showsprites[state_ta.testsprites_size].texturepf=state_ta.pixelformat; - state_ta.showsprites[state_ta.testsprites_size].texturepalette=state_ta.paletteselector; - state_ta.testsprites_size=state_ta.testsprites_size+1; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].positionx=u2f(tafifo_buff[1]); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].positiony=u2f(tafifo_buff[2]); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].sizex=u2f(tafifo_buff[4])-u2f(tafifo_buff[1]); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].sizey=u2f(tafifo_buff[8])-u2f(tafifo_buff[2]); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].u=u2f(tafifo_buff[13] & 0xffff0000); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].v=u2f((tafifo_buff[13] & 0xffff) << 16); + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].du=u2f(tafifo_buff[14] & 0xffff0000)-state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].u; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].dv=u2f((tafifo_buff[15] & 0xffff) << 16)-state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].v; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].textureaddress=state_ta.textureaddress; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturesizex=state_ta.textureusize; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturesizey=state_ta.texturevsize; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturemode=state_ta.scanorder+state_ta.vqcompressed*2; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturesizes=state_ta.texturesizes; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturepf=state_ta.pixelformat; + state_ta.grab[state_ta.grabsel].showsprites[state_ta.grab[state_ta.grabsel].testsprites_size].texturepalette=state_ta.paletteselector; + state_ta.grab[state_ta.grabsel].testsprites_size=state_ta.grab[state_ta.grabsel].testsprites_size+1; /* test video end */ } } @@ -488,13 +557,13 @@ WRITE64_HANDLER( ta_fifo_poly_w ) mame_printf_verbose("\n"); #endif #if DEBUG_VERTICES - if (state_ta.testvertices_size < 65530) + if (state_ta.grab[state_ta.grabsel].testvertices_size <= 65530) { - state_ta.showvertices[state_ta.testvertices_size].x=u2f(tafifo_buff[1]); - state_ta.showvertices[state_ta.testvertices_size].y=u2f(tafifo_buff[2]); - state_ta.showvertices[state_ta.testvertices_size].endofstrip=state_ta.endofstrip; + state_ta.grab[state_ta.grabsel].showvertices[state_ta.grab[state_ta.grabsel].testvertices_size].x=u2f(tafifo_buff[1]); + state_ta.grab[state_ta.grabsel].showvertices[state_ta.grab[state_ta.grabsel].testvertices_size].y=u2f(tafifo_buff[2]); + state_ta.grab[state_ta.grabsel].showvertices[state_ta.grab[state_ta.grabsel].testvertices_size].endofstrip=state_ta.endofstrip; } - state_ta.testvertices_size=state_ta.testvertices_size+1; + state_ta.grab[state_ta.grabsel].testvertices_size=state_ta.grab[state_ta.grabsel].testvertices_size+1; #endif } } @@ -562,110 +631,188 @@ static void computedilated(void) } #if DEBUG_VERTICES -static void testdrawline(bitmap_t *bitmap,int from,int to) +static void testdrawline(bitmap_t *bitmap, int index, int from, int to) +{ +UINT32 *bmpaddr; +int ix, iy, i, inc, x, y, dx, dy, plotx, ploty; + + if ((state_ta.grab[index].showvertices[to].x < 0) || (state_ta.grab[index].showvertices[to].x > 639)) + return; + if ((state_ta.grab[index].showvertices[from].x < 0) || (state_ta.grab[index].showvertices[from].x > 639)) + return; + if ((state_ta.grab[index].showvertices[to].y < 0) || (state_ta.grab[index].showvertices[to].y > 479)) + return; + if ((state_ta.grab[index].showvertices[from].y < 0) || (state_ta.grab[index].showvertices[from].y > 479)) + return; + dx = state_ta.grab[index].showvertices[to].x - state_ta.grab[index].showvertices[from].x; + dy = state_ta.grab[index].showvertices[to].y - state_ta.grab[index].showvertices[from].y; + plotx = state_ta.grab[index].showvertices[from].x; + ploty = state_ta.grab[index].showvertices[from].y; + ix = abs(dx); + iy = abs(dy); + inc = max(ix,iy); + x = y = 0; + + for (i=0; i <= inc; ++i) + { + x += ix; y += iy; + + if (x > inc) + { + x -= inc; + plotx += (dx ? dx/ix : 0); + bmpaddr = BITMAP_ADDR32(bitmap,ploty,plotx); + *bmpaddr = MAKE_RGB(0, 0, 255); + } + if (y > inc) + { + y -= inc; + ploty += (dy ? dy/iy : 0); + bmpaddr = BITMAP_ADDR32(bitmap,ploty,plotx); + *bmpaddr = MAKE_RGB(0, 0, 255); + } + } +} +#endif + +#if 0 +INLINE UINT32 alpha_blend_r16_565(UINT32 d, UINT32 s, UINT8 level) { + int alphad = 256 - level; + return ((((s & 0x001f) * level + (d & 0x001f) * alphad) >> 8)) | + ((((s & 0x07e0) * level + (d & 0x07e0) * alphad) >> 8) & 0x07e0) | + ((((s & 0xf800) * level + (d & 0xf800) * alphad) >> 8) & 0xf800); } #endif static void testdrawscreen(bitmap_t *bitmap,const rectangle *cliprect) { - int cs,x,y,dx,dy,xi,yi,a; + int cs,x,y,dx,dy,xi,yi,a,rs,ns; float iu,iv,u,v; UINT32 addrp; UINT32 *bmpaddr; int xt,yt,cd; UINT32 c; +#if 0 + int stride; + UINT16 *bmpaddr16; + UINT32 k; +#endif + if (state_ta.renderselect < 0) + return; + rs=state_ta.renderselect; c=pvrta_regs[ISP_BACKGND_T]; - fillbitmap(bitmap,program_read_dword_64le(0x05000000+((c&0xfffff8)>>1)+(3+3)*4),cliprect); + c=program_read_dword_64le(0x05000000+((c&0xfffff8)>>1)+(3+3)*4); + fillbitmap(bitmap,c,cliprect); +#if 0 + stride=pvrta_regs[FB_W_LINESTRIDE] << 3; + c=pvrta_regs[ISP_BACKGND_T]; + a=(c & 0xfffff8) >> 1; + cs=(c >> 24) & 7; + cs=cs+3; // cs*2+3 + c=program_read_dword_64le(0x05000000+a+3*4+(cs-1)*4); + dx=(int)u2f(program_read_dword_64le(0x05000000+a+3*4+cs*4+0)); + dy=(int)u2f(program_read_dword_64le(0x05000000+a+3*4+2*cs*4+4)); + for (y=0;y < dy;y++) + { + addrp=state_ta.grab[rs].fbwsof1+y*stride; + for (x=0;x < dx;x++) + { + bmpaddr16=((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1); + *bmpaddr16=((c & 0xf80000) >> 8) | ((c & 0xfc00) >> 5) | ((c & 0xf8) >> 3); + addrp+=2; + } + } +#endif - for (cs=0;cs < state_ta.testsprites_size;cs++) + ns=state_ta.grab[rs].testsprites_size; + for (cs=0;cs < ns;cs++) { - dx=state_ta.showsprites[cs].sizex; - dy=state_ta.showsprites[cs].sizey; - iu=state_ta.showsprites[cs].du/dx; - iv=state_ta.showsprites[cs].dv/dy; - cd=dilatechose[state_ta.showsprites[cs].texturesizes]; - - if ((state_ta.showsprites[cs].positionx+dx) > 640) - dx=640-state_ta.showsprites[cs].positionx; - if ((state_ta.showsprites[cs].positiony+dy) > 480) - dy=480-state_ta.showsprites[cs].positiony; + dx=state_ta.grab[rs].showsprites[cs].sizex; + dy=state_ta.grab[rs].showsprites[cs].sizey; + iu=state_ta.grab[rs].showsprites[cs].du/dx; + iv=state_ta.grab[rs].showsprites[cs].dv/dy; + cd=dilatechose[state_ta.grab[rs].showsprites[cs].texturesizes]; + + if ((state_ta.grab[rs].showsprites[cs].positionx+dx) > 640) + dx=640-state_ta.grab[rs].showsprites[cs].positionx; + if ((state_ta.grab[rs].showsprites[cs].positiony+dy) > 480) + dy=480-state_ta.grab[rs].showsprites[cs].positiony; xi=0; yi=0; - if (state_ta.showsprites[cs].positionx < 0) - xi=-state_ta.showsprites[cs].positionx; - if (state_ta.showsprites[cs].positiony < 0) - yi=-state_ta.showsprites[cs].positiony; + if (state_ta.grab[rs].showsprites[cs].positionx < 0) + xi=-state_ta.grab[rs].showsprites[cs].positionx; + if (state_ta.grab[rs].showsprites[cs].positiony < 0) + yi=-state_ta.grab[rs].showsprites[cs].positiony; for (y = yi;y < dy;y++) { for (x = xi;x < dx;x++) { // find the coordinates - u=state_ta.showsprites[cs].u+iu*x; - v=state_ta.showsprites[cs].v+iv*y; - yt=v*(state_ta.showsprites[cs].texturesizey-1); - xt=u*(state_ta.showsprites[cs].texturesizex-1); + u=state_ta.grab[rs].showsprites[cs].u+iu*x; + v=state_ta.grab[rs].showsprites[cs].v+iv*y; + yt=v*(state_ta.grab[rs].showsprites[cs].texturesizey-1); + xt=u*(state_ta.grab[rs].showsprites[cs].texturesizex-1); - switch (state_ta.showsprites[cs].texturepf) + a=255; + switch (state_ta.grab[rs].showsprites[cs].texturepf) { case 0: // 1555 // find the address - if (state_ta.showsprites[cs].texturemode == 1) - addrp=state_ta.showsprites[cs].textureaddress+(state_ta.showsprites[cs].texturesizex*yt+xt)*2; - else if (state_ta.showsprites[cs].texturemode == 0) // twiddled - addrp=state_ta.showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; + if (state_ta.grab[rs].showsprites[cs].texturemode == 1) + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(state_ta.grab[rs].showsprites[cs].texturesizex*yt+xt)*2; + else if (state_ta.grab[rs].showsprites[cs].texturemode == 0) // twiddled + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; else // vq-compressed { c=0x800+(dilated1[cd][xt >> 1] + dilated0[cd][yt >> 1]); - c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.showsprites[cs].textureaddress+c)); - addrp=state_ta.showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; + c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.grab[rs].showsprites[cs].textureaddress+c)); + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; } // read datum c=*(((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1)); // find the color and draw a=(((c & 0x8000) >> 8)*255)/0x80; - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0x7c00) >> 7, (c&0x3e0) >> 2, (c&0x1f) << 3), a); + c=MAKE_RGB((c&0x7c00) >> 7, (c&0x3e0) >> 2, (c&0x1f) << 3); break; case 1: // 565 // find the address - if (state_ta.showsprites[cs].texturemode == 1) - addrp=state_ta.showsprites[cs].textureaddress+(state_ta.showsprites[cs].texturesizex*yt+xt)*2; - else if (state_ta.showsprites[cs].texturemode == 0) // twiddled - addrp=state_ta.showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; + if (state_ta.grab[rs].showsprites[cs].texturemode == 1) + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(state_ta.grab[rs].showsprites[cs].texturesizex*yt+xt)*2; + else if (state_ta.grab[rs].showsprites[cs].texturemode == 0) // twiddled + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; else // vq-compressed { c=0x800+(dilated1[cd][xt >> 1] + dilated0[cd][yt >> 1]); - c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.showsprites[cs].textureaddress+c)); - addrp=state_ta.showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; + c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.grab[rs].showsprites[cs].textureaddress+c)); + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; } // read datum c=*(((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1)); // find the color and draw - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0xf800) >> 8, (c&0x7e0) >> 3, (c&0x1f) << 3), 255); + a=255; + c=MAKE_RGB((c&0xf800) >> 8, (c&0x7e0) >> 3, (c&0x1f) << 3); break; case 2: // 4444 // find the address - if (state_ta.showsprites[cs].texturemode == 1) - addrp=state_ta.showsprites[cs].textureaddress+(state_ta.showsprites[cs].texturesizex*yt+xt)*2; - else if (state_ta.showsprites[cs].texturemode == 0) // twiddled - addrp=state_ta.showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; + if (state_ta.grab[rs].showsprites[cs].texturemode == 1) + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(state_ta.grab[rs].showsprites[cs].texturesizex*yt+xt)*2; + else if (state_ta.grab[rs].showsprites[cs].texturemode == 0) // twiddled + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt])*2; else // vq-compressed { c=0x800+(dilated1[cd][xt >> 1] + dilated0[cd][yt >> 1]); - c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.showsprites[cs].textureaddress+c)); - addrp=state_ta.showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; + c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.grab[rs].showsprites[cs].textureaddress+c)); + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 1])*2; } // read datum c=*(((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1)); // find the color and draw a=(((c & 0xf000) >> 8)*255)/0xf0; - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0xf00) >> 4, c&0xf0, (c&0xf) << 4), a); + c=MAKE_RGB((c&0xf00) >> 4, c&0xf0, (c&0xf) << 4); break; case 3: // yuv422 break; @@ -674,64 +821,115 @@ static void testdrawscreen(bitmap_t *bitmap,const rectangle *cliprect) case 5: // 4 bpp palette break; case 6: // 8 bpp palette - if (state_ta.showsprites[cs].texturemode & 2) // vq-compressed + if (state_ta.grab[rs].showsprites[cs].texturemode & 2) // vq-compressed { c=0x800+(dilated1[cd][xt >> 1] + dilated0[cd][yt >> 2]); - c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.showsprites[cs].textureaddress+c)); - addrp=state_ta.showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 3]); + c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(state_ta.grab[rs].showsprites[cs].textureaddress+c)); + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+c*8+(dilated1[cd][xt & 1] + dilated0[cd][yt & 3]); } else { - addrp=state_ta.showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt]); + addrp=state_ta.grab[rs].showsprites[cs].textureaddress+(dilated1[cd][xt] + dilated0[cd][yt]); } c=*(((UINT8 *)dc_texture_ram) + BYTE_XOR_LE(addrp)); - c=((state_ta.showsprites[cs].texturepalette & 0x30) << 4) | c; + c=((state_ta.grab[rs].showsprites[cs].texturepalette & 0x30) << 4) | c; c=pvrta_regs[0x1000/4+c]; switch (pvrta_regs[PAL_RAM_CTRL]) { case 0: // argb1555 a=(((c & 0x8000) >> 8)*255)/0x80; - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0x7c00) >> 7, (c&0x3e0) >> 2, (c&0x1f) << 3), a); + c=MAKE_RGB((c&0x7c00) >> 7, (c&0x3e0) >> 2, (c&0x1f) << 3); break; case 1: // rgb565 - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0xf800) >> 8, (c&0x7e0) >> 3, (c&0x1f) << 3), 255); + a=255; + c=MAKE_RGB((c&0xf800) >> 8, (c&0x7e0) >> 3, (c&0x1f) << 3); break; case 2: // argb4444 a=(((c & 0xf000) >> 8)*255)/0xf0; - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0xf00) >> 4, c&0xf0, (c&0xf) << 4), a); + c=MAKE_RGB((c&0xf00) >> 4, c&0xf0, (c&0xf) << 4); break; case 3: // argb8888 a=(c & 0xff000000) >> 24; - bmpaddr=BITMAP_ADDR32(bitmap,state_ta.showsprites[cs].positiony+y,state_ta.showsprites[cs].positionx+x); - *bmpaddr = alpha_blend_r32(*bmpaddr, MAKE_RGB((c&0xff0000) >> 16, (c&0xff00) >> 8, c&0xff), a); + c=MAKE_RGB((c&0xff0000) >> 16, (c&0xff00) >> 8, c&0xff); break; } break; case 7: // reserved break; - } + } // switch + bmpaddr=BITMAP_ADDR32(bitmap,state_ta.grab[rs].showsprites[cs].positiony+y,state_ta.grab[rs].showsprites[cs].positionx+x); + *bmpaddr = alpha_blend_r32(*bmpaddr, c, a); +#if 0 + // write into framebuffer + switch (pvrta_regs[FB_W_CTRL] & 7) + { + case 0: // 0555 KRGB 16 bit + k=pvrta_regs[FB_W_CTRL] & 0x8000; + addrp=state_ta.grab[s].fbwsof1+(state_ta.grab[s].showsprites[cs].positiony+y)*stride+(state_ta.grab[s].showsprites[cs].positionx+x)*2; + bmpaddr16=((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1); + *bmpaddr16=k | alpha_blend_r16(*bmpaddr16,((c & 0xf80000) >> 9) | ((c & 0xf800) >> 6) | ((c & 0xf8) >> 3),a); + break; + case 1: // 565 RGB 16 bit + addrp=state_ta.grab[rs].fbwsof1+(state_ta.grab[rs].showsprites[cs].positiony+y)*stride+(state_ta.grab[rs].showsprites[cs].positionx+x)*2; + bmpaddr16=((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1); + //*bmpaddr16=alpha_blend_r16_565(*bmpaddr16,((c & 0xf80000) >> 8) | ((c & 0xfc00) >> 5) | ((c & 0xf8) >> 3),a); + *bmpaddr16=((c & 0xf80000) >> 8) | ((c & 0xfc00) >> 5) | ((c & 0xf8) >> 3); + break; + case 2: // 4444 ARGB 16 bit + break; + case 3: // 1555 ARGB 16 bit + break; + case 4: // 888 RGB 24 bit packed + break; + case 5: // 0888 KRGB 32 bit + break; + case 6: // 8888 ARGB 32 bit + break; + case 7: // reserved + break; + } // switch +#endif } } } + state_ta.grab[rs].busy=0; #if DEBUG_VERTICES - xi = yi = -1; - a = state_ta.testvertices_size; - if (a > 65535) - a = 65535; - for (cs=0;cs < a;cs++) + a = state_ta.grab[rs].testvertices_size; + if (a > 65530) + a = 65530; + for (cs=1;cs < a;cs++) { - xi=yi; - yi=cs; - if (xi >= 0) - testdrawline(bitmap,xi,yi); // draw a segment from vertex xi to vertex yi - if (state_ta.showvertices[cs].endofstrip == 1) - xi = yi = -1; + testdrawline(bitmap,rs,cs-1,cs); // draw a segment from vertex xi to vertex yi + if ((cs > 1) && (state_ta.grab[rs].showvertices[cs-2].endofstrip == 0)) + testdrawline(bitmap,rs,cs-2,cs); + if (state_ta.grab[rs].showvertices[cs].endofstrip == 1) + cs++; } #endif } + +static void testdrawscreenframebuffer(bitmap_t *bitmap,const rectangle *cliprect) +{ + int x,y,dy,xi; + UINT32 addrp; + UINT16 *fbaddr; + UINT32 c; + + // only for rgb565 framebuffer + xi=((pvrta_regs[FB_R_SIZE] & 0x3ff)+1) << 1; + dy=((pvrta_regs[FB_R_SIZE] >> 10) & 0x3ff)+1; + for (y=0;y < dy;y++) + { + addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; + for (x=0;x < xi;x++) + { + fbaddr=BITMAP_ADDR16(bitmap,y,x); + c=*(((UINT16 *)dc_texture_ram) + (WORD2_XOR_LE(addrp) >> 1)); + *fbaddr = (UINT16)c; + addrp+=2; + } + } +} /* test video end */ static void pvr_build_parameterconfig(void) @@ -776,6 +974,7 @@ VIDEO_START(dc) { memset(pvrctrl_regs, 0, sizeof(pvrctrl_regs)); memset(pvrta_regs, 0, sizeof(pvrta_regs)); + memset(state_ta.grab, 0, sizeof(state_ta.grab)); pvr_build_parameterconfig(); // if the next 2 registers do not have the correct values, the naomi bios will hang @@ -788,10 +987,9 @@ VIDEO_START(dc) state_ta.tafifo_vertexwords=8; state_ta.tafifo_listtype= -1; state_ta.start_render_received=0; + state_ta.renderselect= -1; + state_ta.grabsel=0; - state_ta.testsprites_size=0; - state_ta.toerasesprites=0; - state_ta.testvertices_size=0; computedilated(); vbout_timer = timer_alloc(vbout, 0); @@ -800,21 +998,32 @@ VIDEO_START(dc) VIDEO_UPDATE(dc) { +static int useframebuffer=1; + if (pvrta_regs[VO_CONTROL] & (1 << 3)) { fillbitmap(bitmap,pvrta_regs[VO_BORDER_COL] & 0xFFFFFF,cliprect); return 0; } - testdrawscreen(bitmap,cliprect); + if ((useframebuffer) && !state_ta.start_render_received) + { + testdrawscreenframebuffer(bitmap,cliprect); + return 0; + } if (state_ta.start_render_received) { + useframebuffer=0; + testdrawscreen(bitmap,cliprect); state_ta.start_render_received=0; + state_ta.renderselect= -1; dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_TSP; // TSP end of render update_interrupt_status(); + return 0; } - return 0; + else + return 1; } void dc_vblank(running_machine *machine) |