mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
From: Samuele Zannoli [mailto:samuele.zannoli@airmachine.it]
Sent: Tue 9/23/2008 1:16 PM To: submit@mamedev.org Subject: More naomi ... Hi. This patch shows the contents of the framebuffer if the 3d accelerator is not used so that now the atomiswave logo and messages are shown (if you wait enough). Removes a maple bug (no more strange messages in cvs2gd). Improves documentation of the communication registers with the dimm board. And if DEBUG_VERTICES is defined as 1 the vertices sent to the tile accelerator are collected and then drawn connected by a segment to give a wireframe-like view of the scene. Bye, Samuele Zannoli
This commit is contained in:
parent
3d65b57f77
commit
07d208cbbd
@ -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) )
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
for (cs=0;cs < state_ta.testsprites_size;cs++)
|
||||
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++)
|
||||
{
|
||||
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];
|
||||
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
|
||||
|
||||
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;
|
||||
ns=state_ta.grab[rs].testsprites_size;
|
||||
for (cs=0;cs < ns;cs++)
|
||||
{
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user