Previous 199869 Revisions Next

r36169 Sunday 1st March, 2015 at 17:32:26 UTC by Couriersud
Merge branch 'master' of https://github.com/mamedev/mame.git
[hash]pasogo.xml
[src/mame/drivers]hng64.c mitchell.c suna8.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/audio]gamate.c
[src/mess/drivers]gamate.c hh_ucom4.c
[src/mess/includes]gamate.h

trunk/hash/pasogo.xml
r244680r244681
33<softwarelist name="pasogo" description="Koei PasoGo cartridges">
44
55<!--
6  Koei PasoGo (パソ碁) undumped games
6  Koei PasoGo (パソ碁) possible undumped games
77
8  Taikyoku-kun I ~ 対局くん I [KS-1001]
9  Tanoshii Tsumego Dai-1-kan ~ 楽しい詰碁・第1巻 [KS-1002]
10  Tanoshii Tsumego Dai-2-kan ~ 楽しい詰碁・第2巻 [KS-1003]
11
8  Unknown title [cart KS-1005]
9  Unknown title [cart KS-1006]
10  Unknown title [cart KS-1007]
11  Unknown title [cart KS-1008]
12 
1213-->
1314
14   <!-- Contians 8M SOP44 ROM, 62256 SOP32 RAM, Microchip 1081N (reset IC?watchdog?battery-power-switcher?) and 3V battery. -->
15   <software name="dgoban">
16      <description>Denshi Goban</description>
15   <!-- KS-1001: Contains 8M SOP44 ROM, 62256 SOP32 RAM, Microchip 1081N (reset IC?watchdog?battery-power-switcher?) and 3V battery. -->
16   <software name="taikyoku">
17      <description>Taikyoku-kun I</description>
1718      <year>1996</year>
1819      <publisher>Koei</publisher>
19      <info name="serial" value="KS-1009"/>
20      <info name="alt_title" value="電子碁盤"/>
20      <info name="serial" value="KS-1001"/>
21      <info name="alt_title" value="対局くん I"/>
2122      <part name="cart" interface="pasogo_cart">
2223         <dataarea name="rom" width="16" endianness="little" size="1048576">
23            <rom name="ks-1010.ic4" size="1048576" crc="b6a3f97c" sha1="2de63b05ec93a4ba3ea55ba131c0706927a5bf39" offset="00000000" />
24            <rom name="ks-1001.ic4" size="1048576" crc="b6a3f97c" sha1="2de63b05ec93a4ba3ea55ba131c0706927a5bf39" offset="00000000" />
2425         </dataarea>
2526      </part>
2627   </software>
2728
29   <!-- KS-1002: Contains 4M SOP40 ROM only. -->
30   <software name="tanostd1">
31      <description>Tanoshii Tsumego Dai-1-kan</description>
32      <year>1996</year>
33      <publisher>Koei</publisher>
34      <info name="serial" value="KS-1002"/>
35      <info name="alt_title" value="楽しい詰碁・第1巻"/>
36      <part name="cart" interface="pasogo_cart">
37         <dataarea name="rom" width="16" endianness="little" size="524288">
38            <rom name="ks-1002.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
39         </dataarea>
40      </part>
41   </software>
2842
29   <!-- Contains 4M SOP40 ROM only. -->
43   <!-- KS-1003: Contains 4M SOP40 ROM only. -->
44   <software name="tanostd2">
45      <description>Tanoshii Tsumego Dai-2-kan</description>
46      <year>1996</year>
47      <publisher>Koei</publisher>
48      <info name="serial" value="KS-1003"/>
49      <info name="alt_title" value="楽しい詰碁・第2巻"/>
50      <part name="cart" interface="pasogo_cart">
51         <dataarea name="rom" width="16" endianness="little" size="524288">
52            <rom name="ks-1003.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
53         </dataarea>
54      </part>
55   </software>
56
57   <!-- KS-1004: Contains 4M SOP40 ROM only. -->
3058   <software name="igmks1">
3159      <description>Igo Meikyokushuu - Dai-1-kan</description>
3260      <year>1996</year>
r244680r244681
3563      <info name="alt_title" value="囲碁名局集 第1巻"/>
3664      <part name="cart" interface="pasogo_cart">
3765         <dataarea name="rom" width="16" endianness="little" size="524288">
38            <rom name="yrm0442m-184s" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
66            <rom name="ks-1004.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
3967         </dataarea>
4068      </part>
4169   </software>
4270
43   <!-- Contains 4M SOP40 ROM only. -->
71   <!-- KS-1009: Contains 8M SOP44 ROM, 62256 SOP32 RAM, Microchip 1081N (reset IC?watchdog?battery-power-switcher?) and 3V battery. -->
72   <software name="dgoban">
73      <description>Denshi Goban</description>
74      <year>1996</year>
75      <publisher>Koei</publisher>
76      <info name="serial" value="KS-1009"/>
77      <info name="alt_title" value="電子碁盤"/>
78      <part name="cart" interface="pasogo_cart">
79         <dataarea name="rom" width="16" endianness="little" size="1048576">
80            <rom name="ks-1009.ic4" size="1048576" crc="b6a3f97c" sha1="2de63b05ec93a4ba3ea55ba131c0706927a5bf39" offset="00000000" />
81         </dataarea>
82      </part>
83   </software>
84
85   <!-- KS-1010: Contains 4M SOP40 ROM only. -->
4486   <software name="tnt1">
4587      <description>Tsuyoku Naru Tesuji - Dai-1-kan</description>
4688      <year>1996</year>
r244680r244681
4991      <info name="alt_title" value="強くなる手筋・第1巻"/>
5092      <part name="cart" interface="pasogo_cart">
5193         <dataarea name="rom" width="16" endianness="little" size="524288">
52            <rom name="ks-1009.ic4" size="524288" crc="3e70fca6" sha1="c46cdc9e01f2f5c66b2523e1d30355e51c839f27" offset="00000000" />
94            <rom name="ks-1010.ic4" size="524288" crc="3e70fca6" sha1="c46cdc9e01f2f5c66b2523e1d30355e51c839f27" offset="00000000" />
5395         </dataarea>
5496      </part>
5597   </software>
trunk/src/mame/drivers/hng64.c
r244680r244681
867867      }
868868
869869      // Send it off to the 3d subsystem.
870      hng64_command3d(machine(), packet3d);
870      hng64_command3d( packet3d);
871871   }
872872#endif
873873}
r244680r244681
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
r244680r244681
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));
r244680r244681
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();
r244680r244681
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")
r244680r244681
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
r244680r244681
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
r244680r244681
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   {
r244680r244681
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 */
r244680r244681
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/mitchell.c
r244680r244681
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) )
r244680r244681
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/suna8.c
r244680r244681
25382538
25392539ROM_START( brickzn )
25402540   ROM_REGION( 0x50000 + 0x40000, "maincpu", 0 )       /* Main Z80 Code */
2541   ROM_LOAD( "P9.M7", 0x00000, 0x08000, CRC(bd7a3c01) SHA1(05fb2836f1c8d8818847ccb76e7b477f13a9929b) )  // V6.0 1992,3,16
2542   ROM_LOAD( "P8.K7", 0x10000, 0x20000, CRC(ec3e266d) SHA1(4441a5ae88e51353f6d1eb22c00becb0a7ecea6e) )
2543   ROM_LOAD( "P7.I7", 0x30000, 0x20000, CRC(4dd88631) SHA1(0dbcaf3420dad82c3ed94d231948fe69b044b786) )
2541   ROM_LOAD( "p9.m7", 0x00000, 0x08000, CRC(bd7a3c01) SHA1(05fb2836f1c8d8818847ccb76e7b477f13a9929b) )  // V6.0 1992,3,16
2542   ROM_LOAD( "p8.k7", 0x10000, 0x20000, CRC(ec3e266d) SHA1(4441a5ae88e51353f6d1eb22c00becb0a7ecea6e) )
2543   ROM_LOAD( "p7.i7", 0x30000, 0x20000, CRC(4dd88631) SHA1(0dbcaf3420dad82c3ed94d231948fe69b044b786) )
25442544
25452545   ROM_REGION( 0x10000, "audiocpu", 0 )        /* Music Z80 Code */
2546   ROM_LOAD( "10.O8", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) )  // BRICK MUSIC XILINX PROGRAM 3020 1991,11,14 MUSIC PROGRAM V 2,0 1990.12.14
2546   ROM_LOAD( "10.o8", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) )  // BRICK MUSIC XILINX PROGRAM 3020 1991,11,14 MUSIC PROGRAM V 2,0 1990.12.14
25472547
25482548   ROM_REGION( 0x10000, "pcm", 0 )     /* PCM Z80 Code */
2549   ROM_LOAD( "11.N10", 0x00000, 0x10000, CRC(6c54161a) SHA1(ea216d9f45b441acd56b9fed81a83e3bfe299fbd) )
2549   ROM_LOAD( "11.n10", 0x00000, 0x10000, CRC(6c54161a) SHA1(ea216d9f45b441acd56b9fed81a83e3bfe299fbd) )
25502550
25512551   ROM_REGION( 0xc0000, "gfx1", ROMREGION_INVERT ) /* Sprites */
2552   ROM_LOAD( "P5.M5", 0x00000, 0x20000, CRC(ca59e2f7) SHA1(dbb9f2b316a44f760768f0430798e0c4e9e8f3ff) )
2553   ROM_LOAD( "P4.L5", 0x20000, 0x20000, CRC(cc8fb330) SHA1(fd263f65b81acbfc00fe339c461068ab160c04af) )
2554   ROM_LOAD( "P3.K5", 0x40000, 0x20000, CRC(2e4f194b) SHA1(86da1a582ea274f2af96d3e3e2ac72bcaf3638cb) )
2555   ROM_LOAD( "P2.I5", 0x60000, 0x20000, CRC(592d45ce) SHA1(8ce9236b7deba6cf00999680314ac04eff624a6d) )
2556   ROM_LOAD( "P1.H5", 0x80000, 0x20000, CRC(7a6bb583) SHA1(ff7018c07182fce0ff6954bbe3b08fa5105f6be0) )
2557   ROM_LOAD( "P6.H7", 0xa0000, 0x20000, CRC(bbf31081) SHA1(1fdbd0e0853082345225e18df340184a7a604b78) )
2552   ROM_LOAD( "p5.m5", 0x00000, 0x20000, CRC(ca59e2f7) SHA1(dbb9f2b316a44f760768f0430798e0c4e9e8f3ff) )
2553   ROM_LOAD( "p4.l5", 0x20000, 0x20000, CRC(cc8fb330) SHA1(fd263f65b81acbfc00fe339c461068ab160c04af) )
2554   ROM_LOAD( "p3.k5", 0x40000, 0x20000, CRC(2e4f194b) SHA1(86da1a582ea274f2af96d3e3e2ac72bcaf3638cb) )
2555   ROM_LOAD( "p2.i5", 0x60000, 0x20000, CRC(592d45ce) SHA1(8ce9236b7deba6cf00999680314ac04eff624a6d) )
2556   ROM_LOAD( "p1.h5", 0x80000, 0x20000, CRC(7a6bb583) SHA1(ff7018c07182fce0ff6954bbe3b08fa5105f6be0) )
2557   ROM_LOAD( "p6.h7", 0xa0000, 0x20000, CRC(bbf31081) SHA1(1fdbd0e0853082345225e18df340184a7a604b78) )
25582558ROM_END
25592559
25602560
r244680r244681
26032603
26042604ROM_START( brickzn11 )
26052605   ROM_REGION( 0x50000 + 0x40000, "maincpu", 0 )       /* Main Z80 Code */
2606   ROM_LOAD( "9.bin", 0x00000, 0x08000, CRC(24f88cfd) SHA1(dfa7313ab6696042bab2e6cc8ff97b331d526c6b) )
2606   ROM_LOAD( "9.bin", 0x00000, 0x08000, CRC(24f88cfd) SHA1(dfa7313ab6696042bab2e6cc8ff97b331d526c6b) )  // V1.1 1992,1,13
26072607   ROM_LOAD( "8.bin", 0x10000, 0x20000, CRC(e2c7f7ac) SHA1(43377daf6957829ef9bb7a81708c2f18f5d7ced6) )
26082608   ROM_LOAD( "7.bin", 0x30000, 0x20000, CRC(7af5b25c) SHA1(9e98e99bdc5be1602144c83f40b2ccf6b90a729a) )
26092609
r244680r244681
28812881
28822882GAME( 1991, hardhea2,  0,        hardhea2, hardhea2, suna8_state, hardhea2,  ROT0,  "SunA",                       "Hard Head 2 (v2.0)",          0 )
28832883
2884GAME( 1992, brickzn,   0,        brickzn,  brickzn,  suna8_state, brickzn,   ROT90, "SunA",                       "Brick Zone (v6.0, Joystick)", 0 )
2885GAME( 1992, brickznv5, brickzn,  brickzn,  brickzn,  suna8_state, brickznv5, ROT90, "SunA",                       "Brick Zone (v5.0, Joystick)", 0 )
2886GAME( 1992, brickznv4, brickzn,  brickzn,  brickzn,  suna8_state, brickznv4, ROT90, "SunA",                       "Brick Zone (v4.0, Spinner)",  0 )
2884// is meant to sound like this https://www.youtube.com/watch?v=yfU1C7A3iZI (recorded from v6.0, Joystick version)
2885GAME( 1992, brickzn,   0,        brickzn,  brickzn,  suna8_state, brickzn,   ROT90, "SunA",                       "Brick Zone (v6.0, Joystick)", GAME_IMPERFECT_SOUND )
2886GAME( 1992, brickznv5, brickzn,  brickzn,  brickzn,  suna8_state, brickznv5, ROT90, "SunA",                       "Brick Zone (v5.0, Joystick)", GAME_IMPERFECT_SOUND )
2887GAME( 1992, brickznv4, brickzn,  brickzn,  brickzn,  suna8_state, brickznv4, ROT90, "SunA",                       "Brick Zone (v4.0, Spinner)",  GAME_IMPERFECT_SOUND )
28872888GAME( 1992, brickzn11, brickzn,  brickzn,  brickzn,  suna8_state, brickzn11, ROT90, "SunA",                       "Brick Zone (v1.1)",  GAME_NOT_WORKING )
trunk/src/mame/drivers/suprgolf.c
r244680r244681
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);
r244680r244681
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;
r244680r244681
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
r244680r244681
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 *************************************************************/
r244680r244681
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
r244680r244681
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)
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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:
r244680r244681
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;
r244680r244681
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;
r244680r244681
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
r244680r244681
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
r244680r244681
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);
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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      }
r244680r244681
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               }
r244680r244681
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;
r244680r244681
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);
r244680r244681
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 */
r244680r244681
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();
r244680r244681
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{
r244680r244681
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{
r244680r244681
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;
r244680r244681
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))
r244680r244681
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)
r244680r244681
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;
r244680r244681
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;
r244680r244681
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 */
r244680r244681
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
r244680r244681
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))
r244680r244681
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
r244680r244681
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);
r244680r244681
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,
r244680r244681
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",
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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;
r244680r244681
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 //
r244680r244681
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);
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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;
r244680r244681
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)
r244680r244681
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
r244680r244681
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?
r244680r244681
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}
r244680r244681
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
r244680r244681
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      {
r244680r244681
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++)
r244680r244681
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 //
r244680r244681
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  **/
r244680r244681
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++)
r244680r244681
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;
r244680r244681
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
r244680r244681
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);
r244680r244681
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);
r244680r244681
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 !!!
r244680r244681
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/audio/gamate.c
r244680r244681
11/***************************************************************************
22 gamate sound hardware
33
4 PeT mess@utanet.at
4 PeT mess@utanet.at 2015
55***************************************************************************/
66
77#include "emu.h"
88#include "includes/gamate.h"
9#include "ui/ui.h"
910
1011
12enum { ClockDelay=32 };
13
1114// device type definition
1215const device_type GAMATE_SND = &device_creator<gamate_sound_device>;
1316
14
17const int gamate_sound_device::DAConverter[]={ 0, 3, 7, 13,  23, 41, 75, 137,  249, 453, 825, 1499,  2726, 4956, 9011, 16383 }; // (*.55) on the real below index 8 bareless measureable
18const UINT8 Mask[]={ 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0x1f, 0x3f,  0x1f, 0x1f, 0x1f, 0xff, 0xff, 0xf };
19const int EnvelopeVolumes[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0  };
1520//**************************************************************************
1621//  LIVE DEVICE
1722//**************************************************************************
r244680r244681
2732{
2833}
2934
30
3135//-------------------------------------------------
3236//  device_start - device-specific startup
3337//-------------------------------------------------
r244680r244681
3539void gamate_sound_device::device_start()
3640{
3741   // bind callbacks
38//  m_irq_cb.bind_relative_to(*owner());
42//   m_irq_cb.bind_relative_to(*owner());
3943
4044   memset(m_channels, 0, sizeof(m_channels));
4145   memset(reg, 0, sizeof(reg));
r244680r244681
5256{
5357   stream_sample_t *left=outputs[0], *right=outputs[1];
5458   int i, j;
55   GAMATE_CHANNEL *channel;
56
59   Tone *channel;
60   
5761   for (i = 0; i < samples; i++, left++, right++)
5862   {
63      noise.pos += noise.step;
64      while (noise.pos >= 1.0) {
65        // guess (white noise register taken from supervision)
66        noise.level = noise.state & 0x40 ? 1 : 0;
67        bool b1 = (noise.state & 0x40) != 0, b2 = (noise.state & 0x20) != 0;
68        noise.state=(noise.state<<1)+(b1!=b2?1:0);
69        noise.pos -= 1;
70      }
71
72      envelope.pos += envelope.step;
73      while (envelope.pos >= 1.0) {
74        envelope.pos -= 1;
75        envelope.index++;
76        switch (envelope.control) {
77          case 0: case 1: case 2: case 3:
78          case 4: case 5: case 6: case 7:
79          case 8: case 9: case 0xb:
80          case 0xd: case 0xf:
81            if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)/2) {
82         envelope.index=0;
83         envelope.first=false;
84            }
85            break;
86          default:
87            if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)) {
88         envelope.index=0;
89         envelope.first=false;
90            }
91            break;
92        }
93       
94      }
95
5996      *left = 0;
6097      *right = 0;
6198      for (channel=m_channels, j=0; j<ARRAY_LENGTH(m_channels); j++, channel++)
6299      {
63100         if (channel->size != 0)
64101         {
65            if (channel->on)//||channel->count)
66            {
67               int on = FALSE;
68               on = channel->pos <= channel->size / 2;
69               {
70                  INT16 s = on ? channel->volume << 8 : 0;
71                  if (j == 0)
72                     *right += s;
73                  else if (j==1)
74                     *left += s;
75                  else {
76                     *right += s;
77                     *left += s;
78                  }
79               }
102           channel->level= channel->pos <= channel->size / 2;
103            bool l= channel->full_cycle? true: channel->level;
104            if (!channel->tone) l= l && noise.level;
105            int volume=0;
106            if (l) {
107              if (channel->envelope_on) {
108                switch (envelope.control) {
109                case 0: case 1: case 2: case 3:
110                case 0x9: // one time falling, low
111                  if (envelope.first && channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
112                  break;
113                case 4: case 5: case 6: case 7:
114                case 0xf: // one time rising, low
115                  if (envelope.first && channel->level) volume=EnvelopeVolumes[envelope.index];
116                  break;
117                case 8: // falling
118                  if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
119                  break;
120                case 0xa: // rising, falling
121                  if (channel->level) volume=EnvelopeVolumes[envelope.index];
122                  break;
123                case 0xb: // one time falling, high
124                  if (channel->level) volume=envelope.first? 0xf-EnvelopeVolumes[envelope.index]: 0xf;
125                  break;
126                case 0xc: // rising, low
127                  if (channel->level) volume=envelope.index<ARRAY_LENGTH(EnvelopeVolumes)/2? EnvelopeVolumes[envelope.index]: 0;
128                  break;
129                case 0xd: // one time rising, high
130                  if (channel->level) volume=envelope.first? EnvelopeVolumes[envelope.index]: 0xf;
131                  break;
132                case 0xe: // falling, rising
133                  if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
134                  break;
135                }
136              } else {
137                volume=channel->volume;
138              }
80139            }
140            if (j == Right)
141              *right += Value2Volume(volume);
142            else if (j==Left)
143              *left += Value2Volume(volume);
144            else {
145              *right += Value2Volume(volume);
146              *left += Value2Volume(volume);
147            }
81148            channel->pos++;
82149            if (channel->pos >= channel->size)
83150               channel->pos = 0;
r244680r244681
94161   reg[offset] = data;
95162   int chan=-1;
96163
97   switch (offset)
164   switch (offset&0xf)
98165   {
99166      case 0:
100167      case 1:
r244680r244681
102169      case 3:
103170      case 4:
104171      case 5:
105         chan=offset/2;
172        chan=offset/2;
106173         size = reg[chan*2] | ((reg[chan*2+1] & 0xf) << 8);
107174         if (size)
108175         {
109            m_channels[chan].size= (int) (machine().sample_rate() * (size << 5) / machine().device("maincpu")->unscaled_clock());
176            m_channels[chan].size= (int) (machine().sample_rate() * size*ClockDelay / machine().device("maincpu")->unscaled_clock());
110177         }
111178         else
112179         {
r244680r244681
115182         m_channels[chan].pos = 0;
116183         break;
117184      case 6:
185        size=data&0x1f;
186        if (size==0) size=1;
187        noise.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
188        break;
118189      case 7:
190        m_channels[Right].full_cycle=data&1;
191        m_channels[Right].tone=data&8;
192        m_channels[Left].full_cycle=data&2;
193        m_channels[Left].tone=data&0x10;
194        m_channels[Both].full_cycle=data&4;
195        m_channels[Both].tone=data&0x20;
196        noise.state=1;
197        noise.pos=0.0;
198        noise.level=false;
199        break;
119200      case 8:
120         chan=offset-6;
121//          m_channels[chan]->on = data & 0x40;
122//          channel->waveform = (data & 0x30) >> 4;
201      case 9:
202      case 0xa:
203        chan=offset-8;
204         m_channels[chan].envelope_on = data & 0x10; // buggy aussetzer cube up
123205         m_channels[chan].volume = data & 0xf;
124206         break;
207      case 0xb: case 0xc:
208         size = reg[0xb] | ((reg[0xc]) << 8);
209        if (size==0) size=1;
210        envelope.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
211        break;
212      case 0xd:
213        envelope.control=data&0xf;
214        envelope.pos=0;
215        envelope.index=0;
216        envelope.first=true;
217        break;
218       
125219   }
126   if (chan!=-1) m_channels[chan].on=m_channels[chan].volume!=0 && m_channels[chan].size>3/* avoid speed loss for unhearable >=23khz*/;
220   envelope.pos=0; // guess
221   envelope.index=0;
222   envelope.first=true;
127223}
224
225READ8_MEMBER( gamate_sound_device::device_r )
226{
227  UINT8 data=0;
228  if ((offset&0xf)<ARRAY_LENGTH(Mask)) data=reg[offset&0xf]&Mask[offset&0xf]; // unused bits set to last write value? in this area
229  return data;
230}
trunk/src/mess/drivers/gamate.c
r244680r244681
33 Peter Wilhelmsen peter.wilhelmsen@gmail.com
44 Morten Shearman Kirkegaard morten+gamate@afdelingp.dk
55 Juan F??lix Mateos vectrex@hackermesh.org
6******************************************************************************/
76
7 nmi unknown
8 cube up audio sometimes missing
9 bomb blast top status line missing
10 ******************************************************************************/
11
812#include "emu.h"
913#include "cpu/m6502/m6502.h"
1014#include "bus/generic/slot.h"
r244680r244681
3640   DECLARE_WRITE8_MEMBER(cart_bankswitch_w);
3741   DECLARE_READ8_MEMBER(gamate_video_r);
3842   DECLARE_READ8_MEMBER(gamate_pad_r);
43   DECLARE_READ8_MEMBER(gamate_nmi_r);
3944   DECLARE_WRITE8_MEMBER(gamate_video_w);
4045   DECLARE_READ8_MEMBER(gamate_audio_r);
4146   DECLARE_WRITE8_MEMBER(gamate_audio_w);
r244680r244681
5156
5257   struct
5358   {
54   UINT8 reg[8];
55   struct {
56      bool write;
57      bool page2; // else page1
59     UINT8 reg[8];
60     struct {
61       bool page2; // else page1
5862   UINT8 ypos, xpos/*tennis*/;
59      UINT8 data[2][0x100][0x20];
60      } bitmap;
61   UINT8 x, y;
63       UINT8 data[2][0x100][0x20];
64     } bitmap;
65     UINT8 x, y;
6266      bool y_increment;
6367   } video;
6468
6569   struct {
66      bool set;
70     bool set;
6771      int bit_shifter;
6872      UINT8 cartridge_byte;
6973      UINT16 address; // in reality something more like short local cartridge address offset
7074      bool unprotected;
7175      bool failed;
72
76     
7377   } card_protection;
7478
7579   required_device<cpu_device> m_maincpu;
r244680r244681
8084   required_shared_ptr<UINT8> m_bios;
8185   emu_timer *timer1;
8286   emu_timer *timer2;
83   UINT8 bank_multi;
87   UINT8 bank_multi; 
8488};
8589
8690WRITE8_MEMBER( gamate_state::gamate_cart_protection_w )
8791{
88      logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
89
92        logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
93 
9094   switch (offset) {
9195   case 0:
9296      card_protection.failed= card_protection.failed || ((card_protection.cartridge_byte&0x80)!=0) != ((data&4)!=0);
r244680r244681
100104}
101105READ8_MEMBER( gamate_state::gamate_cart_protection_r )
102106{
103   UINT8 ret=1;
104   if (card_protection.bit_shifter==7 && card_protection.unprotected) {
105   ret=m_cart->get_rom_base()[bank_multi*0x4000];
106   } else {
107
108  UINT8 ret=1;
109  if (card_protection.bit_shifter==7 && card_protection.unprotected) {
110    ret=m_cart->get_rom_base()[bank_multi*0x4000];
111  } else {
107112   card_protection.bit_shifter++;
108113   if (card_protection.bit_shifter==8) {
109114      card_protection.bit_shifter=0;
r244680r244681
112117   }
113118   ret=(card_protection.cartridge_byte&0x80)?2:0;
114119   if (card_protection.bit_shifter==7 && !card_protection.failed) { // now protection chip on cartridge activates cartridge chip select on cpu accesses
115//        m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working
120//        m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working
116121   }
117122   card_protection.cartridge_byte<<=1;
118   }
119   logerror("%.6f protection read %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, ret, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
120   return ret;
123  }
124  logerror("%.6f protection read %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, ret, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
125  return ret;
121126}
122127
123128READ8_MEMBER( gamate_state::protection_r ) { return card_protection.set? 3: 1; } // bits 0 and 1 checked
124129
125130WRITE8_MEMBER( gamate_state::protection_reset )
126131{
127   // writes 0x20
128   card_protection.address=0x6005-0x6001;
129   card_protection.bit_shifter=0;
130   card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++];
131   card_protection.failed=false;
132   card_protection.unprotected=false;
132  // writes 0x20
133  card_protection.address=0x6005-0x6001;
134  card_protection.bit_shifter=0;
135  card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++];
136  card_protection.failed=false;
137  card_protection.unprotected=false;
133138}
134139
135140READ8_MEMBER( gamate_state::newer_protection_set )
136141{
137   card_protection.set=true;
138   return 0;
142  card_protection.set=true;
143  return 0;
139144}
140145
141146
142147WRITE8_MEMBER( gamate_state::gamate_video_w )
143148{
144   video.reg[offset]=data;
145   switch (offset) {
146   case 1:
147      if (data&0xf) printf("lcd mode %x\n", data);
148      video.bitmap.write=data&0xc0; // more addressing mode
149      video.y_increment=data&0x40;
150      break;
151   case 2: video.bitmap.xpos=data;break;
152   case 3:
153      if (data>=200) printf("lcd ypos: %x\n", data);
154      video.bitmap.ypos=data;
155      break;
156   case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break;
157   case 5: video.y=data;break;
158   case 7:
159   if (video.y>=200)
160   machine().ui().popup_time(2, "bitmap write to x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data);
161   if (video.bitmap.write) {
162      video.bitmap.data[video.bitmap.page2][video.y][video.x]=data;
163   } else {
164      video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data;
165   }
166   if (video.y_increment) video.y++;
167      else video.x++;
168   }
149  video.reg[offset]=data;
150  switch (offset) {
151  case 1:
152    if (data&0xf) printf("lcd mode %x\n", data);
153    video.y_increment=data&0x40;
154    break;
155  case 2: video.bitmap.xpos=data;break;
156  case 3:
157    if (data>=200) printf("lcd ypos: %x\n", data);
158    video.bitmap.ypos=data;
159    break;
160  case 4: video.bitmap.page2=data&0x80;video.x=data&0x1f;break;
161  case 5: video.y=data;break;
162  case 7:
163    video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data;
164    if (video.y_increment) video.y++;
165    else video.x++; // overruns
166  }
169167}
170168
171169WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w )
172170{
173   bank_multi=data;
174   membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1);
171  bank_multi=data;
172  membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1);
175173}
176174
177175WRITE8_MEMBER( gamate_state::cart_bankswitch_w )
r244680r244681
181179
182180READ8_MEMBER( gamate_state::gamate_video_r )
183181{
184   if (offset!=6) return 0;
185   UINT8 data=0;
186   if (video.bitmap.write) {
187   data=video.bitmap.data[video.bitmap.page2][video.y][video.x];
188   } else {
189   data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)];
190   }
182  if (offset!=6) return 0;
183  UINT8 data=0;
184    data=video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)];
191185//  if (m_maincpu->pc()<0xf000)
192186//    machine().ui().popup_time(2, "lcd read x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data);
193   return data;
187    if (video.y_increment) video.y++;
188    else video.x++; // overruns?
189
190    return data;
194191}
195192
196193WRITE8_MEMBER( gamate_state::gamate_audio_w )
197194{
198195//  printf("audio write %x:%x\n", offset, data);//logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data);
199   m_sound->device_w(space, offset, data);
196  m_sound->device_w(space, offset, data);
200197}
201198
202199READ8_MEMBER( gamate_state::gamate_audio_r )
203200{
204// legend of dragon knight
205//  machine().ui().popup_time(2, "%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset);
206   return 0;
201  UINT8 data=m_sound->device_r(space, offset);
202  return data;
207203}
208204
209205
210206READ8_MEMBER( gamate_state::gamate_pad_r )
211207{
212   UINT8 data=m_io_joy->read();
213   return data;
208  UINT8 data=m_io_joy->read();
209  return data;
214210}
215211
212READ8_MEMBER( gamate_state::gamate_nmi_r )
213{
214  UINT8 data=0;
215  machine().ui().popup_time(2, "nmi/4800 read\n");
216  return data;
217}
218
216219static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state )
217   AM_RANGE(0x0000, 0x03ff) AM_RAM
218   AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w)
219   AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r)
220   AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w)
221   AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set)
222   AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset)
223   AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r)
220    AM_RANGE(0x0000, 0x03ff) AM_RAM
221  AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w)
222  AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r)
223  AM_RANGE(0x4800, 0x4800) AM_READ(gamate_nmi_r)
224  AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w)
225  AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set)
226  AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset)
227  AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r)
224228
225   AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti")
226   AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank")
229  AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti")
230  AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank")
227231
228232   AM_RANGE(0x6000, 0x6000) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w)
229233   AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_w)
230234   AM_RANGE(0xc000, 0xc000) AM_WRITE(cart_bankswitch_w)
231235
232   AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios")
236  AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios")
233237ADDRESS_MAP_END
234238
235239
r244680r244681
245249   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select")
246250INPUT_PORTS_END
247251
248ATTR_UNUSED static const unsigned short gamate_palette[4] =
252static const unsigned short gamate_palette[4] =
249253{
250254   0,1,2,3
251255};
r244680r244681
254258/* palette in red, green, blue tribles */
255259static const unsigned char gamate_colors[4][3] =
256260{
257   { 255,255,255 },
258   { 0xa0, 0xa0, 0xa0 },
259   { 0x60, 0x60, 0x60 },
260   { 0, 0, 0 }
261  { 255,255,255 },
262  { 0xa0, 0xa0, 0xa0 },
263  { 0x60, 0x60, 0x60 },
264  { 0, 0, 0 }
261265};
262266
263267PALETTE_INIT_MEMBER(gamate_state, gamate)
r244680r244681
280284
281285UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
282286{
283   int x, y, j;
284   for (y=0;y<152;y++) {
285   for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) {
286      UINT8 d1, d2;
287      if (video.bitmap.ypos<200) {
287  int x, y, j;
288  for (y=0;y<152;y++) {
289    for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) {     
290      UINT8 d1, d2;
291      if (video.bitmap.ypos<200) {
288292   d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f];
289293   d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f];
290      } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines
294      } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines; most likely problematic 200 warp around hardware! no real usage
291295   int yi=(y+(video.bitmap.ypos&0xf)-8);
292296   if (yi<0) yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane?
293297   d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos
294298   d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f];
295      } else {
299      } else {
296300   d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f];
297   d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f];
298      }
299      BlitPlane(&bitmap.pix16(y, x+4), d1, d2);
300      BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4);
301   }
302   }
303   return 0;
301   d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f];   
302      }
303      BlitPlane(&bitmap.pix16(y, x+4), d1, d2);
304      BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4);
305    }
306  }
307  return 0;
304308}
305309
306310DRIVER_INIT_MEMBER(gamate_state,gamate)
r244680r244681
314318void gamate_state::machine_start()
315319{
316320   if (m_cart->exists()) {
317//      m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r));
321//      m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r));
318322      membank("bankmulti")->set_base(m_cart->get_rom_base()+1);
319323      membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset
320324   }
321//  m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback
325//   m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback
322326   card_protection.set=false;
323327   bank_multi=0;
324328   card_protection.unprotected=false;
r244680r244681
378382   MCFG_SOUND_ADD("custom", GAMATE_SND, 0)
379383   MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
380384   MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
381
385   
382386   MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gamate_cart")
383387   MCFG_GENERIC_MANDATORY
384388
r244680r244681
396400
397401
398402/*    YEAR  NAME      PARENT  COMPAT    MACHINE   INPUT    CLASS          INIT      COMPANY    FULLNAME */
399CONS( 19??, gamate,  0,      0,        gamate,  gamate, gamate_state, gamate, "Bit Corp", "Gamate", GAME_IMPERFECT_SOUND)
403CONS( 19??, gamate,  0,      0,        gamate,  gamate, gamate_state, gamate, "Bit Corp", "Gamate", 0)
404
405
trunk/src/mess/drivers/hh_ucom4.c
r244680r244681
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);
r244680r244681
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
r244680r244681
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
r244680r244681
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
r244680r244681
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);
r244680r244681
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)
r244680r244681
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 )
r244680r244681
548557
549558READ8_MEMBER(hh_ucom4_state::alnchase_input_r)
550559{
551   // port A: buttons
560   // A: buttons
552561   return read_inputs(2);
553562}
554563
r244680r244681
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
r244680r244681
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   }
r244680r244681
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 )
trunk/src/mess/includes/gamate.h
r244680r244681
1111#include "bus/generic/slot.h"
1212#include "bus/generic/carts.h"
1313
14struct GAMATE_CHANNEL
15{
16   GAMATE_CHANNEL() :
17//      on(0),
18//      waveform(0),
19      volume(0),
20      pos(0),
21      size(0)
22//      count(0)
23   {
24   }
2514
26   int on;
27   int /*waveform,*/ volume;
28   int pos;
29   int size;
30//  int count;
31};
32
33
3415// ======================> gamate_sound_device
3516
3617class gamate_sound_device : public device_t,
r244680r244681
4930
5031public:
5132   DECLARE_WRITE8_MEMBER( device_w );
33   DECLARE_READ8_MEMBER( device_r );
5234
5335private:
5436
37   static const int DAConverter[];
38   static int Value2Volume(int volume) { return DAConverter[volume]*1; }
39
5540   sound_stream *m_mixer_channel;
56   GAMATE_CHANNEL m_channels[3];
41   struct Tone
42   {
43     Tone() :
44      envelope_on(false),
45      level(false),
46      tone(false), full_cycle(false),
47      volume(0),
48      pos(0),
49      size(0)
50     {
51     }
52
53     bool envelope_on, level;
54     bool tone/*else noise*/, full_cycle/* else square signal/pulse */;
55     int volume;
56     int pos, size;
57   };
58   enum { Right, Left, Both };
59   Tone m_channels[3];
60   struct Noise {
61     Noise(): state(1), level(false), step(0.0), pos(0.0) {}
62     int state;
63     bool level;
64     double step, pos;
65   } noise;
66   struct Envelope {
67     Envelope():control(0), index(0), first(false) {}
68     int control;
69     int index;
70     bool first;
71     double step, pos;
72   } envelope;
5773   UINT8 reg[14];
5874};
5975


Previous 199869 Revisions Next


© 1997-2024 The MAME Team