Previous 199869 Revisions Next

r36166 Sunday 1st March, 2015 at 09:44:28 UTC by Thomas Klausner
Revert part of 34d0ee6b.

It introduced naming conflicts in two rom sets where the name
bb9.bin is used for two different roms.

Signed-off-by: Thomas Klausner <wiz@NetBSD.org>
[src/mame/drivers]hng64.c mitchell.c suprgolf.c suprslam.c tankbust.c thunderx.c tryout.c usgames.c vigilant.c
[src/mame/includes]hng64.h tankbust.h thunderx.h tryout.h usgames.h vigilant.h
[src/mame/video]hng64.c
[src/mess/drivers]hh_ucom4.c

trunk/src/mame/drivers/hng64.c
r244677r244678
867867      }
868868
869869      // Send it off to the 3d subsystem.
870      hng64_command3d( packet3d);
870      hng64_command3d(machine(), packet3d);
871871   }
872872#endif
873873}
r244677r244678
892892{
893893   // this handles 3d to fb upload
894894   UINT16 packet3d[16];
895//   printf("dl_upload_w %08x %08x\n", data, mem_mask);
896895
897
898896   for(int packetStart=0;packetStart<0x200/4;packetStart+=8)
899897   {
900898      // Create a 3d packet
r244677r244678
908906      }
909907
910908      // Send it off to the 3d subsystem.
911      hng64_command3d( packet3d);
909      hng64_command3d(machine(), packet3d);
912910   }
913911
914912   machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(0x200*8), timer_expired_delegate(FUNC(hng64_state::hng64_3dfifo_processed),this));
r244677r244678
917915/* Note: Samurai Shodown games never calls bit 1, so it can't be framebuffer clear. It also calls bit 3 at start-up, meaning unknown */
918916WRITE32_MEMBER(hng64_state::dl_control_w) // This handles framebuffers
919917{
920//   printf("dl_control_w %08x %08x\n", data, mem_mask);
921
922918   //if(data & 2) // swap buffers
923919   //{
924920   //  clear3d();
r244677r244678
11771173<ElSemi> 0xBF800000-0xBF808000 S-RAM
11781174<ElSemi> 0x60000000-0x60001000 Comm dualport ram
11791175*/
1180
1181WRITE32_MEMBER(hng64_state::hng64_vregs_w)
1182{
1183//   printf("hng64_vregs_w %02x, %08x %08x\n", offset * 4, data, mem_mask);
1184   COMBINE_DATA(&m_videoregs[offset]);
1185}
1186
11871176static ADDRESS_MAP_START( hng_map, AS_PROGRAM, 32, hng64_state )
11881177
11891178   AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_SHARE("mainram")
r244677r244678
12071196   AM_RANGE(0x2000e400, 0x2000efff) AM_WRITE(hng64_sprite_clear_odd_w)
12081197   AM_RANGE(0x20010000, 0x20010013) AM_RAM AM_SHARE("spriteregs")
12091198   AM_RANGE(0x20100000, 0x2017ffff) AM_RAM_WRITE(hng64_videoram_w) AM_SHARE("videoram")    // Tilemap
1210   AM_RANGE(0x20190000, 0x20190037) AM_RAM_WRITE(hng64_vregs_w) AM_SHARE("videoregs")
1199   AM_RANGE(0x20190000, 0x20190037) AM_RAM AM_SHARE("videoregs")
12111200   AM_RANGE(0x20200000, 0x20203fff) AM_RAM_WRITE(hng64_pal_w) AM_SHARE("paletteram")
12121201   AM_RANGE(0x20208000, 0x2020805f) AM_READWRITE(tcram_r, tcram_w) AM_SHARE("tcram")   // Transition Control
12131202   AM_RANGE(0x20300000, 0x203001ff) AM_RAM_WRITE(dl_w) AM_SHARE("dl")  // 3d Display List
r244677r244678
17411730   GFXDECODE_ENTRY( "textures", 0, hng64_texlayout,     0x0, 0x10 )  /* textures */
17421731GFXDECODE_END
17431732
1744static void hng64_reorder( UINT8* gfxregion, size_t gfxregionsize)
1733static void hng64_reorder(running_machine &machine, UINT8* gfxregion, size_t gfxregionsize)
17451734{
17461735   // by default 2 4bpp tiles are stored in each 8bpp tile, this makes decoding in MAME harder than it needs to be
17471736   // reorder them
r244677r244678
17611750
17621751DRIVER_INIT_MEMBER(hng64_state,hng64_reorder_gfx)
17631752{
1764   hng64_reorder(memregion("scrtile")->base(), memregion("scrtile")->bytes());
1753   hng64_reorder(machine(), memregion("scrtile")->base(), memregion("scrtile")->bytes());
17651754}
17661755
17671756#define HACK_REGION
17681757#ifdef HACK_REGION
1769void hng64_state::hng64_patch_bios_region(int region)
1758static void hng64_patch_bios_region(running_machine& machine, int region)
17701759{
1771   UINT8 *rom = memregion("user1")->base();
1760   UINT8 *rom = machine.root_device().memregion("user1")->base();
17721761
17731762   if ((rom[0x4000]==0xff) && (rom[0x4001] == 0xff))
17741763   {
r244677r244678
17851774   // region hacking, english error messages are more useful to us, but no english bios is dumped...
17861775#ifdef HACK_REGION
17871776// versions according to fatal fury test mode
1788//  hng64_patch_bios_region( 0); // 'Others Ver' (invalid?)
1789   hng64_patch_bios_region( 1); // Japan
1790//  hng64_patch_bios_region( 2); // USA
1791//  hng64_patch_bios_region( 3); // Korea
1792//  hng64_patch_bios_region( 4); // 'Others'
1777//  hng64_patch_bios_region(machine(), 0); // 'Others Ver' (invalid?)
1778   hng64_patch_bios_region(machine(), 1); // Japan
1779//  hng64_patch_bios_region(machine(), 2); // USA
1780//  hng64_patch_bios_region(machine(), 3); // Korea
1781//  hng64_patch_bios_region(machine(), 4); // 'Others'
17931782#endif
17941783
17951784   /* 1 meg of virtual address space for the com cpu */
r244677r244678
19131902
19141903   m_comm_rom = memregion("user2")->base();
19151904   m_comm_ram = auto_alloc_array(machine(),UINT8,0x10000);
1916
1917
1918   for (int i = 0; i < 0x38 / 4; i++)
1919   {
1920      m_videoregs[i] = 0xdeadbeef;
1921   }
1922     
19231905}
19241906
19251907
trunk/src/mame/drivers/mitchell.c
r244677r244678
15871587   ROM_LOAD( "pang_03.bin",  0x10000, 0x20000, CRC(0c8477ae) SHA1(a31a8c00407dfc3017d56e29fac6114b73248030) )   /* Decrypted data */
15881588
15891589   ROM_REGION( 0x100000, "gfx1", ROMREGION_ERASEFF )
1590   ROM_LOAD( "bb9.bin",      0x000000, 0x20000, CRC(3a5883f5) SHA1(a8a33071e10f5992e80afdb782c334829f9ae27f) ) /* chars */
1590   ROM_LOAD( "pang_9.bin",      0x000000, 0x20000, CRC(3a5883f5) SHA1(a8a33071e10f5992e80afdb782c334829f9ae27f) ) /* chars */
15911591   ROM_LOAD( "bb3.bin",      0x020000, 0x20000, CRC(79a8ed08) SHA1(c1e43889e29b80c7fe2c09b11eecde24450a1ff5) )
15921592   /* 40000-7ffff empty */
15931593   ROM_LOAD( "bb11.bin",     0x080000, 0x20000, CRC(166a16ae) SHA1(7f907c78b7ac8c99e3d79761a6ae689c77e3a1f5) )
r244677r244678
16101610   ROM_CONTINUE(0x10000, 0x20000 )   /* Decrypted data */
16111611
16121612   ROM_REGION( 0x100000, "gfx1", ROMREGION_ERASEFF )
1613   ROM_LOAD( "bb9.bin",      0x000000, 0x20000, CRC(3a5883f5) SHA1(a8a33071e10f5992e80afdb782c334829f9ae27f) ) /* chars */
1613   ROM_LOAD( "pang_9.bin",      0x000000, 0x20000, CRC(3a5883f5) SHA1(a8a33071e10f5992e80afdb782c334829f9ae27f) ) /* chars */
16141614   ROM_LOAD( "bb3.bin",      0x020000, 0x20000, CRC(79a8ed08) SHA1(c1e43889e29b80c7fe2c09b11eecde24450a1ff5) )
16151615   /* 40000-7ffff empty */
16161616   ROM_LOAD( "bb11.bin",     0x080000, 0x20000, CRC(166a16ae) SHA1(7f907c78b7ac8c99e3d79761a6ae689c77e3a1f5) )
trunk/src/mame/drivers/suprgolf.c
r244677r244678
7272   DECLARE_WRITE8_MEMBER(suprgolf_writeB);
7373   DECLARE_DRIVER_INIT(suprgolf);
7474   TILE_GET_INFO_MEMBER(get_tile_info);
75    virtual void machine_start();
7675   virtual void machine_reset();
7776   virtual void video_start();
7877   UINT32 screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
r244677r244678
250249   }
251250}
252251
253void suprgolf_state::machine_start()
254{
255    membank("bank1")->configure_entries(0, 16, memregion("user2")->base(), 0x4000);
256    membank("bank2")->configure_entries(0, 64, memregion("user1")->base(), 0x4000);
257}
258
259252WRITE8_MEMBER(suprgolf_state::suprgolf_pen_w)
260253{
261254   m_vreg_pen = data;
r244677r244678
273266
274267WRITE8_MEMBER(suprgolf_state::rom_bank_select_w)
275268{
276    m_rom_bank = data;
269   UINT8 *region_base = memregion("user1")->base();
277270
278    //popmessage("%08x %02x",((data & 0x3f) * 0x4000),data);
279    //osd_printf_debug("ROM_BANK 0x8000 - %X @%X\n",data,space.device().safe_pcbase());
280    membank("bank2")->set_entry(data & 0x3f);
271   m_rom_bank = data;
281272
273   //popmessage("%08x %02x",((data & 0x3f) * 0x4000),data);
274
275//  osd_printf_debug("ROM_BANK 0x8000 - %X @%X\n",data,space.device().safe_pcbase());
276   membank("bank2")->set_base(region_base + (data&0x3f ) * 0x4000);
277
282278   m_msm_nmi_mask = data & 0x40;
283279   flip_screen_set(data & 0x80);
284280}
285281
286282WRITE8_MEMBER(suprgolf_state::rom2_bank_select_w)
287283{
288    //osd_printf_debug("ROM_BANK 0x4000 - %X @%X\n",data,space.device().safe_pcbase());
289    membank("bank1")->set_entry(data & 0x0f);
290   
284   UINT8 *region_base = memregion("user2")->base();
285//  osd_printf_debug("ROM_BANK 0x4000 - %X @%X\n",data,space.device().safe_pcbase());
286
287   membank("bank1")->set_base(region_base + (data&0x0f) * 0x4000);
288
291289   if(data & 0xf0)
292290      printf("Rom bank select 2 with data %02x activated\n",data);
293291}
trunk/src/mame/drivers/suprslam.c
r244677r244678
115115
116116WRITE8_MEMBER(suprslam_state::suprslam_sh_bankswitch_w)
117117{
118    membank("bank1")->set_entry(data & 0x03);
118   UINT8 *RAM = memregion("audiocpu")->base();
119   int bankaddress;
120
121   bankaddress = 0x10000 + (data & 0x03) * 0x8000;
122   membank("bank1")->set_base(&RAM[bankaddress]);
119123}
120124
121125/*** MEMORY MAPS *************************************************************/
r244677r244678
284288   save_item(NAME(m_screen_bank));
285289   save_item(NAME(m_bg_bank));
286290   save_item(NAME(m_pending_command));
287
288    membank("bank1")->configure_entries(0, 4, memregion("audiocpu")->base() + 0x10000, 0x8000);
289291}
290292
291293void suprslam_state::machine_reset()
trunk/src/mame/drivers/tankbust.c
r244677r244678
2222#include "includes/tankbust.h"
2323
2424
25void tankbust_state::machine_start()
26{
27    membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000);
28    membank("bank2")->configure_entries(0, 2, memregion("maincpu")->base() + 0x18000, 0x2000);
29}
30
3125//port A of ay8910#0
3226
3327TIMER_CALLBACK_MEMBER(tankbust_state::soundlatch_callback)
r244677r244678
10195
10296   case 7: /* 0xe007 bankswitch */
10397      /* bank 1 at 0x6000-9fff = from 0x10000 when bit0=0 else from 0x14000 */
104        membank("bank1")->set_entry(data & 1);
105
10698      /* bank 2 at 0xa000-bfff = from 0x18000 when bit0=0 else from 0x1a000 */
107      membank("bank2")->set_entry(data & 1); /* verified (the game will reset after the "game over" otherwise) */
99      membank("bank1")->set_base(memregion("maincpu")->base() + 0x10000 + ((data&1) * 0x4000) );
100      membank("bank2")->set_base(memregion("maincpu")->base() + 0x18000 + ((data&1) * 0x2000) ); /* verified (the game will reset after the "game over" otherwise) */
108101      break;
109102   }
110103}
trunk/src/mame/drivers/thunderx.c
r244677r244678
312312
313313WRITE8_MEMBER(thunderx_state::scontra_bankswitch_w)
314314{
315    // logerror("%04x: bank switch %02x\n", space.device().safe_pc(), data & 0x0f);
316    membank("bank1")->set_entry(data & 0x0f);
315   UINT8 *RAM = memregion("maincpu")->base();
316   int offs;
317317
318//logerror("%04x: bank switch %02x\n",space.device().safe_pc(),data);
319
320   /* bits 0-3 ROM bank */
321   offs = 0x10000 + (data & 0x0f)*0x2000;
322   membank("bank1")->set_base(&RAM[offs] );
323
318324   /* bit 4 select work RAM or palette RAM at 5800-5fff */
319325   m_palette_selected = ~data & 0x10;
320326
r244677r244678
579585   save_item(NAME(m_palette_selected));
580586   save_item(NAME(m_rambank));
581587   save_item(NAME(m_pmcbank));
582   
583    membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x2000);
584588}
585589
586590MACHINE_START_MEMBER(thunderx_state,thunderx)
trunk/src/mame/drivers/tryout.c
r244677r244678
4343//  m_audiocpu->set_input_line(0, CLEAR_LINE);
4444}
4545
46void tryout_state::machine_start()
47{
48    membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x2000);
49}
50
5146WRITE8_MEMBER(tryout_state::tryout_bankswitch_w)
5247{
53    membank("bank1")->set_entry(data & 0x01);
48   UINT8 *RAM = memregion("maincpu")->base();
49   int bankaddress;
50
51   bankaddress = 0x10000 + (data & 0x01) * 0x2000;
52   membank("bank1")->set_base(&RAM[bankaddress]);
5453}
5554
5655static ADDRESS_MAP_START( main_cpu, AS_PROGRAM, 8, tryout_state )
trunk/src/mame/drivers/usgames.c
r244677r244678
3030#include "includes/usgames.h"
3131#include "machine/nvram.h"
3232
33void usgames_state::machine_start()
34{
35    membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000);
36}
3733
3834WRITE8_MEMBER(usgames_state::usgames_rombank_w)
3935{
40    membank("bank1")->set_entry(data);
36   UINT8 *RAM = memregion("maincpu")->base();
37
38//  logerror ("BANK WRITE? -%02x-\n",data);
39//popmessage("%02x",data);
40
41   membank("bank1")->set_base(&RAM[ 0x10000 + 0x4000 * data] );
4142}
4243
4344WRITE8_MEMBER(usgames_state::lamps1_w)
trunk/src/mame/drivers/vigilant.c
r244677r244678
2222#include "includes/vigilant.h"
2323#include "includes/iremipt.h"
2424
25void vigilant_state::machine_start()
26{
27    membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
28}
29
3025WRITE8_MEMBER(vigilant_state::vigilant_bank_select_w)
3126{
32    membank("bank1")->set_entry(data & 0x07);
27   int bankaddress;
28   UINT8 *RAM = memregion("maincpu")->base();
29
30   bankaddress = 0x10000 + (data & 0x07) * 0x4000;
31   membank("bank1")->set_base(&RAM[bankaddress]);
3332}
3433
3534/***************************************************************************
trunk/src/mame/includes/hng64.h
r244677r244678
1010   BURIKI_MCU
1111};
1212
13enum hng64trans_t
14{
15   HNG64_TILEMAP_NORMAL = 1,
16   HNG64_TILEMAP_ADDITIVE,
17   HNG64_TILEMAP_ALPHA
18};
1913
2014
21struct blit_parameters
22{
23   bitmap_rgb32 *          bitmap;
24   rectangle           cliprect;
25   UINT32              tilemap_priority_code;
26   UINT8               mask;
27   UINT8               value;
28   UINT8               alpha;
29   hng64trans_t        drawformat;
30};
31
32
33
34///////////////////////
35// polygon rendering //
36///////////////////////
37
38struct polygonRasterOptions
39{
40   UINT8 texType;
41   UINT8 texIndex;
42   UINT8 texPageSmall;
43   UINT8 texPageHorizOffset;
44   UINT8 texPageVertOffset;
45   int palOffset;
46   int palPageSize;
47   int debugColor;
48};
49
5015class hng64_state : public driver_device
5116{
5217public:
r244677r244678
7540      m_screen(*this, "screen"),
7641      m_palette(*this, "palette"),
7742      m_generic_paletteram_32(*this, "paletteram")
43      { }
7844
79   { }
80   
8145   required_device<mips3_device> m_maincpu;
8246   required_device<cpu_device> m_audiocpu;
8347   required_device<cpu_device> m_comm;
r244677r244678
10670   required_device<palette_device> m_palette;
10771   required_shared_ptr<UINT32> m_generic_paletteram_32;
10872
109
11073   int m_mcu_type;
11174
11275   UINT16 *m_soundram;
r244677r244678
13497
13598   UINT8 m_screen_dis;
13699
137   struct hng64_tilemap {
138      tilemap_t *m_tilemap_8x8;
139      tilemap_t *m_tilemap_16x16;
140      tilemap_t *m_tilemap_16x16_alt;
141   };
100   tilemap_t *m_tilemap0_8x8;
101   tilemap_t *m_tilemap1_8x8;
102   tilemap_t *m_tilemap2_8x8;
103   tilemap_t *m_tilemap3_8x8;
142104
143   hng64_tilemap m_tilemap[4];
105   tilemap_t *m_tilemap0_16x16;
106   tilemap_t *m_tilemap1_16x16;
107   tilemap_t *m_tilemap2_16x16;
108   tilemap_t *m_tilemap3_16x16;
144109
110   tilemap_t *m_tilemap0_16x16_alt;
111   tilemap_t *m_tilemap1_16x16_alt;
112   tilemap_t *m_tilemap2_16x16_alt;
113   tilemap_t *m_tilemap3_16x16_alt;
114
145115   UINT8 m_additive_tilemap_debug;
146116
147117   // 3d display buffers
r244677r244678
151121
152122   UINT32 m_old_animmask;
153123   UINT32 m_old_animbits;
154   UINT16 m_old_tileflags[4];
124   UINT16 m_old_tileflags0;
125   UINT16 m_old_tileflags1;
126   UINT16 m_old_tileflags2;
127   UINT16 m_old_tileflags3;
155128
156129   UINT32 m_dls[2][0x81];
157130
r244677r244678
193166   DECLARE_READ32_MEMBER(unk_vreg_r);
194167   DECLARE_WRITE32_MEMBER(hng64_soundram_w);
195168   DECLARE_READ32_MEMBER(hng64_soundram_r);
196   DECLARE_WRITE32_MEMBER(hng64_vregs_w);
197169
198170   // not actually used, but left in code so you can turn it and see the (possibly undesired?) behavior, see notes in memory map
199171   DECLARE_WRITE32_MEMBER(hng64_soundram2_w);
r244677r244678
254226   DECLARE_CUSTOM_INPUT_MEMBER(brake_down_r);
255227   void clear3d();
256228   TIMER_CALLBACK_MEMBER(hng64_3dfifo_processed);
257
258   void FillSmoothTexPCHorizontalLine(
259      const polygonRasterOptions& prOptions,
260      int x_start, int x_end, int y, float z_start, float z_delta,
261      float w_start, float w_delta, float r_start, float r_delta,
262      float g_start, float g_delta, float b_start, float b_delta,
263      float s_start, float s_delta, float t_start, float t_delta);
264
265   void hng64_command3d(const UINT16* packet);
266   void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
267   void transition_control( bitmap_rgb32 &bitmap, const rectangle &cliprect);
268   void hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit,
269      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound);
270   void hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm);
271   void setCameraTransformation(const UINT16* packet);
272   void setLighting(const UINT16* packet);
273   void set3dFlags(const UINT16* packet);
274   void setCameraProjectionMatrix(const UINT16* packet);
275   void recoverPolygonBlock(const UINT16* packet, struct polygon* polys, int* numPolys);
276   void hng64_mark_all_tiles_dirty(int tilemap);
277   void hng64_mark_tile_dirty(int tilemap, int tile_index);
278
279   void hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
280      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
281      int wraparound, UINT32 flags, UINT8 priority, hng64trans_t drawformat);
282
283   void hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
284      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
285      int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat);
286
287   void RasterizeTriangle_SMOOTH_TEX_PC(
288      float A[4], float B[4], float C[4],
289      float Ca[3], float Cb[3], float Cc[3], // PER-VERTEX RGB COLORS
290      float Ta[2], float Tb[2], float Tc[2], // PER-VERTEX (S,T) TEX-COORDS
291      const polygonRasterOptions& prOptions);
292
293   void drawShaded( struct polygon *p);
294
295   void hng64_patch_bios_region(int region);
296
297229};
298230
231/*----------- defined in video/hng64.c -----------*/
232void hng64_command3d(running_machine& machine, const UINT16* packet);
trunk/src/mame/includes/tankbust.h
r244677r244678
4343   DECLARE_READ8_MEMBER(tankbust_soundtimer_r);
4444   TILE_GET_INFO_MEMBER(get_bg_tile_info);
4545   TILE_GET_INFO_MEMBER(get_txt_tile_info);
46    virtual void machine_start();
47    virtual void machine_reset();
46   virtual void machine_reset();
4847   virtual void video_start();
4948   DECLARE_PALETTE_INIT(tankbust);
5049   UINT32 screen_update_tankbust(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
trunk/src/mame/includes/thunderx.h
r244677r244678
6363   DECLARE_READ8_MEMBER(k052109_051960_r);
6464   DECLARE_WRITE8_MEMBER(k052109_051960_w);
6565   DECLARE_WRITE8_MEMBER(scontra_snd_bankswitch_w);
66    virtual void video_start();
66   virtual void video_start();
6767   DECLARE_MACHINE_START(scontra);
6868   DECLARE_MACHINE_RESET(scontra);
6969   DECLARE_MACHINE_START(thunderx);
trunk/src/mame/includes/tryout.h
r244677r244678
3636   TILE_GET_INFO_MEMBER(get_bg_tile_info);
3737   TILEMAP_MAPPER_MEMBER(get_fg_memory_offset);
3838   TILEMAP_MAPPER_MEMBER(get_bg_memory_offset);
39    virtual void machine_start();
40    virtual void video_start();
39   virtual void video_start();
4140   DECLARE_PALETTE_INIT(tryout);
4241   UINT32 screen_update_tryout(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
4342   void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
trunk/src/mame/includes/usgames.h
r244677r244678
1717   DECLARE_WRITE8_MEMBER(usgames_videoram_w);
1818   DECLARE_WRITE8_MEMBER(usgames_charram_w);
1919   TILE_GET_INFO_MEMBER(get_usgames_tile_info);
20    virtual void machine_start();
21    virtual void video_start();
20   virtual void video_start();
2221   DECLARE_PALETTE_INIT(usgames);
2322   UINT32 screen_update_usgames(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
2423   required_device<cpu_device> m_maincpu;
trunk/src/mame/includes/vigilant.h
r244677r244678
3838   DECLARE_WRITE8_MEMBER(vigilant_horiz_scroll_w);
3939   DECLARE_WRITE8_MEMBER(vigilant_rear_horiz_scroll_w);
4040   DECLARE_WRITE8_MEMBER(vigilant_rear_color_w);
41    virtual void machine_start();
42    virtual void video_start();
41   virtual void video_start();
4342   virtual void video_reset();
4443   UINT32 screen_update_vigilant(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
4544   UINT32 screen_update_kikcubic(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
trunk/src/mame/video/hng64.c
r244677r244678
77
88
99
10void hng64_state::hng64_mark_all_tiles_dirty( int tilemap )
10static void hng64_mark_all_tiles_dirty( hng64_state *state, int tilemap )
1111{
12   m_tilemap[tilemap].m_tilemap_8x8->mark_all_dirty();
13   m_tilemap[tilemap].m_tilemap_16x16->mark_all_dirty();
14   m_tilemap[tilemap].m_tilemap_16x16_alt->mark_all_dirty();
12   if (tilemap == 0)
13   {
14      state->m_tilemap0_8x8->mark_all_dirty();
15      state->m_tilemap0_16x16->mark_all_dirty();
16      state->m_tilemap0_16x16_alt->mark_all_dirty();
17   }
18   else if (tilemap == 1)
19   {
20      state->m_tilemap1_8x8->mark_all_dirty();
21      state->m_tilemap1_16x16->mark_all_dirty();
22      state->m_tilemap1_16x16_alt->mark_all_dirty();
23   }
24   else if (tilemap == 2)
25   {
26      state->m_tilemap2_8x8->mark_all_dirty();
27      state->m_tilemap2_16x16->mark_all_dirty();
28      state->m_tilemap2_16x16_alt->mark_all_dirty();
29   }
30   else if (tilemap == 3)
31   {
32      state->m_tilemap3_8x8->mark_all_dirty();
33      state->m_tilemap3_16x16->mark_all_dirty();
34      state->m_tilemap3_16x16_alt->mark_all_dirty();
35   }
1536}
1637
17void hng64_state::hng64_mark_tile_dirty( int tilemap, int tile_index )
38static void hng64_mark_tile_dirty( hng64_state *state, int tilemap, int tile_index )
1839{
19   m_tilemap[tilemap].m_tilemap_8x8->mark_tile_dirty(tile_index);
20   m_tilemap[tilemap].m_tilemap_16x16->mark_tile_dirty(tile_index);
21   m_tilemap[tilemap].m_tilemap_16x16_alt->mark_tile_dirty(tile_index);
40   if (tilemap == 0)
41   {
42      state->m_tilemap0_8x8->mark_tile_dirty(tile_index);
43      state->m_tilemap0_16x16->mark_tile_dirty(tile_index);
44      state->m_tilemap0_16x16_alt->mark_tile_dirty(tile_index);
45   }
46   else if (tilemap == 1)
47   {
48      state->m_tilemap1_8x8->mark_tile_dirty(tile_index);
49      state->m_tilemap1_16x16->mark_tile_dirty(tile_index);
50      state->m_tilemap1_16x16_alt->mark_tile_dirty(tile_index);
51   }
52   else if (tilemap == 2)
53   {
54      state->m_tilemap2_8x8->mark_tile_dirty(tile_index);
55      state->m_tilemap2_16x16->mark_tile_dirty(tile_index);
56      state->m_tilemap2_16x16_alt->mark_tile_dirty(tile_index);
57   }
58   else if (tilemap == 3)
59   {
60      state->m_tilemap3_8x8->mark_tile_dirty(tile_index);
61      state->m_tilemap3_16x16->mark_tile_dirty(tile_index);
62      state->m_tilemap3_16x16_alt->mark_tile_dirty(tile_index);
63   }
2264}
2365
2466
r244677r244678
63105 * 0x0e0 in Samurai Shodown/Xrally games, 0x1c0 in all the others, zooming factor?
64106 */
65107
66void hng64_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
108static void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
67109{
110   hng64_state *state = screen.machine().driver_data<hng64_state>();
68111   gfx_element *gfx;
69   UINT32 *source = m_spriteram;
70   UINT32 *finish = m_spriteram + 0xc000/4;
112   UINT32 *source = state->m_spriteram;
113   UINT32 *finish = state->m_spriteram + 0xc000/4;
71114
72115   // global offsets in sprite regs
73   int spriteoffsx = (m_spriteregs[1]>>0)&0xffff;
74   int spriteoffsy = (m_spriteregs[1]>>16)&0xffff;
116   int spriteoffsx = (state->m_spriteregs[1]>>0)&0xffff;
117   int spriteoffsy = (state->m_spriteregs[1]>>16)&0xffff;
75118
76119#if 0
77120   for (int iii = 0; iii < 0x0f; iii++)
78      osd_printf_debug("%.8x ", m_videoregs[iii]);
121      osd_printf_debug("%.8x ", state->m_videoregs[iii]);
79122   osd_printf_debug("\n");
80123#endif
81124
r244677r244678
139182         int zoom_factor;
140183
141184         /* FIXME: regular zoom mode has precision bugs, can be easily seen in Samurai Shodown 64 intro */
142         zoom_factor = (m_spriteregs[0] & 0x08000000) ? 0x1000 : 0x100;
185         zoom_factor = (state->m_spriteregs[0] & 0x08000000) ? 0x1000 : 0x100;
143186         if(!zoomx) zoomx=zoom_factor;
144187         if(!zoomy) zoomy=zoom_factor;
145188
r244677r244678
154197         zoomy += (int)((foomY - floor(foomY)) * (float)0x10000);
155198      }
156199
157      if (m_spriteregs[0] & 0x00800000) //bpp switch
200      if (state->m_spriteregs[0] & 0x00800000) //bpp switch
158201      {
159         gfx= m_gfxdecode->gfx(4);
202         gfx= state->m_gfxdecode->gfx(4);
160203      }
161204      else
162205      {
163         gfx= m_gfxdecode->gfx(5);
206         gfx= state->m_gfxdecode->gfx(5);
164207         tileno>>=1;
165208         pal&=0xf;
166209      }
r244677r244678
219262               tileno=(source[4]&0x0007ffff);
220263               pal =(source[3]&0x00ff0000)>>16;
221264
222               if (m_spriteregs[0] & 0x00800000) //bpp switch
265               if (state->m_spriteregs[0] & 0x00800000) //bpp switch
223266               {
224                  gfx= m_gfxdecode->gfx(4);
267                  gfx= state->m_gfxdecode->gfx(4);
225268               }
226269               else
227270               {
228                  gfx= m_gfxdecode->gfx(5);
271                  gfx= state->m_gfxdecode->gfx(5);
229272                  tileno>>=1;
230273                  pal&=0xf;
231274               }
r244677r244678
285328 */
286329
287330/* this is broken for the 'How to Play' screen in Buriki after attract, disabled for now */
288void hng64_state::transition_control( bitmap_rgb32 &bitmap, const rectangle &cliprect)
331static void transition_control(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect)
289332{
290   UINT32 *hng64_tcram = m_tcram;
333   hng64_state *state = machine.driver_data<hng64_state>();
334   UINT32 *hng64_tcram = state->m_tcram;
291335   int i, j;
292336
293337//  float colorScaleR, colorScaleG, colorScaleB;
r244677r244678
504548WRITE32_MEMBER(hng64_state::hng64_videoram_w)
505549{
506550   int realoff;
551   hng64_state *state = machine().driver_data<hng64_state>();
507552   COMBINE_DATA(&m_videoram[offset]);
508553
509554   realoff = offset*4;
510555
511556   if ((realoff>=0) && (realoff<0x10000))
512557   {
513      hng64_mark_tile_dirty(0, offset&0x3fff);
558      hng64_mark_tile_dirty(state, 0, offset&0x3fff);
514559   }
515560   else if ((realoff>=0x10000) && (realoff<0x20000))
516561   {
517      hng64_mark_tile_dirty(1, offset&0x3fff);
562      hng64_mark_tile_dirty(state, 1, offset&0x3fff);
518563   }
519564   else if ((realoff>=0x20000) && (realoff<0x30000))
520565   {
521      hng64_mark_tile_dirty(2, offset&0x3fff);
566      hng64_mark_tile_dirty(state, 2, offset&0x3fff);
522567   }
523568   else if ((realoff>=0x30000) && (realoff<0x40000))
524569   {
525      hng64_mark_tile_dirty(3, offset&0x3fff);
570      hng64_mark_tile_dirty(state, 3, offset&0x3fff);
526571   }
527572
528573//  if ((realoff>=0x40000)) osd_printf_debug("offsw %08x %08x\n",realoff,data);
r244677r244678
531576}
532577
533578/* internal set of transparency states for rendering */
579enum hng64trans_t
580{
581   HNG64_TILEMAP_NORMAL = 1,
582   HNG64_TILEMAP_ADDITIVE,
583   HNG64_TILEMAP_ALPHA
584};
534585
535586
587struct blit_parameters
588{
589   bitmap_rgb32 *          bitmap;
590   rectangle           cliprect;
591   UINT32              tilemap_priority_code;
592   UINT8               mask;
593   UINT8               value;
594   UINT8               alpha;
595   hng64trans_t        drawformat;
596};
597
598
599
536600static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat)
537601{
538602   /* start with nothing */
r244677r244678
609673      *(UINT32 *)dest = alpha_blend_r32(*(UINT32 *)dest, clut[INPUT_VAL], alpha); \
610674} while (0)
611675
612void hng64_state::hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit,
676static void hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit,
613677      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound)
614678{
615   const pen_t *clut = &m_palette->pen(blit->tilemap_priority_code >> 16);
679   hng64_state *state = screen.machine().driver_data<hng64_state>();
680   const pen_t *clut = &state->m_palette->pen(blit->tilemap_priority_code >> 16);
616681   bitmap_ind8 &priority_bitmap = screen.priority();
617682   bitmap_rgb32 &destbitmap = *blit->bitmap;
618683   bitmap_ind16 &srcbitmap = tmap->pixmap();
r244677r244678
786851
787852
788853
789void hng64_state::hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
854static void hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
790855      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
791856      int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat)
792857{
r244677r244678
814879}
815880
816881
817inline void hng64_state::hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
882INLINE void hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
818883      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
819884      int wraparound, UINT32 flags, UINT8 priority, hng64trans_t drawformat)
820885{
r244677r244678
823888
824889
825890
826void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm )
891static void hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm )
827892{
828   UINT32 *hng64_videoregs = m_videoregs;
829   UINT32 *hng64_videoram = m_videoram;
893   hng64_state *state = screen.machine().driver_data<hng64_state>();
894   UINT32 *hng64_videoregs = state->m_videoregs;
895   UINT32 *hng64_videoram = state->m_videoram;
830896   tilemap_t* tilemap = 0;
831897   UINT32 scrollbase = 0;
832898   UINT32 tileregs = 0;
r244677r244678
837903
838904   int global_dimensions = (global_tileregs&0x03000000)>>24;
839905
840   if ( (m_additive_tilemap_debug&(1 << tm)))
906   if ( (state->m_additive_tilemap_debug&(1 << tm)))
841907      debug_blend_enabled = 1;
842908
843909   if ((global_dimensions != 0) && (global_dimensions != 3))
r244677r244678
847913   {
848914      scrollbase = (hng64_videoregs[0x04]&0x3fff0000)>>16;
849915      tileregs   = (hng64_videoregs[0x02]&0xffff0000)>>16;
916
917      if (global_dimensions==0)
918      {
919         if (tileregs&0x0200)    tilemap = state->m_tilemap0_16x16;
920         else tilemap = state->m_tilemap0_8x8;
921      }
922      else
923      {
924         if (tileregs&0x0200)    tilemap = state->m_tilemap0_16x16_alt;
925         else tilemap = state->m_tilemap0_8x8; // _alt
926      }
850927   }
851928   else if (tm==1)
852929   {
853930      scrollbase = (hng64_videoregs[0x04]&0x00003fff)>>0;
854931      tileregs   = (hng64_videoregs[0x02]&0x0000ffff)>>0;
932
933      if (global_dimensions==0)
934      {
935         if (tileregs&0x0200)    tilemap = state->m_tilemap1_16x16;
936         else tilemap = state->m_tilemap1_8x8;
937      }
938      else
939      {
940         if (tileregs&0x0200)    tilemap = state->m_tilemap1_16x16_alt;
941         else tilemap = state->m_tilemap1_8x8; // _alt
942      }
855943   }
856944   else if (tm==2)
857945   {
858946      scrollbase = (hng64_videoregs[0x05]&0x3fff0000)>>16;
859947      tileregs   = (hng64_videoregs[0x03]&0xffff0000)>>16;
948
949      if (global_dimensions==0)
950      {
951         if (tileregs&0x0200)    tilemap = state->m_tilemap2_16x16;
952         else tilemap = state->m_tilemap2_8x8;
953      }
954      else
955      {
956         if (tileregs&0x0200)    tilemap = state->m_tilemap2_16x16_alt;
957         else tilemap = state->m_tilemap2_8x8; // _alt
958      }
860959   }
861960   else if (tm==3)
862961   {
863962      scrollbase = (hng64_videoregs[0x05]&0x00003fff)>>0;
864963      tileregs   = (hng64_videoregs[0x03]&0x0000ffff)>>0;
865   }
866964
867   if (global_dimensions==0)
868   {
869      if (tileregs&0x0200)    tilemap = m_tilemap[tm].m_tilemap_16x16;
870      else tilemap = m_tilemap[tm].m_tilemap_8x8;
965      if (global_dimensions==0)
966      {
967         if (tileregs&0x0200)    tilemap = state->m_tilemap3_16x16;
968         else tilemap = state->m_tilemap3_8x8;
969      }
970      else
971      {
972         if (tileregs&0x0200)    tilemap = state->m_tilemap3_16x16_alt;
973         else tilemap = state->m_tilemap3_8x8; // _alt
974      }
871975   }
872   else
873   {
874      if (tileregs&0x0200)    tilemap = m_tilemap[tm].m_tilemap_16x16_alt;
875      else tilemap = m_tilemap[tm].m_tilemap_8x8; // _alt
876   }
877976
878977   // xrally's pink tilemaps make me think this is a tilemap enable bit.
879978   // fatfurwa makes me think otherwise.
880//   if (!(tileregs & 0x0040)) return;
979   //if (!(tileregs & 0x0040)) return;
881980
882981   // set the transmask so our manual copy is correct
883982   if (tileregs & 0x0400)
r244677r244678
10271126            bitmap_ind16 &bm = tilemap->pixmap();
10281127            int bmheight = bm.height();
10291128            int bmwidth = bm.width();
1030            const pen_t *paldata = m_palette->pens();
1129            const pen_t *paldata = state->m_palette->pens();
10311130            UINT32* dstptr;
10321131            UINT16* srcptr;
10331132            int xx,yy;
r244677r244678
11231222            bitmap_ind16 &bm = tilemap->pixmap();
11241223            int bmheight = bm.height();
11251224            int bmwidth = bm.width();
1126            const pen_t *paldata = m_palette->pens();
1225            const pen_t *paldata = state->m_palette->pens();
11271226            UINT32* dstptr;
11281227            UINT16* srcptr;
11291228            int xx,yy;
r244677r244678
12121311    // 0940 - samurai shodown 64
12131312    // 0880 - buriki
12141313
1215    // mmmm dbrz zzzz zzzz
1314    // mmmm dbr? ??e? ????
12161315    // m = mosaic related?
12171316    //  -- they seem to enable mosaic at the same time as rowscroll in several cases (floor in buriki / ff)
12181317    //     and also on the rotating logo in buriki.. does it cause some kind of aliasing side-effect, or.. ?
12191318    // r = tile size (seems correct)
12201319    // b = 4bpp/8bpp (seems correct) (beast busters, samsh64, sasm64 2, xrally switch it for some screens)
12211320    // d = line (floor) mode - buriki, fatafurwa, some backgrounds in ss64_2
1222    // z = z depth? tilemaps might also be affected by min / max clip values somewhere? (debug layer on buriki has priority 0x020, which would be highest)
1321    // e = enable according to sams64_2 debug mode, buriki and xrally.. but NOT fatal fury :-(
12231322
12241323
12251324 */
r244677r244678
12351334   UINT32 *hng64_tcram = m_tcram;
12361335   UINT32 animmask;
12371336   UINT32 animbits;
1238   UINT16 tileflags[4];
1337   UINT16 tileflags0, tileflags1;
1338   UINT16 tileflags2, tileflags3;
12391339
12401340#if 0
12411341   // press in sams64_2 attract mode for a nice debug screen from the game
r244677r244678
12561356
12571357   animmask = hng64_videoregs[0x0b];
12581358   animbits = hng64_videoregs[0x0c];
1259   tileflags[0] = hng64_videoregs[0x02]>>16;
1260   tileflags[1] = hng64_videoregs[0x02]&0xffff;
1261   tileflags[2] = hng64_videoregs[0x03]>>16;
1262   tileflags[3] = hng64_videoregs[0x03]&0xffff;
1359   tileflags0 = hng64_videoregs[0x02]>>16;
1360   tileflags1 = hng64_videoregs[0x02]&0xffff;
1361   tileflags2 = hng64_videoregs[0x03]>>16;
1362   tileflags3 = hng64_videoregs[0x03]&0xffff;
12631363
12641364   /* if the auto-animation mask or bits have changed search for tiles using them and mark as dirty */
12651365   if ((m_old_animmask != animmask) || (m_old_animbits != animbits))
r244677r244678
12691369      {
12701370         if (hng64_videoram[tile_index+(0x00000/4)]&0x200000)
12711371         {
1272            hng64_mark_tile_dirty(0, tile_index);
1372            hng64_mark_tile_dirty(this, 0, tile_index);
12731373         }
12741374         if (hng64_videoram[tile_index+(0x10000/4)]&0x200000)
12751375         {
1276            hng64_mark_tile_dirty(1, tile_index);
1376            hng64_mark_tile_dirty(this, 1, tile_index);
12771377         }
12781378         if (hng64_videoram[tile_index+(0x20000/4)]&0x200000)
12791379         {
1280            hng64_mark_tile_dirty(2, tile_index);
1380            hng64_mark_tile_dirty(this, 2, tile_index);
12811381         }
12821382         if (hng64_videoram[tile_index+(0x30000/4)]&0x200000)
12831383         {
1284            hng64_mark_tile_dirty(3, tile_index);
1384            hng64_mark_tile_dirty(this, 3, tile_index);
12851385         }
12861386      }
12871387
r244677r244678
12891389      m_old_animbits = animbits;
12901390   }
12911391
1292   for (int i = 0; i < 4; i++)
1392   if ((m_old_tileflags0&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags0&IMPORTANT_DIRTY_TILEFLAG_MASK))
12931393   {
1294      if ((m_old_tileflags[i]&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags[i]&IMPORTANT_DIRTY_TILEFLAG_MASK))
1295      {
1296         hng64_mark_all_tiles_dirty(i);
1297         m_old_tileflags[i] = tileflags[i];
1298      }
1394      hng64_mark_all_tiles_dirty(this, 0);
1395      m_old_tileflags0 = tileflags0;
12991396   }
13001397
1398   if ((m_old_tileflags1&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags1&IMPORTANT_DIRTY_TILEFLAG_MASK))
1399   {
1400      hng64_mark_all_tiles_dirty(this, 1);
1401      m_old_tileflags1 = tileflags1;
1402   }
13011403
1404   if ((m_old_tileflags2&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags2&IMPORTANT_DIRTY_TILEFLAG_MASK))
1405   {
1406      hng64_mark_all_tiles_dirty(this, 2);
1407      m_old_tileflags2 = tileflags2;
1408   }
1409
1410   if ((m_old_tileflags3&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags3&IMPORTANT_DIRTY_TILEFLAG_MASK))
1411   {
1412      hng64_mark_all_tiles_dirty(this, 3);
1413      m_old_tileflags3 = tileflags3;
1414   }
1415
1416   // mark all frames as dirty if for some reason we don't trust the above code
1417   //hng64_mark_all_tiles_dirty(this, 0);
1418   //hng64_mark_all_tiles_dirty(this, 1);
1419   //hng64_mark_all_tiles_dirty(this, 2);
1420   //hng64_mark_all_tiles_dirty(this, 3);
1421
13021422   hng64_drawtilemap(screen,bitmap,cliprect, 3);
13031423   hng64_drawtilemap(screen,bitmap,cliprect, 2);
13041424   hng64_drawtilemap(screen,bitmap,cliprect, 1);
r244677r244678
13301450   draw_sprites(screen, bitmap,cliprect);
13311451
13321452   if(0)
1333      transition_control(bitmap, cliprect);
1453      transition_control(machine(), bitmap, cliprect);
13341454
13351455   if (0)
13361456      popmessage("%08x %08x %08x %08x %08x", m_spriteregs[0], m_spriteregs[1], m_spriteregs[2], m_spriteregs[3], m_spriteregs[4]);
13371457
1338   if (1)
1339   popmessage("%08x %08x TR(%04x %04x %04x %04x) SB(%04x %04x %04x %04x) %08x %08x %08x %08x %08x AA(%08x %08x) %08x",
1458   if (0)
1459   popmessage("%08x %08x TR(%04x %04x %04x %04x) SB(%04x %04x %04x %04x) %08x %08x %08x %08x %08x AA(%08x %08x) %08x %08x",
13401460      hng64_videoregs[0x00],
13411461      hng64_videoregs[0x01],
1342   (hng64_videoregs[0x02]>>16)&0x01ff, // ----  bits we're sure about are masked out
1343   (hng64_videoregs[0x02]>>0)&0x01ff,  //  ss64_2 debug mode indicates that 0x0040 is enable!
1344   (hng64_videoregs[0x03]>>16)&0x01ff, //   buriki agrees (debug data on text layer) xrally agress (pink layer)
1345   (hng64_videoregs[0x03]>>0)&0x01ff,  //   fatal fury doesn't (all backgrounds have it set) joy
1462   (hng64_videoregs[0x02]>>16)&0xf9ff, // ----  bits we're sure about are masked out
1463   (hng64_videoregs[0x02]>>0)&0xf9ff,  //  ss64_2 debug mode indicates that 0x0040 is enable!
1464   (hng64_videoregs[0x03]>>16)&0xf9ff, //   buriki agrees (debug data on text layer) xrally agress (pink layer)
1465   (hng64_videoregs[0x03]>>0)&0xf9ff,  //   fatal fury doesn't (all backgrounds have it set) joy
13461466   (hng64_videoregs[0x04]>>16)&0xffff,
13471467   (hng64_videoregs[0x04]>>0)&0xffff,
13481468   (hng64_videoregs[0x05]>>16)&0xffff,
r244677r244678
13541474      hng64_videoregs[0x0a],
13551475      hng64_videoregs[0x0b],
13561476      hng64_videoregs[0x0c],
1357      hng64_videoregs[0x0d]);
1477      hng64_videoregs[0x0d],
1478      hng64_videoregs[0x0e]);
13581479
13591480   if (0)
13601481   popmessage("3D: %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x",
r244677r244678
14261547
14271548   m_old_animmask = -1;
14281549   m_old_animbits = -1;
1429   m_old_tileflags[0] = -1;
1430   m_old_tileflags[1] = -1;
1431   m_old_tileflags[2] = -1;
1432   m_old_tileflags[3] = -1;
1550   m_old_tileflags0 = -1;
1551   m_old_tileflags1 = -1;
1552   m_old_tileflags2 = -1;
1553   m_old_tileflags3 = -1;
14331554
1434   m_tilemap[0].m_tilemap_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1435   m_tilemap[0].m_tilemap_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1436   m_tilemap[0].m_tilemap_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
1555   m_tilemap0_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1556   m_tilemap0_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1557   m_tilemap0_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile0_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
14371558
1438   m_tilemap[1].m_tilemap_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1439   m_tilemap[1].m_tilemap_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1440   m_tilemap[1].m_tilemap_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
1559   m_tilemap1_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1560   m_tilemap1_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1561   m_tilemap1_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile1_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
14411562
1442   m_tilemap[2].m_tilemap_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1443   m_tilemap[2].m_tilemap_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1444   m_tilemap[2].m_tilemap_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
1563   m_tilemap2_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1564   m_tilemap2_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1565   m_tilemap2_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile2_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
14451566
1446   m_tilemap[3].m_tilemap_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1447   m_tilemap[3].m_tilemap_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1448   m_tilemap[3].m_tilemap_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
1567   m_tilemap3_8x8       = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_8x8_info),this),   TILEMAP_SCAN_ROWS,  8,   8, 128, 128); /* 128x128x4 = 0x10000 */
1568   m_tilemap3_16x16     = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 128, 128); /* 128x128x4 = 0x10000 */
1569   m_tilemap3_16x16_alt = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(hng64_state::get_hng64_tile3_16x16_info),this), TILEMAP_SCAN_ROWS,  16, 16, 256,  64); /* 128x128x4 = 0x10000 */
14491570
1450   for (int i = 0; i < 4; i++)
1451   {
1452      m_tilemap[i].m_tilemap_8x8->set_transparent_pen(0);
1453      m_tilemap[i].m_tilemap_16x16->set_transparent_pen(0);
1454      m_tilemap[i].m_tilemap_16x16_alt->set_transparent_pen(0);
1455   }
1571   m_tilemap0_8x8->set_transparent_pen(0);
1572   m_tilemap0_16x16->set_transparent_pen(0);
1573   m_tilemap0_16x16_alt->set_transparent_pen(0);
14561574
1575   m_tilemap1_8x8->set_transparent_pen(0);
1576   m_tilemap1_16x16->set_transparent_pen(0);
1577   m_tilemap1_16x16_alt->set_transparent_pen(0);
1578
1579   m_tilemap2_8x8->set_transparent_pen(0);
1580   m_tilemap2_16x16->set_transparent_pen(0);
1581   m_tilemap2_16x16_alt->set_transparent_pen(0);
1582
1583   m_tilemap3_8x8->set_transparent_pen(0);
1584   m_tilemap3_16x16->set_transparent_pen(0);
1585   m_tilemap3_16x16_alt->set_transparent_pen(0);
1586
14571587   // Debug switch, turn on / off additive blending on a per-tilemap basis
14581588   m_additive_tilemap_debug = 0;
14591589
r244677r244678
15041634static void vecmatmul4(float *product, const float *a, const float *b);
15051635static float vecDotProduct(const float *a, const float *b);
15061636static void normalize(float* x);
1637
15071638static void performFrustumClip(struct polygon *p);
1639static void drawShaded(running_machine &machine, struct polygon *p);
1640//static void plot(running_machine &machine, INT32 x, INT32 y, UINT32 color);
1641//static void drawline2d(running_machine &machine, INT32 x0, INT32 y0, INT32 x1, INT32 y1, UINT32 color);
1642//static void DrawWireframe(running_machine &machine, struct polygon *p);
1643
15081644static float uToF(UINT16 input);
15091645
15101646
r244677r244678
15421678
15431679// Operation 0001
15441680// Camera transformation.
1545void hng64_state::setCameraTransformation(const UINT16* packet)
1681static void setCameraTransformation(hng64_state *state, const UINT16* packet)
15461682{
1547   float *cameraMatrix = m_cameraMatrix;
1683   float *cameraMatrix = state->m_cameraMatrix;
15481684
15491685   /*//////////////
15501686   // PACKET FORMAT
r244677r244678
15891725
15901726// Operation 0010
15911727// Lighting information
1592void hng64_state::setLighting(const UINT16* packet)
1728static void setLighting(hng64_state *state, const UINT16* packet)
15931729{
1594   float *lightVector = m_lightVector;
1730   float *lightVector = state->m_lightVector;
15951731
15961732   /*//////////////
15971733   // PACKET FORMAT
r244677r244678
16181754   lightVector[0] = uToF(packet[3]);
16191755   lightVector[1] = uToF(packet[4]);
16201756   lightVector[2] = uToF(packet[5]);
1621   m_lightStrength = uToF(packet[9]);
1757   state->m_lightStrength = uToF(packet[9]);
16221758}
16231759
16241760// Operation 0011
16251761// Palette / Model flags?
1626void hng64_state::set3dFlags(const UINT16* packet)
1762static void set3dFlags(hng64_state *state, const UINT16* packet)
16271763{
16281764   /*//////////////
16291765   // PACKET FORMAT
r244677r244678
16441780   // [14] - ???? ... ? ''  ''
16451781   // [15] - ???? ... ? ''  ''
16461782   ////////////*/
1647   m_paletteState3d = (packet[8] & 0xff00) >> 8;
1783   state->m_paletteState3d = (packet[8] & 0xff00) >> 8;
16481784}
16491785
16501786// Operation 0012
16511787// Projection Matrix.
1652void hng64_state::setCameraProjectionMatrix(const UINT16* packet)
1788static void setCameraProjectionMatrix(hng64_state *state, const UINT16* packet)
16531789{
1654   float *projectionMatrix = m_projectionMatrix;
1790   float *projectionMatrix = state->m_projectionMatrix;
16551791
16561792   /*//////////////
16571793   // PACKET FORMAT
r244677r244678
17071843
17081844// Operation 0100
17091845// Polygon rasterization.
1710void hng64_state::recoverPolygonBlock(const UINT16* packet, struct polygon* polys, int* numPolys)
1846static void recoverPolygonBlock(running_machine& machine, const UINT16* packet, struct polygon* polys, int* numPolys)
17111847{
17121848   /*//////////////
17131849   // PACKET FORMAT
r244677r244678
17441880   // [15] - xxxx ... Transformation matrix
17451881   ////////////*/
17461882
1883   hng64_state *state = machine.driver_data<hng64_state>();
17471884   UINT32 size[4];
17481885   UINT32 address[4];
17491886   UINT32 megaOffset;
r244677r244678
17571894   setIdentity(objectMatrix);
17581895
17591896   struct polygon lastPoly = { 0 };
1760   const rectangle &visarea = m_screen->visible_area();
1897   const rectangle &visarea = machine.first_screen()->visible_area();
17611898
17621899   /////////////////
17631900   // HEADER INFO //
r244677r244678
18131950   //////////////////////////////////////////////*/
18141951
18151952   // 3d ROM Offset
1816   UINT16* threeDRoms = (UINT16*)memregion("verts")->base();
1953   UINT16* threeDRoms = (UINT16*)(machine.root_device().memregion("verts")->base());
18171954   UINT32  threeDOffset = (((UINT32)packet[2]) << 16) | ((UINT32)packet[3]);
18181955   UINT16* threeDPointer = &threeDRoms[threeDOffset * 3];
18191956
1820   if (threeDOffset >= memregion("verts")->bytes())
1957   if (threeDOffset >= machine.root_device().memregion("verts")->bytes())
18211958   {
18221959      printf("Strange geometry packet: (ignoring)\n");
18231960      printPacket(packet, 1);
r244677r244678
19422079         /* FIXME: This isn't correct.
19432080                   Buriki & Xrally need this line.  Roads Edge needs it removed.
19442081                   So instead we're looking for a bit that is on for XRally & Buriki, but noone else. */
1945         if (m_3dregs[0x00/4] & 0x2000)
2082         if (state->m_3dregs[0x00/4] & 0x2000)
19462083         {
1947            if (strcmp(machine().basename(), "roadedge"))
2084            if (strcmp(machine.basename(), "roadedge"))
19482085               polys[*numPolys].palOffset += 0x800;
19492086         }
19502087
r244677r244678
19582095         // Apply the dynamic palette offset if its flag is set, otherwise stick with the fixed one
19592096         if ((packet[1] & 0x0100))
19602097         {
1961            explicitPaletteValue1 = m_paletteState3d * 0x80;
2098            explicitPaletteValue1 = state->m_paletteState3d * 0x80;
19622099            explicitPaletteValue2 = 0;      // This is probably hiding somewhere in operation 0011
19632100         }
19642101
r244677r244678
21522289         ////////////////////////////////////
21532290         // Perform the world transformations...
21542291         // !! Can eliminate this step with a matrix stack (maybe necessary?) !!
2155         setIdentity(m_modelViewMatrix);
2156         if (m_mcu_type != SAMSHO_MCU)
2292         setIdentity(state->m_modelViewMatrix);
2293         if (state->m_mcu_type != SAMSHO_MCU)
21572294         {
21582295            // The sams64 games transform the geometry in front of a stationary camera.
21592296            // This is fine in sams64_2, since it never calls the 'camera transformation' function
21602297            // (thus using the identity matrix for this transform), but sams64 calls the
21612298            // camera transformation function with rotation values.
21622299            // It remains to be seen what those might do...
2163            matmul4(m_modelViewMatrix, m_modelViewMatrix, m_cameraMatrix);
2300            matmul4(state->m_modelViewMatrix, state->m_modelViewMatrix, state->m_cameraMatrix);
21642301         }
2165         matmul4(m_modelViewMatrix, m_modelViewMatrix, objectMatrix);
2302         matmul4(state->m_modelViewMatrix, state->m_modelViewMatrix, objectMatrix);
21662303
21672304         // LIGHTING
2168         if (packet[1] & 0x0008 && m_lightStrength > 0.0f)
2305         if (packet[1] & 0x0008 && state->m_lightStrength > 0.0f)
21692306         {
21702307            for (int v = 0; v < 3; v++)
21712308            {
21722309               float transformedNormal[4];
21732310               vecmatmul4(transformedNormal, objectMatrix, polys[*numPolys].vert[v].normal);
21742311               normalize(transformedNormal);
2175               normalize(m_lightVector);
2312               normalize(state->m_lightVector);
21762313
2177               float intensity = vecDotProduct(transformedNormal, m_lightVector) * -1.0f;
2314               float intensity = vecDotProduct(transformedNormal, state->m_lightVector) * -1.0f;
21782315               intensity = (intensity <= 0.0f) ? (0.0f) : (intensity);
2179               intensity *= m_lightStrength * 128.0f;    // Turns 0x0100 into 1.0
2316               intensity *= state->m_lightStrength * 128.0f;    // Turns 0x0100 into 1.0
21802317               intensity *= 128.0;                     // Maps intensity to the range [0.0, 2.0]
21812318               if (intensity >= 255.0f) intensity = 255.0f;
21822319
r244677r244678
22192356
22202357
22212358         // BEHIND-THE-CAMERA CULL //
2222         vecmatmul4(cullRay, m_modelViewMatrix, polys[*numPolys].vert[0].worldCoords);
2359         vecmatmul4(cullRay, state->m_modelViewMatrix, polys[*numPolys].vert[0].worldCoords);
22232360         if (cullRay[2] > 0.0f)              // Camera is pointing down -Z
22242361         {
22252362            polys[*numPolys].visible = 0;
r244677r244678
22322369            for (int m = 0; m < polys[*numPolys].n; m++)
22332370            {
22342371               // Transform and project the vertex into pre-divided homogeneous coordinates...
2235               vecmatmul4(eyeCoords, m_modelViewMatrix, polys[*numPolys].vert[m].worldCoords);
2236               vecmatmul4(polys[*numPolys].vert[m].clipCoords, m_projectionMatrix, eyeCoords);
2372               vecmatmul4(eyeCoords, state->m_modelViewMatrix, polys[*numPolys].vert[m].worldCoords);
2373               vecmatmul4(polys[*numPolys].vert[m].clipCoords, state->m_projectionMatrix, eyeCoords);
22372374            }
22382375
22392376            if (polys[*numPolys].visible)
r244677r244678
22732410   }
22742411}
22752412
2276void hng64_state::hng64_command3d(const UINT16* packet)
2413void hng64_command3d(running_machine& machine, const UINT16* packet)
22772414{
2415   hng64_state *state = machine.driver_data<hng64_state>();
22782416
22792417   /* A temporary place to put some polygons.  This will optimize away if the compiler's any good. */
22802418   int numPolys = 0;
22812419   dynamic_array<polygon> polys(1024*5);
22822420
2283   //printf("packet type : %04x %04x|%04x %04x|%04x %04x|%04x %04x  | %04x %04x %04x %04x %04x %04x %04x %04x\n", packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7],     packet[8], packet[9], packet[10], packet[11], packet[12], packet[13], packet[14], packet[15]);
2284   
2421   //printf("packet type : %04x %04x|%04x %04x|%04x %04x|%04x %04x\n", packet[0],packet[1],packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]);
22852422   switch (packet[0])
22862423   {
22872424   case 0x0000:    // Appears to be a NOP.
22882425      break;
22892426
22902427   case 0x0001:    // Camera transformation.
2291      setCameraTransformation(packet);
2428      setCameraTransformation(state, packet);
22922429      break;
22932430
22942431   case 0x0010:    // Lighting information.
22952432      //if (packet[9]) printPacket(packet, 1);
2296      setLighting(packet);
2433      setLighting(state, packet);
22972434      break;
22982435
22992436   case 0x0011:    // Palette / Model flags?
23002437      //printPacket(packet, 1); printf("\n");
2301      set3dFlags(packet);
2438      set3dFlags(state, packet);
23022439      break;
23032440
23042441   case 0x0012:    // Projection Matrix
23052442      //printPacket(packet, 1);
2306      setCameraProjectionMatrix(packet);
2443      setCameraProjectionMatrix(state, packet);
23072444      break;
23082445
23092446   case 0x0100:
23102447   case 0x0101:    // Geometry with full transformations
23112448      // HACK.  Masks out a piece of geo bbust2's drawShaded() crashes on.
2312      if (packet[2] == 0x0003 && packet[3] == 0x8f37 && m_mcu_type == SHOOT_MCU)
2449      if (packet[2] == 0x0003 && packet[3] == 0x8f37 && state->m_mcu_type == SHOOT_MCU)
23132450         break;
23142451
2315      recoverPolygonBlock( packet, polys, &numPolys);
2452      recoverPolygonBlock(machine, packet, polys, &numPolys);
23162453      break;
23172454
23182455   case 0x0102:    // Geometry with only translation
r244677r244678
23322469      miniPacket[7] = 0x7fff;
23332470      miniPacket[11] = 0x7fff;
23342471      miniPacket[15] = 0x7fff;
2335      recoverPolygonBlock( miniPacket, polys, &numPolys);
2472      recoverPolygonBlock(machine, miniPacket, polys, &numPolys);
23362473
23372474      memset(miniPacket, 0, sizeof(UINT16)*16);
23382475      for (int i = 0; i < 7; i++) miniPacket[i] = packet[i+8];
2339      for (int i = 0; i < 7; i++) miniPacket[i] = packet[i+8];
23402476      miniPacket[7] = 0x7fff;
23412477      miniPacket[11] = 0x7fff;
23422478      miniPacket[15] = 0x7fff;
2343      recoverPolygonBlock( miniPacket, polys, &numPolys);
2479      recoverPolygonBlock(machine, miniPacket, polys, &numPolys);
23442480      break;
23452481
23462482   case 0x1000:    // Unknown: Some sort of global flags?
r244677r244678
23612497   {
23622498      if (polys[i].visible)
23632499      {
2364         //DrawWireframe( &polys[i]);
2365         drawShaded( &polys[i]);
2500         //DrawWireframe(machine, &polys[i]);
2501         drawShaded(machine, &polys[i]);
23662502      }
23672503   }
23682504}
r244677r244678
26482784// wireframe rendering //
26492785/////////////////////////
26502786#ifdef UNUSED_FUNCTION
2651static void plot( INT32 x, INT32 y, UINT32 color)
2787static void plot(running_machine &machine, INT32 x, INT32 y, UINT32 color)
26522788{
26532789   UINT32* cb = &(colorBuffer3d[(y * machine.first_screen()->visible_area().max_x) + x]);
26542790   *cb = color;
26552791}
26562792
26572793// Stolen from http://en.wikipedia.org/wiki/Bresenham's_line_algorithm (no copyright denoted) - the non-optimized version
2658static void drawline2d( INT32 x0, INT32 y0, INT32 x1, INT32 y1, UINT32 color)
2794static void drawline2d(running_machine &machine, INT32 x0, INT32 y0, INT32 x1, INT32 y1, UINT32 color)
26592795{
26602796#define SWAP(a,b) tmpswap = a; a = b; b = tmpswap;
26612797
r244677r244678
26932829   {
26942830      if (steep)
26952831      {
2696         plot( x0, y0, color);
2832         plot(machine, x0, y0, color);
26972833      }
26982834      else
26992835      {
2700         plot( y0, x0, color);
2836         plot(machine, y0, x0, color);
27012837      }
27022838      while (e >= 0)
27032839      {
r244677r244678
27112847#undef SWAP
27122848}
27132849
2714static void DrawWireframe( struct polygon *p)
2850static void DrawWireframe(running_machine &machine, struct polygon *p)
27152851{
27162852   int j;
27172853   for (j = 0; j < p->n; j++)
r244677r244678
27192855      // osd_printf_debug("now drawing : %f %f %f, %f %f %f\n", p->vert[j].clipCoords[0], p->vert[j].clipCoords[1], p->vert[j].clipCoords[2], p->vert[(j+1)%p->n].clipCoords[0], p->vert[(j+1)%p->n].clipCoords[1], p->vert[(j+1)%p->n].clipCoords[2]);
27202856      // osd_printf_debug("%f %f %f %f\n", p->vert[j].clipCoords[0], p->vert[j].clipCoords[1], p->vert[(j+1)%p->n].clipCoords[0], p->vert[(j+1)%p->n].clipCoords[1]);
27212857      UINT32 color = rgb_t((UINT8)255, (UINT8)255, (UINT8)0, (UINT8)0);
2722      drawline2d( p->vert[j].clipCoords[0], p->vert[j].clipCoords[1], p->vert[(j+1)%p->n].clipCoords[0], p->vert[(j+1)%p->n].clipCoords[1], color);
2858      drawline2d(machine, p->vert[j].clipCoords[0], p->vert[j].clipCoords[1], p->vert[(j+1)%p->n].clipCoords[0], p->vert[(j+1)%p->n].clipCoords[1], color);
27232859   }
27242860
27252861   // SHOWS THE CLIPPING //
r244677r244678
27342870}
27352871#endif
27362872
2873///////////////////////
2874// polygon rendering //
2875///////////////////////
27372876
2877struct polygonRasterOptions
2878{
2879   UINT8 texType;
2880   UINT8 texIndex;
2881   UINT8 texPageSmall;
2882   UINT8 texPageHorizOffset;
2883   UINT8 texPageVertOffset;
2884   int palOffset;
2885   int palPageSize;
2886   int debugColor;
2887};
2888
27382889/*********************************************************************/
27392890/**   FillSmoothTexPCHorizontalLine                                 **/
27402891/**     Input: Color Buffer (framebuffer), depth buffer, width and  **/
r244677r244678
27442895/**                                                                 **/
27452896/**     Output: none                                                **/
27462897/*********************************************************************/
2747inline void hng64_state::FillSmoothTexPCHorizontalLine(
2898INLINE void FillSmoothTexPCHorizontalLine(running_machine &machine,
27482899                                 const polygonRasterOptions& prOptions,
27492900                                 int x_start, int x_end, int y, float z_start, float z_delta,
27502901                                 float w_start, float w_delta, float r_start, float r_delta,
27512902                                 float g_start, float g_delta, float b_start, float b_delta,
27522903                                 float s_start, float s_delta, float t_start, float t_delta)
27532904{
2754   float*  db = &(m_depthBuffer3d[(y * m_screen->visible_area().max_x) + x_start]);
2755   UINT32* cb = &(m_colorBuffer3d[(y * m_screen->visible_area().max_x) + x_start]);
2905   hng64_state *state = machine.driver_data<hng64_state>();
2906   float*  db = &(state->m_depthBuffer3d[(y * machine.first_screen()->visible_area().max_x) + x_start]);
2907   UINT32* cb = &(state->m_colorBuffer3d[(y * machine.first_screen()->visible_area().max_x) + x_start]);
27562908
27572909   UINT8 paletteEntry = 0;
27582910   float t_coord, s_coord;
2759   const UINT8 *gfx = memregion("textures")->base();
2911   const UINT8 *gfx = state->memregion("textures")->base();
27602912   const UINT8 *textureOffset = &gfx[prOptions.texIndex * 1024 * 1024];
27612913
27622914   for (; x_start <= x_end; x_start++)
r244677r244678
28182970            {
28192971               // The color out of the texture
28202972               paletteEntry %= prOptions.palPageSize;
2821               rgb_t color = m_palette->pen(prOptions.palOffset + paletteEntry);
2973               rgb_t color = state->m_palette->pen(prOptions.palOffset + paletteEntry);
28222974
28232975               // Apply the lighting
28242976               float rIntensity = (r_start/w_start) / 255.0f;
r244677r244678
28863038//   nearest and bilinear filtering: Filtering={0,1}
28873039//   replace and modulate application modes: Function={0,1}
28883040//---------------------------------------------------------------------------
2889void hng64_state::RasterizeTriangle_SMOOTH_TEX_PC(
3041static void RasterizeTriangle_SMOOTH_TEX_PC(running_machine &machine,
28903042                                 float A[4], float B[4], float C[4],
28913043                                 float Ca[3], float Cb[3], float Cc[3], // PER-VERTEX RGB COLORS
28923044                                 float Ta[2], float Tb[2], float Tc[2], // PER-VERTEX (S,T) TEX-COORDS
r244677r244678
30803232
30813233      // Pass the horizontal line to the filler, this could be put in the routine
30823234      // then interpolate for the next values of x and z
3083      FillSmoothTexPCHorizontalLine( prOptions,
3235      FillSmoothTexPCHorizontalLine(machine, prOptions,
30843236         x_start, x_end, y_min, z_interp_x, z_delta_x, w_interp_x, w_delta_x,
30853237         r_interp_x, r_delta_x, g_interp_x, g_delta_x, b_interp_x, b_delta_x,
30863238         s_interp_x, s_delta_x, t_interp_x, t_delta_x);
r244677r244678
31593311
31603312      // Pass the horizontal line to the filler, this could be put in the routine
31613313      // then interpolate for the next values of x and z
3162      FillSmoothTexPCHorizontalLine( prOptions,
3314      FillSmoothTexPCHorizontalLine(machine, prOptions,
31633315         x_start, x_end, y_mid, z_interp_x, z_delta_x, w_interp_x, w_delta_x,
31643316         r_interp_x, r_delta_x, g_interp_x, g_delta_x, b_interp_x, b_delta_x,
31653317         s_interp_x, s_delta_x, t_interp_x, t_delta_x);
r244677r244678
31743326   }
31753327}
31763328
3177void hng64_state::drawShaded( struct polygon *p)
3329static void drawShaded(running_machine &machine, struct polygon *p)
31783330{
31793331   // The perspective-correct texture divide...
31803332   // !!! There is a very good chance the HNG64 hardware does not do perspective-correct texture-mapping !!!
r244677r244678
32023354
32033355   for (j = 1; j < p->n-1; j++)
32043356   {
3205      RasterizeTriangle_SMOOTH_TEX_PC(
3357      RasterizeTriangle_SMOOTH_TEX_PC(machine,
32063358                              p->vert[0].clipCoords, p->vert[j].clipCoords, p->vert[j+1].clipCoords,
32073359                              p->vert[0].light,      p->vert[j].light,      p->vert[j+1].light,
32083360                              p->vert[0].texCoords,  p->vert[j].texCoords,  p->vert[j+1].texCoords,
trunk/src/mess/drivers/hh_ucom4.c
r244677r244678
8787   DECLARE_INPUT_CHANGED_MEMBER(tmtennis_difficulty_switch);
8888   DECLARE_MACHINE_RESET(tmtennis);
8989
90   void tmpacman_display();
9190   DECLARE_WRITE8_MEMBER(tmpacman_grid_w);
9291   DECLARE_WRITE8_MEMBER(tmpacman_plate_w);
9392   DECLARE_WRITE8_MEMBER(tmpacman_port_e_w);
r244677r244678
237236
238237WRITE8_MEMBER(hh_ucom4_state::edracula_grid_w)
239238{
240   // C,D: vfd matrix grid
239   // ports C,D: vfd matrix grid
241240   int shift = (offset - NEC_UCOM4_PORTC) * 4;
242241   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
243242
r244677r244678
246245
247246WRITE8_MEMBER(hh_ucom4_state::edracula_plate_w)
248247{
249   // E-H,I01: vfd matrix plate
248   // ports E-H,I01: vfd matrix plate
250249   int shift = (offset - NEC_UCOM4_PORTE) * 4;
251250   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
252251
r244677r244678
326325
327326READ8_MEMBER(hh_ucom4_state::tmtennis_input_r)
328327{
329   // A,B: buttons
328   // ports A,B: buttons
330329   return ~read_inputs(2) >> (offset*4);
331330}
332331
333332WRITE8_MEMBER(hh_ucom4_state::tmtennis_grid_w)
334333{
335   // G-I: vfd matrix grid
334   // ports G-I: vfd matrix grid
336335   int shift = (offset - NEC_UCOM4_PORTG) * 4;
337336   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
338337
r244677r244678
341340
342341WRITE8_MEMBER(hh_ucom4_state::tmtennis_plate_w)
343342{
344   // C-F: vfd matrix plate
343   // ports C-F: vfd matrix plate
345344   if (offset == NEC_UCOM4_PORTF) offset--;
346345   int shift = (offset - NEC_UCOM4_PORTC) * 4;
347346   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
r244677r244678
453452  known releases:
454453  - Japan: Puck Man
455454  - USA: Pac Man
456  - UK: Puckman (Tomy), and also published by Grandstand as Munchman
455  - UK: Puckman (Tomy), and also as Munchman, published by Grandstand
457456  - Australia: Pac Man-1, published by Futuretronics
458457
459458  NOTE!: MESS external artwork is recommended
460459
461460***************************************************************************/
462461
463void hh_ucom4_state::tmpacman_display()
464{
465   UINT8 grid = BITSWAP8((UINT8)m_grid,0,1,2,3,4,5,6,7);
466   UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15);
467   
468   display_matrix(19, 8, plate | 0x100, grid);
469}
470
471462WRITE8_MEMBER(hh_ucom4_state::tmpacman_grid_w)
472463{
473   // C,D: vfd matrix grid
464   // ports C,D: vfd matrix grid
474465   int shift = (offset - NEC_UCOM4_PORTC) * 4;
475466   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
476467
477   tmpacman_display();
468   display_matrix(19, 8, m_plate, m_grid);
478469}
479470
480471WRITE8_MEMBER(hh_ucom4_state::tmpacman_plate_w)
481472{
482   // E023,F-I: vfd matrix plate
473   // ports E-I: vfd matrix plate
483474   int shift = (offset - NEC_UCOM4_PORTE) * 4;
484475   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
485476
486   tmpacman_display();
477   display_matrix(19, 8, m_plate, m_grid);
487478}
488479
489480WRITE8_MEMBER(hh_ucom4_state::tmpacman_port_e_w)
r244677r244678
503494   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
504495
505496   PORT_START("IN.1") // port B
506   PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) )
497   PORT_CONFNAME( 0x00, 0x00, DEF_STR( Difficulty ) )
507498   PORT_CONFSETTING(    0x00, "Amateur" )
508499   PORT_CONFSETTING(    0x01, "Professional" )
509500   PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
r244677r244678
557548
558549READ8_MEMBER(hh_ucom4_state::alnchase_input_r)
559550{
560   // A: buttons
551   // port A: buttons
561552   return read_inputs(2);
562553}
563554
r244677r244678
565556{
566557   if (offset <= NEC_UCOM4_PORTE)
567558   {
568      // C,D,E0: vfd matrix grid
559      // ports C,D,E0: vfd matrix grid
569560      int shift = (offset - NEC_UCOM4_PORTC) * 4;
570561      m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
571562
r244677r244678
576567
577568   if (offset >= NEC_UCOM4_PORTE)
578569   {
579      // E23,F-I: vfd matrix plate
570      // ports F-I,E23: vfd matrix plate
580571      int shift = (offset - NEC_UCOM4_PORTE) * 4;
581572      m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2;
582573   }
r244677r244678
693684CONS( 1982, edracula, 0, 0, edracula, edracula, driver_device, 0, "Epoch", "Dracula (Epoch)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
694685
695686CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, driver_device, 0, "Tomy", "Tennis (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
696CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, driver_device, 0, "Tomy", "Pac Man (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
687CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, driver_device, 0, "Tomy", "Pac Man (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING )
697688CONS( 1984, alnchase, 0, 0, alnchase, alnchase, driver_device, 0, "Tomy", "Alien Chase", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team