Previous 199869 Revisions Next

r36167 Sunday 1st March, 2015 at 15:00:28 UTC by hap
Merge pull request #143 from 0-wiz-0/master

Revert part of 34d0ee6b.
[src/mame/drivers]hng64.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
r244678r244679
867867      }
868868
869869      // Send it off to the 3d subsystem.
870      hng64_command3d(machine(), packet3d);
870      hng64_command3d( packet3d);
871871   }
872872#endif
873873}
r244678r244679
892892{
893893   // this handles 3d to fb upload
894894   UINT16 packet3d[16];
895//   printf("dl_upload_w %08x %08x\n", data, mem_mask);
895896
897
896898   for(int packetStart=0;packetStart<0x200/4;packetStart+=8)
897899   {
898900      // Create a 3d packet
r244678r244679
906908      }
907909
908910      // Send it off to the 3d subsystem.
909      hng64_command3d(machine(), packet3d);
911      hng64_command3d( packet3d);
910912   }
911913
912914   machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(0x200*8), timer_expired_delegate(FUNC(hng64_state::hng64_3dfifo_processed),this));
r244678r244679
915917/* 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 */
916918WRITE32_MEMBER(hng64_state::dl_control_w) // This handles framebuffers
917919{
920//   printf("dl_control_w %08x %08x\n", data, mem_mask);
921
918922   //if(data & 2) // swap buffers
919923   //{
920924   //  clear3d();
r244678r244679
11731177<ElSemi> 0xBF800000-0xBF808000 S-RAM
11741178<ElSemi> 0x60000000-0x60001000 Comm dualport ram
11751179*/
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
11761187static ADDRESS_MAP_START( hng_map, AS_PROGRAM, 32, hng64_state )
11771188
11781189   AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_SHARE("mainram")
r244678r244679
11961207   AM_RANGE(0x2000e400, 0x2000efff) AM_WRITE(hng64_sprite_clear_odd_w)
11971208   AM_RANGE(0x20010000, 0x20010013) AM_RAM AM_SHARE("spriteregs")
11981209   AM_RANGE(0x20100000, 0x2017ffff) AM_RAM_WRITE(hng64_videoram_w) AM_SHARE("videoram")    // Tilemap
1199   AM_RANGE(0x20190000, 0x20190037) AM_RAM AM_SHARE("videoregs")
1210   AM_RANGE(0x20190000, 0x20190037) AM_RAM_WRITE(hng64_vregs_w) AM_SHARE("videoregs")
12001211   AM_RANGE(0x20200000, 0x20203fff) AM_RAM_WRITE(hng64_pal_w) AM_SHARE("paletteram")
12011212   AM_RANGE(0x20208000, 0x2020805f) AM_READWRITE(tcram_r, tcram_w) AM_SHARE("tcram")   // Transition Control
12021213   AM_RANGE(0x20300000, 0x203001ff) AM_RAM_WRITE(dl_w) AM_SHARE("dl")  // 3d Display List
r244678r244679
17301741   GFXDECODE_ENTRY( "textures", 0, hng64_texlayout,     0x0, 0x10 )  /* textures */
17311742GFXDECODE_END
17321743
1733static void hng64_reorder(running_machine &machine, UINT8* gfxregion, size_t gfxregionsize)
1744static void hng64_reorder( UINT8* gfxregion, size_t gfxregionsize)
17341745{
17351746   // by default 2 4bpp tiles are stored in each 8bpp tile, this makes decoding in MAME harder than it needs to be
17361747   // reorder them
r244678r244679
17501761
17511762DRIVER_INIT_MEMBER(hng64_state,hng64_reorder_gfx)
17521763{
1753   hng64_reorder(machine(), memregion("scrtile")->base(), memregion("scrtile")->bytes());
1764   hng64_reorder(memregion("scrtile")->base(), memregion("scrtile")->bytes());
17541765}
17551766
17561767#define HACK_REGION
17571768#ifdef HACK_REGION
1758static void hng64_patch_bios_region(running_machine& machine, int region)
1769void hng64_state::hng64_patch_bios_region(int region)
17591770{
1760   UINT8 *rom = machine.root_device().memregion("user1")->base();
1771   UINT8 *rom = memregion("user1")->base();
17611772
17621773   if ((rom[0x4000]==0xff) && (rom[0x4001] == 0xff))
17631774   {
r244678r244679
17741785   // region hacking, english error messages are more useful to us, but no english bios is dumped...
17751786#ifdef HACK_REGION
17761787// versions according to fatal fury test mode
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'
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'
17821793#endif
17831794
17841795   /* 1 meg of virtual address space for the com cpu */
r244678r244679
19021913
19031914   m_comm_rom = memregion("user2")->base();
19041915   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     
19051923}
19061924
19071925
trunk/src/mame/drivers/suprgolf.c
r244678r244679
7272   DECLARE_WRITE8_MEMBER(suprgolf_writeB);
7373   DECLARE_DRIVER_INIT(suprgolf);
7474   TILE_GET_INFO_MEMBER(get_tile_info);
75    virtual void machine_start();
7576   virtual void machine_reset();
7677   virtual void video_start();
7778   UINT32 screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
r244678r244679
249250   }
250251}
251252
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
252259WRITE8_MEMBER(suprgolf_state::suprgolf_pen_w)
253260{
254261   m_vreg_pen = data;
r244678r244679
266273
267274WRITE8_MEMBER(suprgolf_state::rom_bank_select_w)
268275{
269   UINT8 *region_base = memregion("user1")->base();
276    m_rom_bank = data;
270277
271   m_rom_bank = data;
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);
272281
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
278282   m_msm_nmi_mask = data & 0x40;
279283   flip_screen_set(data & 0x80);
280284}
281285
282286WRITE8_MEMBER(suprgolf_state::rom2_bank_select_w)
283287{
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
288    //osd_printf_debug("ROM_BANK 0x4000 - %X @%X\n",data,space.device().safe_pcbase());
289    membank("bank1")->set_entry(data & 0x0f);
290   
289291   if(data & 0xf0)
290292      printf("Rom bank select 2 with data %02x activated\n",data);
291293}
trunk/src/mame/drivers/suprslam.c
r244678r244679
115115
116116WRITE8_MEMBER(suprslam_state::suprslam_sh_bankswitch_w)
117117{
118   UINT8 *RAM = memregion("audiocpu")->base();
119   int bankaddress;
120
121   bankaddress = 0x10000 + (data & 0x03) * 0x8000;
122   membank("bank1")->set_base(&RAM[bankaddress]);
118    membank("bank1")->set_entry(data & 0x03);
123119}
124120
125121/*** MEMORY MAPS *************************************************************/
r244678r244679
288284   save_item(NAME(m_screen_bank));
289285   save_item(NAME(m_bg_bank));
290286   save_item(NAME(m_pending_command));
287
288    membank("bank1")->configure_entries(0, 4, memregion("audiocpu")->base() + 0x10000, 0x8000);
291289}
292290
293291void suprslam_state::machine_reset()
trunk/src/mame/drivers/tankbust.c
r244678r244679
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
2531//port A of ay8910#0
2632
2733TIMER_CALLBACK_MEMBER(tankbust_state::soundlatch_callback)
r244678r244679
95101
96102   case 7: /* 0xe007 bankswitch */
97103      /* bank 1 at 0x6000-9fff = from 0x10000 when bit0=0 else from 0x14000 */
104        membank("bank1")->set_entry(data & 1);
105
98106      /* bank 2 at 0xa000-bfff = from 0x18000 when bit0=0 else from 0x1a000 */
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) */
107      membank("bank2")->set_entry(data & 1); /* verified (the game will reset after the "game over" otherwise) */
101108      break;
102109   }
103110}
trunk/src/mame/drivers/thunderx.c
r244678r244679
312312
313313WRITE8_MEMBER(thunderx_state::scontra_bankswitch_w)
314314{
315   UINT8 *RAM = memregion("maincpu")->base();
316   int offs;
315    // logerror("%04x: bank switch %02x\n", space.device().safe_pc(), data & 0x0f);
316    membank("bank1")->set_entry(data & 0x0f);
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
324318   /* bit 4 select work RAM or palette RAM at 5800-5fff */
325319   m_palette_selected = ~data & 0x10;
326320
r244678r244679
585579   save_item(NAME(m_palette_selected));
586580   save_item(NAME(m_rambank));
587581   save_item(NAME(m_pmcbank));
582   
583    membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x2000);
588584}
589585
590586MACHINE_START_MEMBER(thunderx_state,thunderx)
trunk/src/mame/drivers/tryout.c
r244678r244679
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
4651WRITE8_MEMBER(tryout_state::tryout_bankswitch_w)
4752{
48   UINT8 *RAM = memregion("maincpu")->base();
49   int bankaddress;
50
51   bankaddress = 0x10000 + (data & 0x01) * 0x2000;
52   membank("bank1")->set_base(&RAM[bankaddress]);
53    membank("bank1")->set_entry(data & 0x01);
5354}
5455
5556static ADDRESS_MAP_START( main_cpu, AS_PROGRAM, 8, tryout_state )
trunk/src/mame/drivers/usgames.c
r244678r244679
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}
3337
3438WRITE8_MEMBER(usgames_state::usgames_rombank_w)
3539{
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] );
40    membank("bank1")->set_entry(data);
4241}
4342
4443WRITE8_MEMBER(usgames_state::lamps1_w)
trunk/src/mame/drivers/vigilant.c
r244678r244679
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
2530WRITE8_MEMBER(vigilant_state::vigilant_bank_select_w)
2631{
27   int bankaddress;
28   UINT8 *RAM = memregion("maincpu")->base();
29
30   bankaddress = 0x10000 + (data & 0x07) * 0x4000;
31   membank("bank1")->set_base(&RAM[bankaddress]);
32    membank("bank1")->set_entry(data & 0x07);
3233}
3334
3435/***************************************************************************
trunk/src/mame/includes/hng64.h
r244678r244679
1010   BURIKI_MCU
1111};
1212
13enum hng64trans_t
14{
15   HNG64_TILEMAP_NORMAL = 1,
16   HNG64_TILEMAP_ADDITIVE,
17   HNG64_TILEMAP_ALPHA
18};
1319
1420
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
1550class hng64_state : public driver_device
1651{
1752public:
r244678r244679
4075      m_screen(*this, "screen"),
4176      m_palette(*this, "palette"),
4277      m_generic_paletteram_32(*this, "paletteram")
43      { }
4478
79   { }
80   
4581   required_device<mips3_device> m_maincpu;
4682   required_device<cpu_device> m_audiocpu;
4783   required_device<cpu_device> m_comm;
r244678r244679
70106   required_device<palette_device> m_palette;
71107   required_shared_ptr<UINT32> m_generic_paletteram_32;
72108
109
73110   int m_mcu_type;
74111
75112   UINT16 *m_soundram;
r244678r244679
97134
98135   UINT8 m_screen_dis;
99136
100   tilemap_t *m_tilemap0_8x8;
101   tilemap_t *m_tilemap1_8x8;
102   tilemap_t *m_tilemap2_8x8;
103   tilemap_t *m_tilemap3_8x8;
137   struct hng64_tilemap {
138      tilemap_t *m_tilemap_8x8;
139      tilemap_t *m_tilemap_16x16;
140      tilemap_t *m_tilemap_16x16_alt;
141   };
104142
105   tilemap_t *m_tilemap0_16x16;
106   tilemap_t *m_tilemap1_16x16;
107   tilemap_t *m_tilemap2_16x16;
108   tilemap_t *m_tilemap3_16x16;
143   hng64_tilemap m_tilemap[4];
109144
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
115145   UINT8 m_additive_tilemap_debug;
116146
117147   // 3d display buffers
r244678r244679
121151
122152   UINT32 m_old_animmask;
123153   UINT32 m_old_animbits;
124   UINT16 m_old_tileflags0;
125   UINT16 m_old_tileflags1;
126   UINT16 m_old_tileflags2;
127   UINT16 m_old_tileflags3;
154   UINT16 m_old_tileflags[4];
128155
129156   UINT32 m_dls[2][0x81];
130157
r244678r244679
166193   DECLARE_READ32_MEMBER(unk_vreg_r);
167194   DECLARE_WRITE32_MEMBER(hng64_soundram_w);
168195   DECLARE_READ32_MEMBER(hng64_soundram_r);
196   DECLARE_WRITE32_MEMBER(hng64_vregs_w);
169197
170198   // not actually used, but left in code so you can turn it and see the (possibly undesired?) behavior, see notes in memory map
171199   DECLARE_WRITE32_MEMBER(hng64_soundram2_w);
r244678r244679
226254   DECLARE_CUSTOM_INPUT_MEMBER(brake_down_r);
227255   void clear3d();
228256   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
229297};
230298
231/*----------- defined in video/hng64.c -----------*/
232void hng64_command3d(running_machine& machine, const UINT16* packet);
trunk/src/mame/includes/tankbust.h
r244678r244679
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_reset();
46    virtual void machine_start();
47    virtual void machine_reset();
4748   virtual void video_start();
4849   DECLARE_PALETTE_INIT(tankbust);
4950   UINT32 screen_update_tankbust(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
trunk/src/mame/includes/thunderx.h
r244678r244679
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
r244678r244679
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 video_start();
39    virtual void machine_start();
40    virtual void video_start();
4041   DECLARE_PALETTE_INIT(tryout);
4142   UINT32 screen_update_tryout(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
4243   void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
trunk/src/mame/includes/usgames.h
r244678r244679
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 video_start();
20    virtual void machine_start();
21    virtual void video_start();
2122   DECLARE_PALETTE_INIT(usgames);
2223   UINT32 screen_update_usgames(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
2324   required_device<cpu_device> m_maincpu;
trunk/src/mame/includes/vigilant.h
r244678r244679
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 video_start();
41    virtual void machine_start();
42    virtual void video_start();
4243   virtual void video_reset();
4344   UINT32 screen_update_vigilant(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
4445   UINT32 screen_update_kikcubic(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
trunk/src/mame/video/hng64.c
r244678r244679
77
88
99
10static void hng64_mark_all_tiles_dirty( hng64_state *state, int tilemap )
10void hng64_state::hng64_mark_all_tiles_dirty( int tilemap )
1111{
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   }
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();
3615}
3716
38static void hng64_mark_tile_dirty( hng64_state *state, int tilemap, int tile_index )
17void hng64_state::hng64_mark_tile_dirty( int tilemap, int tile_index )
3918{
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   }
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);
6422}
6523
6624
r244678r244679
10563 * 0x0e0 in Samurai Shodown/Xrally games, 0x1c0 in all the others, zooming factor?
10664 */
10765
108static void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
66void hng64_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
10967{
110   hng64_state *state = screen.machine().driver_data<hng64_state>();
11168   gfx_element *gfx;
112   UINT32 *source = state->m_spriteram;
113   UINT32 *finish = state->m_spriteram + 0xc000/4;
69   UINT32 *source = m_spriteram;
70   UINT32 *finish = m_spriteram + 0xc000/4;
11471
11572   // global offsets in sprite regs
116   int spriteoffsx = (state->m_spriteregs[1]>>0)&0xffff;
117   int spriteoffsy = (state->m_spriteregs[1]>>16)&0xffff;
73   int spriteoffsx = (m_spriteregs[1]>>0)&0xffff;
74   int spriteoffsy = (m_spriteregs[1]>>16)&0xffff;
11875
11976#if 0
12077   for (int iii = 0; iii < 0x0f; iii++)
121      osd_printf_debug("%.8x ", state->m_videoregs[iii]);
78      osd_printf_debug("%.8x ", m_videoregs[iii]);
12279   osd_printf_debug("\n");
12380#endif
12481
r244678r244679
182139         int zoom_factor;
183140
184141         /* FIXME: regular zoom mode has precision bugs, can be easily seen in Samurai Shodown 64 intro */
185         zoom_factor = (state->m_spriteregs[0] & 0x08000000) ? 0x1000 : 0x100;
142         zoom_factor = (m_spriteregs[0] & 0x08000000) ? 0x1000 : 0x100;
186143         if(!zoomx) zoomx=zoom_factor;
187144         if(!zoomy) zoomy=zoom_factor;
188145
r244678r244679
197154         zoomy += (int)((foomY - floor(foomY)) * (float)0x10000);
198155      }
199156
200      if (state->m_spriteregs[0] & 0x00800000) //bpp switch
157      if (m_spriteregs[0] & 0x00800000) //bpp switch
201158      {
202         gfx= state->m_gfxdecode->gfx(4);
159         gfx= m_gfxdecode->gfx(4);
203160      }
204161      else
205162      {
206         gfx= state->m_gfxdecode->gfx(5);
163         gfx= m_gfxdecode->gfx(5);
207164         tileno>>=1;
208165         pal&=0xf;
209166      }
r244678r244679
262219               tileno=(source[4]&0x0007ffff);
263220               pal =(source[3]&0x00ff0000)>>16;
264221
265               if (state->m_spriteregs[0] & 0x00800000) //bpp switch
222               if (m_spriteregs[0] & 0x00800000) //bpp switch
266223               {
267                  gfx= state->m_gfxdecode->gfx(4);
224                  gfx= m_gfxdecode->gfx(4);
268225               }
269226               else
270227               {
271                  gfx= state->m_gfxdecode->gfx(5);
228                  gfx= m_gfxdecode->gfx(5);
272229                  tileno>>=1;
273230                  pal&=0xf;
274231               }
r244678r244679
328285 */
329286
330287/* this is broken for the 'How to Play' screen in Buriki after attract, disabled for now */
331static void transition_control(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect)
288void hng64_state::transition_control( bitmap_rgb32 &bitmap, const rectangle &cliprect)
332289{
333   hng64_state *state = machine.driver_data<hng64_state>();
334   UINT32 *hng64_tcram = state->m_tcram;
290   UINT32 *hng64_tcram = m_tcram;
335291   int i, j;
336292
337293//  float colorScaleR, colorScaleG, colorScaleB;
r244678r244679
548504WRITE32_MEMBER(hng64_state::hng64_videoram_w)
549505{
550506   int realoff;
551   hng64_state *state = machine().driver_data<hng64_state>();
552507   COMBINE_DATA(&m_videoram[offset]);
553508
554509   realoff = offset*4;
555510
556511   if ((realoff>=0) && (realoff<0x10000))
557512   {
558      hng64_mark_tile_dirty(state, 0, offset&0x3fff);
513      hng64_mark_tile_dirty(0, offset&0x3fff);
559514   }
560515   else if ((realoff>=0x10000) && (realoff<0x20000))
561516   {
562      hng64_mark_tile_dirty(state, 1, offset&0x3fff);
517      hng64_mark_tile_dirty(1, offset&0x3fff);
563518   }
564519   else if ((realoff>=0x20000) && (realoff<0x30000))
565520   {
566      hng64_mark_tile_dirty(state, 2, offset&0x3fff);
521      hng64_mark_tile_dirty(2, offset&0x3fff);
567522   }
568523   else if ((realoff>=0x30000) && (realoff<0x40000))
569524   {
570      hng64_mark_tile_dirty(state, 3, offset&0x3fff);
525      hng64_mark_tile_dirty(3, offset&0x3fff);
571526   }
572527
573528//  if ((realoff>=0x40000)) osd_printf_debug("offsw %08x %08x\n",realoff,data);
r244678r244679
576531}
577532
578533/* 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};
585534
586535
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
600536static 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)
601537{
602538   /* start with nothing */
r244678r244679
673609      *(UINT32 *)dest = alpha_blend_r32(*(UINT32 *)dest, clut[INPUT_VAL], alpha); \
674610} while (0)
675611
676static void hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit,
612void hng64_state::hng64_tilemap_draw_roz_core(screen_device &screen, tilemap_t *tmap, const blit_parameters *blit,
677613      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound)
678614{
679   hng64_state *state = screen.machine().driver_data<hng64_state>();
680   const pen_t *clut = &state->m_palette->pen(blit->tilemap_priority_code >> 16);
615   const pen_t *clut = &m_palette->pen(blit->tilemap_priority_code >> 16);
681616   bitmap_ind8 &priority_bitmap = screen.priority();
682617   bitmap_rgb32 &destbitmap = *blit->bitmap;
683618   bitmap_ind16 &srcbitmap = tmap->pixmap();
r244678r244679
851786
852787
853788
854static void hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
789void hng64_state::hng64_tilemap_draw_roz_primask(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
855790      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
856791      int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat)
857792{
r244678r244679
879814}
880815
881816
882INLINE void hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
817inline void hng64_state::hng64_tilemap_draw_roz(screen_device &screen, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap,
883818      UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy,
884819      int wraparound, UINT32 flags, UINT8 priority, hng64trans_t drawformat)
885820{
r244678r244679
888823
889824
890825
891static void hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm )
826void hng64_state::hng64_drawtilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm )
892827{
893   hng64_state *state = screen.machine().driver_data<hng64_state>();
894   UINT32 *hng64_videoregs = state->m_videoregs;
895   UINT32 *hng64_videoram = state->m_videoram;
828   UINT32 *hng64_videoregs = m_videoregs;
829   UINT32 *hng64_videoram = m_videoram;
896830   tilemap_t* tilemap = 0;
897831   UINT32 scrollbase = 0;
898832   UINT32 tileregs = 0;
r244678r244679
903837
904838   int global_dimensions = (global_tileregs&0x03000000)>>24;
905839
906   if ( (state->m_additive_tilemap_debug&(1 << tm)))
840   if ( (m_additive_tilemap_debug&(1 << tm)))
907841      debug_blend_enabled = 1;
908842
909843   if ((global_dimensions != 0) && (global_dimensions != 3))
r244678r244679
913847   {
914848      scrollbase = (hng64_videoregs[0x04]&0x3fff0000)>>16;
915849      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      }
927850   }
928851   else if (tm==1)
929852   {
930853      scrollbase = (hng64_videoregs[0x04]&0x00003fff)>>0;
931854      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      }
943855   }
944856   else if (tm==2)
945857   {
946858      scrollbase = (hng64_videoregs[0x05]&0x3fff0000)>>16;
947859      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      }
959860   }
960861   else if (tm==3)
961862   {
962863      scrollbase = (hng64_videoregs[0x05]&0x00003fff)>>0;
963864      tileregs   = (hng64_videoregs[0x03]&0x0000ffff)>>0;
865   }
964866
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      }
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;
975871   }
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   }
976877
977878   // xrally's pink tilemaps make me think this is a tilemap enable bit.
978879   // fatfurwa makes me think otherwise.
979   //if (!(tileregs & 0x0040)) return;
880//   if (!(tileregs & 0x0040)) return;
980881
981882   // set the transmask so our manual copy is correct
982883   if (tileregs & 0x0400)
r244678r244679
11261027            bitmap_ind16 &bm = tilemap->pixmap();
11271028            int bmheight = bm.height();
11281029            int bmwidth = bm.width();
1129            const pen_t *paldata = state->m_palette->pens();
1030            const pen_t *paldata = m_palette->pens();
11301031            UINT32* dstptr;
11311032            UINT16* srcptr;
11321033            int xx,yy;
r244678r244679
12221123            bitmap_ind16 &bm = tilemap->pixmap();
12231124            int bmheight = bm.height();
12241125            int bmwidth = bm.width();
1225            const pen_t *paldata = state->m_palette->pens();
1126            const pen_t *paldata = m_palette->pens();
12261127            UINT32* dstptr;
12271128            UINT16* srcptr;
12281129            int xx,yy;
r244678r244679
13111212    // 0940 - samurai shodown 64
13121213    // 0880 - buriki
13131214
1314    // mmmm dbr? ??e? ????
1215    // mmmm dbrz zzzz zzzz
13151216    // m = mosaic related?
13161217    //  -- they seem to enable mosaic at the same time as rowscroll in several cases (floor in buriki / ff)
13171218    //     and also on the rotating logo in buriki.. does it cause some kind of aliasing side-effect, or.. ?
13181219    // r = tile size (seems correct)
13191220    // b = 4bpp/8bpp (seems correct) (beast busters, samsh64, sasm64 2, xrally switch it for some screens)
13201221    // d = line (floor) mode - buriki, fatafurwa, some backgrounds in ss64_2
1321    // e = enable according to sams64_2 debug mode, buriki and xrally.. but NOT fatal fury :-(
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)
13221223
13231224
13241225 */
r244678r244679
13341235   UINT32 *hng64_tcram = m_tcram;
13351236   UINT32 animmask;
13361237   UINT32 animbits;
1337   UINT16 tileflags0, tileflags1;
1338   UINT16 tileflags2, tileflags3;
1238   UINT16 tileflags[4];
13391239
13401240#if 0
13411241   // press in sams64_2 attract mode for a nice debug screen from the game
r244678r244679
13561256
13571257   animmask = hng64_videoregs[0x0b];
13581258   animbits = hng64_videoregs[0x0c];
1359   tileflags0 = hng64_videoregs[0x02]>>16;
1360   tileflags1 = hng64_videoregs[0x02]&0xffff;
1361   tileflags2 = hng64_videoregs[0x03]>>16;
1362   tileflags3 = hng64_videoregs[0x03]&0xffff;
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;
13631263
13641264   /* if the auto-animation mask or bits have changed search for tiles using them and mark as dirty */
13651265   if ((m_old_animmask != animmask) || (m_old_animbits != animbits))
r244678r244679
13691269      {
13701270         if (hng64_videoram[tile_index+(0x00000/4)]&0x200000)
13711271         {
1372            hng64_mark_tile_dirty(this, 0, tile_index);
1272            hng64_mark_tile_dirty(0, tile_index);
13731273         }
13741274         if (hng64_videoram[tile_index+(0x10000/4)]&0x200000)
13751275         {
1376            hng64_mark_tile_dirty(this, 1, tile_index);
1276            hng64_mark_tile_dirty(1, tile_index);
13771277         }
13781278         if (hng64_videoram[tile_index+(0x20000/4)]&0x200000)
13791279         {
1380            hng64_mark_tile_dirty(this, 2, tile_index);
1280            hng64_mark_tile_dirty(2, tile_index);
13811281         }
13821282         if (hng64_videoram[tile_index+(0x30000/4)]&0x200000)
13831283         {
1384            hng64_mark_tile_dirty(this, 3, tile_index);
1284            hng64_mark_tile_dirty(3, tile_index);
13851285         }
13861286      }
13871287
r244678r244679
13891289      m_old_animbits = animbits;
13901290   }
13911291
1392   if ((m_old_tileflags0&IMPORTANT_DIRTY_TILEFLAG_MASK)!=(tileflags0&IMPORTANT_DIRTY_TILEFLAG_MASK))
1292   for (int i = 0; i < 4; i++)
13931293   {
1394      hng64_mark_all_tiles_dirty(this, 0);
1395      m_old_tileflags0 = tileflags0;
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      }
13961299   }
13971300
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   }
14031301
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
14221302   hng64_drawtilemap(screen,bitmap,cliprect, 3);
14231303   hng64_drawtilemap(screen,bitmap,cliprect, 2);
14241304   hng64_drawtilemap(screen,bitmap,cliprect, 1);
r244678r244679
14501330   draw_sprites(screen, bitmap,cliprect);
14511331
14521332   if(0)
1453      transition_control(machine(), bitmap, cliprect);
1333      transition_control(bitmap, cliprect);
14541334
14551335   if (0)
14561336      popmessage("%08x %08x %08x %08x %08x", m_spriteregs[0], m_spriteregs[1], m_spriteregs[2], m_spriteregs[3], m_spriteregs[4]);
14571337
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",
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",
14601340      hng64_videoregs[0x00],
14611341      hng64_videoregs[0x01],
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
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
14661346   (hng64_videoregs[0x04]>>16)&0xffff,
14671347   (hng64_videoregs[0x04]>>0)&0xffff,
14681348   (hng64_videoregs[0x05]>>16)&0xffff,
r244678r244679
14741354      hng64_videoregs[0x0a],
14751355      hng64_videoregs[0x0b],
14761356      hng64_videoregs[0x0c],
1477      hng64_videoregs[0x0d],
1478      hng64_videoregs[0x0e]);
1357      hng64_videoregs[0x0d]);
14791358
14801359   if (0)
14811360   popmessage("3D: %08x %08x %08x %08x : %08x %08x %08x %08x : %08x %08x %08x %08x",
r244678r244679
15471426
15481427   m_old_animmask = -1;
15491428   m_old_animbits = -1;
1550   m_old_tileflags0 = -1;
1551   m_old_tileflags1 = -1;
1552   m_old_tileflags2 = -1;
1553   m_old_tileflags3 = -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;
15541433
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 */
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 */
15581437
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 */
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 */
15621441
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 */
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 */
15661445
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 */
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 */
15701449
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);
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   }
15741456
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
15871457   // Debug switch, turn on / off additive blending on a per-tilemap basis
15881458   m_additive_tilemap_debug = 0;
15891459
r244678r244679
16341504static void vecmatmul4(float *product, const float *a, const float *b);
16351505static float vecDotProduct(const float *a, const float *b);
16361506static void normalize(float* x);
1637
16381507static 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
16441508static float uToF(UINT16 input);
16451509
16461510
r244678r244679
16781542
16791543// Operation 0001
16801544// Camera transformation.
1681static void setCameraTransformation(hng64_state *state, const UINT16* packet)
1545void hng64_state::setCameraTransformation(const UINT16* packet)
16821546{
1683   float *cameraMatrix = state->m_cameraMatrix;
1547   float *cameraMatrix = m_cameraMatrix;
16841548
16851549   /*//////////////
16861550   // PACKET FORMAT
r244678r244679
17251589
17261590// Operation 0010
17271591// Lighting information
1728static void setLighting(hng64_state *state, const UINT16* packet)
1592void hng64_state::setLighting(const UINT16* packet)
17291593{
1730   float *lightVector = state->m_lightVector;
1594   float *lightVector = m_lightVector;
17311595
17321596   /*//////////////
17331597   // PACKET FORMAT
r244678r244679
17541618   lightVector[0] = uToF(packet[3]);
17551619   lightVector[1] = uToF(packet[4]);
17561620   lightVector[2] = uToF(packet[5]);
1757   state->m_lightStrength = uToF(packet[9]);
1621   m_lightStrength = uToF(packet[9]);
17581622}
17591623
17601624// Operation 0011
17611625// Palette / Model flags?
1762static void set3dFlags(hng64_state *state, const UINT16* packet)
1626void hng64_state::set3dFlags(const UINT16* packet)
17631627{
17641628   /*//////////////
17651629   // PACKET FORMAT
r244678r244679
17801644   // [14] - ???? ... ? ''  ''
17811645   // [15] - ???? ... ? ''  ''
17821646   ////////////*/
1783   state->m_paletteState3d = (packet[8] & 0xff00) >> 8;
1647   m_paletteState3d = (packet[8] & 0xff00) >> 8;
17841648}
17851649
17861650// Operation 0012
17871651// Projection Matrix.
1788static void setCameraProjectionMatrix(hng64_state *state, const UINT16* packet)
1652void hng64_state::setCameraProjectionMatrix(const UINT16* packet)
17891653{
1790   float *projectionMatrix = state->m_projectionMatrix;
1654   float *projectionMatrix = m_projectionMatrix;
17911655
17921656   /*//////////////
17931657   // PACKET FORMAT
r244678r244679
18431707
18441708// Operation 0100
18451709// Polygon rasterization.
1846static void recoverPolygonBlock(running_machine& machine, const UINT16* packet, struct polygon* polys, int* numPolys)
1710void hng64_state::recoverPolygonBlock(const UINT16* packet, struct polygon* polys, int* numPolys)
18471711{
18481712   /*//////////////
18491713   // PACKET FORMAT
r244678r244679
18801744   // [15] - xxxx ... Transformation matrix
18811745   ////////////*/
18821746
1883   hng64_state *state = machine.driver_data<hng64_state>();
18841747   UINT32 size[4];
18851748   UINT32 address[4];
18861749   UINT32 megaOffset;
r244678r244679
18941757   setIdentity(objectMatrix);
18951758
18961759   struct polygon lastPoly = { 0 };
1897   const rectangle &visarea = machine.first_screen()->visible_area();
1760   const rectangle &visarea = m_screen->visible_area();
18981761
18991762   /////////////////
19001763   // HEADER INFO //
r244678r244679
19501813   //////////////////////////////////////////////*/
19511814
19521815   // 3d ROM Offset
1953   UINT16* threeDRoms = (UINT16*)(machine.root_device().memregion("verts")->base());
1816   UINT16* threeDRoms = (UINT16*)memregion("verts")->base();
19541817   UINT32  threeDOffset = (((UINT32)packet[2]) << 16) | ((UINT32)packet[3]);
19551818   UINT16* threeDPointer = &threeDRoms[threeDOffset * 3];
19561819
1957   if (threeDOffset >= machine.root_device().memregion("verts")->bytes())
1820   if (threeDOffset >= memregion("verts")->bytes())
19581821   {
19591822      printf("Strange geometry packet: (ignoring)\n");
19601823      printPacket(packet, 1);
r244678r244679
20791942         /* FIXME: This isn't correct.
20801943                   Buriki & Xrally need this line.  Roads Edge needs it removed.
20811944                   So instead we're looking for a bit that is on for XRally & Buriki, but noone else. */
2082         if (state->m_3dregs[0x00/4] & 0x2000)
1945         if (m_3dregs[0x00/4] & 0x2000)
20831946         {
2084            if (strcmp(machine.basename(), "roadedge"))
1947            if (strcmp(machine().basename(), "roadedge"))
20851948               polys[*numPolys].palOffset += 0x800;
20861949         }
20871950
r244678r244679
20951958         // Apply the dynamic palette offset if its flag is set, otherwise stick with the fixed one
20961959         if ((packet[1] & 0x0100))
20971960         {
2098            explicitPaletteValue1 = state->m_paletteState3d * 0x80;
1961            explicitPaletteValue1 = m_paletteState3d * 0x80;
20991962            explicitPaletteValue2 = 0;      // This is probably hiding somewhere in operation 0011
21001963         }
21011964
r244678r244679
22892152         ////////////////////////////////////
22902153         // Perform the world transformations...
22912154         // !! Can eliminate this step with a matrix stack (maybe necessary?) !!
2292         setIdentity(state->m_modelViewMatrix);
2293         if (state->m_mcu_type != SAMSHO_MCU)
2155         setIdentity(m_modelViewMatrix);
2156         if (m_mcu_type != SAMSHO_MCU)
22942157         {
22952158            // The sams64 games transform the geometry in front of a stationary camera.
22962159            // This is fine in sams64_2, since it never calls the 'camera transformation' function
22972160            // (thus using the identity matrix for this transform), but sams64 calls the
22982161            // camera transformation function with rotation values.
22992162            // It remains to be seen what those might do...
2300            matmul4(state->m_modelViewMatrix, state->m_modelViewMatrix, state->m_cameraMatrix);
2163            matmul4(m_modelViewMatrix, m_modelViewMatrix, m_cameraMatrix);
23012164         }
2302         matmul4(state->m_modelViewMatrix, state->m_modelViewMatrix, objectMatrix);
2165         matmul4(m_modelViewMatrix, m_modelViewMatrix, objectMatrix);
23032166
23042167         // LIGHTING
2305         if (packet[1] & 0x0008 && state->m_lightStrength > 0.0f)
2168         if (packet[1] & 0x0008 && m_lightStrength > 0.0f)
23062169         {
23072170            for (int v = 0; v < 3; v++)
23082171            {
23092172               float transformedNormal[4];
23102173               vecmatmul4(transformedNormal, objectMatrix, polys[*numPolys].vert[v].normal);
23112174               normalize(transformedNormal);
2312               normalize(state->m_lightVector);
2175               normalize(m_lightVector);
23132176
2314               float intensity = vecDotProduct(transformedNormal, state->m_lightVector) * -1.0f;
2177               float intensity = vecDotProduct(transformedNormal, m_lightVector) * -1.0f;
23152178               intensity = (intensity <= 0.0f) ? (0.0f) : (intensity);
2316               intensity *= state->m_lightStrength * 128.0f;    // Turns 0x0100 into 1.0
2179               intensity *= m_lightStrength * 128.0f;    // Turns 0x0100 into 1.0
23172180               intensity *= 128.0;                     // Maps intensity to the range [0.0, 2.0]
23182181               if (intensity >= 255.0f) intensity = 255.0f;
23192182
r244678r244679
23562219
23572220
23582221         // BEHIND-THE-CAMERA CULL //
2359         vecmatmul4(cullRay, state->m_modelViewMatrix, polys[*numPolys].vert[0].worldCoords);
2222         vecmatmul4(cullRay, m_modelViewMatrix, polys[*numPolys].vert[0].worldCoords);
23602223         if (cullRay[2] > 0.0f)              // Camera is pointing down -Z
23612224         {
23622225            polys[*numPolys].visible = 0;
r244678r244679
23692232            for (int m = 0; m < polys[*numPolys].n; m++)
23702233            {
23712234               // Transform and project the vertex into pre-divided homogeneous coordinates...
2372               vecmatmul4(eyeCoords, state->m_modelViewMatrix, polys[*numPolys].vert[m].worldCoords);
2373               vecmatmul4(polys[*numPolys].vert[m].clipCoords, state->m_projectionMatrix, eyeCoords);
2235               vecmatmul4(eyeCoords, m_modelViewMatrix, polys[*numPolys].vert[m].worldCoords);
2236               vecmatmul4(polys[*numPolys].vert[m].clipCoords, m_projectionMatrix, eyeCoords);
23742237            }
23752238
23762239            if (polys[*numPolys].visible)
r244678r244679
24102273   }
24112274}
24122275
2413void hng64_command3d(running_machine& machine, const UINT16* packet)
2276void hng64_state::hng64_command3d(const UINT16* packet)
24142277{
2415   hng64_state *state = machine.driver_data<hng64_state>();
24162278
24172279   /* A temporary place to put some polygons.  This will optimize away if the compiler's any good. */
24182280   int numPolys = 0;
24192281   dynamic_array<polygon> polys(1024*5);
24202282
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]);
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   
24222285   switch (packet[0])
24232286   {
24242287   case 0x0000:    // Appears to be a NOP.
24252288      break;
24262289
24272290   case 0x0001:    // Camera transformation.
2428      setCameraTransformation(state, packet);
2291      setCameraTransformation(packet);
24292292      break;
24302293
24312294   case 0x0010:    // Lighting information.
24322295      //if (packet[9]) printPacket(packet, 1);
2433      setLighting(state, packet);
2296      setLighting(packet);
24342297      break;
24352298
24362299   case 0x0011:    // Palette / Model flags?
24372300      //printPacket(packet, 1); printf("\n");
2438      set3dFlags(state, packet);
2301      set3dFlags(packet);
24392302      break;
24402303
24412304   case 0x0012:    // Projection Matrix
24422305      //printPacket(packet, 1);
2443      setCameraProjectionMatrix(state, packet);
2306      setCameraProjectionMatrix(packet);
24442307      break;
24452308
24462309   case 0x0100:
24472310   case 0x0101:    // Geometry with full transformations
24482311      // HACK.  Masks out a piece of geo bbust2's drawShaded() crashes on.
2449      if (packet[2] == 0x0003 && packet[3] == 0x8f37 && state->m_mcu_type == SHOOT_MCU)
2312      if (packet[2] == 0x0003 && packet[3] == 0x8f37 && m_mcu_type == SHOOT_MCU)
24502313         break;
24512314
2452      recoverPolygonBlock(machine, packet, polys, &numPolys);
2315      recoverPolygonBlock( packet, polys, &numPolys);
24532316      break;
24542317
24552318   case 0x0102:    // Geometry with only translation
r244678r244679
24692332      miniPacket[7] = 0x7fff;
24702333      miniPacket[11] = 0x7fff;
24712334      miniPacket[15] = 0x7fff;
2472      recoverPolygonBlock(machine, miniPacket, polys, &numPolys);
2335      recoverPolygonBlock( miniPacket, polys, &numPolys);
24732336
24742337      memset(miniPacket, 0, sizeof(UINT16)*16);
24752338      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];
24762340      miniPacket[7] = 0x7fff;
24772341      miniPacket[11] = 0x7fff;
24782342      miniPacket[15] = 0x7fff;
2479      recoverPolygonBlock(machine, miniPacket, polys, &numPolys);
2343      recoverPolygonBlock( miniPacket, polys, &numPolys);
24802344      break;
24812345
24822346   case 0x1000:    // Unknown: Some sort of global flags?
r244678r244679
24972361   {
24982362      if (polys[i].visible)
24992363      {
2500         //DrawWireframe(machine, &polys[i]);
2501         drawShaded(machine, &polys[i]);
2364         //DrawWireframe( &polys[i]);
2365         drawShaded( &polys[i]);
25022366      }
25032367   }
25042368}
r244678r244679
27842648// wireframe rendering //
27852649/////////////////////////
27862650#ifdef UNUSED_FUNCTION
2787static void plot(running_machine &machine, INT32 x, INT32 y, UINT32 color)
2651static void plot( INT32 x, INT32 y, UINT32 color)
27882652{
27892653   UINT32* cb = &(colorBuffer3d[(y * machine.first_screen()->visible_area().max_x) + x]);
27902654   *cb = color;
27912655}
27922656
27932657// Stolen from http://en.wikipedia.org/wiki/Bresenham's_line_algorithm (no copyright denoted) - the non-optimized version
2794static void drawline2d(running_machine &machine, INT32 x0, INT32 y0, INT32 x1, INT32 y1, UINT32 color)
2658static void drawline2d( INT32 x0, INT32 y0, INT32 x1, INT32 y1, UINT32 color)
27952659{
27962660#define SWAP(a,b) tmpswap = a; a = b; b = tmpswap;
27972661
r244678r244679
28292693   {
28302694      if (steep)
28312695      {
2832         plot(machine, x0, y0, color);
2696         plot( x0, y0, color);
28332697      }
28342698      else
28352699      {
2836         plot(machine, y0, x0, color);
2700         plot( y0, x0, color);
28372701      }
28382702      while (e >= 0)
28392703      {
r244678r244679
28472711#undef SWAP
28482712}
28492713
2850static void DrawWireframe(running_machine &machine, struct polygon *p)
2714static void DrawWireframe( struct polygon *p)
28512715{
28522716   int j;
28532717   for (j = 0; j < p->n; j++)
r244678r244679
28552719      // 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]);
28562720      // 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]);
28572721      UINT32 color = rgb_t((UINT8)255, (UINT8)255, (UINT8)0, (UINT8)0);
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);
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);
28592723   }
28602724
28612725   // SHOWS THE CLIPPING //
r244678r244679
28702734}
28712735#endif
28722736
2873///////////////////////
2874// polygon rendering //
2875///////////////////////
28762737
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
28892738/*********************************************************************/
28902739/**   FillSmoothTexPCHorizontalLine                                 **/
28912740/**     Input: Color Buffer (framebuffer), depth buffer, width and  **/
r244678r244679
28952744/**                                                                 **/
28962745/**     Output: none                                                **/
28972746/*********************************************************************/
2898INLINE void FillSmoothTexPCHorizontalLine(running_machine &machine,
2747inline void hng64_state::FillSmoothTexPCHorizontalLine(
28992748                                 const polygonRasterOptions& prOptions,
29002749                                 int x_start, int x_end, int y, float z_start, float z_delta,
29012750                                 float w_start, float w_delta, float r_start, float r_delta,
29022751                                 float g_start, float g_delta, float b_start, float b_delta,
29032752                                 float s_start, float s_delta, float t_start, float t_delta)
29042753{
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]);
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]);
29082756
29092757   UINT8 paletteEntry = 0;
29102758   float t_coord, s_coord;
2911   const UINT8 *gfx = state->memregion("textures")->base();
2759   const UINT8 *gfx = memregion("textures")->base();
29122760   const UINT8 *textureOffset = &gfx[prOptions.texIndex * 1024 * 1024];
29132761
29142762   for (; x_start <= x_end; x_start++)
r244678r244679
29702818            {
29712819               // The color out of the texture
29722820               paletteEntry %= prOptions.palPageSize;
2973               rgb_t color = state->m_palette->pen(prOptions.palOffset + paletteEntry);
2821               rgb_t color = m_palette->pen(prOptions.palOffset + paletteEntry);
29742822
29752823               // Apply the lighting
29762824               float rIntensity = (r_start/w_start) / 255.0f;
r244678r244679
30382886//   nearest and bilinear filtering: Filtering={0,1}
30392887//   replace and modulate application modes: Function={0,1}
30402888//---------------------------------------------------------------------------
3041static void RasterizeTriangle_SMOOTH_TEX_PC(running_machine &machine,
2889void hng64_state::RasterizeTriangle_SMOOTH_TEX_PC(
30422890                                 float A[4], float B[4], float C[4],
30432891                                 float Ca[3], float Cb[3], float Cc[3], // PER-VERTEX RGB COLORS
30442892                                 float Ta[2], float Tb[2], float Tc[2], // PER-VERTEX (S,T) TEX-COORDS
r244678r244679
32323080
32333081      // Pass the horizontal line to the filler, this could be put in the routine
32343082      // then interpolate for the next values of x and z
3235      FillSmoothTexPCHorizontalLine(machine, prOptions,
3083      FillSmoothTexPCHorizontalLine( prOptions,
32363084         x_start, x_end, y_min, z_interp_x, z_delta_x, w_interp_x, w_delta_x,
32373085         r_interp_x, r_delta_x, g_interp_x, g_delta_x, b_interp_x, b_delta_x,
32383086         s_interp_x, s_delta_x, t_interp_x, t_delta_x);
r244678r244679
33113159
33123160      // Pass the horizontal line to the filler, this could be put in the routine
33133161      // then interpolate for the next values of x and z
3314      FillSmoothTexPCHorizontalLine(machine, prOptions,
3162      FillSmoothTexPCHorizontalLine( prOptions,
33153163         x_start, x_end, y_mid, z_interp_x, z_delta_x, w_interp_x, w_delta_x,
33163164         r_interp_x, r_delta_x, g_interp_x, g_delta_x, b_interp_x, b_delta_x,
33173165         s_interp_x, s_delta_x, t_interp_x, t_delta_x);
r244678r244679
33263174   }
33273175}
33283176
3329static void drawShaded(running_machine &machine, struct polygon *p)
3177void hng64_state::drawShaded( struct polygon *p)
33303178{
33313179   // The perspective-correct texture divide...
33323180   // !!! There is a very good chance the HNG64 hardware does not do perspective-correct texture-mapping !!!
r244678r244679
33543202
33553203   for (j = 1; j < p->n-1; j++)
33563204   {
3357      RasterizeTriangle_SMOOTH_TEX_PC(machine,
3205      RasterizeTriangle_SMOOTH_TEX_PC(
33583206                              p->vert[0].clipCoords, p->vert[j].clipCoords, p->vert[j+1].clipCoords,
33593207                              p->vert[0].light,      p->vert[j].light,      p->vert[j+1].light,
33603208                              p->vert[0].texCoords,  p->vert[j].texCoords,  p->vert[j+1].texCoords,
trunk/src/mess/drivers/hh_ucom4.c
r244678r244679
8787   DECLARE_INPUT_CHANGED_MEMBER(tmtennis_difficulty_switch);
8888   DECLARE_MACHINE_RESET(tmtennis);
8989
90   void tmpacman_display();
9091   DECLARE_WRITE8_MEMBER(tmpacman_grid_w);
9192   DECLARE_WRITE8_MEMBER(tmpacman_plate_w);
9293   DECLARE_WRITE8_MEMBER(tmpacman_port_e_w);
r244678r244679
236237
237238WRITE8_MEMBER(hh_ucom4_state::edracula_grid_w)
238239{
239   // ports C,D: vfd matrix grid
240   // C,D: vfd matrix grid
240241   int shift = (offset - NEC_UCOM4_PORTC) * 4;
241242   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
242243
r244678r244679
245246
246247WRITE8_MEMBER(hh_ucom4_state::edracula_plate_w)
247248{
248   // ports E-H,I01: vfd matrix plate
249   // E-H,I01: vfd matrix plate
249250   int shift = (offset - NEC_UCOM4_PORTE) * 4;
250251   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
251252
r244678r244679
325326
326327READ8_MEMBER(hh_ucom4_state::tmtennis_input_r)
327328{
328   // ports A,B: buttons
329   // A,B: buttons
329330   return ~read_inputs(2) >> (offset*4);
330331}
331332
332333WRITE8_MEMBER(hh_ucom4_state::tmtennis_grid_w)
333334{
334   // ports G-I: vfd matrix grid
335   // G-I: vfd matrix grid
335336   int shift = (offset - NEC_UCOM4_PORTG) * 4;
336337   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
337338
r244678r244679
340341
341342WRITE8_MEMBER(hh_ucom4_state::tmtennis_plate_w)
342343{
343   // ports C-F: vfd matrix plate
344   // C-F: vfd matrix plate
344345   if (offset == NEC_UCOM4_PORTF) offset--;
345346   int shift = (offset - NEC_UCOM4_PORTC) * 4;
346347   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
r244678r244679
452453  known releases:
453454  - Japan: Puck Man
454455  - USA: Pac Man
455  - UK: Puckman (Tomy), and also as Munchman, published by Grandstand
456  - UK: Puckman (Tomy), and also published by Grandstand as Munchman
456457  - Australia: Pac Man-1, published by Futuretronics
457458
458459  NOTE!: MESS external artwork is recommended
459460
460461***************************************************************************/
461462
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
462471WRITE8_MEMBER(hh_ucom4_state::tmpacman_grid_w)
463472{
464   // ports C,D: vfd matrix grid
473   // C,D: vfd matrix grid
465474   int shift = (offset - NEC_UCOM4_PORTC) * 4;
466475   m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
467476
468   display_matrix(19, 8, m_plate, m_grid);
477   tmpacman_display();
469478}
470479
471480WRITE8_MEMBER(hh_ucom4_state::tmpacman_plate_w)
472481{
473   // ports E-I: vfd matrix plate
482   // E023,F-I: vfd matrix plate
474483   int shift = (offset - NEC_UCOM4_PORTE) * 4;
475484   m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
476485
477   display_matrix(19, 8, m_plate, m_grid);
486   tmpacman_display();
478487}
479488
480489WRITE8_MEMBER(hh_ucom4_state::tmpacman_port_e_w)
r244678r244679
494503   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY
495504
496505   PORT_START("IN.1") // port B
497   PORT_CONFNAME( 0x00, 0x00, DEF_STR( Difficulty ) )
506   PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) )
498507   PORT_CONFSETTING(    0x00, "Amateur" )
499508   PORT_CONFSETTING(    0x01, "Professional" )
500509   PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
r244678r244679
548557
549558READ8_MEMBER(hh_ucom4_state::alnchase_input_r)
550559{
551   // port A: buttons
560   // A: buttons
552561   return read_inputs(2);
553562}
554563
r244678r244679
556565{
557566   if (offset <= NEC_UCOM4_PORTE)
558567   {
559      // ports C,D,E0: vfd matrix grid
568      // C,D,E0: vfd matrix grid
560569      int shift = (offset - NEC_UCOM4_PORTC) * 4;
561570      m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
562571
r244678r244679
567576
568577   if (offset >= NEC_UCOM4_PORTE)
569578   {
570      // ports F-I,E23: vfd matrix plate
579      // E23,F-I: vfd matrix plate
571580      int shift = (offset - NEC_UCOM4_PORTE) * 4;
572581      m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2;
573582   }
r244678r244679
684693CONS( 1982, edracula, 0, 0, edracula, edracula, driver_device, 0, "Epoch", "Dracula (Epoch)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
685694
686695CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, driver_device, 0, "Tomy", "Tennis (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 )
696CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, driver_device, 0, "Tomy", "Pac Man (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK )
688697CONS( 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