trunk/src/mame/drivers/suna8.c
| r249116 | r249117 | |
| 27 | 27 | |
| 28 | 28 | - hardhea2: in test mode press P1&P2 button 2 to see a picture of each level |
| 29 | 29 | - Rough Ranger default dipswitch settings are based on the settings listed in |
| 30 | | the Sharp Image licensed Rough Ranger manual / NOTICE sheet dated 8-5-88 |
| 31 | | - rranger video: http://www.nicovideo.jp/watch/sm15788808 (not perfect: fireball masking, lev. 5; masking/missing legs, lev. 10) |
| 32 | | - hardhead video: https://youtu.be/zamQvXr9_xs |
| 33 | | - starfigh video: http://youtu.be/SIwV7wjvnHM (missing starfield effect!) |
| 30 | the Sharp Image licensed Rough Ranger manaul / NOTICE sheet dated 8-5-88 |
| 31 | - starfigh video: http://youtu.be/SIwV7wjvnHM -> missing starfield effect! |
| 34 | 32 | - brickzn video: http://youtu.be/yfU1C7A3iZI (recorded from v6.0, Joystick version) |
| 35 | 33 | |
| 36 | 34 | ***************************************************************************/ |
| r249116 | r249117 | |
| 1887 | 1885 | MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) |
| 1888 | 1886 | MCFG_PALETTE_ENDIANNESS(ENDIANNESS_BIG) |
| 1889 | 1887 | |
| 1890 | | MCFG_VIDEO_START_OVERRIDE(suna8_state,suna8_text) |
| 1888 | MCFG_VIDEO_START_OVERRIDE(suna8_state,suna8_textdim12) |
| 1891 | 1889 | |
| 1892 | 1890 | /* sound hardware */ |
| 1893 | 1891 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r249116 | r249117 | |
| 1941 | 1939 | MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) |
| 1942 | 1940 | MCFG_PALETTE_ENDIANNESS(ENDIANNESS_BIG) |
| 1943 | 1941 | |
| 1944 | | MCFG_VIDEO_START_OVERRIDE(suna8_state,suna8_text) |
| 1942 | MCFG_VIDEO_START_OVERRIDE(suna8_state,suna8_textdim8) |
| 1945 | 1943 | |
| 1946 | 1944 | /* sound hardware */ |
| 1947 | 1945 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r249116 | r249117 | |
| 2923 | 2921 | m_bank1->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000); |
| 2924 | 2922 | } |
| 2925 | 2923 | |
| 2926 | | GAME( 1988, sranger, 0, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (v2.0)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2927 | | GAME( 1988, rranger, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (Sharp Image license)", "Rough Ranger (v2.0)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2928 | | GAME( 1988, rrangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg", "Rough Ranger (v2.0, bootleg)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2929 | | GAME( 1988, srangero, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (older)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2930 | | GAME( 1988, srangern, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (NOVA license)", "Super Ranger (older, NOVA license)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2931 | | GAME( 1988, srangerw, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (WDK license)", "Super Ranger (older, WDK license)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2932 | | GAME( 1988, srangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg (NYWA)", "Super Ranger (older, bootleg)", MACHINE_IMPERFECT_GRAPHICS ) |
| 2924 | GAME( 1988, sranger, 0, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (v2.0)", 0 ) |
| 2925 | GAME( 1988, rranger, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (Sharp Image license)", "Rough Ranger (v2.0)", 0 ) |
| 2926 | GAME( 1988, rrangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg", "Rough Ranger (v2.0, bootleg)", 0 ) |
| 2927 | GAME( 1988, srangero, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (older)", 0 ) |
| 2928 | GAME( 1988, srangern, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (NOVA license)", "Super Ranger (older, NOVA license)", 0 ) |
| 2929 | GAME( 1988, srangerw, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (WDK license)", "Super Ranger (older, WDK license)", 0 ) |
| 2930 | GAME( 1988, srangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg (NYWA)", "Super Ranger (older, bootleg)", 0 ) |
| 2933 | 2931 | |
| 2934 | 2932 | GAME( 1988, hardhead, 0, hardhead, hardhead, suna8_state, hardhead, ROT0, "SunA", "Hard Head", 0 ) |
| 2935 | 2933 | GAME( 1988, hardheadb, hardhead, hardhead, hardhead, suna8_state, hardhedb, ROT0, "bootleg", "Hard Head (bootleg)", 0 ) |
trunk/src/mame/video/suna8.c
| r249116 | r249117 | |
| 17 | 17 | sent to the screen. Each sprite uses 4 bytes, held within the last |
| 18 | 18 | page of tiles. |
| 19 | 19 | |
| 20 | * Note: later games use a more complex format than the following, |
| 21 | which is yet to be completely understood. |
| 22 | |
| 23 | [ Sprites Format ] |
| 24 | |
| 25 | Offset: Bits: Value: |
| 26 | |
| 27 | 0.b Y (Bottom up) |
| 28 | |
| 29 | 1.b 7--- ---- Sprite Size (1 = 2x32 tiles; 0 = 2x2) |
| 30 | |
| 31 | 2x2 Sprites: |
| 32 | -65- ---- Tiles Row (height = 8 tiles) |
| 33 | ---4 ---- Page |
| 34 | |
| 35 | 2x32 Sprites: |
| 36 | -6-- ---- Ignore X (Multisprite) |
| 37 | --54 ---- Page |
| 38 | |
| 39 | ---- 3210 Tiles Column (width = 2 tiles) |
| 40 | |
| 41 | 2.b X |
| 42 | |
| 43 | 3.b 7--- ---- |
| 44 | -6-- ---- X (Sign Bit) |
| 45 | --54 3--- |
| 46 | ---- -210 Tiles Bank |
| 47 | |
| 48 | |
| 49 | [ Sprite's Tiles Format ] |
| 50 | |
| 51 | |
| 52 | Offset: Bits: Value: |
| 53 | |
| 54 | 0.b Code (Low Bits) |
| 55 | |
| 56 | 1.b 7--- ---- Flip Y |
| 57 | -6-- ---- Flip X |
| 58 | --54 32-- Color |
| 59 | ---- --10 Code (High Bits) |
| 60 | |
| 61 | |
| 62 | |
| 20 | 63 | Set TILEMAPS to 1 to debug. |
| 21 | 64 | Press Z (you see the "tilemaps" in RAM) or |
| 22 | 65 | Press X (you see the "tilemaps" in ROM) then |
| r249116 | r249117 | |
| 29 | 72 | |
| 30 | 73 | #include "emu.h" |
| 31 | 74 | #include "includes/suna8.h" |
| 32 | | #include "drawgfxm.h" |
| 33 | 75 | |
| 34 | 76 | /*************************************************************************** |
| 35 | 77 | For Debug: there's no tilemap, just sprites. |
| r249116 | r249117 | |
| 138 | 180 | |
| 139 | 181 | |
| 140 | 182 | |
| 141 | | void suna8_state::suna8_vh_start_common(bool has_text, GFXBANK_TYPE_T gfxbank_type) |
| 183 | void suna8_state::suna8_vh_start_common(int text_dim, GFXBANK_TYPE_T gfxbank_type) |
| 142 | 184 | { |
| 143 | | m_has_text = has_text; |
| 185 | m_text_dim = text_dim; |
| 144 | 186 | m_spritebank = 0; |
| 145 | 187 | m_gfxbank = 0; |
| 146 | 188 | m_gfxbank_type = gfxbank_type; |
| 147 | 189 | m_palettebank = 0; |
| 148 | 190 | |
| 149 | | if (!m_has_text) |
| 191 | if (!m_text_dim) |
| 150 | 192 | { |
| 151 | 193 | m_banked_paletteram.allocate(0x200 * 2); |
| 152 | 194 | |
| r249116 | r249117 | |
| 157 | 199 | #if TILEMAPS |
| 158 | 200 | m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(suna8_state::get_tile_info),this), TILEMAP_SCAN_COLS, |
| 159 | 201 | |
| 160 | | 8, 8, 0x20*(m_has_text ? 4 : 16), 0x20); |
| 202 | 8, 8, 0x20*(m_text_dim ? 4 : 16), 0x20); |
| 161 | 203 | |
| 162 | 204 | m_bg_tilemap->set_transparent_pen(15); |
| 163 | 205 | #endif |
| 164 | 206 | } |
| 165 | 207 | |
| 166 | | VIDEO_START_MEMBER(suna8_state,suna8_text) { suna8_vh_start_common( true, GFXBANK_TYPE_SPARKMAN); } |
| 167 | | VIDEO_START_MEMBER(suna8_state,suna8_sparkman) { suna8_vh_start_common( false, GFXBANK_TYPE_SPARKMAN); } |
| 168 | | VIDEO_START_MEMBER(suna8_state,suna8_brickzn) { suna8_vh_start_common( false, GFXBANK_TYPE_BRICKZN); } |
| 169 | | VIDEO_START_MEMBER(suna8_state,suna8_starfigh) { suna8_vh_start_common( false, GFXBANK_TYPE_STARFIGH); } |
| 208 | VIDEO_START_MEMBER(suna8_state,suna8_textdim8) { suna8_vh_start_common( 8, GFXBANK_TYPE_SPARKMAN); } |
| 209 | VIDEO_START_MEMBER(suna8_state,suna8_textdim12) { suna8_vh_start_common( 12, GFXBANK_TYPE_SPARKMAN); } |
| 210 | VIDEO_START_MEMBER(suna8_state,suna8_sparkman) { suna8_vh_start_common( 0, GFXBANK_TYPE_SPARKMAN); } |
| 211 | VIDEO_START_MEMBER(suna8_state,suna8_brickzn) { suna8_vh_start_common( 0, GFXBANK_TYPE_BRICKZN); } |
| 212 | VIDEO_START_MEMBER(suna8_state,suna8_starfigh) { suna8_vh_start_common( 0, GFXBANK_TYPE_STARFIGH); } |
| 170 | 213 | |
| 171 | 214 | /*************************************************************************** |
| 172 | 215 | |
| r249116 | r249117 | |
| 176 | 219 | |
| 177 | 220 | ***************************************************************************/ |
| 178 | 221 | |
| 179 | | #define PIXEL_OP_REBASE_TRANSPEN_PRIORITY_MASK(DEST, PRIORITY, SOURCE) \ |
| 180 | | do \ |
| 181 | | { \ |
| 182 | | UINT32 srcdata = (SOURCE); \ |
| 183 | | if (srcdata != trans_pen) \ |
| 184 | | { \ |
| 185 | | if ((PRIORITY) == 0) \ |
| 186 | | (DEST) = color + srcdata; \ |
| 187 | | } \ |
| 188 | | } \ |
| 189 | | while (0) |
| 190 | | |
| 191 | | class mygfx_element : public gfx_element |
| 222 | void suna8_state::draw_normal_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int which) |
| 192 | 223 | { |
| 193 | | public: |
| 194 | | void prio_mask_transpen(bitmap_ind16 &dest, const rectangle &cliprect, |
| 195 | | UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, |
| 196 | | bitmap_ind8 &priority, UINT32 trans_pen) |
| 197 | | { |
| 198 | | color = colorbase() + granularity() * (color % colors()); |
| 199 | | code %= elements(); |
| 200 | | DRAWGFX_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN_PRIORITY_MASK, UINT8); |
| 201 | | } |
| 202 | | }; |
| 203 | | |
| 204 | | /*************************************************************************** |
| 205 | | |
| 206 | | [ Sprites Format ] |
| 207 | | |
| 208 | | * Note: later games use a more complex format than the following |
| 209 | | |
| 210 | | Offset: Bits: Value: |
| 211 | | |
| 212 | | 0.b Y (Bottom up) |
| 213 | | |
| 214 | | 1.b 7--- ---- Sprite Size (1 = 2x32 tiles; 0 = 2x2) |
| 215 | | |
| 216 | | 2x2 Sprites: |
| 217 | | -65- ---- Tiles Row (height = 8 tiles) |
| 218 | | ---4 ---- Page |
| 219 | | |
| 220 | | 2x32 Sprites: |
| 221 | | -6-- ---- Ignore X (Multisprite) |
| 222 | | --54 ---- Page |
| 223 | | |
| 224 | | ---- 3210 Tiles Column (width = 2 tiles) |
| 225 | | |
| 226 | | 2.b X |
| 227 | | |
| 228 | | 3.b 7--- ---- Text Sprite |
| 229 | | -6-- ---- X (Sign Bit) <- Also Set For Text Sprites |
| 230 | | --54 3210 Tiles Bank ($400 tiles each) |
| 231 | | |
| 232 | | |
| 233 | | [ Sprite's Tiles Format ] |
| 234 | | |
| 235 | | |
| 236 | | Offset: Bits: Value: |
| 237 | | |
| 238 | | 0.b Code (Low Bits) |
| 239 | | |
| 240 | | 1.b 7--- ---- Flip Y |
| 241 | | -6-- ---- Flip X |
| 242 | | --54 32-- Color |
| 243 | | ---- --10 Code (High Bits) |
| 244 | | |
| 245 | | ***************************************************************************/ |
| 246 | | |
| 247 | | void suna8_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int end, int which) |
| 248 | | { |
| 249 | 224 | UINT8 *spriteram = m_spriteram + which * 0x2000 * 2; |
| 250 | 225 | |
| 226 | int i; |
| 251 | 227 | int mx = 0; // multisprite x counter |
| 252 | 228 | |
| 253 | 229 | int max_x = m_screen->width() - 8; |
| 254 | 230 | int max_y = m_screen->height() - 8; |
| 255 | 231 | |
| 256 | | if (m_has_text) |
| 257 | | screen.priority().fill(0, cliprect); |
| 258 | | |
| 259 | | for (int i = start; i < end; i += 4) |
| 232 | for (i = 0x1d00; i < 0x2000; i += 4) |
| 260 | 233 | { |
| 261 | 234 | int srcpg, srcx,srcy, dimx,dimy, tx, ty; |
| 262 | 235 | int gfxbank, colorbank = 0, flipx,flipy, multisprite; |
| r249116 | r249117 | |
| 266 | 239 | int x = spriteram[i + 2]; |
| 267 | 240 | int bank = spriteram[i + 3]; |
| 268 | 241 | |
| 269 | | bool read_mask = false; |
| 270 | | |
| 271 | | if (m_has_text) |
| 242 | if (m_text_dim) |
| 272 | 243 | { |
| 273 | 244 | // Older, simpler hardware: hardhead, rranger |
| 274 | | |
| 275 | | // rranger (20:18): |
| 276 | | // fireball (fe00: 19 00 28 07) not masked by text (fd48: e0 00 00 c0, fd4c: 10 00 00 c0), fire (fdb0: 30 00 00 c0, fdb4: 20 00 00 c0) |
| 277 | | // fireball (fe00: 20 00 ba 07) is masked!? But only by fire? |
| 278 | | // rranger (33:04, 35:17): |
| 279 | | // generally no masking by fire, but there are missing legs on some enemies. |
| 280 | | // Could be a sprite limit hit, as there are many sprites on that line, and it's affected by the horizontal (dead) player |
| 281 | | read_mask = true; |
| 282 | | |
| 283 | | if ((bank & 0xc0) == 0xc0) |
| 284 | | { |
| 285 | | // hardhead: fd88/8c/90 -> f994..f9c0 |
| 286 | | // rranger: fd48/4c -> f980..f9ac |
| 287 | | // fdb0/b4 -> f9c0..f9fc |
| 288 | | // note: fireballs in level 5 (fe20/40) should go above flames and score (text sprites) |
| 289 | | int text_list = (i - start) & 0x20; |
| 290 | | int text_start = text_list ? 0x19c0 : 0x1980; |
| 291 | | bool write_mask = (text_list == 0); // hack? |
| 292 | | draw_text_sprites(screen, bitmap, cliprect, text_start, text_start + 0x80, y, write_mask); |
| 293 | | continue; |
| 294 | | } |
| 295 | | |
| 296 | 245 | flipx = 0; |
| 297 | 246 | flipy = 0; |
| 298 | 247 | gfxbank = bank & 0x3f; |
| r249116 | r249117 | |
| 314 | 263 | } |
| 315 | 264 | else |
| 316 | 265 | { |
| 317 | | // Newer, more complex hardware: brickzn, hardhea2, sparkman, starfigh |
| 266 | // Newer, more complex hardware: brickzn, hardhea2, sparkman?, starfigh |
| 318 | 267 | switch( code & 0xc0 ) |
| 319 | 268 | { |
| 320 | 269 | case 0xc0: |
| r249116 | r249117 | |
| 333 | 282 | gfxbank = bank & 0x1f; |
| 334 | 283 | srcpg = (code >> 4) & 3; |
| 335 | 284 | break; |
| 285 | // hardhea2: fire code=52/54 bank=a4; player code=02/04/06 bank=08; arrow:code=16 bank=27 |
| 336 | 286 | case 0x40: |
| 337 | | // hardhea2: fire code=52/54 bank=a4; player code=02/04/06 bank=08; arrow:code=16 bank=27 |
| 338 | 287 | dimx = 4; dimy = 4; |
| 339 | 288 | srcx = (code & 0xe) * 2; |
| 340 | 289 | flipx = code & 0x01; |
| r249116 | r249117 | |
| 398 | 347 | x = x - ((bank & 0x40) ? 0x100 : 0); |
| 399 | 348 | y = (0x100 - y - dimy*8 ) & 0xff; |
| 400 | 349 | |
| 401 | | // Multi Sprite |
| 350 | /* Multi Sprite */ |
| 402 | 351 | if ( multisprite ) { mx += dimx*8; x = mx; } |
| 403 | 352 | else mx = x; |
| 404 | 353 | |
| r249116 | r249117 | |
| 430 | 379 | sy = max_y - sy; tile_flipy = !tile_flipy; |
| 431 | 380 | } |
| 432 | 381 | |
| 433 | | int code = tile + (attr & 0x3)*0x100 + gfxbank; |
| 434 | | int color = (((attr >> 2) & 0xf) ^ colorbank) + 0x10 * m_palettebank; // player2 in hardhea2 and sparkman |
| 435 | | |
| 436 | | if (read_mask) |
| 437 | | ((mygfx_element*)(m_gfxdecode->gfx(which)))->prio_mask_transpen(bitmap, cliprect, |
| 438 | | code, color, tile_flipx, tile_flipy, sx, sy, screen.priority(), 0xf); |
| 439 | | else |
| 440 | | m_gfxdecode->gfx(which)->transpen(bitmap, cliprect, |
| 441 | | code, color, tile_flipx, tile_flipy, sx, sy, 0xf); |
| 382 | m_gfxdecode->gfx(which)->transpen(bitmap,cliprect, |
| 383 | tile + (attr & 0x3)*0x100 + gfxbank, |
| 384 | (((attr >> 2) & 0xf) ^ colorbank) + 0x10 * m_palettebank, // player2 in hardhea2 and sparkman |
| 385 | tile_flipx, tile_flipy, |
| 386 | sx, sy, 0xf); |
| 442 | 387 | } |
| 443 | 388 | } |
| 389 | |
| 444 | 390 | } |
| 445 | 391 | } |
| 446 | 392 | |
| 447 | | /*************************************************************************** |
| 448 | | |
| 449 | | [ Text Sprites Format ] |
| 450 | | |
| 451 | | Offset: Bits: Value: |
| 452 | | |
| 453 | | 0.b Tiles Y (height = 2 tiles) |
| 454 | | |
| 455 | | 1.b 7--- ---- 0 = Skip Sprite |
| 456 | | -6-- ---- |
| 457 | | --54 ---- Page |
| 458 | | ---- 3210 Tiles Column (width = 2 tiles) |
| 459 | | |
| 460 | | 2.b X |
| 461 | | |
| 462 | | 3.b 7--- ---- 0 = Last Sprite |
| 463 | | -6-- ---- X (Sign Bit) |
| 464 | | --54 3210 Tiles Bank ($400 tiles each) |
| 465 | | |
| 466 | | Each text sprite is 2x2 tiles |
| 467 | | |
| 468 | | ***************************************************************************/ |
| 469 | | |
| 470 | | void suna8_state::draw_text_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int end, int ypos, bool write_mask) |
| 393 | void suna8_state::draw_text_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) |
| 471 | 394 | { |
| 472 | 395 | UINT8 *spriteram = m_spriteram; |
| 396 | int i; |
| 473 | 397 | |
| 474 | 398 | int max_x = m_screen->width() - 8; |
| 475 | 399 | int max_y = m_screen->height() - 8; |
| 476 | 400 | |
| 477 | | bool last = false; |
| 478 | | for (int i = start; i < end && !last; i += 4) |
| 401 | for (i = 0x1900; i < 0x19ff; i += 4) |
| 479 | 402 | { |
| 480 | 403 | int srcpg, srcx,srcy, dimx,dimy, tx, ty; |
| 481 | 404 | |
| r249116 | r249117 | |
| 485 | 408 | int bank = spriteram[i + 3]; |
| 486 | 409 | |
| 487 | 410 | if (~code & 0x80) continue; |
| 488 | | last = !(bank & 0x80); |
| 489 | 411 | |
| 490 | | dimx = 2; dimy = 2; |
| 491 | | srcx = (code & 0xf) * 2; srcy = ((y & 0xf8) - (ypos & 0xf8) - 0x10) / 8; |
| 412 | dimx = 2; dimy = m_text_dim; |
| 413 | srcx = (code & 0xf) * 2; srcy = (y & 0xf0) / 8; |
| 492 | 414 | srcpg = (code >> 4) & 3; |
| 493 | 415 | |
| 494 | 416 | x = x - ((bank & 0x40) ? 0x100 : 0); |
| 417 | y = 0; |
| 495 | 418 | |
| 496 | 419 | bank = (bank & 0x3f) * 0x400; |
| 497 | 420 | |
| r249116 | r249117 | |
| 499 | 422 | { |
| 500 | 423 | for (tx = 0; tx < dimx; tx ++) |
| 501 | 424 | { |
| 425 | int real_ty = (ty < (dimy/2)) ? ty : (ty + 0x20 - dimy); |
| 426 | |
| 502 | 427 | int addr = (srcpg * 0x20 * 0x20) + |
| 503 | 428 | ((srcx + tx) & 0x1f) * 0x20 + |
| 504 | | ((srcy + ty) & 0x1f); |
| 429 | ((srcy + real_ty) & 0x1f); |
| 505 | 430 | |
| 506 | 431 | int tile = spriteram[addr*2 + 0]; |
| 507 | 432 | int attr = spriteram[addr*2 + 1]; |
| r249116 | r249117 | |
| 510 | 435 | int flipy = attr & 0x80; |
| 511 | 436 | |
| 512 | 437 | int sx = x + tx * 8; |
| 513 | | int sy = (0xf0 - ypos + ty * 8) & 0xff; |
| 438 | int sy = (y + real_ty * 8) & 0xff; |
| 514 | 439 | |
| 515 | 440 | if (flip_screen()) |
| 516 | 441 | { |
| r249116 | r249117 | |
| 518 | 443 | sy = max_y - sy; flipy = !flipy; |
| 519 | 444 | } |
| 520 | 445 | |
| 521 | | m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, |
| 446 | m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, |
| 522 | 447 | tile + (attr & 0x3)*0x100 + bank, |
| 523 | 448 | (attr >> 2) & 0xf, |
| 524 | 449 | flipx, flipy, |
| 525 | | sx, sy, 0xf ); |
| 450 | sx, sy, 0xf); |
| 526 | 451 | } |
| 527 | 452 | } |
| 528 | | } |
| 529 | 453 | |
| 530 | | if (write_mask) |
| 531 | | { |
| 532 | | // Fill the text sprites row with high priority for masking |
| 533 | | int sy = (0xf0 - ypos) & 0xff; |
| 534 | | if (flip_screen()) |
| 535 | | sy = max_y - sy - 8; |
| 536 | | rectangle text_clip(cliprect.min_x, cliprect.max_x, sy, sy + 0x10 - 1); |
| 537 | | text_clip &= cliprect; |
| 538 | | screen.priority().fill(1, text_clip); |
| 539 | 454 | } |
| 540 | 455 | } |
| 541 | 456 | |
| r249116 | r249117 | |
| 549 | 464 | |
| 550 | 465 | UINT32 suna8_state::screen_update_suna8(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 551 | 466 | { |
| 552 | | // see hardhead, hardhea2 test mode (press button 2 for both players) |
| 467 | /* see hardhead, hardhea2 test mode (press button 2 for both players) */ |
| 553 | 468 | bitmap.fill(0xff, cliprect); |
| 554 | 469 | |
| 555 | 470 | #ifdef MAME_DEBUG |
| r249116 | r249117 | |
| 566 | 481 | if (machine().input().code_pressed_once(KEYCODE_S)) { m_trombank++; machine().tilemap().mark_all_dirty(); } |
| 567 | 482 | |
| 568 | 483 | m_trombank &= 0xf; |
| 569 | | m_page &= m_has_text ? 3 : (m_gfxdecode->gfx(1) ? 15 : 7); |
| 484 | m_page &= m_text_dim ? 3 : (m_gfxdecode->gfx(1) ? 15 : 7); |
| 570 | 485 | m_tiles %= max_tiles; |
| 571 | 486 | if (m_tiles < 0) m_tiles += max_tiles; |
| 572 | 487 | |
| r249116 | r249117 | |
| 578 | 493 | m_rombank, m_palettebank, m_spritebank, |
| 579 | 494 | m_page, m_tiles, m_trombank); |
| 580 | 495 | #endif |
| 581 | | return 0; |
| 582 | 496 | } |
| 497 | else |
| 583 | 498 | #endif |
| 584 | 499 | #endif |
| 500 | { |
| 501 | // Normal sprites |
| 502 | draw_normal_sprites(bitmap,cliprect, 0); |
| 585 | 503 | |
| 586 | | // Sprites |
| 587 | | draw_sprites(screen, bitmap, cliprect, 0x1d00, 0x2000, 0); |
| 504 | // More normal sprites (second sprite "chip" in sparkman) |
| 505 | if (m_gfxdecode->gfx(1)) |
| 506 | draw_normal_sprites(bitmap,cliprect, 1); |
| 588 | 507 | |
| 589 | | // More sprites (second sprite "chip" in sparkman) |
| 590 | | if (m_gfxdecode->gfx(1)) |
| 591 | | draw_sprites(screen, bitmap, cliprect, 0x1d00, 0x2000, 1); |
| 592 | | |
| 508 | // Text sprites (earlier games only) |
| 509 | if (m_text_dim) |
| 510 | draw_text_sprites(bitmap,cliprect); |
| 511 | } |
| 593 | 512 | return 0; |
| 594 | 513 | } |