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:
Aaron Giles 2008-09-26 05:27:40 +00:00
parent 3d65b57f77
commit 07d208cbbd
4 changed files with 380 additions and 135 deletions

View File

@ -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) )

View File

@ -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

View File

@ -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;
}

View File

@ -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)